Lines Matching defs:ov5693

5  * Adapted from the atomisp-ov5693 driver, with contributions from:
358 static int ov5693_flip_vert_configure(struct ov5693_device *ov5693,
365 ret = cci_update_bits(ov5693->regmap, OV5693_FORMAT1_REG, bits,
373 static int ov5693_flip_horz_configure(struct ov5693_device *ov5693,
380 ret = cci_update_bits(ov5693->regmap, OV5693_FORMAT2_REG, bits,
388 static int ov5693_get_exposure(struct ov5693_device *ov5693, s32 *value)
393 ret = cci_read(ov5693->regmap, OV5693_EXPOSURE_CTRL_REG, &exposure,
404 static int ov5693_exposure_configure(struct ov5693_device *ov5693,
411 cci_write(ov5693->regmap, OV5693_EXPOSURE_CTRL_REG, exposure, &ret);
416 static int ov5693_get_gain(struct ov5693_device *ov5693, u32 *gain)
421 ret = cci_read(ov5693->regmap, OV5693_GAIN_CTRL_REG, &value, NULL);
431 static int ov5693_digital_gain_configure(struct ov5693_device *ov5693,
438 cci_write(ov5693->regmap, OV5693_MWB_RED_GAIN_REG, gain, &ret);
439 cci_write(ov5693->regmap, OV5693_MWB_GREEN_GAIN_REG, gain, &ret);
440 cci_write(ov5693->regmap, OV5693_MWB_BLUE_GAIN_REG, gain, &ret);
445 static int ov5693_analog_gain_configure(struct ov5693_device *ov5693, u32 gain)
451 cci_write(ov5693->regmap, OV5693_GAIN_CTRL_REG, gain, &ret);
456 static int ov5693_vts_configure(struct ov5693_device *ov5693, u32 vblank)
458 u16 vts = ov5693->mode.format.height + vblank;
461 cci_write(ov5693->regmap, OV5693_TIMING_VTS_REG, vts, &ret);
466 static int ov5693_test_pattern_configure(struct ov5693_device *ov5693, u32 idx)
470 cci_write(ov5693->regmap, OV5693_TEST_PATTERN_REG,
478 struct ov5693_device *ov5693 =
486 exposure_max = ov5693->mode.format.height + ctrl->val -
488 __v4l2_ctrl_modify_range(ov5693->ctrls.exposure,
489 ov5693->ctrls.exposure->minimum,
491 ov5693->ctrls.exposure->step,
492 min(ov5693->ctrls.exposure->val,
497 if (!pm_runtime_get_if_in_use(ov5693->dev))
502 ret = ov5693_exposure_configure(ov5693, ctrl->val);
505 ret = ov5693_analog_gain_configure(ov5693, ctrl->val);
508 ret = ov5693_digital_gain_configure(ov5693, ctrl->val);
511 ret = ov5693_flip_horz_configure(ov5693, !!ctrl->val);
514 ret = ov5693_flip_vert_configure(ov5693, !!ctrl->val);
517 ret = ov5693_vts_configure(ov5693, ctrl->val);
520 ret = ov5693_test_pattern_configure(ov5693, ctrl->val);
526 pm_runtime_put(ov5693->dev);
533 struct ov5693_device *ov5693 = container_of(ctrl->handler,
539 return ov5693_get_exposure(ov5693, &ctrl->val);
541 return ov5693_get_gain(ov5693, &ctrl->val);
554 static int ov5693_mode_configure(struct ov5693_device *ov5693)
556 const struct ov5693_mode *mode = &ov5693->mode;
560 cci_write(ov5693->regmap, OV5693_CROP_START_X_REG, mode->crop.left,
564 cci_write(ov5693->regmap, OV5693_OFFSET_START_X_REG, 0, &ret);
567 cci_write(ov5693->regmap, OV5693_OUTPUT_SIZE_X_REG, mode->format.width,
571 cci_write(ov5693->regmap, OV5693_CROP_END_X_REG,
575 cci_write(ov5693->regmap, OV5693_TIMING_HTS_REG, OV5693_FIXED_PPL,
579 cci_write(ov5693->regmap, OV5693_CROP_START_Y_REG, mode->crop.top,
583 cci_write(ov5693->regmap, OV5693_OFFSET_START_Y_REG, 0, &ret);
586 cci_write(ov5693->regmap, OV5693_OUTPUT_SIZE_Y_REG, mode->format.height,
590 cci_write(ov5693->regmap, OV5693_CROP_END_Y_REG,
594 cci_write(ov5693->regmap, OV5693_SUB_INC_X_REG,
597 cci_write(ov5693->regmap, OV5693_SUB_INC_Y_REG,
601 cci_update_bits(ov5693->regmap, OV5693_FORMAT1_REG,
605 cci_update_bits(ov5693->regmap, OV5693_FORMAT2_REG,
612 static int ov5693_enable_streaming(struct ov5693_device *ov5693, bool enable)
616 cci_write(ov5693->regmap, OV5693_SW_STREAM_REG,
623 static int ov5693_sw_reset(struct ov5693_device *ov5693)
627 cci_write(ov5693->regmap, OV5693_SW_RESET_REG, OV5693_SW_RESET, &ret);
632 static int ov5693_sensor_init(struct ov5693_device *ov5693)
636 ret = ov5693_sw_reset(ov5693);
638 return dev_err_probe(ov5693->dev, ret,
641 ret = cci_multi_reg_write(ov5693->regmap, ov5693_global_regs,
644 return dev_err_probe(ov5693->dev, ret,
647 ret = ov5693_mode_configure(ov5693);
649 return dev_err_probe(ov5693->dev, ret,
652 ret = ov5693_enable_streaming(ov5693, false);
654 dev_err(ov5693->dev, "stop streaming error\n");
659 static void ov5693_sensor_powerdown(struct ov5693_device *ov5693)
661 gpiod_set_value_cansleep(ov5693->privacy_led, 0);
662 gpiod_set_value_cansleep(ov5693->reset, 1);
663 gpiod_set_value_cansleep(ov5693->powerdown, 1);
665 regulator_bulk_disable(OV5693_NUM_SUPPLIES, ov5693->supplies);
667 clk_disable_unprepare(ov5693->xvclk);
670 static int ov5693_sensor_powerup(struct ov5693_device *ov5693)
674 gpiod_set_value_cansleep(ov5693->reset, 1);
675 gpiod_set_value_cansleep(ov5693->powerdown, 1);
677 ret = clk_prepare_enable(ov5693->xvclk);
679 dev_err(ov5693->dev, "Failed to enable clk\n");
683 ret = regulator_bulk_enable(OV5693_NUM_SUPPLIES, ov5693->supplies);
685 dev_err(ov5693->dev, "Failed to enable regulators\n");
689 gpiod_set_value_cansleep(ov5693->powerdown, 0);
690 gpiod_set_value_cansleep(ov5693->reset, 0);
691 gpiod_set_value_cansleep(ov5693->privacy_led, 1);
698 ov5693_sensor_powerdown(ov5693);
705 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
707 ov5693_sensor_powerdown(ov5693);
715 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
718 mutex_lock(&ov5693->lock);
720 ret = ov5693_sensor_powerup(ov5693);
724 ret = ov5693_sensor_init(ov5693);
726 dev_err(dev, "ov5693 sensor init failure\n");
733 ov5693_sensor_powerdown(ov5693);
735 mutex_unlock(&ov5693->lock);
739 static int ov5693_detect(struct ov5693_device *ov5693)
744 ret = cci_read(ov5693->regmap, OV5693_REG_CHIP_ID, &id, NULL);
749 return dev_err_probe(ov5693->dev, -ENODEV,
773 __ov5693_get_pad_format(struct ov5693_device *ov5693,
779 return v4l2_subdev_get_try_format(&ov5693->sd, state, pad);
781 return &ov5693->mode.format;
788 __ov5693_get_pad_crop(struct ov5693_device *ov5693,
794 return v4l2_subdev_get_try_crop(&ov5693->sd, state, pad);
796 return &ov5693->mode.crop;
806 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
808 format->format = ov5693->mode.format;
817 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
825 crop = __ov5693_get_pad_crop(ov5693, state, format->pad, format->which);
845 fmt = __ov5693_get_pad_format(ov5693, state, format->pad,
857 mutex_lock(&ov5693->lock);
859 ov5693->mode.binning_x = hratio > 1;
860 ov5693->mode.inc_x_odd = hratio > 1 ? 3 : 1;
861 ov5693->mode.binning_y = vratio > 1;
862 ov5693->mode.inc_y_odd = vratio > 1 ? 3 : 1;
864 ov5693->mode.vts = __ov5693_calc_vts(fmt->height);
866 __v4l2_ctrl_modify_range(ov5693->ctrls.vblank,
869 1, ov5693->mode.vts - fmt->height);
870 __v4l2_ctrl_s_ctrl(ov5693->ctrls.vblank,
871 ov5693->mode.vts - fmt->height);
874 __v4l2_ctrl_modify_range(ov5693->ctrls.hblank, hblank, hblank, 1,
877 exposure_max = ov5693->mode.vts - OV5693_INTEGRATION_TIME_MARGIN;
878 __v4l2_ctrl_modify_range(ov5693->ctrls.exposure,
879 ov5693->ctrls.exposure->minimum, exposure_max,
880 ov5693->ctrls.exposure->step,
881 min(ov5693->ctrls.exposure->val,
884 mutex_unlock(&ov5693->lock);
892 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
896 mutex_lock(&ov5693->lock);
897 sel->r = *__ov5693_get_pad_crop(ov5693, state, sel->pad,
899 mutex_unlock(&ov5693->lock);
925 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
953 __crop = __ov5693_get_pad_crop(ov5693, state, sel->pad, sel->which);
960 format = __ov5693_get_pad_format(ov5693, state, sel->pad,
974 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
978 ret = pm_runtime_get_sync(ov5693->dev);
982 mutex_lock(&ov5693->lock);
983 ret = __v4l2_ctrl_handler_setup(&ov5693->ctrls.handler);
985 mutex_unlock(&ov5693->lock);
989 ret = ov5693_enable_streaming(ov5693, true);
990 mutex_unlock(&ov5693->lock);
992 mutex_lock(&ov5693->lock);
993 ret = ov5693_enable_streaming(ov5693, false);
994 mutex_unlock(&ov5693->lock);
999 ov5693->streaming = !!enable;
1002 pm_runtime_put(ov5693->dev);
1006 pm_runtime_put_noidle(ov5693->dev);
1013 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
1014 unsigned int framesize = OV5693_FIXED_PPL * (ov5693->mode.format.height +
1015 ov5693->ctrls.vblank->val);
1040 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
1046 __crop = __ov5693_get_pad_crop(ov5693, state, fse->pad, fse->which);
1079 static int ov5693_init_controls(struct ov5693_device *ov5693)
1082 struct ov5693_v4l2_ctrls *ctrls = &ov5693->ctrls;
1107 exposure_max = ov5693->mode.vts - OV5693_INTEGRATION_TIME_MARGIN;
1135 hblank = OV5693_FIXED_PPL - ov5693->mode.format.width;
1143 vblank_max = OV5693_TIMING_MAX_VTS - ov5693->mode.format.height;
1144 vblank_def = ov5693->mode.vts - ov5693->mode.format.height;
1157 dev_err(ov5693->dev, "Error initialising v4l2 ctrls\n");
1163 ret = v4l2_fwnode_device_parse(ov5693->dev, &props);
1173 ctrls->handler.lock = &ov5693->lock;
1174 ov5693->sd.ctrl_handler = &ctrls->handler;
1183 static int ov5693_configure_gpios(struct ov5693_device *ov5693)
1185 ov5693->reset = devm_gpiod_get_optional(ov5693->dev, "reset",
1187 if (IS_ERR(ov5693->reset)) {
1188 dev_err(ov5693->dev, "Error fetching reset GPIO\n");
1189 return PTR_ERR(ov5693->reset);
1192 ov5693->powerdown = devm_gpiod_get_optional(ov5693->dev, "powerdown",
1194 if (IS_ERR(ov5693->powerdown)) {
1195 dev_err(ov5693->dev, "Error fetching powerdown GPIO\n");
1196 return PTR_ERR(ov5693->powerdown);
1199 ov5693->privacy_led = devm_gpiod_get_optional(ov5693->dev, "privacy-led",
1201 if (IS_ERR(ov5693->privacy_led)) {
1202 dev_err(ov5693->dev, "Error fetching privacy-led GPIO\n");
1203 return PTR_ERR(ov5693->privacy_led);
1209 static int ov5693_get_regulators(struct ov5693_device *ov5693)
1214 ov5693->supplies[i].supply = ov5693_supply_names[i];
1216 return devm_regulator_bulk_get(ov5693->dev, OV5693_NUM_SUPPLIES,
1217 ov5693->supplies);
1220 static int ov5693_check_hwcfg(struct ov5693_device *ov5693)
1222 struct fwnode_handle *fwnode = dev_fwnode(ov5693->dev);
1240 dev_err(ov5693->dev, "only a 2-lane CSI2 config is supported");
1246 dev_err(ov5693->dev, "no link frequencies defined\n");
1256 dev_err(ov5693->dev, "supported link freq %ull not found\n",
1270 struct ov5693_device *ov5693;
1274 ov5693 = devm_kzalloc(&client->dev, sizeof(*ov5693), GFP_KERNEL);
1275 if (!ov5693)
1278 ov5693->dev = &client->dev;
1280 ov5693->regmap = devm_cci_regmap_init_i2c(client, 16);
1281 if (IS_ERR(ov5693->regmap))
1282 return PTR_ERR(ov5693->regmap);
1284 ret = ov5693_check_hwcfg(ov5693);
1288 mutex_init(&ov5693->lock);
1290 v4l2_i2c_subdev_init(&ov5693->sd, client, &ov5693_ops);
1292 ov5693->xvclk = devm_clk_get_optional(&client->dev, "xvclk");
1293 if (IS_ERR(ov5693->xvclk))
1294 return dev_err_probe(&client->dev, PTR_ERR(ov5693->xvclk),
1296 PTR_ERR(ov5693->xvclk));
1298 if (ov5693->xvclk) {
1299 xvclk_rate = clk_get_rate(ov5693->xvclk);
1315 ret = ov5693_configure_gpios(ov5693);
1319 ret = ov5693_get_regulators(ov5693);
1324 ov5693->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1325 ov5693->pad.flags = MEDIA_PAD_FL_SOURCE;
1326 ov5693->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1328 ov5693->mode.crop = ov5693_default_crop;
1329 ov5693->mode.format = ov5693_default_fmt;
1330 ov5693->mode.vts = __ov5693_calc_vts(ov5693->mode.format.height);
1332 ret = ov5693_init_controls(ov5693);
1336 ret = media_entity_pads_init(&ov5693->sd.entity, 1, &ov5693->pad);
1347 ret = ov5693_sensor_powerup(ov5693);
1351 ret = ov5693_detect(ov5693);
1359 ret = v4l2_async_register_subdev_sensor(&ov5693->sd);
1376 ov5693_sensor_powerdown(ov5693);
1378 media_entity_cleanup(&ov5693->sd.entity);
1380 v4l2_ctrl_handler_free(&ov5693->ctrls.handler);
1388 struct ov5693_device *ov5693 = to_ov5693_sensor(sd);
1391 media_entity_cleanup(&ov5693->sd.entity);
1392 v4l2_ctrl_handler_free(&ov5693->ctrls.handler);
1393 mutex_destroy(&ov5693->lock);
1401 ov5693_sensor_powerdown(ov5693);
1416 { .compatible = "ovti,ov5693", },
1423 .name = "ov5693",