Lines Matching refs:ov5693

377 static int ov5693_read_reg(struct ov5693_device *ov5693, u32 addr, u32 *value)  in ov5693_read_reg()  argument
379 struct i2c_client *client = ov5693->client; in ov5693_read_reg()
418 static void ov5693_write_reg(struct ov5693_device *ov5693, u32 addr, u32 value, in ov5693_write_reg() argument
421 struct i2c_client *client = ov5693->client; in ov5693_write_reg()
453 static int ov5693_write_reg_array(struct ov5693_device *ov5693, in ov5693_write_reg_array() argument
460 ov5693_write_reg(ov5693, reglist->regs[i].reg, in ov5693_write_reg_array()
466 static int ov5693_update_bits(struct ov5693_device *ov5693, u32 address, in ov5693_update_bits() argument
472 ret = ov5693_read_reg(ov5693, address, &value); in ov5693_update_bits()
479 ov5693_write_reg(ov5693, address, value, &ret); in ov5693_update_bits()
486 static int ov5693_flip_vert_configure(struct ov5693_device *ov5693, in ov5693_flip_vert_configure() argument
493 ret = ov5693_update_bits(ov5693, OV5693_FORMAT1_REG, bits, in ov5693_flip_vert_configure()
501 static int ov5693_flip_horz_configure(struct ov5693_device *ov5693, in ov5693_flip_horz_configure() argument
508 ret = ov5693_update_bits(ov5693, OV5693_FORMAT2_REG, bits, in ov5693_flip_horz_configure()
516 static int ov5693_get_exposure(struct ov5693_device *ov5693, s32 *value) in ov5693_get_exposure() argument
521 ret = ov5693_read_reg(ov5693, OV5693_EXPOSURE_CTRL_REG, &exposure); in ov5693_get_exposure()
531 static int ov5693_exposure_configure(struct ov5693_device *ov5693, in ov5693_exposure_configure() argument
538 ov5693_write_reg(ov5693, OV5693_EXPOSURE_CTRL_REG, exposure, &ret); in ov5693_exposure_configure()
543 static int ov5693_get_gain(struct ov5693_device *ov5693, u32 *gain) in ov5693_get_gain() argument
548 ret = ov5693_read_reg(ov5693, OV5693_GAIN_CTRL_REG, &value); in ov5693_get_gain()
558 static int ov5693_digital_gain_configure(struct ov5693_device *ov5693, in ov5693_digital_gain_configure() argument
565 ov5693_write_reg(ov5693, OV5693_MWB_RED_GAIN_REG, gain, &ret); in ov5693_digital_gain_configure()
566 ov5693_write_reg(ov5693, OV5693_MWB_GREEN_GAIN_REG, gain, &ret); in ov5693_digital_gain_configure()
567 ov5693_write_reg(ov5693, OV5693_MWB_BLUE_GAIN_REG, gain, &ret); in ov5693_digital_gain_configure()
572 static int ov5693_analog_gain_configure(struct ov5693_device *ov5693, u32 gain) in ov5693_analog_gain_configure() argument
578 ov5693_write_reg(ov5693, OV5693_GAIN_CTRL_REG, gain, &ret); in ov5693_analog_gain_configure()
583 static int ov5693_vts_configure(struct ov5693_device *ov5693, u32 vblank) in ov5693_vts_configure() argument
585 u16 vts = ov5693->mode.format.height + vblank; in ov5693_vts_configure()
588 ov5693_write_reg(ov5693, OV5693_TIMING_VTS_REG, vts, &ret); in ov5693_vts_configure()
593 static int ov5693_test_pattern_configure(struct ov5693_device *ov5693, u32 idx) in ov5693_test_pattern_configure() argument
597 ov5693_write_reg(ov5693, OV5693_TEST_PATTERN_REG, in ov5693_test_pattern_configure()
605 struct ov5693_device *ov5693 = in ov5693_s_ctrl() local
613 exposure_max = ov5693->mode.format.height + ctrl->val - in ov5693_s_ctrl()
615 __v4l2_ctrl_modify_range(ov5693->ctrls.exposure, in ov5693_s_ctrl()
616 ov5693->ctrls.exposure->minimum, in ov5693_s_ctrl()
618 ov5693->ctrls.exposure->step, in ov5693_s_ctrl()
619 min(ov5693->ctrls.exposure->val, in ov5693_s_ctrl()
624 if (!pm_runtime_get_if_in_use(ov5693->dev)) in ov5693_s_ctrl()
629 ret = ov5693_exposure_configure(ov5693, ctrl->val); in ov5693_s_ctrl()
632 ret = ov5693_analog_gain_configure(ov5693, ctrl->val); in ov5693_s_ctrl()
635 ret = ov5693_digital_gain_configure(ov5693, ctrl->val); in ov5693_s_ctrl()
638 ret = ov5693_flip_horz_configure(ov5693, !!ctrl->val); in ov5693_s_ctrl()
641 ret = ov5693_flip_vert_configure(ov5693, !!ctrl->val); in ov5693_s_ctrl()
644 ret = ov5693_vts_configure(ov5693, ctrl->val); in ov5693_s_ctrl()
647 ret = ov5693_test_pattern_configure(ov5693, ctrl->val); in ov5693_s_ctrl()
653 pm_runtime_put(ov5693->dev); in ov5693_s_ctrl()
660 struct ov5693_device *ov5693 = container_of(ctrl->handler, in ov5693_g_volatile_ctrl() local
666 return ov5693_get_exposure(ov5693, &ctrl->val); in ov5693_g_volatile_ctrl()
668 return ov5693_get_gain(ov5693, &ctrl->val); in ov5693_g_volatile_ctrl()
681 static int ov5693_mode_configure(struct ov5693_device *ov5693) in ov5693_mode_configure() argument
683 const struct ov5693_mode *mode = &ov5693->mode; in ov5693_mode_configure()
687 ov5693_write_reg(ov5693, OV5693_CROP_START_X_REG, mode->crop.left, in ov5693_mode_configure()
691 ov5693_write_reg(ov5693, OV5693_OFFSET_START_X_REG, 0, &ret); in ov5693_mode_configure()
694 ov5693_write_reg(ov5693, OV5693_OUTPUT_SIZE_X_REG, mode->format.width, in ov5693_mode_configure()
698 ov5693_write_reg(ov5693, OV5693_CROP_END_X_REG, in ov5693_mode_configure()
702 ov5693_write_reg(ov5693, OV5693_TIMING_HTS_REG, OV5693_FIXED_PPL, in ov5693_mode_configure()
706 ov5693_write_reg(ov5693, OV5693_CROP_START_Y_REG, mode->crop.top, in ov5693_mode_configure()
710 ov5693_write_reg(ov5693, OV5693_OFFSET_START_Y_REG, 0, &ret); in ov5693_mode_configure()
713 ov5693_write_reg(ov5693, OV5693_OUTPUT_SIZE_Y_REG, mode->format.height, in ov5693_mode_configure()
717 ov5693_write_reg(ov5693, OV5693_CROP_END_Y_REG, in ov5693_mode_configure()
721 ov5693_write_reg(ov5693, OV5693_SUB_INC_X_REG, in ov5693_mode_configure()
724 ov5693_write_reg(ov5693, OV5693_SUB_INC_Y_REG, in ov5693_mode_configure()
731 ret = ov5693_update_bits(ov5693, OV5693_FORMAT1_REG, in ov5693_mode_configure()
737 ret = ov5693_update_bits(ov5693, OV5693_FORMAT2_REG, in ov5693_mode_configure()
744 static int ov5693_enable_streaming(struct ov5693_device *ov5693, bool enable) in ov5693_enable_streaming() argument
748 ov5693_write_reg(ov5693, OV5693_SW_STREAM_REG, in ov5693_enable_streaming()
755 static int ov5693_sw_reset(struct ov5693_device *ov5693) in ov5693_sw_reset() argument
759 ov5693_write_reg(ov5693, OV5693_SW_RESET_REG, OV5693_SW_RESET, &ret); in ov5693_sw_reset()
764 static int ov5693_sensor_init(struct ov5693_device *ov5693) in ov5693_sensor_init() argument
768 ret = ov5693_sw_reset(ov5693); in ov5693_sensor_init()
770 return dev_err_probe(ov5693->dev, ret, in ov5693_sensor_init()
773 ret = ov5693_write_reg_array(ov5693, &ov5693_global_setting); in ov5693_sensor_init()
775 return dev_err_probe(ov5693->dev, ret, in ov5693_sensor_init()
778 ret = ov5693_mode_configure(ov5693); in ov5693_sensor_init()
780 return dev_err_probe(ov5693->dev, ret, in ov5693_sensor_init()
783 ret = ov5693_enable_streaming(ov5693, false); in ov5693_sensor_init()
785 dev_err(ov5693->dev, "stop streaming error\n"); in ov5693_sensor_init()
790 static void ov5693_sensor_powerdown(struct ov5693_device *ov5693) in ov5693_sensor_powerdown() argument
792 gpiod_set_value_cansleep(ov5693->reset, 1); in ov5693_sensor_powerdown()
793 gpiod_set_value_cansleep(ov5693->powerdown, 1); in ov5693_sensor_powerdown()
795 regulator_bulk_disable(OV5693_NUM_SUPPLIES, ov5693->supplies); in ov5693_sensor_powerdown()
797 clk_disable_unprepare(ov5693->clk); in ov5693_sensor_powerdown()
800 static int ov5693_sensor_powerup(struct ov5693_device *ov5693) in ov5693_sensor_powerup() argument
804 gpiod_set_value_cansleep(ov5693->reset, 1); in ov5693_sensor_powerup()
805 gpiod_set_value_cansleep(ov5693->powerdown, 1); in ov5693_sensor_powerup()
807 ret = clk_prepare_enable(ov5693->clk); in ov5693_sensor_powerup()
809 dev_err(ov5693->dev, "Failed to enable clk\n"); in ov5693_sensor_powerup()
813 ret = regulator_bulk_enable(OV5693_NUM_SUPPLIES, ov5693->supplies); in ov5693_sensor_powerup()
815 dev_err(ov5693->dev, "Failed to enable regulators\n"); in ov5693_sensor_powerup()
819 gpiod_set_value_cansleep(ov5693->powerdown, 0); in ov5693_sensor_powerup()
820 gpiod_set_value_cansleep(ov5693->reset, 0); in ov5693_sensor_powerup()
827 ov5693_sensor_powerdown(ov5693); in ov5693_sensor_powerup()
834 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_sensor_suspend() local
836 ov5693_sensor_powerdown(ov5693); in ov5693_sensor_suspend()
844 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_sensor_resume() local
847 mutex_lock(&ov5693->lock); in ov5693_sensor_resume()
849 ret = ov5693_sensor_powerup(ov5693); in ov5693_sensor_resume()
853 ret = ov5693_sensor_init(ov5693); in ov5693_sensor_resume()
862 ov5693_sensor_powerdown(ov5693); in ov5693_sensor_resume()
864 mutex_unlock(&ov5693->lock); in ov5693_sensor_resume()
868 static int ov5693_detect(struct ov5693_device *ov5693) in ov5693_detect() argument
873 ret = ov5693_read_reg(ov5693, OV5693_REG_CHIP_ID, &id); in ov5693_detect()
878 return dev_err_probe(ov5693->dev, -ENODEV, in ov5693_detect()
902 __ov5693_get_pad_format(struct ov5693_device *ov5693, in __ov5693_get_pad_format() argument
908 return v4l2_subdev_get_try_format(&ov5693->sd, state, pad); in __ov5693_get_pad_format()
910 return &ov5693->mode.format; in __ov5693_get_pad_format()
917 __ov5693_get_pad_crop(struct ov5693_device *ov5693, in __ov5693_get_pad_crop() argument
923 return v4l2_subdev_get_try_crop(&ov5693->sd, state, pad); in __ov5693_get_pad_crop()
925 return &ov5693->mode.crop; in __ov5693_get_pad_crop()
935 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_get_fmt() local
937 format->format = ov5693->mode.format; in ov5693_get_fmt()
946 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_set_fmt() local
954 crop = __ov5693_get_pad_crop(ov5693, state, format->pad, format->which); in ov5693_set_fmt()
974 fmt = __ov5693_get_pad_format(ov5693, state, format->pad, in ov5693_set_fmt()
986 mutex_lock(&ov5693->lock); in ov5693_set_fmt()
988 ov5693->mode.binning_x = hratio > 1; in ov5693_set_fmt()
989 ov5693->mode.inc_x_odd = hratio > 1 ? 3 : 1; in ov5693_set_fmt()
990 ov5693->mode.binning_y = vratio > 1; in ov5693_set_fmt()
991 ov5693->mode.inc_y_odd = vratio > 1 ? 3 : 1; in ov5693_set_fmt()
993 ov5693->mode.vts = __ov5693_calc_vts(fmt->height); in ov5693_set_fmt()
995 __v4l2_ctrl_modify_range(ov5693->ctrls.vblank, in ov5693_set_fmt()
998 1, ov5693->mode.vts - fmt->height); in ov5693_set_fmt()
999 __v4l2_ctrl_s_ctrl(ov5693->ctrls.vblank, in ov5693_set_fmt()
1000 ov5693->mode.vts - fmt->height); in ov5693_set_fmt()
1003 __v4l2_ctrl_modify_range(ov5693->ctrls.hblank, hblank, hblank, 1, in ov5693_set_fmt()
1006 exposure_max = ov5693->mode.vts - OV5693_INTEGRATION_TIME_MARGIN; in ov5693_set_fmt()
1007 __v4l2_ctrl_modify_range(ov5693->ctrls.exposure, in ov5693_set_fmt()
1008 ov5693->ctrls.exposure->minimum, exposure_max, in ov5693_set_fmt()
1009 ov5693->ctrls.exposure->step, in ov5693_set_fmt()
1010 min(ov5693->ctrls.exposure->val, in ov5693_set_fmt()
1013 mutex_unlock(&ov5693->lock); in ov5693_set_fmt()
1021 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_get_selection() local
1025 mutex_lock(&ov5693->lock); in ov5693_get_selection()
1026 sel->r = *__ov5693_get_pad_crop(ov5693, state, sel->pad, in ov5693_get_selection()
1028 mutex_unlock(&ov5693->lock); in ov5693_get_selection()
1054 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_set_selection() local
1082 __crop = __ov5693_get_pad_crop(ov5693, state, sel->pad, sel->which); in ov5693_set_selection()
1089 format = __ov5693_get_pad_format(ov5693, state, sel->pad, in ov5693_set_selection()
1103 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_s_stream() local
1107 ret = pm_runtime_get_sync(ov5693->dev); in ov5693_s_stream()
1111 mutex_lock(&ov5693->lock); in ov5693_s_stream()
1112 ret = __v4l2_ctrl_handler_setup(&ov5693->ctrls.handler); in ov5693_s_stream()
1114 mutex_unlock(&ov5693->lock); in ov5693_s_stream()
1118 ret = ov5693_enable_streaming(ov5693, true); in ov5693_s_stream()
1119 mutex_unlock(&ov5693->lock); in ov5693_s_stream()
1121 mutex_lock(&ov5693->lock); in ov5693_s_stream()
1122 ret = ov5693_enable_streaming(ov5693, false); in ov5693_s_stream()
1123 mutex_unlock(&ov5693->lock); in ov5693_s_stream()
1128 ov5693->streaming = !!enable; in ov5693_s_stream()
1131 pm_runtime_put(ov5693->dev); in ov5693_s_stream()
1135 pm_runtime_put_noidle(ov5693->dev); in ov5693_s_stream()
1142 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_g_frame_interval() local
1143 unsigned int framesize = OV5693_FIXED_PPL * (ov5693->mode.format.height + in ov5693_g_frame_interval()
1144 ov5693->ctrls.vblank->val); in ov5693_g_frame_interval()
1169 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_enum_frame_size() local
1175 __crop = __ov5693_get_pad_crop(ov5693, state, fse->pad, fse->which); in ov5693_enum_frame_size()
1208 static int ov5693_init_controls(struct ov5693_device *ov5693) in ov5693_init_controls() argument
1211 struct ov5693_v4l2_ctrls *ctrls = &ov5693->ctrls; in ov5693_init_controls()
1236 exposure_max = ov5693->mode.vts - OV5693_INTEGRATION_TIME_MARGIN; in ov5693_init_controls()
1264 hblank = OV5693_FIXED_PPL - ov5693->mode.format.width; in ov5693_init_controls()
1272 vblank_max = OV5693_TIMING_MAX_VTS - ov5693->mode.format.height; in ov5693_init_controls()
1273 vblank_def = ov5693->mode.vts - ov5693->mode.format.height; in ov5693_init_controls()
1286 dev_err(ov5693->dev, "Error initialising v4l2 ctrls\n"); in ov5693_init_controls()
1292 ret = v4l2_fwnode_device_parse(ov5693->dev, &props); in ov5693_init_controls()
1302 ctrls->handler.lock = &ov5693->lock; in ov5693_init_controls()
1303 ov5693->sd.ctrl_handler = &ctrls->handler; in ov5693_init_controls()
1312 static int ov5693_configure_gpios(struct ov5693_device *ov5693) in ov5693_configure_gpios() argument
1314 ov5693->reset = devm_gpiod_get_optional(ov5693->dev, "reset", in ov5693_configure_gpios()
1316 if (IS_ERR(ov5693->reset)) { in ov5693_configure_gpios()
1317 dev_err(ov5693->dev, "Error fetching reset GPIO\n"); in ov5693_configure_gpios()
1318 return PTR_ERR(ov5693->reset); in ov5693_configure_gpios()
1321 ov5693->powerdown = devm_gpiod_get_optional(ov5693->dev, "powerdown", in ov5693_configure_gpios()
1323 if (IS_ERR(ov5693->powerdown)) { in ov5693_configure_gpios()
1324 dev_err(ov5693->dev, "Error fetching powerdown GPIO\n"); in ov5693_configure_gpios()
1325 return PTR_ERR(ov5693->powerdown); in ov5693_configure_gpios()
1331 static int ov5693_get_regulators(struct ov5693_device *ov5693) in ov5693_get_regulators() argument
1336 ov5693->supplies[i].supply = ov5693_supply_names[i]; in ov5693_get_regulators()
1338 return devm_regulator_bulk_get(ov5693->dev, OV5693_NUM_SUPPLIES, in ov5693_get_regulators()
1339 ov5693->supplies); in ov5693_get_regulators()
1342 static int ov5693_check_hwcfg(struct ov5693_device *ov5693) in ov5693_check_hwcfg() argument
1344 struct fwnode_handle *fwnode = dev_fwnode(ov5693->dev); in ov5693_check_hwcfg()
1362 dev_err(ov5693->dev, "only a 2-lane CSI2 config is supported"); in ov5693_check_hwcfg()
1368 dev_err(ov5693->dev, "no link frequencies defined\n"); in ov5693_check_hwcfg()
1378 dev_err(ov5693->dev, "supported link freq %ull not found\n", in ov5693_check_hwcfg()
1392 struct ov5693_device *ov5693; in ov5693_probe() local
1396 ov5693 = devm_kzalloc(&client->dev, sizeof(*ov5693), GFP_KERNEL); in ov5693_probe()
1397 if (!ov5693) in ov5693_probe()
1400 ov5693->client = client; in ov5693_probe()
1401 ov5693->dev = &client->dev; in ov5693_probe()
1403 ret = ov5693_check_hwcfg(ov5693); in ov5693_probe()
1407 mutex_init(&ov5693->lock); in ov5693_probe()
1409 v4l2_i2c_subdev_init(&ov5693->sd, client, &ov5693_ops); in ov5693_probe()
1411 ov5693->clk = devm_clk_get(&client->dev, "xvclk"); in ov5693_probe()
1412 if (IS_ERR(ov5693->clk)) { in ov5693_probe()
1414 return PTR_ERR(ov5693->clk); in ov5693_probe()
1417 clk_rate = clk_get_rate(ov5693->clk); in ov5693_probe()
1422 ret = ov5693_configure_gpios(ov5693); in ov5693_probe()
1426 ret = ov5693_get_regulators(ov5693); in ov5693_probe()
1431 ov5693->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ov5693_probe()
1432 ov5693->pad.flags = MEDIA_PAD_FL_SOURCE; in ov5693_probe()
1433 ov5693->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov5693_probe()
1435 ov5693->mode.crop = ov5693_default_crop; in ov5693_probe()
1436 ov5693->mode.format = ov5693_default_fmt; in ov5693_probe()
1437 ov5693->mode.vts = __ov5693_calc_vts(ov5693->mode.format.height); in ov5693_probe()
1439 ret = ov5693_init_controls(ov5693); in ov5693_probe()
1443 ret = media_entity_pads_init(&ov5693->sd.entity, 1, &ov5693->pad); in ov5693_probe()
1454 ret = ov5693_sensor_powerup(ov5693); in ov5693_probe()
1458 ret = ov5693_detect(ov5693); in ov5693_probe()
1466 ret = v4l2_async_register_subdev_sensor(&ov5693->sd); in ov5693_probe()
1483 ov5693_sensor_powerdown(ov5693); in ov5693_probe()
1485 media_entity_cleanup(&ov5693->sd.entity); in ov5693_probe()
1487 v4l2_ctrl_handler_free(&ov5693->ctrls.handler); in ov5693_probe()
1495 struct ov5693_device *ov5693 = to_ov5693_sensor(sd); in ov5693_remove() local
1498 media_entity_cleanup(&ov5693->sd.entity); in ov5693_remove()
1499 v4l2_ctrl_handler_free(&ov5693->ctrls.handler); in ov5693_remove()
1500 mutex_destroy(&ov5693->lock); in ov5693_remove()
1508 ov5693_sensor_powerdown(ov5693); in ov5693_remove()