Lines Matching refs:ov5670
141 struct ov5670 { struct
177 #define to_ov5670(sd) container_of(sd, struct ov5670, subdev) argument
787 ov5670_find_best_fit(struct ov5670 *ov5670, in ov5670_find_best_fit() argument
796 for (i = 0; i < ov5670->cfg_num; i++) { in ov5670_find_best_fit()
811 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_set_fmt() local
815 mutex_lock(&ov5670->mutex); in ov5670_set_fmt()
817 mode = ov5670_find_best_fit(ov5670, fmt); in ov5670_set_fmt()
826 mutex_unlock(&ov5670->mutex); in ov5670_set_fmt()
830 ov5670->cur_mode = mode; in ov5670_set_fmt()
832 __v4l2_ctrl_modify_range(ov5670->hblank, h_blank, in ov5670_set_fmt()
835 __v4l2_ctrl_modify_range(ov5670->vblank, vblank_def, in ov5670_set_fmt()
840 mutex_unlock(&ov5670->mutex); in ov5670_set_fmt()
849 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_get_fmt() local
850 const struct ov5670_mode *mode = ov5670->cur_mode; in ov5670_get_fmt()
852 mutex_lock(&ov5670->mutex); in ov5670_get_fmt()
857 mutex_unlock(&ov5670->mutex); in ov5670_get_fmt()
866 mutex_unlock(&ov5670->mutex); in ov5670_get_fmt()
886 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_enum_frame_sizes() local
888 if (fse->index >= ov5670->cfg_num) in ov5670_enum_frame_sizes()
902 static int ov5670_enable_test_pattern(struct ov5670 *ov5670, u32 pattern) in ov5670_enable_test_pattern() argument
911 return ov5670_write_reg(ov5670->client, OV5670_REG_TEST_PATTERN, in ov5670_enable_test_pattern()
964 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_g_frame_interval() local
965 const struct ov5670_mode *mode = ov5670->cur_mode; in ov5670_g_frame_interval()
967 mutex_lock(&ov5670->mutex); in ov5670_g_frame_interval()
969 mutex_unlock(&ov5670->mutex); in ov5670_g_frame_interval()
974 static void ov5670_get_module_inf(struct ov5670 *ov5670, in ov5670_get_module_inf() argument
977 struct ov5670_otp_info *otp = ov5670->otp; in ov5670_get_module_inf()
981 strscpy(inf->base.module, ov5670->module_name, in ov5670_get_module_inf()
983 strscpy(inf->base.lens, ov5670->len_name, sizeof(inf->base.lens)); in ov5670_get_module_inf()
988 static void ov5670_set_awb_cfg(struct ov5670 *ov5670, in ov5670_set_awb_cfg() argument
991 mutex_lock(&ov5670->mutex); in ov5670_set_awb_cfg()
992 memcpy(&ov5670->awb_cfg, cfg, sizeof(*cfg)); in ov5670_set_awb_cfg()
993 mutex_unlock(&ov5670->mutex); in ov5670_set_awb_cfg()
998 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_ioctl() local
1003 ov5670_get_module_inf(ov5670, (struct rkmodule_inf *)arg); in ov5670_ioctl()
1006 ov5670_set_awb_cfg(ov5670, (struct rkmodule_awb_cfg *)arg); in ov5670_ioctl()
1063 static int ov5670_apply_otp(struct ov5670 *ov5670) in ov5670_apply_otp() argument
1066 struct i2c_client *client = ov5670->client; in ov5670_apply_otp()
1067 struct ov5670_otp_info *otp_ptr = ov5670->otp; in ov5670_apply_otp()
1068 struct rkmodule_awb_cfg *awb_cfg = &ov5670->awb_cfg; in ov5670_apply_otp()
1128 static int __ov5670_start_stream(struct ov5670 *ov5670) in __ov5670_start_stream() argument
1132 ret = ov5670_write_array(ov5670->client, ov5670->cur_mode->reg_list); in __ov5670_start_stream()
1140 dev_info(&ov5670->client->dev, "%s:Check register value!\n", in __ov5670_start_stream()
1142 ret = ov5670_reg_verify(ov5670->client, ov5670_global_regs); in __ov5670_start_stream()
1146 ret = ov5670_reg_verify(ov5670->client, ov5670->cur_mode->reg_list); in __ov5670_start_stream()
1152 mutex_unlock(&ov5670->mutex); in __ov5670_start_stream()
1153 ret = v4l2_ctrl_handler_setup(&ov5670->ctrl_handler); in __ov5670_start_stream()
1154 mutex_lock(&ov5670->mutex); in __ov5670_start_stream()
1158 if (ov5670->otp) in __ov5670_start_stream()
1159 ret = ov5670_apply_otp(ov5670); in __ov5670_start_stream()
1162 dev_info(&ov5670->client->dev, "APPly otp failed!\n"); in __ov5670_start_stream()
1164 ret = ov5670_write_reg(ov5670->client, OV5670_REG_CTRL_MODE, in __ov5670_start_stream()
1169 static int __ov5670_stop_stream(struct ov5670 *ov5670) in __ov5670_stop_stream() argument
1171 return ov5670_write_reg(ov5670->client, OV5670_REG_CTRL_MODE, in __ov5670_stop_stream()
1177 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_s_stream() local
1178 struct i2c_client *client = ov5670->client; in ov5670_s_stream()
1182 ov5670->cur_mode->width, in ov5670_s_stream()
1183 ov5670->cur_mode->height, in ov5670_s_stream()
1184 DIV_ROUND_CLOSEST(ov5670->cur_mode->max_fps.denominator, in ov5670_s_stream()
1185 ov5670->cur_mode->max_fps.numerator)); in ov5670_s_stream()
1187 mutex_lock(&ov5670->mutex); in ov5670_s_stream()
1189 if (on == ov5670->streaming) in ov5670_s_stream()
1200 ret = __ov5670_start_stream(ov5670); in ov5670_s_stream()
1208 __ov5670_stop_stream(ov5670); in ov5670_s_stream()
1212 ov5670->streaming = on; in ov5670_s_stream()
1215 mutex_unlock(&ov5670->mutex); in ov5670_s_stream()
1222 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_s_power() local
1223 struct i2c_client *client = ov5670->client; in ov5670_s_power()
1227 mutex_lock(&ov5670->mutex); in ov5670_s_power()
1230 if (ov5670->power_on == !!on) in ov5670_s_power()
1240 ret = ov5670_write_array(ov5670->client, ov5670_global_regs); in ov5670_s_power()
1247 ov5670->power_on = true; in ov5670_s_power()
1249 if (!IS_ERR(ov5670->reset_gpio)) in ov5670_s_power()
1250 gpiod_export(ov5670->reset_gpio, false); in ov5670_s_power()
1251 if (!IS_ERR(ov5670->pwdn_gpio)) in ov5670_s_power()
1252 gpiod_export(ov5670->pwdn_gpio, false); in ov5670_s_power()
1255 ov5670->power_on = false; in ov5670_s_power()
1259 mutex_unlock(&ov5670->mutex); in ov5670_s_power()
1270 static int __ov5670_power_on(struct ov5670 *ov5670) in __ov5670_power_on() argument
1274 struct device *dev = &ov5670->client->dev; in __ov5670_power_on()
1276 if (!IS_ERR(ov5670->power_gpio)) in __ov5670_power_on()
1277 gpiod_set_value_cansleep(ov5670->power_gpio, 1); in __ov5670_power_on()
1281 if (!IS_ERR_OR_NULL(ov5670->pins_default)) { in __ov5670_power_on()
1282 ret = pinctrl_select_state(ov5670->pinctrl, in __ov5670_power_on()
1283 ov5670->pins_default); in __ov5670_power_on()
1287 ret = clk_set_rate(ov5670->xvclk, OV5670_XVCLK_FREQ); in __ov5670_power_on()
1290 if (clk_get_rate(ov5670->xvclk) != OV5670_XVCLK_FREQ) in __ov5670_power_on()
1292 ret = clk_prepare_enable(ov5670->xvclk); in __ov5670_power_on()
1298 ret = regulator_bulk_enable(OV5670_NUM_SUPPLIES, ov5670->supplies); in __ov5670_power_on()
1304 if (!IS_ERR(ov5670->reset_gpio)) in __ov5670_power_on()
1305 gpiod_set_value_cansleep(ov5670->reset_gpio, 1); in __ov5670_power_on()
1307 if (!IS_ERR(ov5670->pwdn_gpio)) in __ov5670_power_on()
1308 gpiod_set_value_cansleep(ov5670->pwdn_gpio, 1); in __ov5670_power_on()
1311 if (!IS_ERR(ov5670->reset_gpio)) in __ov5670_power_on()
1312 gpiod_export(ov5670->reset_gpio, false); in __ov5670_power_on()
1313 if (!IS_ERR(ov5670->pwdn_gpio)) in __ov5670_power_on()
1314 gpiod_export(ov5670->pwdn_gpio, false); in __ov5670_power_on()
1323 clk_disable_unprepare(ov5670->xvclk); in __ov5670_power_on()
1328 static void __ov5670_power_off(struct ov5670 *ov5670) in __ov5670_power_off() argument
1331 struct device *dev = &ov5670->client->dev; in __ov5670_power_off()
1333 if (!IS_ERR(ov5670->pwdn_gpio)) in __ov5670_power_off()
1334 gpiod_set_value_cansleep(ov5670->pwdn_gpio, 0); in __ov5670_power_off()
1335 clk_disable_unprepare(ov5670->xvclk); in __ov5670_power_off()
1336 if (!IS_ERR(ov5670->reset_gpio)) in __ov5670_power_off()
1337 gpiod_set_value_cansleep(ov5670->reset_gpio, 0); in __ov5670_power_off()
1338 if (!IS_ERR_OR_NULL(ov5670->pins_sleep)) { in __ov5670_power_off()
1339 ret = pinctrl_select_state(ov5670->pinctrl, in __ov5670_power_off()
1340 ov5670->pins_sleep); in __ov5670_power_off()
1344 if (!IS_ERR(ov5670->power_gpio)) in __ov5670_power_off()
1345 gpiod_set_value_cansleep(ov5670->power_gpio, 0); in __ov5670_power_off()
1347 regulator_bulk_disable(OV5670_NUM_SUPPLIES, ov5670->supplies); in __ov5670_power_off()
1354 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_runtime_resume() local
1356 return __ov5670_power_on(ov5670); in ov5670_runtime_resume()
1363 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_runtime_suspend() local
1365 __ov5670_power_off(ov5670); in ov5670_runtime_suspend()
1373 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_open() local
1378 mutex_lock(&ov5670->mutex); in ov5670_open()
1385 mutex_unlock(&ov5670->mutex); in ov5670_open()
1396 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_enum_frame_interval() local
1398 if (fie->index >= ov5670->cfg_num) in ov5670_enum_frame_interval()
1463 struct ov5670 *ov5670 = container_of(ctrl->handler, in ov5670_set_ctrl() local
1464 struct ov5670, ctrl_handler); in ov5670_set_ctrl()
1465 struct i2c_client *client = ov5670->client; in ov5670_set_ctrl()
1473 max = ov5670->cur_mode->height + ctrl->val - 4; in ov5670_set_ctrl()
1474 __v4l2_ctrl_modify_range(ov5670->exposure, in ov5670_set_ctrl()
1475 ov5670->exposure->minimum, max, in ov5670_set_ctrl()
1476 ov5670->exposure->step, in ov5670_set_ctrl()
1477 ov5670->exposure->default_value); in ov5670_set_ctrl()
1488 ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, in ov5670_set_ctrl()
1490 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_EXPOSURE, in ov5670_set_ctrl()
1492 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, in ov5670_set_ctrl()
1494 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, in ov5670_set_ctrl()
1500 ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, in ov5670_set_ctrl()
1503 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_L, in ov5670_set_ctrl()
1506 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_H, in ov5670_set_ctrl()
1510 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, in ov5670_set_ctrl()
1512 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, in ov5670_set_ctrl()
1517 ret = ov5670_write_reg(ov5670->client, OV5670_REG_VTS, in ov5670_set_ctrl()
1519 ctrl->val + ov5670->cur_mode->height); in ov5670_set_ctrl()
1522 ret = ov5670_enable_test_pattern(ov5670, ctrl->val); in ov5670_set_ctrl()
1539 static int ov5670_initialize_controls(struct ov5670 *ov5670) in ov5670_initialize_controls() argument
1548 handler = &ov5670->ctrl_handler; in ov5670_initialize_controls()
1549 mode = ov5670->cur_mode; in ov5670_initialize_controls()
1553 handler->lock = &ov5670->mutex; in ov5670_initialize_controls()
1561 0, ov5670->pixel_rate, 1, ov5670->pixel_rate); in ov5670_initialize_controls()
1564 ov5670->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov5670_initialize_controls()
1566 if (ov5670->hblank) in ov5670_initialize_controls()
1567 ov5670->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov5670_initialize_controls()
1570 ov5670->vblank = v4l2_ctrl_new_std(handler, &ov5670_ctrl_ops, in ov5670_initialize_controls()
1576 ov5670->exposure = v4l2_ctrl_new_std(handler, &ov5670_ctrl_ops, in ov5670_initialize_controls()
1581 ov5670->anal_gain = v4l2_ctrl_new_std(handler, &ov5670_ctrl_ops, in ov5670_initialize_controls()
1586 ov5670->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov5670_initialize_controls()
1593 dev_err(&ov5670->client->dev, in ov5670_initialize_controls()
1598 ov5670->subdev.ctrl_handler = handler; in ov5670_initialize_controls()
1608 static int ov5670_otp_read(struct ov5670 *ov5670) in ov5670_otp_read() argument
1612 struct device *dev = &ov5670->client->dev; in ov5670_otp_read()
1613 struct i2c_client *client = ov5670->client; in ov5670_otp_read()
1691 ov5670->otp = otp_ptr; in ov5670_otp_read()
1693 ov5670->otp = NULL; in ov5670_otp_read()
1701 static int ov5670_otp_check_read(struct ov5670 *ov5670) in ov5670_otp_check_read() argument
1705 struct i2c_client *client = ov5670->client; in ov5670_otp_check_read()
1724 ret = ov5670_otp_read(ov5670); in ov5670_otp_check_read()
1738 static int ov5670_check_sensor_id(struct ov5670 *ov5670, in ov5670_check_sensor_id() argument
1741 struct device *dev = &ov5670->client->dev; in ov5670_check_sensor_id()
1757 static int ov5670_configure_regulators(struct ov5670 *ov5670) in ov5670_configure_regulators() argument
1762 ov5670->supplies[i].supply = ov5670_supply_names[i]; in ov5670_configure_regulators()
1764 return devm_regulator_bulk_get(&ov5670->client->dev, in ov5670_configure_regulators()
1766 ov5670->supplies); in ov5670_configure_regulators()
1769 static int ov5670_parse_of(struct ov5670 *ov5670) in ov5670_parse_of() argument
1771 struct device *dev = &ov5670->client->dev; in ov5670_parse_of()
1788 ov5670->lane_num = rval; in ov5670_parse_of()
1789 if (ov5670->lane_num == 2) { in ov5670_parse_of()
1790 ov5670->cur_mode = &supported_modes_2lane[0]; in ov5670_parse_of()
1792 ov5670->cfg_num = ARRAY_SIZE(supported_modes_2lane); in ov5670_parse_of()
1795 ov5670->pixel_rate = MIPI_FREQ * 2U * ov5670->lane_num / 8U; in ov5670_parse_of()
1797 ov5670->lane_num, ov5670->pixel_rate); in ov5670_parse_of()
1799 dev_err(dev, "unsupported lane_num(%d)\n", ov5670->lane_num); in ov5670_parse_of()
1811 struct ov5670 *ov5670; in ov5670_probe() local
1821 ov5670 = devm_kzalloc(dev, sizeof(*ov5670), GFP_KERNEL); in ov5670_probe()
1822 if (!ov5670) in ov5670_probe()
1826 &ov5670->module_index); in ov5670_probe()
1829 ov5670->module_index = 0; in ov5670_probe()
1832 &ov5670->module_facing); in ov5670_probe()
1834 &ov5670->module_name); in ov5670_probe()
1836 &ov5670->len_name); in ov5670_probe()
1842 ov5670->client = client; in ov5670_probe()
1844 ov5670->xvclk = devm_clk_get(dev, "xvclk"); in ov5670_probe()
1845 if (IS_ERR(ov5670->xvclk)) { in ov5670_probe()
1850 ov5670->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in ov5670_probe()
1851 if (IS_ERR(ov5670->power_gpio)) in ov5670_probe()
1854 ov5670->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in ov5670_probe()
1855 if (IS_ERR(ov5670->reset_gpio)) in ov5670_probe()
1858 ov5670->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in ov5670_probe()
1859 if (IS_ERR(ov5670->pwdn_gpio)) in ov5670_probe()
1862 ret = ov5670_configure_regulators(ov5670); in ov5670_probe()
1867 ret = ov5670_parse_of(ov5670); in ov5670_probe()
1871 ov5670->pinctrl = devm_pinctrl_get(dev); in ov5670_probe()
1872 if (!IS_ERR(ov5670->pinctrl)) { in ov5670_probe()
1873 ov5670->pins_default = in ov5670_probe()
1874 pinctrl_lookup_state(ov5670->pinctrl, in ov5670_probe()
1876 if (IS_ERR(ov5670->pins_default)) in ov5670_probe()
1879 ov5670->pins_sleep = in ov5670_probe()
1880 pinctrl_lookup_state(ov5670->pinctrl, in ov5670_probe()
1882 if (IS_ERR(ov5670->pins_sleep)) in ov5670_probe()
1886 mutex_init(&ov5670->mutex); in ov5670_probe()
1888 sd = &ov5670->subdev; in ov5670_probe()
1890 ret = ov5670_initialize_controls(ov5670); in ov5670_probe()
1894 ret = __ov5670_power_on(ov5670); in ov5670_probe()
1898 ret = ov5670_check_sensor_id(ov5670, client); in ov5670_probe()
1906 ov5670_otp_check_read(ov5670); in ov5670_probe()
1913 ov5670->pad.flags = MEDIA_PAD_FL_SOURCE; in ov5670_probe()
1915 ret = media_entity_pads_init(&sd->entity, 1, &ov5670->pad); in ov5670_probe()
1921 if (strcmp(ov5670->module_facing, "back") == 0) in ov5670_probe()
1927 ov5670->module_index, facing, in ov5670_probe()
1947 __ov5670_power_off(ov5670); in ov5670_probe()
1949 v4l2_ctrl_handler_free(&ov5670->ctrl_handler); in ov5670_probe()
1951 mutex_destroy(&ov5670->mutex); in ov5670_probe()
1959 struct ov5670 *ov5670 = to_ov5670(sd); in ov5670_remove() local
1965 v4l2_ctrl_handler_free(&ov5670->ctrl_handler); in ov5670_remove()
1966 mutex_destroy(&ov5670->mutex); in ov5670_remove()
1970 __ov5670_power_off(ov5670); in ov5670_remove()