Lines Matching refs:ov2735
126 struct ov2735 { struct
152 #define to_ov2735(sd) container_of(sd, struct ov2735, subdev) argument
418 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_set_fmt() local
422 mutex_lock(&ov2735->mutex); in ov2735_set_fmt()
433 mutex_unlock(&ov2735->mutex); in ov2735_set_fmt()
437 ov2735->cur_mode = mode; in ov2735_set_fmt()
439 __v4l2_ctrl_modify_range(ov2735->hblank, h_blank, in ov2735_set_fmt()
442 __v4l2_ctrl_modify_range(ov2735->vblank, vblank_def, in ov2735_set_fmt()
447 mutex_unlock(&ov2735->mutex); in ov2735_set_fmt()
456 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_get_fmt() local
457 const struct ov2735_mode *mode = ov2735->cur_mode; in ov2735_get_fmt()
459 mutex_lock(&ov2735->mutex); in ov2735_get_fmt()
464 mutex_unlock(&ov2735->mutex); in ov2735_get_fmt()
473 mutex_unlock(&ov2735->mutex); in ov2735_get_fmt()
507 static int ov2735_enable_test_pattern(struct ov2735 *ov2735, u32 pattern) in ov2735_enable_test_pattern() argument
512 ret = ov2735_read_reg(ov2735->client, OV2735_REG_TEST_PATTERN, &val); in ov2735_enable_test_pattern()
525 return ov2735_write_reg(ov2735->client, in ov2735_enable_test_pattern()
530 static void ov2735_get_module_inf(struct ov2735 *ov2735, in ov2735_get_module_inf() argument
535 strlcpy(inf->base.module, ov2735->module_name, in ov2735_get_module_inf()
537 strlcpy(inf->base.lens, ov2735->len_name, sizeof(inf->base.lens)); in ov2735_get_module_inf()
542 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_ioctl() local
548 ov2735_get_module_inf(ov2735, (struct rkmodule_inf *)arg); in ov2735_ioctl()
555 ret = ov2735_write_reg(ov2735->client, PAGE_SELECT_REG, PAGE_ONE); in ov2735_ioctl()
556 ret |= ov2735_write_reg(ov2735->client, STREAM_CTRL_REG, STREAM_ON); in ov2735_ioctl()
558 ret = ov2735_write_reg(ov2735->client, PAGE_SELECT_REG, PAGE_ONE); in ov2735_ioctl()
559 ret |= ov2735_write_reg(ov2735->client, STREAM_CTRL_REG, STREAM_OFF); in ov2735_ioctl()
619 static int __ov2735_start_stream(struct ov2735 *ov2735) in __ov2735_start_stream() argument
623 ret = ov2735_write_array(ov2735->client, ov2735->cur_mode->reg_list); in __ov2735_start_stream()
626 ret = ov2735_write_reg(ov2735->client, PAGE_SELECT_REG, PAGE_ONE); in __ov2735_start_stream()
630 mutex_unlock(&ov2735->mutex); in __ov2735_start_stream()
631 ret = v4l2_ctrl_handler_setup(&ov2735->ctrl_handler); in __ov2735_start_stream()
632 mutex_lock(&ov2735->mutex); in __ov2735_start_stream()
636 ret |= ov2735_write_reg(ov2735->client, STREAM_CTRL_REG, STREAM_ON); in __ov2735_start_stream()
641 static int __ov2735_stop_stream(struct ov2735 *ov2735) in __ov2735_stop_stream() argument
645 ret = ov2735_write_reg(ov2735->client, PAGE_SELECT_REG, PAGE_ONE); in __ov2735_stop_stream()
646 ret |= ov2735_write_reg(ov2735->client, STREAM_CTRL_REG, STREAM_OFF); in __ov2735_stop_stream()
653 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_s_stream() local
654 struct i2c_client *client = ov2735->client; in ov2735_s_stream()
657 mutex_lock(&ov2735->mutex); in ov2735_s_stream()
659 if (on == ov2735->streaming) in ov2735_s_stream()
669 ret = __ov2735_start_stream(ov2735); in ov2735_s_stream()
676 __ov2735_stop_stream(ov2735); in ov2735_s_stream()
680 ov2735->streaming = on; in ov2735_s_stream()
683 mutex_unlock(&ov2735->mutex); in ov2735_s_stream()
690 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_s_power() local
691 struct i2c_client *client = ov2735->client; in ov2735_s_power()
694 mutex_lock(&ov2735->mutex); in ov2735_s_power()
697 if (ov2735->power_on == !!on) in ov2735_s_power()
707 ret = ov2735_write_array(ov2735->client, ov2735_global_regs); in ov2735_s_power()
714 ov2735->power_on = true; in ov2735_s_power()
717 ov2735->power_on = false; in ov2735_s_power()
721 mutex_unlock(&ov2735->mutex); in ov2735_s_power()
732 static int __ov2735_power_on(struct ov2735 *ov2735) in __ov2735_power_on() argument
736 struct device *dev = &ov2735->client->dev; in __ov2735_power_on()
738 if (!IS_ERR(ov2735->pwdn_gpio)) { in __ov2735_power_on()
739 gpiod_set_value_cansleep(ov2735->pwdn_gpio, 1); in __ov2735_power_on()
743 ret = regulator_bulk_enable(OV2735_NUM_SUPPLIES, ov2735->supplies); in __ov2735_power_on()
750 if (!IS_ERR(ov2735->pwdn_gpio)) { in __ov2735_power_on()
751 gpiod_set_value_cansleep(ov2735->pwdn_gpio, 0); in __ov2735_power_on()
755 if (!IS_ERR(ov2735->reset_gpio)) { in __ov2735_power_on()
756 gpiod_set_value_cansleep(ov2735->reset_gpio, 1); in __ov2735_power_on()
759 ret = clk_set_rate(ov2735->xvclk, OV2735_XVCLK_FREQ); in __ov2735_power_on()
762 if (clk_get_rate(ov2735->xvclk) != OV2735_XVCLK_FREQ) in __ov2735_power_on()
764 ret = clk_prepare_enable(ov2735->xvclk); in __ov2735_power_on()
775 clk_disable_unprepare(ov2735->xvclk); in __ov2735_power_on()
780 static void __ov2735_power_off(struct ov2735 *ov2735) in __ov2735_power_off() argument
782 if (!IS_ERR(ov2735->pwdn_gpio)) in __ov2735_power_off()
783 gpiod_set_value_cansleep(ov2735->pwdn_gpio, 0); in __ov2735_power_off()
784 clk_disable_unprepare(ov2735->xvclk); in __ov2735_power_off()
785 if (!IS_ERR(ov2735->reset_gpio)) in __ov2735_power_off()
786 gpiod_set_value_cansleep(ov2735->reset_gpio, 1); in __ov2735_power_off()
787 regulator_bulk_disable(OV2735_NUM_SUPPLIES, ov2735->supplies); in __ov2735_power_off()
794 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_runtime_resume() local
796 return __ov2735_power_on(ov2735); in ov2735_runtime_resume()
803 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_runtime_suspend() local
805 __ov2735_power_off(ov2735); in ov2735_runtime_suspend()
813 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_open() local
818 mutex_lock(&ov2735->mutex); in ov2735_open()
825 mutex_unlock(&ov2735->mutex); in ov2735_open()
900 struct ov2735 *ov2735 = container_of(ctrl->handler, in ov2735_set_ctrl() local
901 struct ov2735, ctrl_handler); in ov2735_set_ctrl()
902 struct i2c_client *client = ov2735->client; in ov2735_set_ctrl()
910 max = ov2735->cur_mode->height + ctrl->val - 4; in ov2735_set_ctrl()
911 __v4l2_ctrl_modify_range(ov2735->exposure, in ov2735_set_ctrl()
912 ov2735->exposure->minimum, max, in ov2735_set_ctrl()
913 ov2735->exposure->step, in ov2735_set_ctrl()
914 ov2735->exposure->default_value); in ov2735_set_ctrl()
938 (ctrl->val + ov2735->cur_mode->height) & 0xFF); in ov2735_set_ctrl()
940 ((ctrl->val + ov2735->cur_mode->height) >> 8) & 0x0F); in ov2735_set_ctrl()
943 ret = ov2735_enable_test_pattern(ov2735, ctrl->val); in ov2735_set_ctrl()
963 static int ov2735_initialize_controls(struct ov2735 *ov2735) in ov2735_initialize_controls() argument
972 handler = &ov2735->ctrl_handler; in ov2735_initialize_controls()
973 mode = ov2735->cur_mode; in ov2735_initialize_controls()
977 handler->lock = &ov2735->mutex; in ov2735_initialize_controls()
988 ov2735->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov2735_initialize_controls()
990 if (ov2735->hblank) in ov2735_initialize_controls()
991 ov2735->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov2735_initialize_controls()
994 ov2735->vblank = v4l2_ctrl_new_std(handler, &ov2735_ctrl_ops, in ov2735_initialize_controls()
1000 ov2735->exposure = v4l2_ctrl_new_std(handler, &ov2735_ctrl_ops, in ov2735_initialize_controls()
1005 ov2735->anal_gain = v4l2_ctrl_new_std(handler, &ov2735_ctrl_ops, in ov2735_initialize_controls()
1010 ov2735->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov2735_initialize_controls()
1017 dev_err(&ov2735->client->dev, in ov2735_initialize_controls()
1022 ov2735->subdev.ctrl_handler = handler; in ov2735_initialize_controls()
1032 static int ov2735_check_sensor_id(struct ov2735 *ov2735, in ov2735_check_sensor_id() argument
1035 struct device *dev = &ov2735->client->dev; in ov2735_check_sensor_id()
1040 ret = ov2735_write_reg(ov2735->client, PAGE_SELECT_REG, PAGE_ZERO); in ov2735_check_sensor_id()
1041 ret |= ov2735_read_reg(ov2735->client, OV2735_PIDH_ADDR, &pidh); in ov2735_check_sensor_id()
1042 ret |= ov2735_read_reg(ov2735->client, OV2735_PIDL_ADDR, &pidl); in ov2735_check_sensor_id()
1066 static int ov2735_configure_regulators(struct ov2735 *ov2735) in ov2735_configure_regulators() argument
1071 ov2735->supplies[i].supply = ov2735_supply_names[i]; in ov2735_configure_regulators()
1073 return devm_regulator_bulk_get(&ov2735->client->dev, in ov2735_configure_regulators()
1075 ov2735->supplies); in ov2735_configure_regulators()
1083 struct ov2735 *ov2735; in ov2735_probe() local
1093 ov2735 = devm_kzalloc(dev, sizeof(*ov2735), GFP_KERNEL); in ov2735_probe()
1094 if (!ov2735) in ov2735_probe()
1098 &ov2735->module_index); in ov2735_probe()
1100 &ov2735->module_facing); in ov2735_probe()
1102 &ov2735->module_name); in ov2735_probe()
1104 &ov2735->len_name); in ov2735_probe()
1110 ov2735->client = client; in ov2735_probe()
1111 ov2735->cur_mode = &supported_modes[0]; in ov2735_probe()
1113 ov2735->xvclk = devm_clk_get(dev, "xvclk"); in ov2735_probe()
1114 if (IS_ERR(ov2735->xvclk)) { in ov2735_probe()
1119 ov2735->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in ov2735_probe()
1120 if (IS_ERR(ov2735->reset_gpio)) in ov2735_probe()
1123 ov2735->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in ov2735_probe()
1124 if (IS_ERR(ov2735->pwdn_gpio)) in ov2735_probe()
1127 ret = ov2735_configure_regulators(ov2735); in ov2735_probe()
1133 mutex_init(&ov2735->mutex); in ov2735_probe()
1135 sd = &ov2735->subdev; in ov2735_probe()
1137 ret = ov2735_initialize_controls(ov2735); in ov2735_probe()
1141 ret = __ov2735_power_on(ov2735); in ov2735_probe()
1145 ret = ov2735_check_sensor_id(ov2735, client); in ov2735_probe()
1155 ov2735->pad.flags = MEDIA_PAD_FL_SOURCE; in ov2735_probe()
1157 ret = media_entity_pads_init(&sd->entity, 1, &ov2735->pad); in ov2735_probe()
1163 if (strcmp(ov2735->module_facing, "back") == 0) in ov2735_probe()
1169 ov2735->module_index, facing, in ov2735_probe()
1188 __ov2735_power_off(ov2735); in ov2735_probe()
1190 v4l2_ctrl_handler_free(&ov2735->ctrl_handler); in ov2735_probe()
1192 mutex_destroy(&ov2735->mutex); in ov2735_probe()
1200 struct ov2735 *ov2735 = to_ov2735(sd); in ov2735_remove() local
1206 v4l2_ctrl_handler_free(&ov2735->ctrl_handler); in ov2735_remove()
1207 mutex_destroy(&ov2735->mutex); in ov2735_remove()
1211 __ov2735_power_off(ov2735); in ov2735_remove()