Lines Matching full:sensor

3  * Omnivision OV2680 CMOS Image Sensor driver
7 * Based on OV5640 Sensor Driver
186 static struct device *ov2680_to_dev(struct ov2680_dev *sensor) in ov2680_to_dev() argument
188 return &sensor->i2c_client->dev; in ov2680_to_dev()
197 static int __ov2680_write_reg(struct ov2680_dev *sensor, u16 reg, in __ov2680_write_reg() argument
200 struct i2c_client *client = sensor->i2c_client; in __ov2680_write_reg()
227 static int __ov2680_read_reg(struct ov2680_dev *sensor, u16 reg, in __ov2680_read_reg() argument
230 struct i2c_client *client = sensor->i2c_client; in __ov2680_read_reg()
269 static int ov2680_mod_reg(struct ov2680_dev *sensor, u16 reg, u8 mask, u8 val) in ov2680_mod_reg() argument
274 ret = ov2680_read_reg(sensor, reg, &readval); in ov2680_mod_reg()
282 return ov2680_write_reg(sensor, reg, val); in ov2680_mod_reg()
285 static int ov2680_load_regs(struct ov2680_dev *sensor, in ov2680_load_regs() argument
298 ret = ov2680_write_reg(sensor, reg_addr, val); in ov2680_load_regs()
306 static void ov2680_power_up(struct ov2680_dev *sensor) in ov2680_power_up() argument
308 if (!sensor->reset_gpio) in ov2680_power_up()
311 gpiod_set_value(sensor->reset_gpio, 0); in ov2680_power_up()
315 static void ov2680_power_down(struct ov2680_dev *sensor) in ov2680_power_down() argument
317 if (!sensor->reset_gpio) in ov2680_power_down()
320 gpiod_set_value(sensor->reset_gpio, 1); in ov2680_power_down()
324 static int ov2680_bayer_order(struct ov2680_dev *sensor) in ov2680_bayer_order() argument
331 ret = ov2680_read_reg(sensor, OV2680_REG_FORMAT1, &format1); in ov2680_bayer_order()
335 ret = ov2680_read_reg(sensor, OV2680_REG_FORMAT2, &format2); in ov2680_bayer_order()
341 sensor->fmt.code = ov2680_hv_flip_bayer_order[hv_flip]; in ov2680_bayer_order()
346 static int ov2680_vflip_enable(struct ov2680_dev *sensor) in ov2680_vflip_enable() argument
350 ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1, BIT(2), BIT(2)); in ov2680_vflip_enable()
354 return ov2680_bayer_order(sensor); in ov2680_vflip_enable()
357 static int ov2680_vflip_disable(struct ov2680_dev *sensor) in ov2680_vflip_disable() argument
361 ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1, BIT(2), BIT(0)); in ov2680_vflip_disable()
365 return ov2680_bayer_order(sensor); in ov2680_vflip_disable()
368 static int ov2680_hflip_enable(struct ov2680_dev *sensor) in ov2680_hflip_enable() argument
372 ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2, BIT(2), BIT(2)); in ov2680_hflip_enable()
376 return ov2680_bayer_order(sensor); in ov2680_hflip_enable()
379 static int ov2680_hflip_disable(struct ov2680_dev *sensor) in ov2680_hflip_disable() argument
383 ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2, BIT(2), BIT(0)); in ov2680_hflip_disable()
387 return ov2680_bayer_order(sensor); in ov2680_hflip_disable()
390 static int ov2680_test_pattern_set(struct ov2680_dev *sensor, int value) in ov2680_test_pattern_set() argument
395 return ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, BIT(7), 0); in ov2680_test_pattern_set()
397 ret = ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, 0x03, value - 1); in ov2680_test_pattern_set()
401 ret = ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, BIT(7), BIT(7)); in ov2680_test_pattern_set()
408 static int ov2680_gain_set(struct ov2680_dev *sensor, bool auto_gain) in ov2680_gain_set() argument
410 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_gain_set()
414 ret = ov2680_mod_reg(sensor, OV2680_REG_R_MANUAL, BIT(1), in ov2680_gain_set()
424 ret = ov2680_write_reg16(sensor, OV2680_REG_GAIN_PK, gain); in ov2680_gain_set()
429 static int ov2680_gain_get(struct ov2680_dev *sensor) in ov2680_gain_get() argument
434 ret = ov2680_read_reg16(sensor, OV2680_REG_GAIN_PK, &gain); in ov2680_gain_get()
441 static int ov2680_exposure_set(struct ov2680_dev *sensor, bool auto_exp) in ov2680_exposure_set() argument
443 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_exposure_set()
447 ret = ov2680_mod_reg(sensor, OV2680_REG_R_MANUAL, BIT(0), in ov2680_exposure_set()
458 return ov2680_write_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH, exp); in ov2680_exposure_set()
461 static int ov2680_exposure_get(struct ov2680_dev *sensor) in ov2680_exposure_get() argument
466 ret = ov2680_read_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH, &exp); in ov2680_exposure_get()
473 static int ov2680_stream_enable(struct ov2680_dev *sensor) in ov2680_stream_enable() argument
475 return ov2680_write_reg(sensor, OV2680_REG_STREAM_CTRL, 1); in ov2680_stream_enable()
478 static int ov2680_stream_disable(struct ov2680_dev *sensor) in ov2680_stream_disable() argument
480 return ov2680_write_reg(sensor, OV2680_REG_STREAM_CTRL, 0); in ov2680_stream_disable()
483 static int ov2680_mode_set(struct ov2680_dev *sensor) in ov2680_mode_set() argument
485 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_mode_set()
488 ret = ov2680_gain_set(sensor, false); in ov2680_mode_set()
492 ret = ov2680_exposure_set(sensor, false); in ov2680_mode_set()
496 ret = ov2680_load_regs(sensor, sensor->current_mode); in ov2680_mode_set()
501 ret = ov2680_gain_set(sensor, true); in ov2680_mode_set()
507 ret = ov2680_exposure_set(sensor, true); in ov2680_mode_set()
512 sensor->mode_pending_changes = false; in ov2680_mode_set()
517 static int ov2680_mode_restore(struct ov2680_dev *sensor) in ov2680_mode_restore() argument
521 ret = ov2680_load_regs(sensor, &ov2680_mode_init_data); in ov2680_mode_restore()
525 return ov2680_mode_set(sensor); in ov2680_mode_restore()
528 static int ov2680_power_off(struct ov2680_dev *sensor) in ov2680_power_off() argument
530 if (!sensor->is_enabled) in ov2680_power_off()
533 clk_disable_unprepare(sensor->xvclk); in ov2680_power_off()
534 ov2680_power_down(sensor); in ov2680_power_off()
535 regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies); in ov2680_power_off()
536 sensor->is_enabled = false; in ov2680_power_off()
541 static int ov2680_power_on(struct ov2680_dev *sensor) in ov2680_power_on() argument
543 struct device *dev = ov2680_to_dev(sensor); in ov2680_power_on()
546 if (sensor->is_enabled) in ov2680_power_on()
549 ret = regulator_bulk_enable(OV2680_NUM_SUPPLIES, sensor->supplies); in ov2680_power_on()
555 if (!sensor->reset_gpio) { in ov2680_power_on()
556 ret = ov2680_write_reg(sensor, OV2680_REG_SOFT_RESET, 0x01); in ov2680_power_on()
558 dev_err(dev, "sensor soft reset failed\n"); in ov2680_power_on()
563 ov2680_power_down(sensor); in ov2680_power_on()
564 ov2680_power_up(sensor); in ov2680_power_on()
567 ret = clk_prepare_enable(sensor->xvclk); in ov2680_power_on()
571 sensor->is_enabled = true; in ov2680_power_on()
574 ov2680_stream_enable(sensor); in ov2680_power_on()
576 ov2680_stream_disable(sensor); in ov2680_power_on()
583 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_power() local
586 mutex_lock(&sensor->lock); in ov2680_s_power()
589 ret = ov2680_power_on(sensor); in ov2680_s_power()
591 ret = ov2680_power_off(sensor); in ov2680_s_power()
593 mutex_unlock(&sensor->lock); in ov2680_s_power()
596 ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler); in ov2680_s_power()
600 ret = ov2680_mode_restore(sensor); in ov2680_s_power()
609 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_g_frame_interval() local
611 mutex_lock(&sensor->lock); in ov2680_s_g_frame_interval()
612 fi->interval = sensor->frame_interval; in ov2680_s_g_frame_interval()
613 mutex_unlock(&sensor->lock); in ov2680_s_g_frame_interval()
620 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_stream() local
623 mutex_lock(&sensor->lock); in ov2680_s_stream()
625 if (sensor->is_streaming == !!enable) in ov2680_s_stream()
628 if (enable && sensor->mode_pending_changes) { in ov2680_s_stream()
629 ret = ov2680_mode_set(sensor); in ov2680_s_stream()
635 ret = ov2680_stream_enable(sensor); in ov2680_s_stream()
637 ret = ov2680_stream_disable(sensor); in ov2680_s_stream()
639 sensor->is_streaming = !!enable; in ov2680_s_stream()
642 mutex_unlock(&sensor->lock); in ov2680_s_stream()
651 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_enum_mbus_code() local
656 code->code = sensor->fmt.code; in ov2680_enum_mbus_code()
665 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_get_fmt() local
672 mutex_lock(&sensor->lock); in ov2680_get_fmt()
676 fmt = v4l2_subdev_get_try_format(&sensor->sd, sd_state, in ov2680_get_fmt()
682 fmt = &sensor->fmt; in ov2680_get_fmt()
688 mutex_unlock(&sensor->lock); in ov2680_get_fmt()
697 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_set_fmt() local
708 mutex_lock(&sensor->lock); in ov2680_set_fmt()
710 if (sensor->is_streaming) { in ov2680_set_fmt()
733 fmt->code = sensor->fmt.code; in ov2680_set_fmt()
734 fmt->colorspace = sensor->fmt.colorspace; in ov2680_set_fmt()
736 sensor->current_mode = mode; in ov2680_set_fmt()
737 sensor->fmt = format->format; in ov2680_set_fmt()
738 sensor->mode_pending_changes = true; in ov2680_set_fmt()
741 mutex_unlock(&sensor->lock); in ov2680_set_fmt()
800 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_g_volatile_ctrl() local
801 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_g_volatile_ctrl()
804 if (!sensor->is_enabled) in ov2680_g_volatile_ctrl()
809 val = ov2680_gain_get(sensor); in ov2680_g_volatile_ctrl()
815 val = ov2680_exposure_get(sensor); in ov2680_g_volatile_ctrl()
828 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_ctrl() local
829 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_s_ctrl()
831 if (!sensor->is_enabled) in ov2680_s_ctrl()
836 return ov2680_gain_set(sensor, !!ctrl->val); in ov2680_s_ctrl()
838 return ov2680_gain_set(sensor, !!ctrls->auto_gain->val); in ov2680_s_ctrl()
840 return ov2680_exposure_set(sensor, !!ctrl->val); in ov2680_s_ctrl()
842 return ov2680_exposure_set(sensor, !!ctrls->auto_exp->val); in ov2680_s_ctrl()
844 if (sensor->is_streaming) in ov2680_s_ctrl()
847 return ov2680_vflip_enable(sensor); in ov2680_s_ctrl()
849 return ov2680_vflip_disable(sensor); in ov2680_s_ctrl()
851 if (sensor->is_streaming) in ov2680_s_ctrl()
854 return ov2680_hflip_enable(sensor); in ov2680_s_ctrl()
856 return ov2680_hflip_disable(sensor); in ov2680_s_ctrl()
858 return ov2680_test_pattern_set(sensor, ctrl->val); in ov2680_s_ctrl()
896 static int ov2680_mode_init(struct ov2680_dev *sensor) in ov2680_mode_init() argument
901 sensor->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov2680_mode_init()
902 sensor->fmt.width = 800; in ov2680_mode_init()
903 sensor->fmt.height = 600; in ov2680_mode_init()
904 sensor->fmt.field = V4L2_FIELD_NONE; in ov2680_mode_init()
905 sensor->fmt.colorspace = V4L2_COLORSPACE_SRGB; in ov2680_mode_init()
907 sensor->frame_interval.denominator = OV2680_FRAME_RATE; in ov2680_mode_init()
908 sensor->frame_interval.numerator = 1; in ov2680_mode_init()
912 sensor->current_mode = init_mode; in ov2680_mode_init()
914 sensor->mode_pending_changes = true; in ov2680_mode_init()
919 static int ov2680_v4l2_register(struct ov2680_dev *sensor) in ov2680_v4l2_register() argument
922 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_v4l2_register()
926 v4l2_i2c_subdev_init(&sensor->sd, sensor->i2c_client, in ov2680_v4l2_register()
930 sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in ov2680_v4l2_register()
932 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ov2680_v4l2_register()
933 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov2680_v4l2_register()
935 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ov2680_v4l2_register()
941 hdl->lock = &sensor->lock; in ov2680_v4l2_register()
974 sensor->sd.ctrl_handler = hdl; in ov2680_v4l2_register()
976 ret = v4l2_async_register_subdev(&sensor->sd); in ov2680_v4l2_register()
983 media_entity_cleanup(&sensor->sd.entity); in ov2680_v4l2_register()
989 static int ov2680_get_regulators(struct ov2680_dev *sensor) in ov2680_get_regulators() argument
994 sensor->supplies[i].supply = ov2680_supply_name[i]; in ov2680_get_regulators()
996 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in ov2680_get_regulators()
998 sensor->supplies); in ov2680_get_regulators()
1001 static int ov2680_check_id(struct ov2680_dev *sensor) in ov2680_check_id() argument
1003 struct device *dev = ov2680_to_dev(sensor); in ov2680_check_id()
1007 ov2680_power_on(sensor); in ov2680_check_id()
1009 ret = ov2680_read_reg16(sensor, OV2680_REG_CHIP_ID_HIGH, &chip_id); in ov2680_check_id()
1024 static int ov2680_parse_dt(struct ov2680_dev *sensor) in ov2680_parse_dt() argument
1026 struct device *dev = ov2680_to_dev(sensor); in ov2680_parse_dt()
1029 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov2680_parse_dt()
1031 ret = PTR_ERR_OR_ZERO(sensor->reset_gpio); in ov2680_parse_dt()
1037 sensor->xvclk = devm_clk_get(dev, "xvclk"); in ov2680_parse_dt()
1038 if (IS_ERR(sensor->xvclk)) { in ov2680_parse_dt()
1040 return PTR_ERR(sensor->xvclk); in ov2680_parse_dt()
1043 sensor->xvclk_freq = clk_get_rate(sensor->xvclk); in ov2680_parse_dt()
1044 if (sensor->xvclk_freq != OV2680_XVCLK_VALUE) { in ov2680_parse_dt()
1046 sensor->xvclk_freq, OV2680_XVCLK_VALUE); in ov2680_parse_dt()
1056 struct ov2680_dev *sensor; in ov2680_probe() local
1059 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in ov2680_probe()
1060 if (!sensor) in ov2680_probe()
1063 sensor->i2c_client = client; in ov2680_probe()
1065 ret = ov2680_parse_dt(sensor); in ov2680_probe()
1069 ret = ov2680_mode_init(sensor); in ov2680_probe()
1073 ret = ov2680_get_regulators(sensor); in ov2680_probe()
1079 mutex_init(&sensor->lock); in ov2680_probe()
1081 ret = ov2680_check_id(sensor); in ov2680_probe()
1085 ret = ov2680_v4l2_register(sensor); in ov2680_probe()
1095 mutex_destroy(&sensor->lock); in ov2680_probe()
1103 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_remove() local
1105 v4l2_async_unregister_subdev(&sensor->sd); in ov2680_remove()
1106 mutex_destroy(&sensor->lock); in ov2680_remove()
1107 media_entity_cleanup(&sensor->sd.entity); in ov2680_remove()
1108 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov2680_remove()
1114 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_suspend() local
1116 if (sensor->is_streaming) in ov2680_suspend()
1117 ov2680_stream_disable(sensor); in ov2680_suspend()
1125 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_resume() local
1128 if (sensor->is_streaming) { in ov2680_resume()
1129 ret = ov2680_stream_enable(sensor); in ov2680_resume()
1137 ov2680_stream_disable(sensor); in ov2680_resume()
1138 sensor->is_streaming = false; in ov2680_resume()
1165 MODULE_DESCRIPTION("OV2680 CMOS Image Sensor driver");