Lines Matching +full:vdddo +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0
23 #include <media/media-entity.h>
24 #include <media/v4l2-cci.h>
25 #include <media/v4l2-ctrls.h>
26 #include <media/v4l2-device.h>
27 #include <media/v4l2-event.h>
28 #include <media/v4l2-fwnode.h>
29 #include <media/v4l2-subdev.h>
117 * +------------------------------------+
119 * +---+------------------------------------+---+
121 * | | +----------------------------+ | | \
129 * | | +----------------------------+ | | /
131 * +---+------------------------------------+---+
132 * <-> <-> <--------------------------> <-> <->
133 * \---- Ignored right margin (4)
134 * \-------- Effective right margin (9)
135 * \------------------------- Recommended width (1920)
136 * \----------------------------------------- Effective left margin (8)
137 * \--------------------------------------------- Ignored left margin (4)
139 * The optical black lines are output over CSI-2 with a separate data type.
260 /* -----------------------------------------------------------------------------
443 if (imx290->nlanes == 2) in imx290_link_freqs_ptr()
451 if (imx290->nlanes == 2) in imx290_link_freqs_num()
552 if (imx290->nlanes == 2) in imx290_modes_ptr()
560 if (imx290->nlanes == 2) in imx290_modes_num()
601 if (info->code[imx290->model->colour_variant] == code) in imx290_format_info()
614 ret = cci_multi_reg_write(imx290->regmap, settings, num_settings, NULL); in imx290_set_register_array()
626 const struct imx290_mode *mode = imx290->current_mode; in imx290_set_clock()
627 enum imx290_clk_freq clk_idx = imx290->xclk_idx; in imx290_set_clock()
628 const struct imx290_clk_cfg *clk_cfg = &mode->clk_cfg[clk_idx]; in imx290_set_clock()
634 cci_write(imx290->regmap, IMX290_INCKSEL1, clk_cfg->incksel1, &ret); in imx290_set_clock()
635 cci_write(imx290->regmap, IMX290_INCKSEL2, clk_cfg->incksel2, &ret); in imx290_set_clock()
636 cci_write(imx290->regmap, IMX290_INCKSEL3, clk_cfg->incksel3, &ret); in imx290_set_clock()
637 cci_write(imx290->regmap, IMX290_INCKSEL4, clk_cfg->incksel4, &ret); in imx290_set_clock()
638 cci_write(imx290->regmap, IMX290_INCKSEL5, clk_cfg->incksel5, &ret); in imx290_set_clock()
639 cci_write(imx290->regmap, IMX290_INCKSEL6, clk_cfg->incksel6, &ret); in imx290_set_clock()
648 cci_write(imx290->regmap, IMX290_PHY_LANE_NUM, imx290->nlanes - 1, in imx290_set_data_lanes()
650 cci_write(imx290->regmap, IMX290_CSI_LANE_MODE, imx290->nlanes - 1, in imx290_set_data_lanes()
652 cci_write(imx290->regmap, IMX290_FR_FDG_SEL, 0x01, &ret); in imx290_set_data_lanes()
661 unsigned int bpp = imx290_format_info(imx290, format->code)->bpp; in imx290_set_black_level()
663 return cci_write(imx290->regmap, IMX290_BLKLEVEL, in imx290_set_black_level()
664 black_level >> (16 - bpp), err); in imx290_set_black_level()
673 switch (link_freqs[imx290->current_mode->link_freq_index]) { in imx290_set_csi_config()
687 return -EINVAL; in imx290_set_csi_config()
690 cci_write(imx290->regmap, IMX290_REPETITION, csi_cfg->repetition, &ret); in imx290_set_csi_config()
691 cci_write(imx290->regmap, IMX290_TCLKPOST, csi_cfg->tclkpost, &ret); in imx290_set_csi_config()
692 cci_write(imx290->regmap, IMX290_THSZERO, csi_cfg->thszero, &ret); in imx290_set_csi_config()
693 cci_write(imx290->regmap, IMX290_THSPREPARE, csi_cfg->thsprepare, &ret); in imx290_set_csi_config()
694 cci_write(imx290->regmap, IMX290_TCLKTRAIL, csi_cfg->tclktrail, &ret); in imx290_set_csi_config()
695 cci_write(imx290->regmap, IMX290_THSTRAIL, csi_cfg->thstrail, &ret); in imx290_set_csi_config()
696 cci_write(imx290->regmap, IMX290_TCLKZERO, csi_cfg->tclkzero, &ret); in imx290_set_csi_config()
697 cci_write(imx290->regmap, IMX290_TCLKPREPARE, csi_cfg->tclkprepare, in imx290_set_csi_config()
699 cci_write(imx290->regmap, IMX290_TLPX, csi_cfg->tlpx, &ret); in imx290_set_csi_config()
710 info = imx290_format_info(imx290, format->code); in imx290_setup_format()
712 ret = imx290_set_register_array(imx290, info->regs, info->num_regs); in imx290_setup_format()
714 dev_err(imx290->dev, "Could not set format registers\n"); in imx290_setup_format()
722 /* ----------------------------------------------------------------------------
730 exposure_max = imx290->vblank->val + mode->height - in imx290_exposure_update()
732 __v4l2_ctrl_modify_range(imx290->exposure, 1, exposure_max, 1, in imx290_exposure_update()
738 struct imx290 *imx290 = container_of(ctrl->handler, in imx290_set_ctrl()
748 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) in imx290_set_ctrl()
751 if (ctrl->id == V4L2_CID_VBLANK) { in imx290_set_ctrl()
753 imx290_exposure_update(imx290, imx290->current_mode); in imx290_set_ctrl()
757 if (!pm_runtime_get_if_in_use(imx290->dev)) in imx290_set_ctrl()
760 state = v4l2_subdev_get_locked_active_state(&imx290->sd); in imx290_set_ctrl()
763 switch (ctrl->id) { in imx290_set_ctrl()
765 ret = cci_write(imx290->regmap, IMX290_GAIN, ctrl->val, NULL); in imx290_set_ctrl()
769 ret = cci_write(imx290->regmap, IMX290_VMAX, in imx290_set_ctrl()
770 ctrl->val + imx290->current_mode->height, NULL); in imx290_set_ctrl()
778 ctrl = imx290->exposure; in imx290_set_ctrl()
781 vmax = imx290->vblank->val + imx290->current_mode->height; in imx290_set_ctrl()
782 ret = cci_write(imx290->regmap, IMX290_SHS1, in imx290_set_ctrl()
783 vmax - ctrl->val - 1, NULL); in imx290_set_ctrl()
787 if (ctrl->val) { in imx290_set_ctrl()
790 cci_write(imx290->regmap, IMX290_PGCTRL, in imx290_set_ctrl()
793 IMX290_PGCTRL_MODE(ctrl->val)), &ret); in imx290_set_ctrl()
795 cci_write(imx290->regmap, IMX290_PGCTRL, 0x00, &ret); in imx290_set_ctrl()
803 ret = cci_write(imx290->regmap, IMX290_HMAX, in imx290_set_ctrl()
804 ctrl->val + imx290->current_mode->width, NULL); in imx290_set_ctrl()
812 reg = imx290->current_mode->ctrl_07; in imx290_set_ctrl()
813 if (imx290->hflip->val) in imx290_set_ctrl()
815 if (imx290->vflip->val) in imx290_set_ctrl()
817 ret = cci_write(imx290->regmap, IMX290_CTRL_07, reg, NULL); in imx290_set_ctrl()
822 ret = -EINVAL; in imx290_set_ctrl()
826 pm_runtime_mark_last_busy(imx290->dev); in imx290_set_ctrl()
827 pm_runtime_put_autosuspend(imx290->dev); in imx290_set_ctrl()
839 "Horizontal Color-bar Chart",
840 "Vertical Color-bar Chart",
850 unsigned int hblank_min = mode->hmax_min - mode->width; in imx290_ctrl_update()
851 unsigned int hblank_max = IMX290_HMAX_MAX - mode->width; in imx290_ctrl_update()
852 unsigned int vblank_min = mode->vmax_min - mode->height; in imx290_ctrl_update()
853 unsigned int vblank_max = IMX290_VMAX_MAX - mode->height; in imx290_ctrl_update()
855 __v4l2_ctrl_s_ctrl(imx290->link_freq, mode->link_freq_index); in imx290_ctrl_update()
857 __v4l2_ctrl_modify_range(imx290->hblank, hblank_min, hblank_max, 1, in imx290_ctrl_update()
859 __v4l2_ctrl_modify_range(imx290->vblank, vblank_min, vblank_max, 1, in imx290_ctrl_update()
868 ret = v4l2_fwnode_device_parse(imx290->dev, &props); in imx290_ctrl_init()
872 v4l2_ctrl_handler_init(&imx290->ctrls, 11); in imx290_ctrl_init()
887 v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
894 imx290->exposure = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
903 imx290->link_freq = in imx290_ctrl_init()
904 v4l2_ctrl_new_int_menu(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
906 imx290_link_freqs_num(imx290) - 1, 0, in imx290_ctrl_init()
908 if (imx290->link_freq) in imx290_ctrl_init()
909 imx290->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx290_ctrl_init()
911 v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, V4L2_CID_PIXEL_RATE, in imx290_ctrl_init()
915 v4l2_ctrl_new_std_menu_items(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
917 ARRAY_SIZE(imx290_test_pattern_menu) - 1, in imx290_ctrl_init()
923 imx290->hblank = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
926 imx290->vblank = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
929 imx290->hflip = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
931 imx290->vflip = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
933 v4l2_ctrl_cluster(2, &imx290->hflip); in imx290_ctrl_init()
935 v4l2_ctrl_new_fwnode_properties(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
938 imx290->sd.ctrl_handler = &imx290->ctrls; in imx290_ctrl_init()
940 if (imx290->ctrls.error) { in imx290_ctrl_init()
941 ret = imx290->ctrls.error; in imx290_ctrl_init()
942 v4l2_ctrl_handler_free(&imx290->ctrls); in imx290_ctrl_init()
949 /* ----------------------------------------------------------------------------
964 dev_err(imx290->dev, "Could not set init registers\n"); in imx290_start_streaming()
969 ret = imx290_set_register_array(imx290, imx290->model->init_regs, in imx290_start_streaming()
970 imx290->model->init_regs_num); in imx290_start_streaming()
972 dev_err(imx290->dev, "Could not set model specific init registers\n"); in imx290_start_streaming()
979 dev_err(imx290->dev, "Could not set clocks - %d\n", ret); in imx290_start_streaming()
986 dev_err(imx290->dev, "Could not set data lanes - %d\n", ret); in imx290_start_streaming()
992 dev_err(imx290->dev, "Could not set csi cfg - %d\n", ret); in imx290_start_streaming()
1000 dev_err(imx290->dev, "Could not set frame format - %d\n", ret); in imx290_start_streaming()
1005 ret = imx290_set_register_array(imx290, imx290->current_mode->data, in imx290_start_streaming()
1006 imx290->current_mode->data_size); in imx290_start_streaming()
1008 dev_err(imx290->dev, "Could not set current mode - %d\n", ret); in imx290_start_streaming()
1013 ret = __v4l2_ctrl_handler_setup(imx290->sd.ctrl_handler); in imx290_start_streaming()
1015 dev_err(imx290->dev, "Could not sync v4l2 controls - %d\n", ret); in imx290_start_streaming()
1019 cci_write(imx290->regmap, IMX290_STANDBY, 0x00, &ret); in imx290_start_streaming()
1024 return cci_write(imx290->regmap, IMX290_XMSTA, 0x00, &ret); in imx290_start_streaming()
1032 cci_write(imx290->regmap, IMX290_STANDBY, 0x01, &ret); in imx290_stop_streaming()
1036 return cci_write(imx290->regmap, IMX290_XMSTA, 0x01, &ret); in imx290_stop_streaming()
1048 ret = pm_runtime_resume_and_get(imx290->dev); in imx290_set_stream()
1054 dev_err(imx290->dev, "Start stream failed\n"); in imx290_set_stream()
1055 pm_runtime_put_sync(imx290->dev); in imx290_set_stream()
1060 pm_runtime_mark_last_busy(imx290->dev); in imx290_set_stream()
1061 pm_runtime_put_autosuspend(imx290->dev); in imx290_set_stream()
1068 __v4l2_ctrl_grab(imx290->vflip, enable); in imx290_set_stream()
1069 __v4l2_ctrl_grab(imx290->hflip, enable); in imx290_set_stream()
1082 if (code->index >= ARRAY_SIZE(imx290_formats)) in imx290_enum_mbus_code()
1083 return -EINVAL; in imx290_enum_mbus_code()
1085 code->code = imx290_formats[code->index].code[imx290->model->colour_variant]; in imx290_enum_mbus_code()
1097 if (!imx290_format_info(imx290, fse->code)) in imx290_enum_frame_size()
1098 return -EINVAL; in imx290_enum_frame_size()
1100 if (fse->index >= imx290_modes_num(imx290)) in imx290_enum_frame_size()
1101 return -EINVAL; in imx290_enum_frame_size()
1103 fse->min_width = imx290_modes[fse->index].width; in imx290_enum_frame_size()
1104 fse->max_width = imx290_modes[fse->index].width; in imx290_enum_frame_size()
1105 fse->min_height = imx290_modes[fse->index].height; in imx290_enum_frame_size()
1106 fse->max_height = imx290_modes[fse->index].height; in imx290_enum_frame_size()
1121 fmt->format.width, fmt->format.height); in imx290_set_fmt()
1123 fmt->format.width = mode->width; in imx290_set_fmt()
1124 fmt->format.height = mode->height; in imx290_set_fmt()
1126 if (!imx290_format_info(imx290, fmt->format.code)) in imx290_set_fmt()
1127 fmt->format.code = imx290_formats[0].code[imx290->model->colour_variant]; in imx290_set_fmt()
1129 fmt->format.field = V4L2_FIELD_NONE; in imx290_set_fmt()
1130 fmt->format.colorspace = V4L2_COLORSPACE_RAW; in imx290_set_fmt()
1131 fmt->format.ycbcr_enc = V4L2_YCBCR_ENC_601; in imx290_set_fmt()
1132 fmt->format.quantization = V4L2_QUANTIZATION_FULL_RANGE; in imx290_set_fmt()
1133 fmt->format.xfer_func = V4L2_XFER_FUNC_NONE; in imx290_set_fmt()
1137 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) { in imx290_set_fmt()
1138 imx290->current_mode = mode; in imx290_set_fmt()
1144 *format = fmt->format; in imx290_set_fmt()
1156 switch (sel->target) { in imx290_get_selection()
1164 sel->r.top = IMX290_PIXEL_ARRAY_MARGIN_TOP in imx290_get_selection()
1165 + (IMX290_PIXEL_ARRAY_RECORDING_HEIGHT - format->height) / 2 in imx290_get_selection()
1166 + imx290->vflip->val; in imx290_get_selection()
1167 sel->r.left = IMX290_PIXEL_ARRAY_MARGIN_LEFT in imx290_get_selection()
1168 + (IMX290_PIXEL_ARRAY_RECORDING_WIDTH - format->width) / 2 in imx290_get_selection()
1169 + imx290->hflip->val; in imx290_get_selection()
1170 sel->r.width = format->width; in imx290_get_selection()
1171 sel->r.height = format->height; in imx290_get_selection()
1178 sel->r.top = 0; in imx290_get_selection()
1179 sel->r.left = 0; in imx290_get_selection()
1180 sel->r.width = IMX290_PIXEL_ARRAY_WIDTH; in imx290_get_selection()
1181 sel->r.height = IMX290_PIXEL_ARRAY_HEIGHT; in imx290_get_selection()
1186 sel->r.top = IMX290_PIXEL_ARRAY_MARGIN_TOP; in imx290_get_selection()
1187 sel->r.left = IMX290_PIXEL_ARRAY_MARGIN_LEFT; in imx290_get_selection()
1188 sel->r.width = IMX290_PIXEL_ARRAY_RECORDING_WIDTH; in imx290_get_selection()
1189 sel->r.height = IMX290_PIXEL_ARRAY_RECORDING_HEIGHT; in imx290_get_selection()
1194 return -EINVAL; in imx290_get_selection()
1247 struct i2c_client *client = to_i2c_client(imx290->dev); in imx290_subdev_init()
1251 imx290->current_mode = &imx290_modes_ptr(imx290)[0]; in imx290_subdev_init()
1253 v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops); in imx290_subdev_init()
1254 imx290->sd.internal_ops = &imx290_internal_ops; in imx290_subdev_init()
1255 imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in imx290_subdev_init()
1257 imx290->sd.dev = imx290->dev; in imx290_subdev_init()
1258 imx290->sd.entity.ops = &imx290_subdev_entity_ops; in imx290_subdev_init()
1259 imx290->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx290_subdev_init()
1261 imx290->pad.flags = MEDIA_PAD_FL_SOURCE; in imx290_subdev_init()
1262 ret = media_entity_pads_init(&imx290->sd.entity, 1, &imx290->pad); in imx290_subdev_init()
1264 dev_err(imx290->dev, "Could not register media entity\n"); in imx290_subdev_init()
1270 dev_err(imx290->dev, "Control initialization error %d\n", ret); in imx290_subdev_init()
1274 imx290->sd.state_lock = imx290->ctrls.lock; in imx290_subdev_init()
1276 ret = v4l2_subdev_init_finalize(&imx290->sd); in imx290_subdev_init()
1278 dev_err(imx290->dev, "subdev initialization error %d\n", ret); in imx290_subdev_init()
1282 state = v4l2_subdev_lock_and_get_active_state(&imx290->sd); in imx290_subdev_init()
1283 imx290_ctrl_update(imx290, imx290->current_mode); in imx290_subdev_init()
1289 v4l2_ctrl_handler_free(&imx290->ctrls); in imx290_subdev_init()
1291 media_entity_cleanup(&imx290->sd.entity); in imx290_subdev_init()
1297 v4l2_subdev_cleanup(&imx290->sd); in imx290_subdev_cleanup()
1298 media_entity_cleanup(&imx290->sd.entity); in imx290_subdev_cleanup()
1299 v4l2_ctrl_handler_free(&imx290->ctrls); in imx290_subdev_cleanup()
1302 /* ----------------------------------------------------------------------------
1310 ret = clk_prepare_enable(imx290->xclk); in imx290_power_on()
1312 dev_err(imx290->dev, "Failed to enable clock\n"); in imx290_power_on()
1316 ret = regulator_bulk_enable(ARRAY_SIZE(imx290->supplies), in imx290_power_on()
1317 imx290->supplies); in imx290_power_on()
1319 dev_err(imx290->dev, "Failed to enable regulators\n"); in imx290_power_on()
1320 clk_disable_unprepare(imx290->xclk); in imx290_power_on()
1325 gpiod_set_value_cansleep(imx290->rst_gpio, 0); in imx290_power_on()
1333 clk_disable_unprepare(imx290->xclk); in imx290_power_off()
1334 gpiod_set_value_cansleep(imx290->rst_gpio, 1); in imx290_power_off()
1335 regulator_bulk_disable(ARRAY_SIZE(imx290->supplies), imx290->supplies); in imx290_power_off()
1360 /* ----------------------------------------------------------------------------
1367 "vdddo",
1374 for (i = 0; i < ARRAY_SIZE(imx290->supplies); i++) in imx290_get_regulators()
1375 imx290->supplies[i].supply = imx290_supply_name[i]; in imx290_get_regulators()
1377 return devm_regulator_bulk_get(dev, ARRAY_SIZE(imx290->supplies), in imx290_get_regulators()
1378 imx290->supplies); in imx290_get_regulators()
1386 ret = device_property_read_u32(imx290->dev, "clock-frequency", in imx290_init_clk()
1389 dev_err(imx290->dev, "Could not get xclk frequency\n"); in imx290_init_clk()
1396 imx290->xclk_idx = IMX290_CLK_37_125; in imx290_init_clk()
1399 imx290->xclk_idx = IMX290_CLK_74_25; in imx290_init_clk()
1402 dev_err(imx290->dev, "External clock frequency %u is not supported\n", in imx290_init_clk()
1404 return -EINVAL; in imx290_init_clk()
1407 ret = clk_set_rate(imx290->xclk, xclk_freq); in imx290_init_clk()
1409 dev_err(imx290->dev, "Could not set xclk frequency\n"); in imx290_init_clk()
1429 for (j = 0; j < ep->nr_of_link_frequencies; j++) in imx290_check_link_freqs()
1430 if (freqs[i] == ep->link_frequencies[j]) in imx290_check_link_freqs()
1432 if (j == ep->nr_of_link_frequencies) in imx290_check_link_freqs()
1469 imx290->model = of_device_get_match_data(imx290->dev); in imx290_parse_dt()
1471 endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(imx290->dev), NULL); in imx290_parse_dt()
1473 dev_err(imx290->dev, "Endpoint node not found\n"); in imx290_parse_dt()
1474 return -EINVAL; in imx290_parse_dt()
1479 if (ret == -ENXIO) { in imx290_parse_dt()
1480 dev_err(imx290->dev, "Unsupported bus type, should be CSI2\n"); in imx290_parse_dt()
1483 dev_err(imx290->dev, "Parsing endpoint node failed\n"); in imx290_parse_dt()
1488 imx290->nlanes = ep.bus.mipi_csi2.num_data_lanes; in imx290_parse_dt()
1489 if (imx290->nlanes != 2 && imx290->nlanes != 4) { in imx290_parse_dt()
1490 dev_err(imx290->dev, "Invalid data lanes: %d\n", imx290->nlanes); in imx290_parse_dt()
1491 ret = -EINVAL; in imx290_parse_dt()
1495 dev_dbg(imx290->dev, "Using %u data lanes\n", imx290->nlanes); in imx290_parse_dt()
1498 dev_err(imx290->dev, "link-frequency property not found in DT\n"); in imx290_parse_dt()
1499 ret = -EINVAL; in imx290_parse_dt()
1506 dev_err(imx290->dev, "Link frequency of %lld is not supported\n", in imx290_parse_dt()
1508 ret = -EINVAL; in imx290_parse_dt()
1521 struct device *dev = &client->dev; in imx290_probe()
1527 return -ENOMEM; in imx290_probe()
1529 imx290->dev = dev; in imx290_probe()
1530 imx290->regmap = devm_cci_regmap_init_i2c(client, 16); in imx290_probe()
1531 if (IS_ERR(imx290->regmap)) { in imx290_probe()
1533 return -ENODEV; in imx290_probe()
1541 imx290->xclk = devm_clk_get(dev, "xclk"); in imx290_probe()
1542 if (IS_ERR(imx290->xclk)) in imx290_probe()
1543 return dev_err_probe(dev, PTR_ERR(imx290->xclk), in imx290_probe()
1550 imx290->rst_gpio = devm_gpiod_get_optional(dev, "reset", in imx290_probe()
1552 if (IS_ERR(imx290->rst_gpio)) in imx290_probe()
1553 return dev_err_probe(dev, PTR_ERR(imx290->rst_gpio), in imx290_probe()
1588 v4l2_i2c_subdev_set_name(&imx290->sd, client, in imx290_probe()
1589 imx290->model->name, NULL); in imx290_probe()
1596 ret = v4l2_async_register_subdev(&imx290->sd); in imx290_probe()
1632 pm_runtime_disable(imx290->dev); in imx290_remove()
1633 if (!pm_runtime_status_suspended(imx290->dev)) in imx290_remove()
1635 pm_runtime_set_suspended(imx290->dev); in imx290_remove()
1640 /* Deprecated - synonym for "sony,imx290lqr" */