Lines Matching refs:sensor
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()
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, cfg, format->pad); in ov2680_get_fmt()
681 fmt = &sensor->fmt; in ov2680_get_fmt()
687 mutex_unlock(&sensor->lock); in ov2680_get_fmt()
696 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_set_fmt() local
707 mutex_lock(&sensor->lock); in ov2680_set_fmt()
709 if (sensor->is_streaming) { in ov2680_set_fmt()
732 fmt->code = sensor->fmt.code; in ov2680_set_fmt()
733 fmt->colorspace = sensor->fmt.colorspace; in ov2680_set_fmt()
735 sensor->current_mode = mode; in ov2680_set_fmt()
736 sensor->fmt = format->format; in ov2680_set_fmt()
737 sensor->mode_pending_changes = true; in ov2680_set_fmt()
740 mutex_unlock(&sensor->lock); in ov2680_set_fmt()
799 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_g_volatile_ctrl() local
800 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_g_volatile_ctrl()
803 if (!sensor->is_enabled) in ov2680_g_volatile_ctrl()
808 val = ov2680_gain_get(sensor); in ov2680_g_volatile_ctrl()
814 val = ov2680_exposure_get(sensor); in ov2680_g_volatile_ctrl()
827 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_s_ctrl() local
828 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_s_ctrl()
830 if (!sensor->is_enabled) in ov2680_s_ctrl()
835 return ov2680_gain_set(sensor, !!ctrl->val); in ov2680_s_ctrl()
837 return ov2680_gain_set(sensor, !!ctrls->auto_gain->val); in ov2680_s_ctrl()
839 return ov2680_exposure_set(sensor, !!ctrl->val); in ov2680_s_ctrl()
841 return ov2680_exposure_set(sensor, !!ctrls->auto_exp->val); in ov2680_s_ctrl()
843 if (sensor->is_streaming) in ov2680_s_ctrl()
846 return ov2680_vflip_enable(sensor); in ov2680_s_ctrl()
848 return ov2680_vflip_disable(sensor); in ov2680_s_ctrl()
850 if (sensor->is_streaming) in ov2680_s_ctrl()
853 return ov2680_hflip_enable(sensor); in ov2680_s_ctrl()
855 return ov2680_hflip_disable(sensor); in ov2680_s_ctrl()
857 return ov2680_test_pattern_set(sensor, ctrl->val); in ov2680_s_ctrl()
895 static int ov2680_mode_init(struct ov2680_dev *sensor) in ov2680_mode_init() argument
900 sensor->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov2680_mode_init()
901 sensor->fmt.width = 800; in ov2680_mode_init()
902 sensor->fmt.height = 600; in ov2680_mode_init()
903 sensor->fmt.field = V4L2_FIELD_NONE; in ov2680_mode_init()
904 sensor->fmt.colorspace = V4L2_COLORSPACE_SRGB; in ov2680_mode_init()
906 sensor->frame_interval.denominator = OV2680_FRAME_RATE; in ov2680_mode_init()
907 sensor->frame_interval.numerator = 1; in ov2680_mode_init()
911 sensor->current_mode = init_mode; in ov2680_mode_init()
913 sensor->mode_pending_changes = true; in ov2680_mode_init()
918 static int ov2680_v4l2_register(struct ov2680_dev *sensor) in ov2680_v4l2_register() argument
921 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_v4l2_register()
925 v4l2_i2c_subdev_init(&sensor->sd, sensor->i2c_client, in ov2680_v4l2_register()
929 sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in ov2680_v4l2_register()
931 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ov2680_v4l2_register()
932 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov2680_v4l2_register()
934 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ov2680_v4l2_register()
940 hdl->lock = &sensor->lock; in ov2680_v4l2_register()
973 sensor->sd.ctrl_handler = hdl; in ov2680_v4l2_register()
975 ret = v4l2_async_register_subdev(&sensor->sd); in ov2680_v4l2_register()
982 media_entity_cleanup(&sensor->sd.entity); in ov2680_v4l2_register()
988 static int ov2680_get_regulators(struct ov2680_dev *sensor) in ov2680_get_regulators() argument
993 sensor->supplies[i].supply = ov2680_supply_name[i]; in ov2680_get_regulators()
995 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in ov2680_get_regulators()
997 sensor->supplies); in ov2680_get_regulators()
1000 static int ov2680_check_id(struct ov2680_dev *sensor) in ov2680_check_id() argument
1002 struct device *dev = ov2680_to_dev(sensor); in ov2680_check_id()
1006 ov2680_power_on(sensor); in ov2680_check_id()
1008 ret = ov2680_read_reg16(sensor, OV2680_REG_CHIP_ID_HIGH, &chip_id); in ov2680_check_id()
1023 static int ov2680_parse_dt(struct ov2680_dev *sensor) in ov2680_parse_dt() argument
1025 struct device *dev = ov2680_to_dev(sensor); in ov2680_parse_dt()
1028 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov2680_parse_dt()
1030 ret = PTR_ERR_OR_ZERO(sensor->reset_gpio); in ov2680_parse_dt()
1036 sensor->xvclk = devm_clk_get(dev, "xvclk"); in ov2680_parse_dt()
1037 if (IS_ERR(sensor->xvclk)) { in ov2680_parse_dt()
1039 return PTR_ERR(sensor->xvclk); in ov2680_parse_dt()
1042 sensor->xvclk_freq = clk_get_rate(sensor->xvclk); in ov2680_parse_dt()
1043 if (sensor->xvclk_freq != OV2680_XVCLK_VALUE) { in ov2680_parse_dt()
1045 sensor->xvclk_freq, OV2680_XVCLK_VALUE); in ov2680_parse_dt()
1055 struct ov2680_dev *sensor; in ov2680_probe() local
1058 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in ov2680_probe()
1059 if (!sensor) in ov2680_probe()
1062 sensor->i2c_client = client; in ov2680_probe()
1064 ret = ov2680_parse_dt(sensor); in ov2680_probe()
1068 ret = ov2680_mode_init(sensor); in ov2680_probe()
1072 ret = ov2680_get_regulators(sensor); in ov2680_probe()
1078 mutex_init(&sensor->lock); in ov2680_probe()
1080 ret = ov2680_check_id(sensor); in ov2680_probe()
1084 ret = ov2680_v4l2_register(sensor); in ov2680_probe()
1094 mutex_destroy(&sensor->lock); in ov2680_probe()
1102 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_remove() local
1104 v4l2_async_unregister_subdev(&sensor->sd); in ov2680_remove()
1105 mutex_destroy(&sensor->lock); in ov2680_remove()
1106 media_entity_cleanup(&sensor->sd.entity); in ov2680_remove()
1107 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov2680_remove()
1116 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_suspend() local
1118 if (sensor->is_streaming) in ov2680_suspend()
1119 ov2680_stream_disable(sensor); in ov2680_suspend()
1128 struct ov2680_dev *sensor = to_ov2680_dev(sd); in ov2680_resume() local
1131 if (sensor->is_streaming) { in ov2680_resume()
1132 ret = ov2680_stream_enable(sensor); in ov2680_resume()
1140 ov2680_stream_disable(sensor); in ov2680_resume()
1141 sensor->is_streaming = false; in ov2680_resume()