Lines Matching full:sensor
3 * Omnivision OV2680 CMOS Image Sensor driver
7 * Based on OV5640 Sensor Driver
180 static struct device *ov2680_to_dev(struct ov2680_dev *sensor) in ov2680_to_dev() argument
182 return &sensor->i2c_client->dev; in ov2680_to_dev()
191 static int __ov2680_write_reg(struct ov2680_dev *sensor, u16 reg, in __ov2680_write_reg() argument
194 struct i2c_client *client = sensor->i2c_client; in __ov2680_write_reg()
221 static int __ov2680_read_reg(struct ov2680_dev *sensor, u16 reg, in __ov2680_read_reg() argument
224 struct i2c_client *client = sensor->i2c_client; in __ov2680_read_reg()
263 static int ov2680_mod_reg(struct ov2680_dev *sensor, u16 reg, u8 mask, u8 val) in ov2680_mod_reg() argument
268 ret = ov2680_read_reg(sensor, reg, &readval); in ov2680_mod_reg()
276 return ov2680_write_reg(sensor, reg, val); in ov2680_mod_reg()
279 static int ov2680_load_regs(struct ov2680_dev *sensor, in ov2680_load_regs() argument
292 ret = ov2680_write_reg(sensor, reg_addr, val); in ov2680_load_regs()
300 static void ov2680_power_up(struct ov2680_dev *sensor) in ov2680_power_up() argument
302 if (!sensor->reset_gpio) in ov2680_power_up()
305 gpiod_set_value(sensor->reset_gpio, 0); in ov2680_power_up()
309 static void ov2680_power_down(struct ov2680_dev *sensor) in ov2680_power_down() argument
311 if (!sensor->reset_gpio) in ov2680_power_down()
314 gpiod_set_value(sensor->reset_gpio, 1); in ov2680_power_down()
318 static void ov2680_set_bayer_order(struct ov2680_dev *sensor) in ov2680_set_bayer_order() argument
322 if (sensor->ctrls.vflip && sensor->ctrls.vflip->val) in ov2680_set_bayer_order()
325 if (sensor->ctrls.hflip && sensor->ctrls.hflip->val) in ov2680_set_bayer_order()
328 sensor->fmt.code = ov2680_hv_flip_bayer_order[hv_flip]; in ov2680_set_bayer_order()
331 static int ov2680_set_vflip(struct ov2680_dev *sensor, s32 val) in ov2680_set_vflip() argument
335 if (sensor->is_streaming) in ov2680_set_vflip()
338 ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1, in ov2680_set_vflip()
343 ov2680_set_bayer_order(sensor); in ov2680_set_vflip()
347 static int ov2680_set_hflip(struct ov2680_dev *sensor, s32 val) in ov2680_set_hflip() argument
351 if (sensor->is_streaming) in ov2680_set_hflip()
354 ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2, in ov2680_set_hflip()
359 ov2680_set_bayer_order(sensor); in ov2680_set_hflip()
363 static int ov2680_test_pattern_set(struct ov2680_dev *sensor, int value) in ov2680_test_pattern_set() argument
368 return ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, BIT(7), 0); in ov2680_test_pattern_set()
370 ret = ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, 0x03, value - 1); in ov2680_test_pattern_set()
374 ret = ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, BIT(7), BIT(7)); in ov2680_test_pattern_set()
381 static int ov2680_gain_set(struct ov2680_dev *sensor, u32 gain) in ov2680_gain_set() argument
383 return ov2680_write_reg16(sensor, OV2680_REG_GAIN_PK, gain); in ov2680_gain_set()
386 static int ov2680_exposure_set(struct ov2680_dev *sensor, u32 exp) in ov2680_exposure_set() argument
388 return ov2680_write_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH, in ov2680_exposure_set()
392 static int ov2680_stream_enable(struct ov2680_dev *sensor) in ov2680_stream_enable() argument
394 return ov2680_write_reg(sensor, OV2680_REG_STREAM_CTRL, 1); in ov2680_stream_enable()
397 static int ov2680_stream_disable(struct ov2680_dev *sensor) in ov2680_stream_disable() argument
399 return ov2680_write_reg(sensor, OV2680_REG_STREAM_CTRL, 0); in ov2680_stream_disable()
402 static int ov2680_mode_set(struct ov2680_dev *sensor) in ov2680_mode_set() argument
406 ret = ov2680_load_regs(sensor, sensor->current_mode); in ov2680_mode_set()
411 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler); in ov2680_mode_set()
415 sensor->mode_pending_changes = false; in ov2680_mode_set()
420 static int ov2680_mode_restore(struct ov2680_dev *sensor) in ov2680_mode_restore() argument
424 ret = ov2680_load_regs(sensor, &ov2680_mode_init_data); in ov2680_mode_restore()
428 return ov2680_mode_set(sensor); in ov2680_mode_restore()
431 static int ov2680_power_off(struct ov2680_dev *sensor) in ov2680_power_off() argument
433 if (!sensor->is_enabled) in ov2680_power_off()
436 clk_disable_unprepare(sensor->xvclk); in ov2680_power_off()
437 ov2680_power_down(sensor); in ov2680_power_off()
438 regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies); in ov2680_power_off()
439 sensor->is_enabled = false; in ov2680_power_off()
444 static int ov2680_power_on(struct ov2680_dev *sensor) in ov2680_power_on() argument
446 struct device *dev = ov2680_to_dev(sensor); in ov2680_power_on()
449 if (sensor->is_enabled) in ov2680_power_on()
452 ret = regulator_bulk_enable(OV2680_NUM_SUPPLIES, sensor->supplies); in ov2680_power_on()
458 if (!sensor->reset_gpio) { in ov2680_power_on()
459 ret = ov2680_write_reg(sensor, OV2680_REG_SOFT_RESET, 0x01); in ov2680_power_on()
461 dev_err(dev, "sensor soft reset failed\n"); in ov2680_power_on()
466 ov2680_power_down(sensor); in ov2680_power_on()
467 ov2680_power_up(sensor); in ov2680_power_on()
470 ret = clk_prepare_enable(sensor->xvclk); in ov2680_power_on()
474 sensor->is_enabled = true; in ov2680_power_on()
477 ov2680_stream_enable(sensor); in ov2680_power_on()
479 ov2680_stream_disable(sensor); in ov2680_power_on()
484 regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies); in ov2680_power_on()
490 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_power() local
493 mutex_lock(&sensor->lock); in ov2680_s_power()
496 ret = ov2680_power_on(sensor); in ov2680_s_power()
498 ret = ov2680_power_off(sensor); in ov2680_s_power()
501 ret = ov2680_mode_restore(sensor); in ov2680_s_power()
503 mutex_unlock(&sensor->lock); in ov2680_s_power()
511 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_g_frame_interval() local
513 mutex_lock(&sensor->lock); in ov2680_s_g_frame_interval()
514 fi->interval = sensor->frame_interval; in ov2680_s_g_frame_interval()
515 mutex_unlock(&sensor->lock); in ov2680_s_g_frame_interval()
522 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_stream() local
525 mutex_lock(&sensor->lock); in ov2680_s_stream()
527 if (sensor->is_streaming == !!enable) in ov2680_s_stream()
530 if (enable && sensor->mode_pending_changes) { in ov2680_s_stream()
531 ret = ov2680_mode_set(sensor); in ov2680_s_stream()
537 ret = ov2680_stream_enable(sensor); in ov2680_s_stream()
539 ret = ov2680_stream_disable(sensor); in ov2680_s_stream()
541 sensor->is_streaming = !!enable; in ov2680_s_stream()
544 mutex_unlock(&sensor->lock); in ov2680_s_stream()
553 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_enum_mbus_code() local
558 code->code = sensor->fmt.code; in ov2680_enum_mbus_code()
567 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_get_fmt() local
574 mutex_lock(&sensor->lock); in ov2680_get_fmt()
578 fmt = v4l2_subdev_get_try_format(&sensor->sd, cfg, format->pad); in ov2680_get_fmt()
583 fmt = &sensor->fmt; in ov2680_get_fmt()
589 mutex_unlock(&sensor->lock); in ov2680_get_fmt()
598 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_set_fmt() local
609 mutex_lock(&sensor->lock); in ov2680_set_fmt()
611 if (sensor->is_streaming) { in ov2680_set_fmt()
634 fmt->code = sensor->fmt.code; in ov2680_set_fmt()
635 fmt->colorspace = sensor->fmt.colorspace; in ov2680_set_fmt()
637 sensor->current_mode = mode; in ov2680_set_fmt()
638 sensor->fmt = format->format; in ov2680_set_fmt()
639 sensor->mode_pending_changes = true; in ov2680_set_fmt()
642 mutex_unlock(&sensor->lock); in ov2680_set_fmt()
701 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_ctrl() local
703 if (!sensor->is_enabled) in ov2680_s_ctrl()
708 return ov2680_gain_set(sensor, ctrl->val); in ov2680_s_ctrl()
710 return ov2680_exposure_set(sensor, ctrl->val); in ov2680_s_ctrl()
712 return ov2680_set_vflip(sensor, ctrl->val); in ov2680_s_ctrl()
714 return ov2680_set_hflip(sensor, ctrl->val); in ov2680_s_ctrl()
716 return ov2680_test_pattern_set(sensor, ctrl->val); in ov2680_s_ctrl()
753 static int ov2680_mode_init(struct ov2680_dev *sensor) in ov2680_mode_init() argument
758 sensor->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov2680_mode_init()
759 sensor->fmt.width = 800; in ov2680_mode_init()
760 sensor->fmt.height = 600; in ov2680_mode_init()
761 sensor->fmt.field = V4L2_FIELD_NONE; in ov2680_mode_init()
762 sensor->fmt.colorspace = V4L2_COLORSPACE_SRGB; in ov2680_mode_init()
764 sensor->frame_interval.denominator = OV2680_FRAME_RATE; in ov2680_mode_init()
765 sensor->frame_interval.numerator = 1; in ov2680_mode_init()
769 sensor->current_mode = init_mode; in ov2680_mode_init()
771 sensor->mode_pending_changes = true; in ov2680_mode_init()
776 static int ov2680_v4l2_register(struct ov2680_dev *sensor) in ov2680_v4l2_register() argument
779 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_v4l2_register()
783 v4l2_i2c_subdev_init(&sensor->sd, sensor->i2c_client, in ov2680_v4l2_register()
787 sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in ov2680_v4l2_register()
789 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ov2680_v4l2_register()
790 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov2680_v4l2_register()
792 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ov2680_v4l2_register()
798 hdl->lock = &sensor->lock; in ov2680_v4l2_register()
821 sensor->sd.ctrl_handler = hdl; in ov2680_v4l2_register()
823 ret = v4l2_async_register_subdev(&sensor->sd); in ov2680_v4l2_register()
830 media_entity_cleanup(&sensor->sd.entity); in ov2680_v4l2_register()
836 static int ov2680_get_regulators(struct ov2680_dev *sensor) in ov2680_get_regulators() argument
841 sensor->supplies[i].supply = ov2680_supply_name[i]; in ov2680_get_regulators()
843 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in ov2680_get_regulators()
845 sensor->supplies); in ov2680_get_regulators()
848 static int ov2680_check_id(struct ov2680_dev *sensor) in ov2680_check_id() argument
850 struct device *dev = ov2680_to_dev(sensor); in ov2680_check_id()
854 ov2680_power_on(sensor); in ov2680_check_id()
856 ret = ov2680_read_reg16(sensor, OV2680_REG_CHIP_ID_HIGH, &chip_id); in ov2680_check_id()
871 static int ov2680_parse_dt(struct ov2680_dev *sensor) in ov2680_parse_dt() argument
873 struct device *dev = ov2680_to_dev(sensor); in ov2680_parse_dt()
876 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov2680_parse_dt()
878 ret = PTR_ERR_OR_ZERO(sensor->reset_gpio); in ov2680_parse_dt()
884 sensor->xvclk = devm_clk_get(dev, "xvclk"); in ov2680_parse_dt()
885 if (IS_ERR(sensor->xvclk)) { in ov2680_parse_dt()
887 return PTR_ERR(sensor->xvclk); in ov2680_parse_dt()
890 sensor->xvclk_freq = clk_get_rate(sensor->xvclk); in ov2680_parse_dt()
891 if (sensor->xvclk_freq != OV2680_XVCLK_VALUE) { in ov2680_parse_dt()
893 sensor->xvclk_freq, OV2680_XVCLK_VALUE); in ov2680_parse_dt()
903 struct ov2680_dev *sensor; in ov2680_probe() local
906 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in ov2680_probe()
907 if (!sensor) in ov2680_probe()
910 sensor->i2c_client = client; in ov2680_probe()
912 ret = ov2680_parse_dt(sensor); in ov2680_probe()
916 ret = ov2680_mode_init(sensor); in ov2680_probe()
920 ret = ov2680_get_regulators(sensor); in ov2680_probe()
926 mutex_init(&sensor->lock); in ov2680_probe()
928 ret = ov2680_check_id(sensor); in ov2680_probe()
932 ret = ov2680_v4l2_register(sensor); in ov2680_probe()
942 mutex_destroy(&sensor->lock); in ov2680_probe()
950 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_remove() local
952 v4l2_async_unregister_subdev(&sensor->sd); in ov2680_remove()
953 mutex_destroy(&sensor->lock); in ov2680_remove()
954 media_entity_cleanup(&sensor->sd.entity); in ov2680_remove()
955 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov2680_remove()
964 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_suspend() local
966 if (sensor->is_streaming) in ov2680_suspend()
967 ov2680_stream_disable(sensor); in ov2680_suspend()
976 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_resume() local
979 if (sensor->is_streaming) { in ov2680_resume()
980 ret = ov2680_stream_enable(sensor); in ov2680_resume()
988 ov2680_stream_disable(sensor); in ov2680_resume()
989 sensor->is_streaming = false; in ov2680_resume()
1016 MODULE_DESCRIPTION("OV2680 CMOS Image Sensor driver");