Lines Matching +full:sd +full:- +full:lines
1 // SPDX-License-Identifier: GPL-2.0-only
15 #include <media/v4l2-ctrls.h>
16 #include <media/v4l2-fwnode.h>
17 #include <media/v4l2-subdev.h>
24 /* Lines per frame */
67 * struct imx335_reg - imx335 sensor register
77 * struct imx335_reg_list - imx335 sensor register list
93 * struct imx335_mode - imx335 sensor mode structure
97 * @hblank: Horizontal blanking in lines
98 * @vblank: Vertical blanking in lines
99 * @vblank_min: Minimum vertical blanking in lines
100 * @vblank_max: Maximum vertical blanking in lines
119 * struct imx335 - imx335 sensor device structure
122 * @sd: V4L2 sub-device
134 * @vblank: Vertical blanking in lines
142 struct v4l2_subdev sd; member
291 * to_imx335() - imx335 V4L2 sub-device to imx335 device.
292 * @subdev: pointer to imx335 V4L2 sub-device
298 return container_of(subdev, struct imx335, sd); in to_imx335()
302 * imx335_read_reg() - Read registers.
314 struct i2c_client *client = v4l2_get_subdevdata(&imx335->sd); in imx335_read_reg()
321 return -EINVAL; in imx335_read_reg()
326 msgs[0].addr = client->addr; in imx335_read_reg()
332 msgs[1].addr = client->addr; in imx335_read_reg()
337 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in imx335_read_reg()
339 return -EIO; in imx335_read_reg()
347 * imx335_write_reg() - Write register
359 struct i2c_client *client = v4l2_get_subdevdata(&imx335->sd); in imx335_write_reg()
363 return -EINVAL; in imx335_write_reg()
368 return -EIO; in imx335_write_reg()
374 * imx335_write_regs() - Write a list of registers
397 * imx335_update_controls() - Update control ranges based on streaming mode
408 ret = __v4l2_ctrl_s_ctrl(imx335->link_freq_ctrl, mode->link_freq_idx); in imx335_update_controls()
412 ret = __v4l2_ctrl_s_ctrl(imx335->hblank_ctrl, mode->hblank); in imx335_update_controls()
416 return __v4l2_ctrl_modify_range(imx335->vblank_ctrl, mode->vblank_min, in imx335_update_controls()
417 mode->vblank_max, 1, mode->vblank); in imx335_update_controls()
421 * imx335_update_exp_gain() - Set updated exposure and gain
433 lpfr = imx335->vblank + imx335->cur_mode->height; in imx335_update_exp_gain()
434 shutter = lpfr - exposure; in imx335_update_exp_gain()
436 dev_dbg(imx335->dev, "Set exp %u, analog gain %u, shutter %u, lpfr %u\n", in imx335_update_exp_gain()
460 * imx335_set_ctrl() - Set subdevice control
464 * - V4L2_CID_VBLANK
465 * - cluster controls:
466 * - V4L2_CID_ANALOGUE_GAIN
467 * - V4L2_CID_EXPOSURE
474 container_of(ctrl->handler, struct imx335, ctrl_handler); in imx335_set_ctrl()
479 switch (ctrl->id) { in imx335_set_ctrl()
481 imx335->vblank = imx335->vblank_ctrl->val; in imx335_set_ctrl()
483 dev_dbg(imx335->dev, "Received vblank %u, new lpfr %u\n", in imx335_set_ctrl()
484 imx335->vblank, in imx335_set_ctrl()
485 imx335->vblank + imx335->cur_mode->height); in imx335_set_ctrl()
487 ret = __v4l2_ctrl_modify_range(imx335->exp_ctrl, in imx335_set_ctrl()
489 imx335->vblank + in imx335_set_ctrl()
490 imx335->cur_mode->height - in imx335_set_ctrl()
496 if (!pm_runtime_get_if_in_use(imx335->dev)) in imx335_set_ctrl()
499 exposure = ctrl->val; in imx335_set_ctrl()
500 analog_gain = imx335->again_ctrl->val; in imx335_set_ctrl()
502 dev_dbg(imx335->dev, "Received exp %u, analog gain %u\n", in imx335_set_ctrl()
507 pm_runtime_put(imx335->dev); in imx335_set_ctrl()
511 dev_err(imx335->dev, "Invalid control %d\n", ctrl->id); in imx335_set_ctrl()
512 ret = -EINVAL; in imx335_set_ctrl()
536 * imx335_enum_mbus_code() - Enumerate V4L2 sub-device mbus codes
537 * @sd: pointer to imx335 V4L2 sub-device structure
538 * @sd_state: V4L2 sub-device configuration
539 * @code: V4L2 sub-device code enumeration need to be filled
543 static int imx335_enum_mbus_code(struct v4l2_subdev *sd, in imx335_enum_mbus_code() argument
547 if (code->index >= ARRAY_SIZE(imx335_mbus_codes)) in imx335_enum_mbus_code()
548 return -EINVAL; in imx335_enum_mbus_code()
550 code->code = imx335_mbus_codes[code->index]; in imx335_enum_mbus_code()
556 * imx335_enum_frame_size() - Enumerate V4L2 sub-device frame sizes
557 * @sd: pointer to imx335 V4L2 sub-device structure
558 * @sd_state: V4L2 sub-device configuration
559 * @fsize: V4L2 sub-device size enumeration need to be filled
563 static int imx335_enum_frame_size(struct v4l2_subdev *sd, in imx335_enum_frame_size() argument
567 struct imx335 *imx335 = to_imx335(sd); in imx335_enum_frame_size()
570 if (fsize->index > ARRAY_SIZE(imx335_mbus_codes)) in imx335_enum_frame_size()
571 return -EINVAL; in imx335_enum_frame_size()
573 code = imx335_get_format_code(imx335, fsize->code); in imx335_enum_frame_size()
574 if (fsize->code != code) in imx335_enum_frame_size()
575 return -EINVAL; in imx335_enum_frame_size()
577 fsize->min_width = supported_mode.width; in imx335_enum_frame_size()
578 fsize->max_width = fsize->min_width; in imx335_enum_frame_size()
579 fsize->min_height = supported_mode.height; in imx335_enum_frame_size()
580 fsize->max_height = fsize->min_height; in imx335_enum_frame_size()
586 * imx335_fill_pad_format() - Fill subdevice pad format
590 * @fmt: V4L2 sub-device format need to be filled
596 fmt->format.width = mode->width; in imx335_fill_pad_format()
597 fmt->format.height = mode->height; in imx335_fill_pad_format()
598 fmt->format.code = imx335->cur_mbus_code; in imx335_fill_pad_format()
599 fmt->format.field = V4L2_FIELD_NONE; in imx335_fill_pad_format()
600 fmt->format.colorspace = V4L2_COLORSPACE_RAW; in imx335_fill_pad_format()
601 fmt->format.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; in imx335_fill_pad_format()
602 fmt->format.quantization = V4L2_QUANTIZATION_DEFAULT; in imx335_fill_pad_format()
603 fmt->format.xfer_func = V4L2_XFER_FUNC_NONE; in imx335_fill_pad_format()
607 * imx335_get_pad_format() - Get subdevice pad format
608 * @sd: pointer to imx335 V4L2 sub-device structure
609 * @sd_state: V4L2 sub-device configuration
610 * @fmt: V4L2 sub-device format need to be set
614 static int imx335_get_pad_format(struct v4l2_subdev *sd, in imx335_get_pad_format() argument
618 struct imx335 *imx335 = to_imx335(sd); in imx335_get_pad_format()
620 mutex_lock(&imx335->mutex); in imx335_get_pad_format()
622 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in imx335_get_pad_format()
625 framefmt = v4l2_subdev_state_get_format(sd_state, fmt->pad); in imx335_get_pad_format()
626 fmt->format = *framefmt; in imx335_get_pad_format()
628 imx335_fill_pad_format(imx335, imx335->cur_mode, fmt); in imx335_get_pad_format()
631 mutex_unlock(&imx335->mutex); in imx335_get_pad_format()
637 * imx335_set_pad_format() - Set subdevice pad format
638 * @sd: pointer to imx335 V4L2 sub-device structure
639 * @sd_state: V4L2 sub-device configuration
640 * @fmt: V4L2 sub-device format need to be set
644 static int imx335_set_pad_format(struct v4l2_subdev *sd, in imx335_set_pad_format() argument
648 struct imx335 *imx335 = to_imx335(sd); in imx335_set_pad_format()
652 mutex_lock(&imx335->mutex); in imx335_set_pad_format()
656 if (imx335_mbus_codes[i] == fmt->format.code) in imx335_set_pad_format()
657 imx335->cur_mbus_code = imx335_mbus_codes[i]; in imx335_set_pad_format()
662 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in imx335_set_pad_format()
665 framefmt = v4l2_subdev_state_get_format(sd_state, fmt->pad); in imx335_set_pad_format()
666 *framefmt = fmt->format; in imx335_set_pad_format()
670 imx335->cur_mode = mode; in imx335_set_pad_format()
673 mutex_unlock(&imx335->mutex); in imx335_set_pad_format()
679 * imx335_init_state() - Initialize sub-device state
680 * @sd: pointer to imx335 V4L2 sub-device structure
681 * @sd_state: V4L2 sub-device configuration
685 static int imx335_init_state(struct v4l2_subdev *sd, in imx335_init_state() argument
688 struct imx335 *imx335 = to_imx335(sd); in imx335_init_state()
694 return imx335_set_pad_format(sd, sd_state, &fmt); in imx335_init_state()
698 * imx335_get_selection() - Selection API
699 * @sd: pointer to imx335 V4L2 sub-device structure
700 * @sd_state: V4L2 sub-device configuration
705 static int imx335_get_selection(struct v4l2_subdev *sd, in imx335_get_selection() argument
709 switch (sel->target) { in imx335_get_selection()
711 sel->r.top = 0; in imx335_get_selection()
712 sel->r.left = 0; in imx335_get_selection()
713 sel->r.width = IMX335_NATIVE_WIDTH; in imx335_get_selection()
714 sel->r.height = IMX335_NATIVE_HEIGHT; in imx335_get_selection()
721 sel->r.top = IMX335_PIXEL_ARRAY_TOP; in imx335_get_selection()
722 sel->r.left = IMX335_PIXEL_ARRAY_LEFT; in imx335_get_selection()
723 sel->r.width = IMX335_PIXEL_ARRAY_WIDTH; in imx335_get_selection()
724 sel->r.height = IMX335_PIXEL_ARRAY_HEIGHT; in imx335_get_selection()
729 return -EINVAL; in imx335_get_selection()
734 switch (imx335->cur_mbus_code) { in imx335_set_framefmt()
744 return -EINVAL; in imx335_set_framefmt()
748 * imx335_start_streaming() - Start sensor stream
759 reg_list = &imx335->cur_mode->reg_list; in imx335_start_streaming()
760 ret = imx335_write_regs(imx335, reg_list->regs, in imx335_start_streaming()
761 reg_list->num_of_regs); in imx335_start_streaming()
763 dev_err(imx335->dev, "fail to write initial registers\n"); in imx335_start_streaming()
769 dev_err(imx335->dev, "%s failed to set frame format: %d\n", in imx335_start_streaming()
775 ret = __v4l2_ctrl_handler_setup(imx335->sd.ctrl_handler); in imx335_start_streaming()
777 dev_err(imx335->dev, "fail to setup handler\n"); in imx335_start_streaming()
785 dev_err(imx335->dev, "fail to start streaming\n"); in imx335_start_streaming()
796 * imx335_stop_streaming() - Stop sensor stream
808 * imx335_set_stream() - Enable sensor streaming
809 * @sd: pointer to imx335 subdevice
814 static int imx335_set_stream(struct v4l2_subdev *sd, int enable) in imx335_set_stream() argument
816 struct imx335 *imx335 = to_imx335(sd); in imx335_set_stream()
819 mutex_lock(&imx335->mutex); in imx335_set_stream()
822 ret = pm_runtime_resume_and_get(imx335->dev); in imx335_set_stream()
831 pm_runtime_put(imx335->dev); in imx335_set_stream()
834 mutex_unlock(&imx335->mutex); in imx335_set_stream()
839 pm_runtime_put(imx335->dev); in imx335_set_stream()
841 mutex_unlock(&imx335->mutex); in imx335_set_stream()
847 * imx335_detect() - Detect imx335 sensor
850 * Return: 0 if successful, -EIO if sensor id does not match
862 dev_err(imx335->dev, "chip id mismatch: %x!=%x\n", in imx335_detect()
864 return -ENXIO; in imx335_detect()
871 * imx335_parse_hw_config() - Parse HW configuration and check if supported
878 struct fwnode_handle *fwnode = dev_fwnode(imx335->dev); in imx335_parse_hw_config()
888 return -ENXIO; in imx335_parse_hw_config()
891 imx335->reset_gpio = devm_gpiod_get_optional(imx335->dev, "reset", in imx335_parse_hw_config()
893 if (IS_ERR(imx335->reset_gpio)) { in imx335_parse_hw_config()
894 dev_err(imx335->dev, "failed to get reset gpio %ld\n", in imx335_parse_hw_config()
895 PTR_ERR(imx335->reset_gpio)); in imx335_parse_hw_config()
896 return PTR_ERR(imx335->reset_gpio); in imx335_parse_hw_config()
900 imx335->supplies[i].supply = imx335_supply_name[i]; in imx335_parse_hw_config()
902 ret = devm_regulator_bulk_get(imx335->dev, in imx335_parse_hw_config()
904 imx335->supplies); in imx335_parse_hw_config()
906 dev_err(imx335->dev, "Failed to get regulators\n"); in imx335_parse_hw_config()
911 imx335->inclk = devm_clk_get(imx335->dev, NULL); in imx335_parse_hw_config()
912 if (IS_ERR(imx335->inclk)) { in imx335_parse_hw_config()
913 dev_err(imx335->dev, "could not get inclk\n"); in imx335_parse_hw_config()
914 return PTR_ERR(imx335->inclk); in imx335_parse_hw_config()
917 rate = clk_get_rate(imx335->inclk); in imx335_parse_hw_config()
919 dev_err(imx335->dev, "inclk frequency mismatch\n"); in imx335_parse_hw_config()
920 return -EINVAL; in imx335_parse_hw_config()
925 dev_err(imx335->dev, "Failed to get next endpoint\n"); in imx335_parse_hw_config()
926 return -ENXIO; in imx335_parse_hw_config()
935 dev_err(imx335->dev, in imx335_parse_hw_config()
938 ret = -EINVAL; in imx335_parse_hw_config()
943 dev_err(imx335->dev, "no link frequencies defined\n"); in imx335_parse_hw_config()
944 ret = -EINVAL; in imx335_parse_hw_config()
952 dev_err(imx335->dev, "no compatible link frequencies found\n"); in imx335_parse_hw_config()
954 ret = -EINVAL; in imx335_parse_hw_config()
986 * imx335_power_on() - Sensor power on sequence
993 struct v4l2_subdev *sd = dev_get_drvdata(dev); in imx335_power_on() local
994 struct imx335 *imx335 = to_imx335(sd); in imx335_power_on()
998 imx335->supplies); in imx335_power_on()
1008 gpiod_set_value_cansleep(imx335->reset_gpio, 1); in imx335_power_on()
1010 ret = clk_prepare_enable(imx335->inclk); in imx335_power_on()
1012 dev_err(imx335->dev, "fail to enable inclk\n"); in imx335_power_on()
1021 gpiod_set_value_cansleep(imx335->reset_gpio, 0); in imx335_power_on()
1022 regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies); in imx335_power_on()
1028 * imx335_power_off() - Sensor power off sequence
1035 struct v4l2_subdev *sd = dev_get_drvdata(dev); in imx335_power_off() local
1036 struct imx335 *imx335 = to_imx335(sd); in imx335_power_off()
1038 gpiod_set_value_cansleep(imx335->reset_gpio, 0); in imx335_power_off()
1039 clk_disable_unprepare(imx335->inclk); in imx335_power_off()
1040 regulator_bulk_disable(ARRAY_SIZE(imx335_supply_name), imx335->supplies); in imx335_power_off()
1046 * imx335_init_controls() - Initialize sensor subdevice controls
1053 struct v4l2_ctrl_handler *ctrl_hdlr = &imx335->ctrl_handler; in imx335_init_controls()
1054 const struct imx335_mode *mode = imx335->cur_mode; in imx335_init_controls()
1063 ctrl_hdlr->lock = &imx335->mutex; in imx335_init_controls()
1066 lpfr = mode->vblank + mode->height; in imx335_init_controls()
1067 imx335->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr, in imx335_init_controls()
1071 lpfr - IMX335_EXPOSURE_OFFSET, in imx335_init_controls()
1075 imx335->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr, in imx335_init_controls()
1083 v4l2_ctrl_cluster(2, &imx335->exp_ctrl); in imx335_init_controls()
1085 imx335->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr, in imx335_init_controls()
1088 mode->vblank_min, in imx335_init_controls()
1089 mode->vblank_max, in imx335_init_controls()
1090 1, mode->vblank); in imx335_init_controls()
1093 imx335->pclk_ctrl = v4l2_ctrl_new_std(ctrl_hdlr, in imx335_init_controls()
1096 mode->pclk, mode->pclk, in imx335_init_controls()
1097 1, mode->pclk); in imx335_init_controls()
1099 imx335->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr, in imx335_init_controls()
1102 ARRAY_SIZE(link_freq) - in imx335_init_controls()
1104 mode->link_freq_idx, in imx335_init_controls()
1106 if (imx335->link_freq_ctrl) in imx335_init_controls()
1107 imx335->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx335_init_controls()
1109 imx335->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr, in imx335_init_controls()
1112 mode->hblank, in imx335_init_controls()
1113 mode->hblank, in imx335_init_controls()
1114 1, mode->hblank); in imx335_init_controls()
1115 if (imx335->hblank_ctrl) in imx335_init_controls()
1116 imx335->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx335_init_controls()
1118 if (ctrl_hdlr->error) { in imx335_init_controls()
1119 dev_err(imx335->dev, "control init failed: %d\n", in imx335_init_controls()
1120 ctrl_hdlr->error); in imx335_init_controls()
1122 return ctrl_hdlr->error; in imx335_init_controls()
1125 imx335->sd.ctrl_handler = ctrl_hdlr; in imx335_init_controls()
1131 * imx335_probe() - I2C client device binding
1141 imx335 = devm_kzalloc(&client->dev, sizeof(*imx335), GFP_KERNEL); in imx335_probe()
1143 return -ENOMEM; in imx335_probe()
1145 imx335->dev = &client->dev; in imx335_probe()
1148 v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops); in imx335_probe()
1149 imx335->sd.internal_ops = &imx335_internal_ops; in imx335_probe()
1153 dev_err(imx335->dev, "HW configuration is not supported\n"); in imx335_probe()
1157 mutex_init(&imx335->mutex); in imx335_probe()
1159 ret = imx335_power_on(imx335->dev); in imx335_probe()
1161 dev_err(imx335->dev, "failed to power-on the sensor\n"); in imx335_probe()
1168 dev_err(imx335->dev, "failed to find sensor: %d\n", ret); in imx335_probe()
1173 imx335->cur_mode = &supported_mode; in imx335_probe()
1174 imx335->cur_mbus_code = imx335_mbus_codes[0]; in imx335_probe()
1175 imx335->vblank = imx335->cur_mode->vblank; in imx335_probe()
1179 dev_err(imx335->dev, "failed to init controls: %d\n", ret); in imx335_probe()
1184 imx335->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in imx335_probe()
1185 imx335->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx335_probe()
1188 imx335->pad.flags = MEDIA_PAD_FL_SOURCE; in imx335_probe()
1189 ret = media_entity_pads_init(&imx335->sd.entity, 1, &imx335->pad); in imx335_probe()
1191 dev_err(imx335->dev, "failed to init entity pads: %d\n", ret); in imx335_probe()
1195 ret = v4l2_async_register_subdev_sensor(&imx335->sd); in imx335_probe()
1197 dev_err(imx335->dev, in imx335_probe()
1202 pm_runtime_set_active(imx335->dev); in imx335_probe()
1203 pm_runtime_enable(imx335->dev); in imx335_probe()
1204 pm_runtime_idle(imx335->dev); in imx335_probe()
1209 media_entity_cleanup(&imx335->sd.entity); in imx335_probe()
1211 v4l2_ctrl_handler_free(imx335->sd.ctrl_handler); in imx335_probe()
1213 imx335_power_off(imx335->dev); in imx335_probe()
1215 mutex_destroy(&imx335->mutex); in imx335_probe()
1221 * imx335_remove() - I2C client device unbinding
1228 struct v4l2_subdev *sd = i2c_get_clientdata(client); in imx335_remove() local
1229 struct imx335 *imx335 = to_imx335(sd); in imx335_remove()
1231 v4l2_async_unregister_subdev(sd); in imx335_remove()
1232 media_entity_cleanup(&sd->entity); in imx335_remove()
1233 v4l2_ctrl_handler_free(sd->ctrl_handler); in imx335_remove()
1235 pm_runtime_disable(&client->dev); in imx335_remove()
1236 if (!pm_runtime_status_suspended(&client->dev)) in imx335_remove()
1237 imx335_power_off(&client->dev); in imx335_remove()
1238 pm_runtime_set_suspended(&client->dev); in imx335_remove()
1240 mutex_destroy(&imx335->mutex); in imx335_remove()