Lines Matching refs:ov4689

126 struct ov4689 {  struct
159 #define to_ov4689(sd) container_of(sd, struct ov4689, subdev) argument
645 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_set_fmt() local
649 mutex_lock(&ov4689->mutex); in ov4689_set_fmt()
660 mutex_unlock(&ov4689->mutex); in ov4689_set_fmt()
664 ov4689->cur_mode = mode; in ov4689_set_fmt()
666 __v4l2_ctrl_modify_range(ov4689->hblank, h_blank, in ov4689_set_fmt()
669 __v4l2_ctrl_modify_range(ov4689->vblank, vblank_def, in ov4689_set_fmt()
674 mutex_unlock(&ov4689->mutex); in ov4689_set_fmt()
683 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_get_fmt() local
684 const struct ov4689_mode *mode = ov4689->cur_mode; in ov4689_get_fmt()
686 mutex_lock(&ov4689->mutex); in ov4689_get_fmt()
691 mutex_unlock(&ov4689->mutex); in ov4689_get_fmt()
705 mutex_unlock(&ov4689->mutex); in ov4689_get_fmt()
739 static int ov4689_enable_test_pattern(struct ov4689 *ov4689, u32 pattern) in ov4689_enable_test_pattern() argument
748 return ov4689_write_reg(ov4689->client, OV4689_REG_TEST_PATTERN, in ov4689_enable_test_pattern()
755 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_g_frame_interval() local
756 const struct ov4689_mode *mode = ov4689->cur_mode; in ov4689_g_frame_interval()
766 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_g_mbus_config() local
767 const struct ov4689_mode *mode = ov4689->cur_mode; in ov4689_g_mbus_config()
783 static void ov4689_get_module_inf(struct ov4689 *ov4689, in ov4689_get_module_inf() argument
788 strlcpy(inf->base.module, ov4689->module_name, in ov4689_get_module_inf()
790 strlcpy(inf->base.lens, ov4689->len_name, sizeof(inf->base.lens)); in ov4689_get_module_inf()
793 static int ov4689_set_hdrae(struct ov4689 *ov4689, in ov4689_set_hdrae() argument
804 if (!ov4689->has_init_exp && !ov4689->streaming) { in ov4689_set_hdrae()
805 ov4689->init_hdrae_exp = *ae; in ov4689_set_hdrae()
806 ov4689->has_init_exp = true; in ov4689_set_hdrae()
807 dev_dbg(&ov4689->client->dev, "ov4689 don't stream, record exp for hdr!\n"); in ov4689_set_hdrae()
810 dev_dbg(&ov4689->client->dev, in ov4689_set_hdrae()
821 if (ov4689->cur_mode->hdr_mode == HDR_X2) { in ov4689_set_hdrae()
827 l_exp + m_exp >= ov4689->cur_vts - 4) { in ov4689_set_hdrae()
828 dev_err(&ov4689->client->dev, in ov4689_set_hdrae()
830 l_exp, m_exp, ov4689->cur_vts); in ov4689_set_hdrae()
836 l_exp + m_exp + s_exp >= ov4689->cur_vts - 4) { in ov4689_set_hdrae()
837 dev_err(&ov4689->client->dev, in ov4689_set_hdrae()
839 l_exp, m_exp, s_exp, ov4689->cur_vts); in ov4689_set_hdrae()
844 ret = ov4689_write_reg(ov4689->client, OV4689_GROUP_UPDATE_ADDRESS, in ov4689_set_hdrae()
847 ret |= ov4689_write_reg(ov4689->client, OV4689_REG_L_GAIN, in ov4689_set_hdrae()
849 ret |= ov4689_write_reg(ov4689->client, OV4689_REG_L_EXP, in ov4689_set_hdrae()
851 ret |= ov4689_write_reg(ov4689->client, OV4689_REG_M_GAIN, in ov4689_set_hdrae()
853 ret |= ov4689_write_reg(ov4689->client, OV4689_REG_M_EXP, in ov4689_set_hdrae()
855 if (ov4689->cur_mode->hdr_mode == HDR_X3) { in ov4689_set_hdrae()
856 ret |= ov4689_write_reg(ov4689->client, OV4689_REG_S_GAIN, in ov4689_set_hdrae()
858 ret |= ov4689_write_reg(ov4689->client, OV4689_REG_S_EXP, in ov4689_set_hdrae()
861 ret |= ov4689_write_reg(ov4689->client, OV4689_GROUP_UPDATE_ADDRESS, in ov4689_set_hdrae()
863 ret |= ov4689_write_reg(ov4689->client, OV4689_GROUP_UPDATE_ADDRESS, in ov4689_set_hdrae()
870 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_ioctl() local
878 ov4689_get_module_inf(ov4689, (struct rkmodule_inf *)arg); in ov4689_ioctl()
883 hdr->hdr_mode = ov4689->cur_mode->hdr_mode; in ov4689_ioctl()
887 w = ov4689->cur_mode->width; in ov4689_ioctl()
888 h = ov4689->cur_mode->height; in ov4689_ioctl()
893 ov4689->cur_mode = &supported_modes[i]; in ov4689_ioctl()
898 dev_err(&ov4689->client->dev, in ov4689_ioctl()
903 dev_dbg(&ov4689->client->dev, in ov4689_ioctl()
905 ov4689->cur_mode->hdr_mode); in ov4689_ioctl()
906 w = ov4689->cur_mode->hts_def - ov4689->cur_mode->width; in ov4689_ioctl()
907 h = ov4689->cur_mode->vts_def - ov4689->cur_mode->height; in ov4689_ioctl()
908 __v4l2_ctrl_modify_range(ov4689->hblank, w, w, 1, w); in ov4689_ioctl()
909 __v4l2_ctrl_modify_range(ov4689->vblank, h, in ov4689_ioctl()
910 OV4689_VTS_MAX - ov4689->cur_mode->height, 1, h); in ov4689_ioctl()
914 return ov4689_set_hdrae(ov4689, arg); in ov4689_ioctl()
920 ret = ov4689_write_reg(ov4689->client, OV4689_REG_CTRL_MODE, in ov4689_ioctl()
923 ret = ov4689_write_reg(ov4689->client, OV4689_REG_CTRL_MODE, in ov4689_ioctl()
1021 static int __ov4689_start_stream(struct ov4689 *ov4689) in __ov4689_start_stream() argument
1025 ret = ov4689_write_array(ov4689->client, ov4689_2688x1520_regs); in __ov4689_start_stream()
1026 ret |= ov4689_write_array(ov4689->client, ov4689->cur_mode->reg_list); in __ov4689_start_stream()
1031 ret = __v4l2_ctrl_handler_setup(&ov4689->ctrl_handler); in __ov4689_start_stream()
1034 if (ov4689->has_init_exp && ov4689->cur_mode->hdr_mode != NO_HDR) { in __ov4689_start_stream()
1035 ret = ov4689_ioctl(&ov4689->subdev, in __ov4689_start_stream()
1037 &ov4689->init_hdrae_exp); in __ov4689_start_stream()
1039 dev_err(&ov4689->client->dev, in __ov4689_start_stream()
1045 return ov4689_write_reg(ov4689->client, OV4689_REG_CTRL_MODE, in __ov4689_start_stream()
1049 static int __ov4689_stop_stream(struct ov4689 *ov4689) in __ov4689_stop_stream() argument
1051 ov4689->has_init_exp = false; in __ov4689_stop_stream()
1052 return ov4689_write_reg(ov4689->client, OV4689_REG_CTRL_MODE, in __ov4689_stop_stream()
1058 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_s_stream() local
1059 struct i2c_client *client = ov4689->client; in ov4689_s_stream()
1062 mutex_lock(&ov4689->mutex); in ov4689_s_stream()
1064 if (on == ov4689->streaming) in ov4689_s_stream()
1074 ret = __ov4689_start_stream(ov4689); in ov4689_s_stream()
1081 __ov4689_stop_stream(ov4689); in ov4689_s_stream()
1085 ov4689->streaming = on; in ov4689_s_stream()
1088 mutex_unlock(&ov4689->mutex); in ov4689_s_stream()
1095 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_s_power() local
1096 struct i2c_client *client = ov4689->client; in ov4689_s_power()
1099 mutex_lock(&ov4689->mutex); in ov4689_s_power()
1102 if (ov4689->power_on == !!on) in ov4689_s_power()
1112 ret = ov4689_write_array(ov4689->client, ov4689_global_regs); in ov4689_s_power()
1119 ov4689->power_on = true; in ov4689_s_power()
1122 ov4689->power_on = false; in ov4689_s_power()
1126 mutex_unlock(&ov4689->mutex); in ov4689_s_power()
1137 static int __ov4689_power_on(struct ov4689 *ov4689) in __ov4689_power_on() argument
1141 struct device *dev = &ov4689->client->dev; in __ov4689_power_on()
1143 if (!IS_ERR_OR_NULL(ov4689->pins_default)) { in __ov4689_power_on()
1144 ret = pinctrl_select_state(ov4689->pinctrl, in __ov4689_power_on()
1145 ov4689->pins_default); in __ov4689_power_on()
1149 ret = clk_set_rate(ov4689->xvclk, OV4689_XVCLK_FREQ); in __ov4689_power_on()
1152 if (clk_get_rate(ov4689->xvclk) != OV4689_XVCLK_FREQ) in __ov4689_power_on()
1154 ret = clk_prepare_enable(ov4689->xvclk); in __ov4689_power_on()
1159 if (!IS_ERR(ov4689->reset_gpio)) in __ov4689_power_on()
1160 gpiod_set_value_cansleep(ov4689->reset_gpio, 1); in __ov4689_power_on()
1162 ret = regulator_bulk_enable(OV4689_NUM_SUPPLIES, ov4689->supplies); in __ov4689_power_on()
1168 if (!IS_ERR(ov4689->reset_gpio)) in __ov4689_power_on()
1169 gpiod_set_value_cansleep(ov4689->reset_gpio, 0); in __ov4689_power_on()
1172 if (!IS_ERR(ov4689->pwdn_gpio)) in __ov4689_power_on()
1173 gpiod_set_value_cansleep(ov4689->pwdn_gpio, 1); in __ov4689_power_on()
1182 clk_disable_unprepare(ov4689->xvclk); in __ov4689_power_on()
1187 static void __ov4689_power_off(struct ov4689 *ov4689) in __ov4689_power_off() argument
1190 struct device *dev = &ov4689->client->dev; in __ov4689_power_off()
1192 if (!IS_ERR(ov4689->pwdn_gpio)) in __ov4689_power_off()
1193 gpiod_set_value_cansleep(ov4689->pwdn_gpio, 0); in __ov4689_power_off()
1194 clk_disable_unprepare(ov4689->xvclk); in __ov4689_power_off()
1195 if (!IS_ERR(ov4689->reset_gpio)) in __ov4689_power_off()
1196 gpiod_set_value_cansleep(ov4689->reset_gpio, 1); in __ov4689_power_off()
1197 if (!IS_ERR_OR_NULL(ov4689->pins_sleep)) { in __ov4689_power_off()
1198 ret = pinctrl_select_state(ov4689->pinctrl, in __ov4689_power_off()
1199 ov4689->pins_sleep); in __ov4689_power_off()
1203 regulator_bulk_disable(OV4689_NUM_SUPPLIES, ov4689->supplies); in __ov4689_power_off()
1210 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_runtime_resume() local
1212 return __ov4689_power_on(ov4689); in ov4689_runtime_resume()
1219 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_runtime_suspend() local
1221 __ov4689_power_off(ov4689); in ov4689_runtime_suspend()
1229 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_open() local
1234 mutex_lock(&ov4689->mutex); in ov4689_open()
1241 mutex_unlock(&ov4689->mutex); in ov4689_open()
1304 struct ov4689 *ov4689 = container_of(ctrl->handler, in ov4689_set_ctrl() local
1305 struct ov4689, ctrl_handler); in ov4689_set_ctrl()
1306 struct i2c_client *client = ov4689->client; in ov4689_set_ctrl()
1314 max = ov4689->cur_mode->height + ctrl->val - 4; in ov4689_set_ctrl()
1315 __v4l2_ctrl_modify_range(ov4689->exposure, in ov4689_set_ctrl()
1316 ov4689->exposure->minimum, max, in ov4689_set_ctrl()
1317 ov4689->exposure->step, in ov4689_set_ctrl()
1318 ov4689->exposure->default_value); in ov4689_set_ctrl()
1328 ret = ov4689_write_reg(ov4689->client, OV4689_REG_EXPOSURE, in ov4689_set_ctrl()
1334 ret = ov4689_write_reg(ov4689->client, OV4689_REG_GAIN_H, in ov4689_set_ctrl()
1337 ret |= ov4689_write_reg(ov4689->client, OV4689_REG_GAIN_L, in ov4689_set_ctrl()
1344 ret = ov4689_write_reg(ov4689->client, OV4689_REG_VTS, in ov4689_set_ctrl()
1346 ctrl->val + ov4689->cur_mode->height); in ov4689_set_ctrl()
1347 ov4689->cur_vts = ctrl->val + ov4689->cur_mode->height; in ov4689_set_ctrl()
1349 __func__, ov4689->cur_vts); in ov4689_set_ctrl()
1352 ret = ov4689_enable_test_pattern(ov4689, ctrl->val); in ov4689_set_ctrl()
1369 static int ov4689_initialize_controls(struct ov4689 *ov4689) in ov4689_initialize_controls() argument
1378 handler = &ov4689->ctrl_handler; in ov4689_initialize_controls()
1379 mode = ov4689->cur_mode; in ov4689_initialize_controls()
1383 handler->lock = &ov4689->mutex; in ov4689_initialize_controls()
1394 ov4689->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov4689_initialize_controls()
1396 if (ov4689->hblank) in ov4689_initialize_controls()
1397 ov4689->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov4689_initialize_controls()
1400 ov4689->vblank = v4l2_ctrl_new_std(handler, &ov4689_ctrl_ops, in ov4689_initialize_controls()
1404 ov4689->cur_vts = mode->vts_def; in ov4689_initialize_controls()
1407 ov4689->exposure = v4l2_ctrl_new_std(handler, &ov4689_ctrl_ops, in ov4689_initialize_controls()
1412 ov4689->anal_gain = v4l2_ctrl_new_std(handler, &ov4689_ctrl_ops, in ov4689_initialize_controls()
1417 ov4689->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov4689_initialize_controls()
1424 dev_err(&ov4689->client->dev, in ov4689_initialize_controls()
1429 ov4689->subdev.ctrl_handler = handler; in ov4689_initialize_controls()
1430 ov4689->has_init_exp = false; in ov4689_initialize_controls()
1440 static int ov4689_check_sensor_id(struct ov4689 *ov4689, in ov4689_check_sensor_id() argument
1443 struct device *dev = &ov4689->client->dev; in ov4689_check_sensor_id()
1459 static int ov4689_configure_regulators(struct ov4689 *ov4689) in ov4689_configure_regulators() argument
1464 ov4689->supplies[i].supply = ov4689_supply_names[i]; in ov4689_configure_regulators()
1466 return devm_regulator_bulk_get(&ov4689->client->dev, in ov4689_configure_regulators()
1468 ov4689->supplies); in ov4689_configure_regulators()
1476 struct ov4689 *ov4689; in ov4689_probe() local
1487 ov4689 = devm_kzalloc(dev, sizeof(*ov4689), GFP_KERNEL); in ov4689_probe()
1488 if (!ov4689) in ov4689_probe()
1493 &ov4689->module_index); in ov4689_probe()
1495 &ov4689->module_facing); in ov4689_probe()
1497 &ov4689->module_name); in ov4689_probe()
1499 &ov4689->len_name); in ov4689_probe()
1505 ov4689->client = client; in ov4689_probe()
1508 ov4689->cur_mode = &supported_modes[i]; in ov4689_probe()
1513 ov4689->cur_mode = &supported_modes[0]; in ov4689_probe()
1515 ov4689->xvclk = devm_clk_get(dev, "xvclk"); in ov4689_probe()
1516 if (IS_ERR(ov4689->xvclk)) { in ov4689_probe()
1521 ov4689->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in ov4689_probe()
1522 if (IS_ERR(ov4689->reset_gpio)) in ov4689_probe()
1525 ov4689->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in ov4689_probe()
1526 if (IS_ERR(ov4689->pwdn_gpio)) in ov4689_probe()
1529 ov4689->pinctrl = devm_pinctrl_get(dev); in ov4689_probe()
1530 if (!IS_ERR(ov4689->pinctrl)) { in ov4689_probe()
1531 ov4689->pins_default = in ov4689_probe()
1532 pinctrl_lookup_state(ov4689->pinctrl, in ov4689_probe()
1534 if (IS_ERR(ov4689->pins_default)) in ov4689_probe()
1537 ov4689->pins_sleep = in ov4689_probe()
1538 pinctrl_lookup_state(ov4689->pinctrl, in ov4689_probe()
1540 if (IS_ERR(ov4689->pins_sleep)) in ov4689_probe()
1546 ret = ov4689_configure_regulators(ov4689); in ov4689_probe()
1552 mutex_init(&ov4689->mutex); in ov4689_probe()
1554 sd = &ov4689->subdev; in ov4689_probe()
1556 ret = ov4689_initialize_controls(ov4689); in ov4689_probe()
1560 ret = __ov4689_power_on(ov4689); in ov4689_probe()
1564 ret = ov4689_check_sensor_id(ov4689, client); in ov4689_probe()
1574 ov4689->pad.flags = MEDIA_PAD_FL_SOURCE; in ov4689_probe()
1576 ret = media_entity_pads_init(&sd->entity, 1, &ov4689->pad); in ov4689_probe()
1582 if (strcmp(ov4689->module_facing, "back") == 0) in ov4689_probe()
1588 ov4689->module_index, facing, in ov4689_probe()
1607 __ov4689_power_off(ov4689); in ov4689_probe()
1609 v4l2_ctrl_handler_free(&ov4689->ctrl_handler); in ov4689_probe()
1611 mutex_destroy(&ov4689->mutex); in ov4689_probe()
1619 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_remove() local
1625 v4l2_ctrl_handler_free(&ov4689->ctrl_handler); in ov4689_remove()
1626 mutex_destroy(&ov4689->mutex); in ov4689_remove()
1630 __ov4689_power_off(ov4689); in ov4689_remove()