Lines Matching +full:ovdd +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0-only
16 #include <media/v4l2-cci.h>
17 #include <media/v4l2-ctrls.h>
18 #include <media/v4l2-fwnode.h>
19 #include <media/v4l2-subdev.h>
132 * struct imx335_reg_list - imx335 sensor register list
142 "avdd", /* Analog (2.9V) supply */
143 "ovdd", /* Digital I/O (1.8V) supply */
144 "dvdd", /* Digital Core (1.2V) supply */
148 * struct imx335_mode - imx335 sensor mode structure
172 * struct imx335 - imx335 sensor device structure
175 * @sd: V4L2 sub-device
425 * to_imx335() - imx335 V4L2 sub-device to imx335 device.
426 * @subdev: pointer to imx335 V4L2 sub-device
436 * imx335_update_controls() - Update control ranges based on streaming mode
447 ret = __v4l2_ctrl_s_ctrl(imx335->link_freq_ctrl,
448 __ffs(imx335->link_freq_bitmap));
452 ret = __v4l2_ctrl_s_ctrl(imx335->hblank_ctrl, mode->hblank);
456 return __v4l2_ctrl_modify_range(imx335->vblank_ctrl, mode->vblank_min,
457 mode->vblank_max, 1, mode->vblank);
461 * imx335_update_exp_gain() - Set updated exposure and gain
474 lpfr = imx335->vblank + imx335->cur_mode->height;
475 shutter = lpfr - exposure;
477 dev_dbg(imx335->dev, "Set exp %u, analog gain %u, shutter %u, lpfr %u\n",
480 cci_write(imx335->cci, IMX335_REG_HOLD, 1, &ret);
481 cci_write(imx335->cci, IMX335_REG_VMAX, lpfr, &ret);
482 cci_write(imx335->cci, IMX335_REG_SHUTTER, shutter, &ret);
483 cci_write(imx335->cci, IMX335_REG_GAIN, gain, &ret);
488 ret_hold = cci_write(imx335->cci, IMX335_REG_HOLD, 0, NULL);
500 return -EINVAL;
512 cci_write(imx335->cci, IMX335_REG_TPG,
515 cci_multi_reg_write(imx335->cci, tpg_enable_regs,
527 cci_multi_reg_write(imx335->cci, tpg_disable_regs,
535 * imx335_set_ctrl() - Set subdevice control
539 * - V4L2_CID_VBLANK
540 * - cluster controls:
541 * - V4L2_CID_ANALOGUE_GAIN
542 * - V4L2_CID_EXPOSURE
549 container_of(ctrl->handler, struct imx335, ctrl_handler);
555 if (ctrl->id == V4L2_CID_VBLANK) {
556 imx335->vblank = imx335->vblank_ctrl->val;
558 dev_dbg(imx335->dev, "Received vblank %u, new lpfr %u\n",
559 imx335->vblank,
560 imx335->vblank + imx335->cur_mode->height);
562 ret = __v4l2_ctrl_modify_range(imx335->exp_ctrl,
564 imx335->vblank +
565 imx335->cur_mode->height -
576 if (pm_runtime_get_if_in_use(imx335->dev) == 0)
579 switch (ctrl->id) {
581 exposure = imx335->exp_ctrl->val;
582 analog_gain = imx335->again_ctrl->val;
588 exposure = ctrl->val;
589 analog_gain = imx335->again_ctrl->val;
591 dev_dbg(imx335->dev, "Received exp %u, analog gain %u\n",
598 ret = imx335_update_test_pattern(imx335, ctrl->val);
602 dev_err(imx335->dev, "Invalid control %d\n", ctrl->id);
603 ret = -EINVAL;
606 pm_runtime_put(imx335->dev);
629 * imx335_enum_mbus_code() - Enumerate V4L2 sub-device mbus codes
630 * @sd: pointer to imx335 V4L2 sub-device structure
631 * @sd_state: V4L2 sub-device configuration
632 * @code: V4L2 sub-device code enumeration need to be filled
640 if (code->index >= ARRAY_SIZE(imx335_mbus_codes))
641 return -EINVAL;
643 code->code = imx335_mbus_codes[code->index];
649 * imx335_enum_frame_size() - Enumerate V4L2 sub-device frame sizes
650 * @sd: pointer to imx335 V4L2 sub-device structure
651 * @sd_state: V4L2 sub-device configuration
652 * @fsize: V4L2 sub-device size enumeration need to be filled
664 if (fsize->index > 0)
665 return -EINVAL;
667 code = imx335_get_format_code(imx335, fsize->code);
668 if (fsize->code != code)
669 return -EINVAL;
671 fsize->min_width = supported_mode.width;
672 fsize->max_width = fsize->min_width;
673 fsize->min_height = supported_mode.height;
674 fsize->max_height = fsize->min_height;
680 * imx335_fill_pad_format() - Fill subdevice pad format
684 * @fmt: V4L2 sub-device format need to be filled
690 fmt->format.width = mode->width;
691 fmt->format.height = mode->height;
692 fmt->format.code = imx335->cur_mbus_code;
693 fmt->format.field = V4L2_FIELD_NONE;
694 fmt->format.colorspace = V4L2_COLORSPACE_RAW;
695 fmt->format.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
696 fmt->format.quantization = V4L2_QUANTIZATION_DEFAULT;
697 fmt->format.xfer_func = V4L2_XFER_FUNC_NONE;
701 * imx335_get_pad_format() - Get subdevice pad format
702 * @sd: pointer to imx335 V4L2 sub-device structure
703 * @sd_state: V4L2 sub-device configuration
704 * @fmt: V4L2 sub-device format need to be set
714 mutex_lock(&imx335->mutex);
716 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
719 framefmt = v4l2_subdev_state_get_format(sd_state, fmt->pad);
720 fmt->format = *framefmt;
722 imx335_fill_pad_format(imx335, imx335->cur_mode, fmt);
725 mutex_unlock(&imx335->mutex);
731 * imx335_set_pad_format() - Set subdevice pad format
732 * @sd: pointer to imx335 V4L2 sub-device structure
733 * @sd_state: V4L2 sub-device configuration
734 * @fmt: V4L2 sub-device format need to be set
746 mutex_lock(&imx335->mutex);
750 if (imx335_mbus_codes[i] == fmt->format.code)
751 imx335->cur_mbus_code = imx335_mbus_codes[i];
756 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
759 framefmt = v4l2_subdev_state_get_format(sd_state, fmt->pad);
760 *framefmt = fmt->format;
764 imx335->cur_mode = mode;
767 mutex_unlock(&imx335->mutex);
773 * imx335_init_state() - Initialize sub-device state
774 * @sd: pointer to imx335 V4L2 sub-device structure
775 * @sd_state: V4L2 sub-device configuration
788 mutex_lock(&imx335->mutex);
789 __v4l2_ctrl_modify_range(imx335->link_freq_ctrl, 0,
790 __fls(imx335->link_freq_bitmap),
791 ~(imx335->link_freq_bitmap),
792 __ffs(imx335->link_freq_bitmap));
793 mutex_unlock(&imx335->mutex);
799 * imx335_get_selection() - Selection API
800 * @sd: pointer to imx335 V4L2 sub-device structure
801 * @sd_state: V4L2 sub-device configuration
810 switch (sel->target) {
812 sel->r.top = 0;
813 sel->r.left = 0;
814 sel->r.width = IMX335_NATIVE_WIDTH;
815 sel->r.height = IMX335_NATIVE_HEIGHT;
822 sel->r.top = IMX335_PIXEL_ARRAY_TOP;
823 sel->r.left = IMX335_PIXEL_ARRAY_LEFT;
824 sel->r.width = IMX335_PIXEL_ARRAY_WIDTH;
825 sel->r.height = IMX335_PIXEL_ARRAY_HEIGHT;
830 return -EINVAL;
835 switch (imx335->cur_mbus_code) {
837 return cci_multi_reg_write(imx335->cci, raw10_framefmt_regs,
842 return cci_multi_reg_write(imx335->cci, raw12_framefmt_regs,
847 return -EINVAL;
851 * imx335_start_streaming() - Start sensor stream
862 reg_list = &link_freq_reglist[__ffs(imx335->link_freq_bitmap)];
863 ret = cci_multi_reg_write(imx335->cci, reg_list->regs,
864 reg_list->num_of_regs, NULL);
866 dev_err(imx335->dev, "%s failed to set plls\n", __func__);
871 reg_list = &imx335->cur_mode->reg_list;
872 ret = cci_multi_reg_write(imx335->cci, reg_list->regs,
873 reg_list->num_of_regs, NULL);
875 dev_err(imx335->dev, "fail to write initial registers\n");
881 dev_err(imx335->dev, "%s failed to set frame format: %d\n",
887 ret = cci_write(imx335->cci, IMX335_REG_LANEMODE,
888 imx335->lane_mode, NULL);
893 ret = __v4l2_ctrl_handler_setup(imx335->sd.ctrl_handler);
895 dev_err(imx335->dev, "fail to setup handler\n");
900 ret = cci_write(imx335->cci, IMX335_REG_MODE_SELECT,
903 dev_err(imx335->dev, "fail to start streaming\n");
914 * imx335_stop_streaming() - Stop sensor stream
921 return cci_write(imx335->cci, IMX335_REG_MODE_SELECT,
926 * imx335_set_stream() - Enable sensor streaming
937 mutex_lock(&imx335->mutex);
940 ret = pm_runtime_resume_and_get(imx335->dev);
949 pm_runtime_put(imx335->dev);
952 mutex_unlock(&imx335->mutex);
957 pm_runtime_put(imx335->dev);
959 mutex_unlock(&imx335->mutex);
965 * imx335_detect() - Detect imx335 sensor
968 * Return: 0 if successful, -EIO if sensor id does not match
975 ret = cci_read(imx335->cci, IMX335_REG_ID, &val, NULL);
980 dev_err(imx335->dev, "chip id mismatch: %x!=%llx\n",
982 return -ENXIO;
989 * imx335_parse_hw_config() - Parse HW configuration and check if supported
996 struct fwnode_handle *fwnode = dev_fwnode(imx335->dev);
1006 return -ENXIO;
1009 imx335->reset_gpio = devm_gpiod_get_optional(imx335->dev, "reset",
1011 if (IS_ERR(imx335->reset_gpio)) {
1012 dev_err(imx335->dev, "failed to get reset gpio %ld\n",
1013 PTR_ERR(imx335->reset_gpio));
1014 return PTR_ERR(imx335->reset_gpio);
1018 imx335->supplies[i].supply = imx335_supply_name[i];
1020 ret = devm_regulator_bulk_get(imx335->dev,
1022 imx335->supplies);
1024 dev_err(imx335->dev, "Failed to get regulators\n");
1029 imx335->inclk = devm_clk_get(imx335->dev, NULL);
1030 if (IS_ERR(imx335->inclk)) {
1031 dev_err(imx335->dev, "could not get inclk\n");
1032 return PTR_ERR(imx335->inclk);
1035 rate = clk_get_rate(imx335->inclk);
1037 dev_err(imx335->dev, "inclk frequency mismatch\n");
1038 return -EINVAL;
1043 dev_err(imx335->dev, "Failed to get next endpoint\n");
1044 return -ENXIO;
1054 imx335->lane_mode = IMX335_2LANE;
1057 imx335->lane_mode = IMX335_4LANE;
1060 dev_err(imx335->dev,
1063 ret = -EINVAL;
1067 ret = v4l2_link_freq_to_bitmap(imx335->dev, bus_cfg.link_frequencies,
1070 &imx335->link_freq_bitmap);
1102 * imx335_power_on() - Sensor power on sequence
1114 imx335->supplies);
1123 gpiod_set_value_cansleep(imx335->reset_gpio, 0);
1125 ret = clk_prepare_enable(imx335->inclk);
1127 dev_err(imx335->dev, "fail to enable inclk\n");
1136 gpiod_set_value_cansleep(imx335->reset_gpio, 1);
1137 regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies);
1143 * imx335_power_off() - Sensor power off sequence
1153 gpiod_set_value_cansleep(imx335->reset_gpio, 1);
1154 clk_disable_unprepare(imx335->inclk);
1155 regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies);
1161 * imx335_init_controls() - Initialize sensor subdevice controls
1168 struct v4l2_ctrl_handler *ctrl_hdlr = &imx335->ctrl_handler;
1169 const struct imx335_mode *mode = imx335->cur_mode;
1174 ret = v4l2_fwnode_device_parse(imx335->dev, &props);
1184 ctrl_hdlr->lock = &imx335->mutex;
1187 lpfr = mode->vblank + mode->height;
1188 imx335->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
1192 lpfr - IMX335_EXPOSURE_OFFSET,
1204 imx335->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
1212 v4l2_ctrl_cluster(2, &imx335->exp_ctrl);
1214 imx335->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
1217 mode->vblank_min,
1218 mode->vblank_max,
1219 1, mode->vblank);
1224 ARRAY_SIZE(imx335_tpg_menu) - 1,
1228 imx335->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
1231 mode->pclk, mode->pclk,
1232 1, mode->pclk);
1234 imx335->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
1237 __fls(imx335->link_freq_bitmap),
1238 __ffs(imx335->link_freq_bitmap),
1240 if (imx335->link_freq_ctrl)
1241 imx335->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1243 imx335->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
1246 mode->hblank,
1247 mode->hblank,
1248 1, mode->hblank);
1249 if (imx335->hblank_ctrl)
1250 imx335->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1254 if (ctrl_hdlr->error) {
1255 dev_err(imx335->dev, "control init failed: %d\n",
1256 ctrl_hdlr->error);
1258 return ctrl_hdlr->error;
1261 imx335->sd.ctrl_handler = ctrl_hdlr;
1267 * imx335_probe() - I2C client device binding
1277 imx335 = devm_kzalloc(&client->dev, sizeof(*imx335), GFP_KERNEL);
1279 return -ENOMEM;
1281 imx335->dev = &client->dev;
1282 imx335->cci = devm_cci_regmap_init_i2c(client, 16);
1283 if (IS_ERR(imx335->cci)) {
1284 dev_err(imx335->dev, "Unable to initialize I2C\n");
1285 return -ENODEV;
1289 v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops);
1290 imx335->sd.internal_ops = &imx335_internal_ops;
1294 dev_err(imx335->dev, "HW configuration is not supported\n");
1298 mutex_init(&imx335->mutex);
1300 ret = imx335_power_on(imx335->dev);
1302 dev_err(imx335->dev, "failed to power-on the sensor\n");
1309 dev_err(imx335->dev, "failed to find sensor: %d\n", ret);
1314 imx335->cur_mode = &supported_mode;
1315 imx335->cur_mbus_code = imx335_mbus_codes[0];
1316 imx335->vblank = imx335->cur_mode->vblank;
1320 dev_err(imx335->dev, "failed to init controls: %d\n", ret);
1325 imx335->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1326 imx335->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1329 imx335->pad.flags = MEDIA_PAD_FL_SOURCE;
1330 ret = media_entity_pads_init(&imx335->sd.entity, 1, &imx335->pad);
1332 dev_err(imx335->dev, "failed to init entity pads: %d\n", ret);
1336 ret = v4l2_async_register_subdev_sensor(&imx335->sd);
1338 dev_err(imx335->dev,
1343 pm_runtime_set_active(imx335->dev);
1344 pm_runtime_enable(imx335->dev);
1345 pm_runtime_idle(imx335->dev);
1350 media_entity_cleanup(&imx335->sd.entity);
1352 v4l2_ctrl_handler_free(imx335->sd.ctrl_handler);
1354 imx335_power_off(imx335->dev);
1356 mutex_destroy(&imx335->mutex);
1362 * imx335_remove() - I2C client device unbinding
1373 media_entity_cleanup(&sd->entity);
1374 v4l2_ctrl_handler_free(sd->ctrl_handler);
1376 pm_runtime_disable(&client->dev);
1377 if (!pm_runtime_status_suspended(&client->dev))
1378 imx335_power_off(&client->dev);
1379 pm_runtime_set_suspended(&client->dev);
1381 mutex_destroy(&imx335->mutex);