Lines Matching +full:vdig +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0
24 #include <media/v4l2-ctrls.h>
25 #include <media/v4l2-device.h>
26 #include <media/v4l2-event.h>
27 #include <media/v4l2-fwnode.h>
28 #include <media/v4l2-mediabus.h>
72 /* HBLANK control - read only */
153 /* V-timing */
166 /* To Access Addresses 3000-5fff, send the following commands */
206 {0x0114, 0x01}, /* CSI 2-Lane Mode */
332 "VANA", /* Analog (2.8V) supply */
333 "VDIG", /* Digital Core (1.8V) supply */
334 "VDDL", /* IF (1.2V) supply */
343 * - no flip
344 * - h flip
345 * - v flip
346 * - h&v flips
361 * Initialisation delay between XCLR low->high and the moment when the sensor
374 * This start-up time can be optimized a bit more, if we start the writes
379 * This delay doesn't account for the power supply startup time. If needed,
381 * case of DT for regulator-fixed one should define the startup-delay-us
497 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_read_reg()
504 return -EINVAL; in imx219_read_reg()
507 msgs[0].addr = client->addr; in imx219_read_reg()
513 msgs[1].addr = client->addr; in imx219_read_reg()
516 msgs[1].buf = &data_buf[4 - len]; in imx219_read_reg()
518 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in imx219_read_reg()
520 return -EIO; in imx219_read_reg()
530 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_write_reg()
534 return -EINVAL; in imx219_write_reg()
537 put_unaligned_be32(val << (8 * (4 - len)), buf + 2); in imx219_write_reg()
539 return -EIO; in imx219_write_reg()
548 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_write_regs()
555 dev_err_ratelimited(&client->dev, in imx219_write_regs()
578 i = (i & ~3) | (imx219->vflip->val ? 2 : 0) | in imx219_get_format_code()
579 (imx219->hflip->val ? 1 : 0); in imx219_get_format_code()
587 container_of(ctrl->handler, struct imx219, ctrl_handler); in imx219_set_ctrl()
588 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_set_ctrl()
591 if (ctrl->id == V4L2_CID_VBLANK) { in imx219_set_ctrl()
595 exposure_max = imx219->mode->height + ctrl->val - 4; in imx219_set_ctrl()
598 __v4l2_ctrl_modify_range(imx219->exposure, in imx219_set_ctrl()
599 imx219->exposure->minimum, in imx219_set_ctrl()
600 exposure_max, imx219->exposure->step, in imx219_set_ctrl()
608 if (pm_runtime_get_if_in_use(&client->dev) == 0) in imx219_set_ctrl()
611 switch (ctrl->id) { in imx219_set_ctrl()
614 IMX219_REG_VALUE_08BIT, ctrl->val); in imx219_set_ctrl()
618 IMX219_REG_VALUE_16BIT, ctrl->val); in imx219_set_ctrl()
622 IMX219_REG_VALUE_16BIT, ctrl->val); in imx219_set_ctrl()
627 imx219_test_pattern_val[ctrl->val]); in imx219_set_ctrl()
632 imx219->hflip->val | in imx219_set_ctrl()
633 imx219->vflip->val << 1); in imx219_set_ctrl()
638 imx219->mode->height + ctrl->val); in imx219_set_ctrl()
642 IMX219_REG_VALUE_16BIT, ctrl->val); in imx219_set_ctrl()
646 IMX219_REG_VALUE_16BIT, ctrl->val); in imx219_set_ctrl()
650 IMX219_REG_VALUE_16BIT, ctrl->val); in imx219_set_ctrl()
654 IMX219_REG_VALUE_16BIT, ctrl->val); in imx219_set_ctrl()
657 dev_info(&client->dev, in imx219_set_ctrl()
659 ctrl->id, ctrl->val); in imx219_set_ctrl()
660 ret = -EINVAL; in imx219_set_ctrl()
664 pm_runtime_put(&client->dev); in imx219_set_ctrl()
678 fmt->code = imx219_get_format_code(imx219, code); in imx219_update_pad_format()
679 fmt->width = mode->width; in imx219_update_pad_format()
680 fmt->height = mode->height; in imx219_update_pad_format()
681 fmt->field = V4L2_FIELD_NONE; in imx219_update_pad_format()
682 fmt->colorspace = V4L2_COLORSPACE_RAW; in imx219_update_pad_format()
683 fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE; in imx219_update_pad_format()
684 fmt->xfer_func = V4L2_XFER_FUNC_NONE; in imx219_update_pad_format()
701 crop->top = IMX219_PIXEL_ARRAY_TOP; in imx219_init_cfg()
702 crop->left = IMX219_PIXEL_ARRAY_LEFT; in imx219_init_cfg()
703 crop->width = IMX219_PIXEL_ARRAY_WIDTH; in imx219_init_cfg()
704 crop->height = IMX219_PIXEL_ARRAY_HEIGHT; in imx219_init_cfg()
715 if (code->index >= (ARRAY_SIZE(imx219_mbus_formats) / 4)) in imx219_enum_mbus_code()
716 return -EINVAL; in imx219_enum_mbus_code()
718 code->code = imx219_get_format_code(imx219, imx219_mbus_formats[code->index * 4]); in imx219_enum_mbus_code()
730 if (fse->index >= ARRAY_SIZE(supported_modes)) in imx219_enum_frame_size()
731 return -EINVAL; in imx219_enum_frame_size()
733 code = imx219_get_format_code(imx219, fse->code); in imx219_enum_frame_size()
734 if (fse->code != code) in imx219_enum_frame_size()
735 return -EINVAL; in imx219_enum_frame_size()
737 fse->min_width = supported_modes[fse->index].width; in imx219_enum_frame_size()
738 fse->max_width = fse->min_width; in imx219_enum_frame_size()
739 fse->min_height = supported_modes[fse->index].height; in imx219_enum_frame_size()
740 fse->max_height = fse->min_height; in imx219_enum_frame_size()
758 fmt->format.width, fmt->format.height); in imx219_set_pad_format()
760 imx219_update_pad_format(imx219, mode, &fmt->format, fmt->format.code); in imx219_set_pad_format()
765 *format = fmt->format; in imx219_set_pad_format()
766 *crop = mode->crop; in imx219_set_pad_format()
768 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) { in imx219_set_pad_format()
769 imx219->mode = mode; in imx219_set_pad_format()
771 __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN, in imx219_set_pad_format()
772 IMX219_VTS_MAX - mode->height, 1, in imx219_set_pad_format()
773 mode->vts_def - mode->height); in imx219_set_pad_format()
774 __v4l2_ctrl_s_ctrl(imx219->vblank, in imx219_set_pad_format()
775 mode->vts_def - mode->height); in imx219_set_pad_format()
777 exposure_max = mode->vts_def - 4; in imx219_set_pad_format()
780 __v4l2_ctrl_modify_range(imx219->exposure, in imx219_set_pad_format()
781 imx219->exposure->minimum, in imx219_set_pad_format()
782 exposure_max, imx219->exposure->step, in imx219_set_pad_format()
786 * depends on mode->width only, and is not changeble in any in imx219_set_pad_format()
789 hblank = IMX219_PPL_DEFAULT - mode->width; in imx219_set_pad_format()
790 __v4l2_ctrl_modify_range(imx219->hblank, hblank, hblank, 1, in imx219_set_pad_format()
800 switch (format->code) { in imx219_set_framefmt()
816 return -EINVAL; in imx219_set_framefmt()
822 if (!imx219->mode->binning) { in imx219_set_binning()
828 switch (format->code) { in imx219_set_binning()
846 return -EINVAL; in imx219_set_binning()
853 switch (sel->target) { in imx219_get_selection()
855 sel->r = *v4l2_subdev_get_pad_crop(sd, sd_state, 0); in imx219_get_selection()
860 sel->r.top = 0; in imx219_get_selection()
861 sel->r.left = 0; in imx219_get_selection()
862 sel->r.width = IMX219_NATIVE_WIDTH; in imx219_get_selection()
863 sel->r.height = IMX219_NATIVE_HEIGHT; in imx219_get_selection()
869 sel->r.top = IMX219_PIXEL_ARRAY_TOP; in imx219_get_selection()
870 sel->r.left = IMX219_PIXEL_ARRAY_LEFT; in imx219_get_selection()
871 sel->r.width = IMX219_PIXEL_ARRAY_WIDTH; in imx219_get_selection()
872 sel->r.height = IMX219_PIXEL_ARRAY_HEIGHT; in imx219_get_selection()
877 return -EINVAL; in imx219_get_selection()
883 IMX219_REG_VALUE_08BIT, (imx219->lanes == 2) ? in imx219_configure_lanes()
890 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_start_streaming()
895 ret = pm_runtime_resume_and_get(&client->dev); in imx219_start_streaming()
902 dev_err(&client->dev, "%s failed to send mfg header\n", __func__); in imx219_start_streaming()
909 dev_err(&client->dev, "%s failed to configure lanes\n", __func__); in imx219_start_streaming()
914 reg_list = &imx219->mode->reg_list; in imx219_start_streaming()
915 ret = imx219_write_regs(imx219, reg_list->regs, reg_list->num_of_regs); in imx219_start_streaming()
917 dev_err(&client->dev, "%s failed to set mode\n", __func__); in imx219_start_streaming()
921 format = v4l2_subdev_get_pad_format(&imx219->sd, state, 0); in imx219_start_streaming()
924 dev_err(&client->dev, "%s failed to set frame format: %d\n", in imx219_start_streaming()
931 dev_err(&client->dev, "%s failed to set binning: %d\n", in imx219_start_streaming()
937 ret = __v4l2_ctrl_handler_setup(imx219->sd.ctrl_handler); in imx219_start_streaming()
948 __v4l2_ctrl_grab(imx219->vflip, true); in imx219_start_streaming()
949 __v4l2_ctrl_grab(imx219->hflip, true); in imx219_start_streaming()
954 pm_runtime_put(&client->dev); in imx219_start_streaming()
960 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_stop_streaming()
967 dev_err(&client->dev, "%s failed to set stream\n", __func__); in imx219_stop_streaming()
969 __v4l2_ctrl_grab(imx219->vflip, false); in imx219_stop_streaming()
970 __v4l2_ctrl_grab(imx219->hflip, false); in imx219_stop_streaming()
972 pm_runtime_put(&client->dev); in imx219_stop_streaming()
983 if (imx219->streaming == enable) in imx219_set_stream()
998 imx219->streaming = enable; in imx219_set_stream()
1013 imx219->supplies); in imx219_power_on()
1020 ret = clk_prepare_enable(imx219->xclk); in imx219_power_on()
1027 gpiod_set_value_cansleep(imx219->reset_gpio, 1); in imx219_power_on()
1034 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies); in imx219_power_on()
1044 gpiod_set_value_cansleep(imx219->reset_gpio, 0); in imx219_power_off()
1045 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies); in imx219_power_off()
1046 clk_disable_unprepare(imx219->xclk); in imx219_power_off()
1056 if (imx219->streaming) in imx219_suspend()
1069 if (imx219->streaming) { in imx219_resume()
1081 imx219->streaming = false; in imx219_resume()
1088 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_get_regulators()
1092 imx219->supplies[i].supply = imx219_supply_name[i]; in imx219_get_regulators()
1094 return devm_regulator_bulk_get(&client->dev, in imx219_get_regulators()
1096 imx219->supplies); in imx219_get_regulators()
1102 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_identify_module()
1109 dev_err(&client->dev, "failed to read chip id %x\n", in imx219_identify_module()
1115 dev_err(&client->dev, "chip id mismatch: %x!=%x\n", in imx219_identify_module()
1117 return -EIO; in imx219_identify_module()
1150 return (imx219->lanes == 2) ? IMX219_PIXEL_RATE : IMX219_PIXEL_RATE_4LANE; in imx219_get_pixel_rate()
1156 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_init_controls()
1158 unsigned int height = imx219->mode->height; in imx219_init_controls()
1163 ctrl_hdlr = &imx219->ctrl_handler; in imx219_init_controls()
1169 imx219->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
1175 imx219->link_freq = in imx219_init_controls()
1178 ARRAY_SIZE(imx219_link_freq_menu) - 1, 0, in imx219_init_controls()
1179 (imx219->lanes == 2) ? imx219_link_freq_menu : in imx219_init_controls()
1181 if (imx219->link_freq) in imx219_init_controls()
1182 imx219->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx219_init_controls()
1185 imx219->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
1187 IMX219_VTS_MAX - height, 1, in imx219_init_controls()
1188 imx219->mode->vts_def - height); in imx219_init_controls()
1189 hblank = IMX219_PPL_DEFAULT - imx219->mode->width; in imx219_init_controls()
1190 imx219->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
1193 if (imx219->hblank) in imx219_init_controls()
1194 imx219->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx219_init_controls()
1195 exposure_max = imx219->mode->vts_def - 4; in imx219_init_controls()
1198 imx219->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
1212 imx219->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
1214 if (imx219->hflip) in imx219_init_controls()
1215 imx219->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; in imx219_init_controls()
1217 imx219->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
1219 if (imx219->vflip) in imx219_init_controls()
1220 imx219->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; in imx219_init_controls()
1224 ARRAY_SIZE(imx219_test_pattern_menu) - 1, in imx219_init_controls()
1242 if (ctrl_hdlr->error) { in imx219_init_controls()
1243 ret = ctrl_hdlr->error; in imx219_init_controls()
1244 dev_err(&client->dev, "%s control init failed (%d)\n", in imx219_init_controls()
1249 ret = v4l2_fwnode_device_parse(&client->dev, &props); in imx219_init_controls()
1258 imx219->sd.ctrl_handler = ctrl_hdlr; in imx219_init_controls()
1270 v4l2_ctrl_handler_free(imx219->sd.ctrl_handler); in imx219_free_controls()
1279 int ret = -EINVAL; in imx219_check_hwcfg()
1284 return -EINVAL; in imx219_check_hwcfg()
1298 imx219->lanes = ep_cfg.bus.mipi_csi2.num_data_lanes; in imx219_check_hwcfg()
1302 dev_err(dev, "link-frequency property not found in DT\n"); in imx219_check_hwcfg()
1307 (ep_cfg.link_frequencies[0] != ((imx219->lanes == 2) ? in imx219_check_hwcfg()
1325 struct device *dev = &client->dev; in imx219_probe()
1329 imx219 = devm_kzalloc(&client->dev, sizeof(*imx219), GFP_KERNEL); in imx219_probe()
1331 return -ENOMEM; in imx219_probe()
1333 v4l2_i2c_subdev_init(&imx219->sd, client, &imx219_subdev_ops); in imx219_probe()
1337 return -EINVAL; in imx219_probe()
1340 imx219->xclk = devm_clk_get(dev, NULL); in imx219_probe()
1341 if (IS_ERR(imx219->xclk)) { in imx219_probe()
1343 return PTR_ERR(imx219->xclk); in imx219_probe()
1346 imx219->xclk_freq = clk_get_rate(imx219->xclk); in imx219_probe()
1347 if (imx219->xclk_freq != IMX219_XCLK_FREQ) { in imx219_probe()
1349 imx219->xclk_freq); in imx219_probe()
1350 return -EINVAL; in imx219_probe()
1360 imx219->reset_gpio = devm_gpiod_get_optional(dev, "reset", in imx219_probe()
1376 imx219->mode = &supported_modes[0]; in imx219_probe()
1378 /* sensor doesn't enter LP-11 state upon power up until and unless in imx219_probe()
1380 * streaming -> standby in imx219_probe()
1400 imx219->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in imx219_probe()
1402 imx219->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx219_probe()
1405 imx219->pad.flags = MEDIA_PAD_FL_SOURCE; in imx219_probe()
1407 ret = media_entity_pads_init(&imx219->sd.entity, 1, &imx219->pad); in imx219_probe()
1413 imx219->sd.state_lock = imx219->ctrl_handler.lock; in imx219_probe()
1414 ret = v4l2_subdev_init_finalize(&imx219->sd); in imx219_probe()
1420 ret = v4l2_async_register_subdev_sensor(&imx219->sd); in imx219_probe()
1422 dev_err(dev, "failed to register sensor sub-device: %d\n", ret); in imx219_probe()
1434 v4l2_subdev_cleanup(&imx219->sd); in imx219_probe()
1437 media_entity_cleanup(&imx219->sd.entity); in imx219_probe()
1455 media_entity_cleanup(&sd->entity); in imx219_remove()
1458 pm_runtime_disable(&client->dev); in imx219_remove()
1459 if (!pm_runtime_status_suspended(&client->dev)) in imx219_remove()
1460 imx219_power_off(&client->dev); in imx219_remove()
1461 pm_runtime_set_suspended(&client->dev); in imx219_remove()