Lines Matching full:imx290
3 * Sony IMX290 CMOS Image Sensor Driver
115 * The IMX290 pixel array is organized as follows:
228 struct imx290 { struct
255 static inline struct imx290 *to_imx290(struct v4l2_subdev *_sd) in to_imx290() argument
257 return container_of(_sd, struct imx290, sd); in to_imx290()
441 static inline const s64 *imx290_link_freqs_ptr(const struct imx290 *imx290) in imx290_link_freqs_ptr() argument
443 if (imx290->nlanes == 2) in imx290_link_freqs_ptr()
449 static inline int imx290_link_freqs_num(const struct imx290 *imx290) in imx290_link_freqs_num() argument
451 if (imx290->nlanes == 2) in imx290_link_freqs_num()
550 static inline const struct imx290_mode *imx290_modes_ptr(const struct imx290 *imx290) in imx290_modes_ptr() argument
552 if (imx290->nlanes == 2) in imx290_modes_ptr()
558 static inline int imx290_modes_num(const struct imx290 *imx290) in imx290_modes_num() argument
560 if (imx290->nlanes == 2) in imx290_modes_num()
594 imx290_format_info(const struct imx290 *imx290, u32 code) in imx290_format_info() argument
601 if (info->code[imx290->model->colour_variant] == code) in imx290_format_info()
608 static int imx290_set_register_array(struct imx290 *imx290, in imx290_set_register_array() argument
614 ret = cci_multi_reg_write(imx290->regmap, settings, num_settings, NULL); in imx290_set_register_array()
624 static int imx290_set_clock(struct imx290 *imx290) in imx290_set_clock() argument
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()
631 ret = imx290_set_register_array(imx290, xclk_regs[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()
644 static int imx290_set_data_lanes(struct imx290 *imx290) in imx290_set_data_lanes() argument
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()
657 static int imx290_set_black_level(struct imx290 *imx290, in imx290_set_black_level() argument
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()
667 static int imx290_set_csi_config(struct imx290 *imx290) in imx290_set_csi_config() argument
669 const s64 *link_freqs = imx290_link_freqs_ptr(imx290); in imx290_set_csi_config()
673 switch (link_freqs[imx290->current_mode->link_freq_index]) { 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()
704 static int imx290_setup_format(struct imx290 *imx290, in imx290_setup_format() argument
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()
718 return imx290_set_black_level(imx290, format, in imx290_setup_format()
725 static void imx290_exposure_update(struct imx290 *imx290, in imx290_exposure_update() argument
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() local
739 struct imx290, ctrls); 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()
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()
788 imx290_set_black_level(imx290, format, 0, &ret); in imx290_set_ctrl()
790 cci_write(imx290->regmap, IMX290_PGCTRL, in imx290_set_ctrl()
795 cci_write(imx290->regmap, IMX290_PGCTRL, 0x00, &ret); in imx290_set_ctrl()
797 imx290_set_black_level(imx290, format, 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()
826 pm_runtime_mark_last_busy(imx290->dev); in imx290_set_ctrl()
827 pm_runtime_put_autosuspend(imx290->dev); in imx290_set_ctrl()
847 static void imx290_ctrl_update(struct imx290 *imx290, in imx290_ctrl_update() argument
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()
863 static int imx290_ctrl_init(struct imx290 *imx290) in imx290_ctrl_init() argument
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()
882 * The IMX327 and IMX462 are largely compatible with the IMX290, but 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()
907 imx290_link_freqs_ptr(imx290)); 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()
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()
954 static int imx290_start_streaming(struct imx290 *imx290, in imx290_start_streaming() argument
961 ret = imx290_set_register_array(imx290, imx290_global_init_settings, in imx290_start_streaming()
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()
977 ret = imx290_set_clock(imx290); in imx290_start_streaming()
979 dev_err(imx290->dev, "Could not set clocks - %d\n", ret); in imx290_start_streaming()
984 ret = imx290_set_data_lanes(imx290); in imx290_start_streaming()
986 dev_err(imx290->dev, "Could not set data lanes - %d\n", ret); in imx290_start_streaming()
990 ret = imx290_set_csi_config(imx290); in imx290_start_streaming()
992 dev_err(imx290->dev, "Could not set csi cfg - %d\n", ret); in imx290_start_streaming()
998 ret = imx290_setup_format(imx290, format); 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()
1028 static int imx290_stop_streaming(struct imx290 *imx290) in imx290_stop_streaming() argument
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()
1041 struct imx290 *imx290 = to_imx290(sd); in imx290_set_stream() local
1048 ret = pm_runtime_resume_and_get(imx290->dev); in imx290_set_stream()
1052 ret = imx290_start_streaming(imx290, state); 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()
1059 imx290_stop_streaming(imx290); 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()
1080 const struct imx290 *imx290 = to_imx290(sd); in imx290_enum_mbus_code() local
1085 code->code = imx290_formats[code->index].code[imx290->model->colour_variant]; in imx290_enum_mbus_code()
1094 const struct imx290 *imx290 = to_imx290(sd); in imx290_enum_frame_size() local
1095 const struct imx290_mode *imx290_modes = imx290_modes_ptr(imx290); in imx290_enum_frame_size()
1097 if (!imx290_format_info(imx290, fse->code)) in imx290_enum_frame_size()
1100 if (fse->index >= imx290_modes_num(imx290)) in imx290_enum_frame_size()
1115 struct imx290 *imx290 = to_imx290(sd); in imx290_set_fmt() local
1119 mode = v4l2_find_nearest_size(imx290_modes_ptr(imx290), in imx290_set_fmt()
1120 imx290_modes_num(imx290), width, 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()
1138 imx290->current_mode = mode; in imx290_set_fmt()
1140 imx290_ctrl_update(imx290, mode); in imx290_set_fmt()
1141 imx290_exposure_update(imx290, mode); in imx290_set_fmt()
1153 struct imx290 *imx290 = to_imx290(sd); in imx290_get_selection() local
1166 + imx290->vflip->val; in imx290_get_selection()
1169 + imx290->hflip->val; in imx290_get_selection()
1245 static int imx290_subdev_init(struct imx290 *imx290) in imx290_subdev_init() argument
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()
1268 ret = imx290_ctrl_init(imx290); 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()
1295 static void imx290_subdev_cleanup(struct imx290 *imx290) in imx290_subdev_cleanup() argument
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()
1306 static int imx290_power_on(struct imx290 *imx290) in imx290_power_on() argument
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()
1331 static void imx290_power_off(struct imx290 *imx290) in imx290_power_off() argument
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()
1341 struct imx290 *imx290 = to_imx290(sd); in imx290_runtime_resume() local
1343 return imx290_power_on(imx290); in imx290_runtime_resume()
1349 struct imx290 *imx290 = to_imx290(sd); in imx290_runtime_suspend() local
1351 imx290_power_off(imx290); in imx290_runtime_suspend()
1370 static int imx290_get_regulators(struct device *dev, struct imx290 *imx290) in imx290_get_regulators() argument
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()
1381 static int imx290_init_clk(struct imx290 *imx290) in imx290_init_clk() argument
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()
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()
1421 static s64 imx290_check_link_freqs(const struct imx290 *imx290, in imx290_check_link_freqs() argument
1425 const s64 *freqs = imx290_link_freqs_ptr(imx290); in imx290_check_link_freqs()
1426 int freqs_count = imx290_link_freqs_num(imx290); in imx290_check_link_freqs()
1443 .name = "imx290",
1449 .name = "imx290",
1459 static int imx290_parse_dt(struct imx290 *imx290) in imx290_parse_dt() argument
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()
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()
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()
1504 fq = imx290_check_link_freqs(imx290, &ep); in imx290_parse_dt()
1506 dev_err(imx290->dev, "Link frequency of %lld is not supported\n", in imx290_parse_dt()
1522 struct imx290 *imx290; in imx290_probe() local
1525 imx290 = devm_kzalloc(dev, sizeof(*imx290), GFP_KERNEL); in imx290_probe()
1526 if (!imx290) 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()
1536 ret = imx290_parse_dt(imx290); 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()
1546 ret = imx290_get_regulators(dev, imx290); 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()
1557 ret = imx290_init_clk(imx290); in imx290_probe()
1566 ret = imx290_power_on(imx290); in imx290_probe()
1584 ret = imx290_subdev_init(imx290); 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()
1612 imx290_subdev_cleanup(imx290); in imx290_probe()
1616 imx290_power_off(imx290); in imx290_probe()
1623 struct imx290 *imx290 = to_imx290(sd); in imx290_remove() local
1626 imx290_subdev_cleanup(imx290); in imx290_remove()
1632 pm_runtime_disable(imx290->dev); in imx290_remove()
1633 if (!pm_runtime_status_suspended(imx290->dev)) in imx290_remove()
1634 imx290_power_off(imx290); in imx290_remove()
1635 pm_runtime_set_suspended(imx290->dev); in imx290_remove()
1641 .compatible = "sony,imx290",
1661 .name = "imx290",
1669 MODULE_DESCRIPTION("Sony IMX290 CMOS Image Sensor Driver");