Lines Matching full:ov4689

3  * ov4689 driver
90 struct ov4689 { struct
110 #define to_ov4689(sd) container_of(sd, struct ov4689, subdev) argument
372 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_set_fmt() local
375 ov4689_fill_fmt(ov4689->cur_mode, mbus_fmt); in ov4689_set_fmt()
385 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_get_fmt() local
388 ov4689_fill_fmt(ov4689->cur_mode, mbus_fmt); in ov4689_get_fmt()
422 static int ov4689_enable_test_pattern(struct ov4689 *ov4689, u32 pattern) in ov4689_enable_test_pattern() argument
431 return ov4689_write_reg(ov4689->client, OV4689_REG_TEST_PATTERN, in ov4689_enable_test_pattern()
465 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_s_stream() local
466 struct i2c_client *client = ov4689->client; in ov4689_s_stream()
469 mutex_lock(&ov4689->mutex); in ov4689_s_stream()
472 if (on == ov4689->streaming) in ov4689_s_stream()
480 ret = ov4689_write_array(ov4689->client, in ov4689_s_stream()
481 ov4689->cur_mode->reg_list); in ov4689_s_stream()
487 ret = __v4l2_ctrl_handler_setup(&ov4689->ctrl_handler); in ov4689_s_stream()
493 ret = ov4689_write_reg(ov4689->client, OV4689_REG_CTRL_MODE, in ov4689_s_stream()
501 ov4689_write_reg(ov4689->client, OV4689_REG_CTRL_MODE, in ov4689_s_stream()
507 ov4689->streaming = on; in ov4689_s_stream()
510 mutex_unlock(&ov4689->mutex); in ov4689_s_stream()
516 static inline u32 ov4689_cal_delay(struct ov4689 *ov4689, u32 cycles) in ov4689_cal_delay() argument
519 DIV_ROUND_UP(ov4689->clock_rate, 1000)); in ov4689_cal_delay()
525 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_power_on() local
529 ret = clk_prepare_enable(ov4689->xvclk); in ov4689_power_on()
535 gpiod_set_value_cansleep(ov4689->reset_gpio, 1); in ov4689_power_on()
538 ov4689->supplies); in ov4689_power_on()
544 gpiod_set_value_cansleep(ov4689->reset_gpio, 0); in ov4689_power_on()
546 gpiod_set_value_cansleep(ov4689->pwdn_gpio, 0); in ov4689_power_on()
549 delay_us = ov4689_cal_delay(ov4689, 8192); in ov4689_power_on()
555 clk_disable_unprepare(ov4689->xvclk); in ov4689_power_on()
563 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_power_off() local
565 gpiod_set_value_cansleep(ov4689->pwdn_gpio, 1); in ov4689_power_off()
566 clk_disable_unprepare(ov4689->xvclk); in ov4689_power_off()
567 gpiod_set_value_cansleep(ov4689->reset_gpio, 1); in ov4689_power_off()
569 ov4689->supplies); in ov4689_power_off()
575 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_open() local
578 mutex_lock(&ov4689->mutex); in ov4689_open()
584 mutex_unlock(&ov4689->mutex); in ov4689_open()
618 static int ov4689_map_gain(struct ov4689 *ov4689, int logical_gain, int *result) in ov4689_map_gain() argument
620 const struct device *dev = &ov4689->client->dev; in ov4689_map_gain()
645 struct ov4689 *ov4689 = in ov4689_set_ctrl() local
646 container_of(ctrl->handler, struct ov4689, ctrl_handler); in ov4689_set_ctrl()
647 struct i2c_client *client = ov4689->client; in ov4689_set_ctrl()
656 max_expo = ov4689->cur_mode->height + ctrl->val - 4; in ov4689_set_ctrl()
657 __v4l2_ctrl_modify_range(ov4689->exposure, in ov4689_set_ctrl()
658 ov4689->exposure->minimum, max_expo, in ov4689_set_ctrl()
659 ov4689->exposure->step, in ov4689_set_ctrl()
660 ov4689->exposure->default_value); in ov4689_set_ctrl()
670 ret = ov4689_write_reg(ov4689->client, OV4689_REG_EXPOSURE, in ov4689_set_ctrl()
674 ret = ov4689_map_gain(ov4689, ctrl->val, &sensor_gain); in ov4689_set_ctrl()
677 ov4689_write_reg(ov4689->client, OV4689_REG_GAIN_H, in ov4689_set_ctrl()
682 ov4689_write_reg(ov4689->client, OV4689_REG_GAIN_L, in ov4689_set_ctrl()
687 ret = ov4689_write_reg(ov4689->client, OV4689_REG_VTS, in ov4689_set_ctrl()
689 ctrl->val + ov4689->cur_mode->height); in ov4689_set_ctrl()
692 ret = ov4689_enable_test_pattern(ov4689, ctrl->val); in ov4689_set_ctrl()
710 static int ov4689_initialize_controls(struct ov4689 *ov4689) in ov4689_initialize_controls() argument
712 struct i2c_client *client = v4l2_get_subdevdata(&ov4689->subdev); in ov4689_initialize_controls()
721 handler = &ov4689->ctrl_handler; in ov4689_initialize_controls()
722 mode = ov4689->cur_mode; in ov4689_initialize_controls()
726 handler->lock = &ov4689->mutex; in ov4689_initialize_controls()
748 ov4689->exposure = in ov4689_initialize_controls()
766 dev_err(&ov4689->client->dev, "Failed to init controls(%d)\n", in ov4689_initialize_controls()
780 ov4689->subdev.ctrl_handler = handler; in ov4689_initialize_controls()
790 static int ov4689_check_sensor_id(struct ov4689 *ov4689, in ov4689_check_sensor_id() argument
793 struct device *dev = &ov4689->client->dev; in ov4689_check_sensor_id()
815 static int ov4689_configure_regulators(struct ov4689 *ov4689) in ov4689_configure_regulators() argument
820 ov4689->supplies[i].supply = ov4689_supply_names[i]; in ov4689_configure_regulators()
822 return devm_regulator_bulk_get(&ov4689->client->dev, in ov4689_configure_regulators()
824 ov4689->supplies); in ov4689_configure_regulators()
880 struct ov4689 *ov4689; in ov4689_probe() local
887 ov4689 = devm_kzalloc(dev, sizeof(*ov4689), GFP_KERNEL); in ov4689_probe()
888 if (!ov4689) in ov4689_probe()
891 ov4689->client = client; in ov4689_probe()
892 ov4689->cur_mode = &supported_modes[OV4689_MODE_2688_1520]; in ov4689_probe()
894 ov4689->xvclk = devm_clk_get_optional(dev, NULL); in ov4689_probe()
895 if (IS_ERR(ov4689->xvclk)) in ov4689_probe()
896 return dev_err_probe(dev, PTR_ERR(ov4689->xvclk), in ov4689_probe()
899 if (!ov4689->xvclk) { in ov4689_probe()
903 &ov4689->clock_rate); in ov4689_probe()
905 ov4689->clock_rate = clk_get_rate(ov4689->xvclk); in ov4689_probe()
908 if (ov4689->clock_rate != OV4689_XVCLK_FREQ) { in ov4689_probe()
911 ov4689->clock_rate, OV4689_XVCLK_FREQ); in ov4689_probe()
915 ov4689->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov4689_probe()
917 if (IS_ERR(ov4689->reset_gpio)) { in ov4689_probe()
919 return PTR_ERR(ov4689->reset_gpio); in ov4689_probe()
922 ov4689->pwdn_gpio = devm_gpiod_get_optional(dev, "pwdn", GPIOD_OUT_LOW); in ov4689_probe()
923 if (IS_ERR(ov4689->pwdn_gpio)) { in ov4689_probe()
925 return PTR_ERR(ov4689->pwdn_gpio); in ov4689_probe()
928 ret = ov4689_configure_regulators(ov4689); in ov4689_probe()
933 mutex_init(&ov4689->mutex); in ov4689_probe()
935 sd = &ov4689->subdev; in ov4689_probe()
937 ret = ov4689_initialize_controls(ov4689); in ov4689_probe()
945 ret = ov4689_check_sensor_id(ov4689, client); in ov4689_probe()
952 ov4689->pad.flags = MEDIA_PAD_FL_SOURCE; in ov4689_probe()
954 ret = media_entity_pads_init(&sd->entity, 1, &ov4689->pad); in ov4689_probe()
975 v4l2_ctrl_handler_free(&ov4689->ctrl_handler); in ov4689_probe()
977 mutex_destroy(&ov4689->mutex); in ov4689_probe()
985 struct ov4689 *ov4689 = to_ov4689(sd); in ov4689_remove() local
990 v4l2_ctrl_handler_free(&ov4689->ctrl_handler); in ov4689_remove()
991 mutex_destroy(&ov4689->mutex); in ov4689_remove()
1000 { .compatible = "ovti,ov4689" },
1007 .name = "ov4689",
1017 MODULE_DESCRIPTION("OmniVision ov4689 sensor driver");