Lines Matching +full:solid +full:- +full:state
1 // SPDX-License-Identifier: GPL-2.0-only
19 #include <media/v4l2-ctrls.h>
20 #include <media/v4l2-fwnode.h>
21 #include <media/v4l2-subdev.h>
110 * describe MIPI CSI-2 speed. This driver uses lane rates wherever possible
124 /* INCK Settings - includes all lane rate and INCK dependent registers */
203 /* all-pixel 2-lane 720 Mbps 15.74 Hz mode */
219 /* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */
235 /* all-pixel 4-lane 891 Mbps 30 Hz mode */
333 "solid black",
334 "solid white",
335 "solid dark gray",
336 "solid light gray",
375 /* use all-pixel readout mode, no flip */
379 /* use RAW 10-bit mode */
470 ret = regmap_raw_read(sensor->regmap, addr & IMX415_REG_ADDR_MASK, data, in imx415_read()
483 ret = regmap_raw_write(sensor->regmap, addr & IMX415_REG_ADDR_MASK, in imx415_write()
486 dev_err_ratelimited(sensor->dev, in imx415_write()
487 "%u-bit write to 0x%04x failed: %d\n", in imx415_write()
505 ret = imx415_write(sensor, IMX415_TPG_PATSEL_DUOUT, val - 1); in imx415_set_testpattern()
539 struct imx415 *sensor = container_of(ctrl->handler, struct imx415, in imx415_s_ctrl()
542 struct v4l2_subdev_state *state; in imx415_s_ctrl() local
546 if (!sensor->streaming) in imx415_s_ctrl()
549 state = v4l2_subdev_get_locked_active_state(&sensor->subdev); in imx415_s_ctrl()
550 format = v4l2_subdev_get_pad_format(&sensor->subdev, state, 0); in imx415_s_ctrl()
552 switch (ctrl->id) { in imx415_s_ctrl()
555 vmax = format->height + sensor->vblank->cur.val; in imx415_s_ctrl()
556 ctrl->val = min_t(int, ctrl->val, vmax); in imx415_s_ctrl()
557 return imx415_write(sensor, IMX415_SHR0, vmax - ctrl->val); in imx415_s_ctrl()
561 return imx415_write(sensor, IMX415_GAIN_PCG_0, ctrl->val); in imx415_s_ctrl()
565 flip = (sensor->hflip->val << IMX415_HREVERSE_SHIFT) | in imx415_s_ctrl()
566 (sensor->vflip->val << IMX415_VREVERSE_SHIFT); in imx415_s_ctrl()
570 return imx415_set_testpattern(sensor, ctrl->val); in imx415_s_ctrl()
573 return -EINVAL; in imx415_s_ctrl()
585 u64 pixel_rate = supported_modes[sensor->cur_mode].pixel_rate; in imx415_ctrls_init()
586 u64 lane_rate = supported_modes[sensor->cur_mode].lane_rate; in imx415_ctrls_init()
588 IMX415_PIXEL_ARRAY_VBLANK - 8; in imx415_ctrls_init()
593 ret = v4l2_fwnode_device_parse(sensor->dev, &props); in imx415_ctrls_init()
597 v4l2_ctrl_handler_init(&sensor->ctrls, 10); in imx415_ctrls_init()
604 return dev_err_probe(sensor->dev, -EINVAL, in imx415_ctrls_init()
609 ctrl = v4l2_ctrl_new_int_menu(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
611 ARRAY_SIZE(link_freq_menu_items) - 1, i, in imx415_ctrls_init()
615 ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx415_ctrls_init()
617 v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, V4L2_CID_EXPOSURE, in imx415_ctrls_init()
620 v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
625 hblank = supported_modes[sensor->cur_mode].hmax_pix - in imx415_ctrls_init()
627 ctrl = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
630 ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx415_ctrls_init()
632 sensor->vblank = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
637 if (sensor->vblank) in imx415_ctrls_init()
638 sensor->vblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx415_ctrls_init()
645 v4l2_ctrl_new_std(&sensor->ctrls, NULL, V4L2_CID_PIXEL_RATE, pixel_rate, in imx415_ctrls_init()
648 sensor->hflip = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
650 sensor->vflip = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
653 v4l2_ctrl_new_std_menu_items(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
655 ARRAY_SIZE(imx415_test_pattern_menu) - 1, in imx415_ctrls_init()
658 v4l2_ctrl_new_fwnode_properties(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
661 if (sensor->ctrls.error) { in imx415_ctrls_init()
662 dev_err_probe(sensor->dev, sensor->ctrls.error, in imx415_ctrls_init()
664 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_ctrls_init()
665 return sensor->ctrls.error; in imx415_ctrls_init()
667 sensor->subdev.ctrl_handler = &sensor->ctrls; in imx415_ctrls_init()
679 dev_err(sensor->dev, "Mode %d not supported\n", mode); in imx415_set_mode()
680 return -EINVAL; in imx415_set_mode()
685 ret = imx415_write(sensor, reg->address, reg->val); in imx415_set_mode()
691 reg = &sensor->clk_params->regs[i]; in imx415_set_mode()
692 ret = imx415_write(sensor, reg->address, reg->val); in imx415_set_mode()
700 static int imx415_setup(struct imx415 *sensor, struct v4l2_subdev_state *state) in imx415_setup() argument
712 return imx415_set_mode(sensor, sensor->cur_mode); in imx415_setup()
758 struct v4l2_subdev_state *state; in imx415_s_stream() local
761 state = v4l2_subdev_lock_and_get_active_state(sd); in imx415_s_stream()
766 pm_runtime_mark_last_busy(sensor->dev); in imx415_s_stream()
767 pm_runtime_put_autosuspend(sensor->dev); in imx415_s_stream()
769 sensor->streaming = false; in imx415_s_stream()
774 ret = pm_runtime_resume_and_get(sensor->dev); in imx415_s_stream()
778 ret = imx415_setup(sensor, state); in imx415_s_stream()
787 sensor->streaming = true; in imx415_s_stream()
789 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls); in imx415_s_stream()
800 v4l2_subdev_unlock_state(state); in imx415_s_stream()
809 pm_runtime_put_sync(sensor->dev); in imx415_s_stream()
810 sensor->streaming = false; in imx415_s_stream()
816 struct v4l2_subdev_state *state, in imx415_enum_mbus_code() argument
819 if (code->index != 0) in imx415_enum_mbus_code()
820 return -EINVAL; in imx415_enum_mbus_code()
822 code->code = MEDIA_BUS_FMT_SGBRG10_1X10; in imx415_enum_mbus_code()
828 struct v4l2_subdev_state *state, in imx415_enum_frame_size() argument
833 format = v4l2_subdev_get_pad_format(sd, state, fse->pad); in imx415_enum_frame_size()
835 if (fse->index > 0 || fse->code != format->code) in imx415_enum_frame_size()
836 return -EINVAL; in imx415_enum_frame_size()
838 fse->min_width = IMX415_PIXEL_ARRAY_WIDTH; in imx415_enum_frame_size()
839 fse->max_width = fse->min_width; in imx415_enum_frame_size()
840 fse->min_height = IMX415_PIXEL_ARRAY_HEIGHT; in imx415_enum_frame_size()
841 fse->max_height = fse->min_height; in imx415_enum_frame_size()
846 struct v4l2_subdev_state *state, in imx415_get_format() argument
849 fmt->format = *v4l2_subdev_get_pad_format(sd, state, fmt->pad); in imx415_get_format()
855 struct v4l2_subdev_state *state, in imx415_set_format() argument
860 format = v4l2_subdev_get_pad_format(sd, state, fmt->pad); in imx415_set_format()
862 format->width = fmt->format.width; in imx415_set_format()
863 format->height = fmt->format.height; in imx415_set_format()
864 format->code = MEDIA_BUS_FMT_SGBRG10_1X10; in imx415_set_format()
865 format->field = V4L2_FIELD_NONE; in imx415_set_format()
866 format->colorspace = V4L2_COLORSPACE_RAW; in imx415_set_format()
867 format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; in imx415_set_format()
868 format->quantization = V4L2_QUANTIZATION_DEFAULT; in imx415_set_format()
869 format->xfer_func = V4L2_XFER_FUNC_NONE; in imx415_set_format()
871 fmt->format = *format; in imx415_set_format()
879 switch (sel->target) { in imx415_get_selection()
883 sel->r.top = IMX415_PIXEL_ARRAY_TOP; in imx415_get_selection()
884 sel->r.left = IMX415_PIXEL_ARRAY_LEFT; in imx415_get_selection()
885 sel->r.width = IMX415_PIXEL_ARRAY_WIDTH; in imx415_get_selection()
886 sel->r.height = IMX415_PIXEL_ARRAY_HEIGHT; in imx415_get_selection()
891 return -EINVAL; in imx415_get_selection()
895 struct v4l2_subdev_state *state) in imx415_init_cfg() argument
904 imx415_set_format(sd, state, &format); in imx415_init_cfg()
929 struct i2c_client *client = to_i2c_client(sensor->dev); in imx415_subdev_init()
932 v4l2_i2c_subdev_init(&sensor->subdev, client, &imx415_subdev_ops); in imx415_subdev_init()
938 sensor->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in imx415_subdev_init()
940 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in imx415_subdev_init()
941 sensor->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx415_subdev_init()
942 ret = media_entity_pads_init(&sensor->subdev.entity, 1, &sensor->pad); in imx415_subdev_init()
944 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_subdev_init()
948 sensor->subdev.state_lock = sensor->subdev.ctrl_handler->lock; in imx415_subdev_init()
949 v4l2_subdev_init_finalize(&sensor->subdev); in imx415_subdev_init()
956 media_entity_cleanup(&sensor->subdev.entity); in imx415_subdev_cleanup()
957 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_subdev_cleanup()
964 ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies), in imx415_power_on()
965 sensor->supplies); in imx415_power_on()
969 gpiod_set_value_cansleep(sensor->reset, 0); in imx415_power_on()
973 ret = clk_prepare_enable(sensor->clk); in imx415_power_on()
987 gpiod_set_value_cansleep(sensor->reset, 1); in imx415_power_on()
988 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); in imx415_power_on()
994 clk_disable_unprepare(sensor->clk); in imx415_power_off()
995 gpiod_set_value_cansleep(sensor->reset, 1); in imx415_power_off()
996 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); in imx415_power_off()
1005 * is not the case of the sensor info register :-( in imx415_identify_model()
1009 return dev_err_probe(sensor->dev, ret, in imx415_identify_model()
1014 dev_err_probe(sensor->dev, ret, in imx415_identify_model()
1023 dev_info(sensor->dev, "Detected IMX415 image sensor\n"); in imx415_identify_model()
1026 ret = dev_err_probe(sensor->dev, -ENODEV, in imx415_identify_model()
1049 return -EINVAL; in imx415_check_inck()
1065 for (i = 0; i < ARRAY_SIZE(sensor->supplies); ++i) in imx415_parse_hw_config()
1066 sensor->supplies[i].supply = imx415_supply_names[i]; in imx415_parse_hw_config()
1068 ret = devm_regulator_bulk_get(sensor->dev, ARRAY_SIZE(sensor->supplies), in imx415_parse_hw_config()
1069 sensor->supplies); in imx415_parse_hw_config()
1071 return dev_err_probe(sensor->dev, ret, in imx415_parse_hw_config()
1074 sensor->reset = devm_gpiod_get_optional(sensor->dev, "reset", in imx415_parse_hw_config()
1076 if (IS_ERR(sensor->reset)) in imx415_parse_hw_config()
1077 return dev_err_probe(sensor->dev, PTR_ERR(sensor->reset), in imx415_parse_hw_config()
1080 sensor->clk = devm_clk_get(sensor->dev, "inck"); in imx415_parse_hw_config()
1081 if (IS_ERR(sensor->clk)) in imx415_parse_hw_config()
1082 return dev_err_probe(sensor->dev, PTR_ERR(sensor->clk), in imx415_parse_hw_config()
1085 ep = fwnode_graph_get_next_endpoint(dev_fwnode(sensor->dev), NULL); in imx415_parse_hw_config()
1087 return -ENXIO; in imx415_parse_hw_config()
1097 sensor->num_data_lanes = bus_cfg.bus.mipi_csi2.num_data_lanes; in imx415_parse_hw_config()
1100 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1107 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1116 inck = clk_get_rate(sensor->clk); in imx415_parse_hw_config()
1119 dev_dbg(sensor->dev, in imx415_parse_hw_config()
1126 if (sensor->num_data_lanes != supported_modes[j].lanes) in imx415_parse_hw_config()
1131 sensor->cur_mode = j; in imx415_parse_hw_config()
1138 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1143 lane_rate = supported_modes[sensor->cur_mode].lane_rate; in imx415_parse_hw_config()
1147 sensor->clk_params = &imx415_clk_params[i]; in imx415_parse_hw_config()
1152 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1154 sensor->cur_mode); in imx415_parse_hw_config()
1159 dev_dbg(sensor->dev, "clock: %lu Hz, lane_rate: %llu bps, lanes: %d\n", in imx415_parse_hw_config()
1160 inck, lane_rate, sensor->num_data_lanes); in imx415_parse_hw_config()
1173 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); in imx415_probe()
1175 return -ENOMEM; in imx415_probe()
1177 sensor->dev = &client->dev; in imx415_probe()
1183 sensor->regmap = devm_regmap_init_i2c(client, &imx415_regmap_config); in imx415_probe()
1184 if (IS_ERR(sensor->regmap)) in imx415_probe()
1185 return PTR_ERR(sensor->regmap); in imx415_probe()
1208 pm_runtime_set_active(sensor->dev); in imx415_probe()
1209 pm_runtime_get_noresume(sensor->dev); in imx415_probe()
1210 pm_runtime_enable(sensor->dev); in imx415_probe()
1212 ret = v4l2_async_register_subdev_sensor(&sensor->subdev); in imx415_probe()
1221 pm_runtime_set_autosuspend_delay(sensor->dev, 1000); in imx415_probe()
1222 pm_runtime_use_autosuspend(sensor->dev); in imx415_probe()
1223 pm_runtime_put_autosuspend(sensor->dev); in imx415_probe()
1228 pm_runtime_disable(sensor->dev); in imx415_probe()
1229 pm_runtime_put_noidle(sensor->dev); in imx415_probe()
1249 pm_runtime_disable(sensor->dev); in imx415_remove()
1250 if (!pm_runtime_status_suspended(sensor->dev)) in imx415_remove()
1252 pm_runtime_set_suspended(sensor->dev); in imx415_remove()