Lines Matching refs:imx290

229 struct imx290 {  struct
256 static inline struct imx290 *to_imx290(struct v4l2_subdev *_sd) in to_imx290() argument
258 return container_of(_sd, struct imx290, sd); in to_imx290()
487 static inline const s64 *imx290_link_freqs_ptr(const struct imx290 *imx290) in imx290_link_freqs_ptr() argument
489 if (imx290->nlanes == 2) in imx290_link_freqs_ptr()
495 static inline int imx290_link_freqs_num(const struct imx290 *imx290) in imx290_link_freqs_num() argument
497 if (imx290->nlanes == 2) in imx290_link_freqs_num()
596 static inline const struct imx290_mode *imx290_modes_ptr(const struct imx290 *imx290) in imx290_modes_ptr() argument
598 if (imx290->nlanes == 2) in imx290_modes_ptr()
604 static inline int imx290_modes_num(const struct imx290 *imx290) in imx290_modes_num() argument
606 if (imx290->nlanes == 2) in imx290_modes_num()
640 imx290_format_info(const struct imx290 *imx290, u32 code) in imx290_format_info() argument
647 if (info->code[imx290->model->colour_variant] == code) in imx290_format_info()
654 static int imx290_set_register_array(struct imx290 *imx290, in imx290_set_register_array() argument
660 ret = cci_multi_reg_write(imx290->regmap, settings, num_settings, NULL); in imx290_set_register_array()
670 static int imx290_set_clock(struct imx290 *imx290) in imx290_set_clock() argument
672 const struct imx290_mode *mode = imx290->current_mode; in imx290_set_clock()
673 enum imx290_clk_freq clk_idx = imx290->xclk_idx; in imx290_set_clock()
677 ret = imx290_set_register_array(imx290, xclk_regs[clk_idx], in imx290_set_clock()
680 cci_write(imx290->regmap, IMX290_INCKSEL1, clk_cfg->incksel1, &ret); in imx290_set_clock()
681 cci_write(imx290->regmap, IMX290_INCKSEL2, clk_cfg->incksel2, &ret); in imx290_set_clock()
682 cci_write(imx290->regmap, IMX290_INCKSEL3, clk_cfg->incksel3, &ret); in imx290_set_clock()
683 cci_write(imx290->regmap, IMX290_INCKSEL4, clk_cfg->incksel4, &ret); in imx290_set_clock()
684 cci_write(imx290->regmap, IMX290_INCKSEL5, clk_cfg->incksel5, &ret); in imx290_set_clock()
685 cci_write(imx290->regmap, IMX290_INCKSEL6, clk_cfg->incksel6, &ret); in imx290_set_clock()
690 static int imx290_set_data_lanes(struct imx290 *imx290) in imx290_set_data_lanes() argument
694 cci_write(imx290->regmap, IMX290_PHY_LANE_NUM, imx290->nlanes - 1, in imx290_set_data_lanes()
696 cci_write(imx290->regmap, IMX290_CSI_LANE_MODE, imx290->nlanes - 1, in imx290_set_data_lanes()
698 cci_write(imx290->regmap, IMX290_FR_FDG_SEL, 0x01, &ret); in imx290_set_data_lanes()
703 static int imx290_set_black_level(struct imx290 *imx290, in imx290_set_black_level() argument
707 unsigned int bpp = imx290_format_info(imx290, format->code)->bpp; in imx290_set_black_level()
709 return cci_write(imx290->regmap, IMX290_BLKLEVEL, in imx290_set_black_level()
713 static int imx290_set_csi_config(struct imx290 *imx290) in imx290_set_csi_config() argument
715 const s64 *link_freqs = imx290_link_freqs_ptr(imx290); in imx290_set_csi_config()
719 switch (link_freqs[imx290->current_mode->link_freq_index]) { in imx290_set_csi_config()
736 cci_write(imx290->regmap, IMX290_REPETITION, csi_cfg->repetition, &ret); in imx290_set_csi_config()
737 cci_write(imx290->regmap, IMX290_TCLKPOST, csi_cfg->tclkpost, &ret); in imx290_set_csi_config()
738 cci_write(imx290->regmap, IMX290_THSZERO, csi_cfg->thszero, &ret); in imx290_set_csi_config()
739 cci_write(imx290->regmap, IMX290_THSPREPARE, csi_cfg->thsprepare, &ret); in imx290_set_csi_config()
740 cci_write(imx290->regmap, IMX290_TCLKTRAIL, csi_cfg->tclktrail, &ret); in imx290_set_csi_config()
741 cci_write(imx290->regmap, IMX290_THSTRAIL, csi_cfg->thstrail, &ret); in imx290_set_csi_config()
742 cci_write(imx290->regmap, IMX290_TCLKZERO, csi_cfg->tclkzero, &ret); in imx290_set_csi_config()
743 cci_write(imx290->regmap, IMX290_TCLKPREPARE, csi_cfg->tclkprepare, in imx290_set_csi_config()
745 cci_write(imx290->regmap, IMX290_TLPX, csi_cfg->tlpx, &ret); in imx290_set_csi_config()
750 static int imx290_setup_format(struct imx290 *imx290, in imx290_setup_format() argument
756 info = imx290_format_info(imx290, format->code); in imx290_setup_format()
758 ret = imx290_set_register_array(imx290, info->regs, info->num_regs); in imx290_setup_format()
760 dev_err(imx290->dev, "Could not set format registers\n"); in imx290_setup_format()
764 return imx290_set_black_level(imx290, format, in imx290_setup_format()
771 static void imx290_exposure_update(struct imx290 *imx290, in imx290_exposure_update() argument
776 exposure_max = imx290->vblank->val + mode->height - in imx290_exposure_update()
778 __v4l2_ctrl_modify_range(imx290->exposure, 1, exposure_max, 1, in imx290_exposure_update()
784 struct imx290 *imx290 = container_of(ctrl->handler, in imx290_set_ctrl() local
785 struct imx290, ctrls); in imx290_set_ctrl()
799 imx290_exposure_update(imx290, imx290->current_mode); in imx290_set_ctrl()
803 if (!pm_runtime_get_if_in_use(imx290->dev)) in imx290_set_ctrl()
806 state = v4l2_subdev_get_locked_active_state(&imx290->sd); in imx290_set_ctrl()
811 ret = cci_write(imx290->regmap, IMX290_GAIN, ctrl->val, NULL); in imx290_set_ctrl()
815 ret = cci_write(imx290->regmap, IMX290_VMAX, in imx290_set_ctrl()
816 ctrl->val + imx290->current_mode->height, NULL); in imx290_set_ctrl()
824 ctrl = imx290->exposure; in imx290_set_ctrl()
827 vmax = imx290->vblank->val + imx290->current_mode->height; in imx290_set_ctrl()
828 ret = cci_write(imx290->regmap, IMX290_SHS1, in imx290_set_ctrl()
834 imx290_set_black_level(imx290, format, 0, &ret); in imx290_set_ctrl()
836 cci_write(imx290->regmap, IMX290_PGCTRL, in imx290_set_ctrl()
841 cci_write(imx290->regmap, IMX290_PGCTRL, 0x00, &ret); in imx290_set_ctrl()
843 imx290_set_black_level(imx290, format, in imx290_set_ctrl()
849 ret = cci_write(imx290->regmap, IMX290_HMAX, in imx290_set_ctrl()
850 ctrl->val + imx290->current_mode->width, NULL); in imx290_set_ctrl()
858 reg = imx290->current_mode->ctrl_07; in imx290_set_ctrl()
859 if (imx290->hflip->val) in imx290_set_ctrl()
861 if (imx290->vflip->val) in imx290_set_ctrl()
863 ret = cci_write(imx290->regmap, IMX290_CTRL_07, reg, NULL); in imx290_set_ctrl()
872 pm_runtime_mark_last_busy(imx290->dev); in imx290_set_ctrl()
873 pm_runtime_put_autosuspend(imx290->dev); in imx290_set_ctrl()
893 static void imx290_ctrl_update(struct imx290 *imx290, in imx290_ctrl_update() argument
901 __v4l2_ctrl_s_ctrl(imx290->link_freq, mode->link_freq_index); in imx290_ctrl_update()
903 __v4l2_ctrl_modify_range(imx290->hblank, hblank_min, hblank_max, 1, in imx290_ctrl_update()
905 __v4l2_ctrl_modify_range(imx290->vblank, vblank_min, vblank_max, 1, in imx290_ctrl_update()
909 static int imx290_ctrl_init(struct imx290 *imx290) in imx290_ctrl_init() argument
914 ret = v4l2_fwnode_device_parse(imx290->dev, &props); in imx290_ctrl_init()
918 v4l2_ctrl_handler_init(&imx290->ctrls, 11); in imx290_ctrl_init()
928 v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
930 imx290->model->max_analog_gain, 1, 0); in imx290_ctrl_init()
936 imx290->exposure = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
945 imx290->link_freq = in imx290_ctrl_init()
946 v4l2_ctrl_new_int_menu(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
948 imx290_link_freqs_num(imx290) - 1, 0, in imx290_ctrl_init()
949 imx290_link_freqs_ptr(imx290)); in imx290_ctrl_init()
950 if (imx290->link_freq) in imx290_ctrl_init()
951 imx290->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx290_ctrl_init()
953 v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, V4L2_CID_PIXEL_RATE, in imx290_ctrl_init()
957 v4l2_ctrl_new_std_menu_items(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
965 imx290->hblank = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
968 imx290->vblank = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
971 imx290->hflip = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
973 imx290->vflip = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
975 v4l2_ctrl_cluster(2, &imx290->hflip); in imx290_ctrl_init()
977 v4l2_ctrl_new_fwnode_properties(&imx290->ctrls, &imx290_ctrl_ops, in imx290_ctrl_init()
980 imx290->sd.ctrl_handler = &imx290->ctrls; in imx290_ctrl_init()
982 if (imx290->ctrls.error) { in imx290_ctrl_init()
983 ret = imx290->ctrls.error; in imx290_ctrl_init()
984 v4l2_ctrl_handler_free(&imx290->ctrls); in imx290_ctrl_init()
996 static int imx290_start_streaming(struct imx290 *imx290, in imx290_start_streaming() argument
1003 ret = imx290_set_register_array(imx290, imx290_global_init_settings, in imx290_start_streaming()
1006 dev_err(imx290->dev, "Could not set init registers\n"); in imx290_start_streaming()
1011 ret = imx290_set_register_array(imx290, imx290->model->init_regs, in imx290_start_streaming()
1012 imx290->model->init_regs_num); in imx290_start_streaming()
1014 dev_err(imx290->dev, "Could not set model specific init registers\n"); in imx290_start_streaming()
1019 ret = imx290_set_clock(imx290); in imx290_start_streaming()
1021 dev_err(imx290->dev, "Could not set clocks - %d\n", ret); in imx290_start_streaming()
1026 ret = imx290_set_data_lanes(imx290); in imx290_start_streaming()
1028 dev_err(imx290->dev, "Could not set data lanes - %d\n", ret); in imx290_start_streaming()
1032 ret = imx290_set_csi_config(imx290); in imx290_start_streaming()
1034 dev_err(imx290->dev, "Could not set csi cfg - %d\n", ret); in imx290_start_streaming()
1040 ret = imx290_setup_format(imx290, format); in imx290_start_streaming()
1042 dev_err(imx290->dev, "Could not set frame format - %d\n", ret); in imx290_start_streaming()
1047 ret = imx290_set_register_array(imx290, imx290->current_mode->data, in imx290_start_streaming()
1048 imx290->current_mode->data_size); in imx290_start_streaming()
1050 dev_err(imx290->dev, "Could not set current mode - %d\n", ret); in imx290_start_streaming()
1055 ret = __v4l2_ctrl_handler_setup(imx290->sd.ctrl_handler); in imx290_start_streaming()
1057 dev_err(imx290->dev, "Could not sync v4l2 controls - %d\n", ret); in imx290_start_streaming()
1061 cci_write(imx290->regmap, IMX290_STANDBY, 0x00, &ret); in imx290_start_streaming()
1066 return cci_write(imx290->regmap, IMX290_XMSTA, 0x00, &ret); in imx290_start_streaming()
1070 static int imx290_stop_streaming(struct imx290 *imx290) in imx290_stop_streaming() argument
1074 cci_write(imx290->regmap, IMX290_STANDBY, 0x01, &ret); in imx290_stop_streaming()
1078 return cci_write(imx290->regmap, IMX290_XMSTA, 0x01, &ret); in imx290_stop_streaming()
1083 struct imx290 *imx290 = to_imx290(sd); in imx290_set_stream() local
1090 ret = pm_runtime_resume_and_get(imx290->dev); in imx290_set_stream()
1094 ret = imx290_start_streaming(imx290, state); in imx290_set_stream()
1096 dev_err(imx290->dev, "Start stream failed\n"); in imx290_set_stream()
1097 pm_runtime_put_sync(imx290->dev); in imx290_set_stream()
1101 imx290_stop_streaming(imx290); in imx290_set_stream()
1102 pm_runtime_mark_last_busy(imx290->dev); in imx290_set_stream()
1103 pm_runtime_put_autosuspend(imx290->dev); in imx290_set_stream()
1110 __v4l2_ctrl_grab(imx290->vflip, enable); in imx290_set_stream()
1111 __v4l2_ctrl_grab(imx290->hflip, enable); in imx290_set_stream()
1122 const struct imx290 *imx290 = to_imx290(sd); in imx290_enum_mbus_code() local
1127 code->code = imx290_formats[code->index].code[imx290->model->colour_variant]; in imx290_enum_mbus_code()
1136 const struct imx290 *imx290 = to_imx290(sd); in imx290_enum_frame_size() local
1137 const struct imx290_mode *imx290_modes = imx290_modes_ptr(imx290); in imx290_enum_frame_size()
1139 if (!imx290_format_info(imx290, fse->code)) in imx290_enum_frame_size()
1142 if (fse->index >= imx290_modes_num(imx290)) in imx290_enum_frame_size()
1157 struct imx290 *imx290 = to_imx290(sd); in imx290_set_fmt() local
1161 mode = v4l2_find_nearest_size(imx290_modes_ptr(imx290), in imx290_set_fmt()
1162 imx290_modes_num(imx290), width, height, in imx290_set_fmt()
1168 if (!imx290_format_info(imx290, fmt->format.code)) in imx290_set_fmt()
1169 fmt->format.code = imx290_formats[0].code[imx290->model->colour_variant]; in imx290_set_fmt()
1180 imx290->current_mode = mode; in imx290_set_fmt()
1182 imx290_ctrl_update(imx290, mode); in imx290_set_fmt()
1183 imx290_exposure_update(imx290, mode); in imx290_set_fmt()
1195 struct imx290 *imx290 = to_imx290(sd); in imx290_get_selection() local
1208 + imx290->vflip->val; in imx290_get_selection()
1211 + imx290->hflip->val; in imx290_get_selection()
1281 static int imx290_subdev_init(struct imx290 *imx290) in imx290_subdev_init() argument
1283 struct i2c_client *client = to_i2c_client(imx290->dev); in imx290_subdev_init()
1287 imx290->current_mode = &imx290_modes_ptr(imx290)[0]; in imx290_subdev_init()
1296 v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops); in imx290_subdev_init()
1297 imx290->sd.dev = imx290->dev; in imx290_subdev_init()
1298 pm_runtime_mark_last_busy(imx290->dev); in imx290_subdev_init()
1299 pm_runtime_put_autosuspend(imx290->dev); in imx290_subdev_init()
1301 imx290->sd.internal_ops = &imx290_internal_ops; in imx290_subdev_init()
1302 imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in imx290_subdev_init()
1303 imx290->sd.entity.ops = &imx290_subdev_entity_ops; in imx290_subdev_init()
1304 imx290->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx290_subdev_init()
1306 imx290->pad.flags = MEDIA_PAD_FL_SOURCE; in imx290_subdev_init()
1307 ret = media_entity_pads_init(&imx290->sd.entity, 1, &imx290->pad); in imx290_subdev_init()
1309 dev_err(imx290->dev, "Could not register media entity\n"); in imx290_subdev_init()
1313 ret = imx290_ctrl_init(imx290); in imx290_subdev_init()
1315 dev_err(imx290->dev, "Control initialization error %d\n", ret); in imx290_subdev_init()
1319 imx290->sd.state_lock = imx290->ctrls.lock; in imx290_subdev_init()
1321 ret = v4l2_subdev_init_finalize(&imx290->sd); in imx290_subdev_init()
1323 dev_err(imx290->dev, "subdev initialization error %d\n", ret); in imx290_subdev_init()
1327 state = v4l2_subdev_lock_and_get_active_state(&imx290->sd); in imx290_subdev_init()
1328 imx290_ctrl_update(imx290, imx290->current_mode); in imx290_subdev_init()
1334 v4l2_ctrl_handler_free(&imx290->ctrls); in imx290_subdev_init()
1336 media_entity_cleanup(&imx290->sd.entity); in imx290_subdev_init()
1340 static void imx290_subdev_cleanup(struct imx290 *imx290) in imx290_subdev_cleanup() argument
1342 v4l2_subdev_cleanup(&imx290->sd); in imx290_subdev_cleanup()
1343 media_entity_cleanup(&imx290->sd.entity); in imx290_subdev_cleanup()
1344 v4l2_ctrl_handler_free(&imx290->ctrls); in imx290_subdev_cleanup()
1351 static int imx290_power_on(struct imx290 *imx290) in imx290_power_on() argument
1355 ret = clk_prepare_enable(imx290->xclk); in imx290_power_on()
1357 dev_err(imx290->dev, "Failed to enable clock\n"); in imx290_power_on()
1361 ret = regulator_bulk_enable(ARRAY_SIZE(imx290->supplies), in imx290_power_on()
1362 imx290->supplies); in imx290_power_on()
1364 dev_err(imx290->dev, "Failed to enable regulators\n"); in imx290_power_on()
1365 clk_disable_unprepare(imx290->xclk); in imx290_power_on()
1370 gpiod_set_value_cansleep(imx290->rst_gpio, 0); in imx290_power_on()
1376 static void imx290_power_off(struct imx290 *imx290) in imx290_power_off() argument
1378 clk_disable_unprepare(imx290->xclk); in imx290_power_off()
1379 gpiod_set_value_cansleep(imx290->rst_gpio, 1); in imx290_power_off()
1380 regulator_bulk_disable(ARRAY_SIZE(imx290->supplies), imx290->supplies); in imx290_power_off()
1386 struct imx290 *imx290 = to_imx290(sd); in imx290_runtime_resume() local
1388 return imx290_power_on(imx290); in imx290_runtime_resume()
1394 struct imx290 *imx290 = to_imx290(sd); in imx290_runtime_suspend() local
1396 imx290_power_off(imx290); in imx290_runtime_suspend()
1415 static int imx290_get_regulators(struct device *dev, struct imx290 *imx290) in imx290_get_regulators() argument
1419 for (i = 0; i < ARRAY_SIZE(imx290->supplies); i++) in imx290_get_regulators()
1420 imx290->supplies[i].supply = imx290_supply_name[i]; in imx290_get_regulators()
1422 return devm_regulator_bulk_get(dev, ARRAY_SIZE(imx290->supplies), in imx290_get_regulators()
1423 imx290->supplies); in imx290_get_regulators()
1426 static int imx290_init_clk(struct imx290 *imx290) in imx290_init_clk() argument
1431 ret = device_property_read_u32(imx290->dev, "clock-frequency", in imx290_init_clk()
1434 dev_err(imx290->dev, "Could not get xclk frequency\n"); in imx290_init_clk()
1441 imx290->xclk_idx = IMX290_CLK_37_125; in imx290_init_clk()
1444 imx290->xclk_idx = IMX290_CLK_74_25; in imx290_init_clk()
1447 dev_err(imx290->dev, "External clock frequency %u is not supported\n", in imx290_init_clk()
1452 ret = clk_set_rate(imx290->xclk, xclk_freq); in imx290_init_clk()
1454 dev_err(imx290->dev, "Could not set xclk frequency\n"); in imx290_init_clk()
1466 static s64 imx290_check_link_freqs(const struct imx290 *imx290, in imx290_check_link_freqs() argument
1470 const s64 *freqs = imx290_link_freqs_ptr(imx290); in imx290_check_link_freqs()
1471 int freqs_count = imx290_link_freqs_num(imx290); in imx290_check_link_freqs()
1521 static int imx290_parse_dt(struct imx290 *imx290) in imx290_parse_dt() argument
1531 imx290->model = of_device_get_match_data(imx290->dev); in imx290_parse_dt()
1533 endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(imx290->dev), NULL); in imx290_parse_dt()
1535 dev_err(imx290->dev, "Endpoint node not found\n"); in imx290_parse_dt()
1542 dev_err(imx290->dev, "Unsupported bus type, should be CSI2\n"); in imx290_parse_dt()
1545 dev_err(imx290->dev, "Parsing endpoint node failed\n"); in imx290_parse_dt()
1550 imx290->nlanes = ep.bus.mipi_csi2.num_data_lanes; in imx290_parse_dt()
1551 if (imx290->nlanes != 2 && imx290->nlanes != 4) { in imx290_parse_dt()
1552 dev_err(imx290->dev, "Invalid data lanes: %d\n", imx290->nlanes); in imx290_parse_dt()
1557 dev_dbg(imx290->dev, "Using %u data lanes\n", imx290->nlanes); in imx290_parse_dt()
1560 dev_err(imx290->dev, "link-frequency property not found in DT\n"); in imx290_parse_dt()
1566 fq = imx290_check_link_freqs(imx290, &ep); in imx290_parse_dt()
1568 dev_err(imx290->dev, "Link frequency of %lld is not supported\n", in imx290_parse_dt()
1584 struct imx290 *imx290; in imx290_probe() local
1587 imx290 = devm_kzalloc(dev, sizeof(*imx290), GFP_KERNEL); in imx290_probe()
1588 if (!imx290) in imx290_probe()
1591 imx290->dev = dev; in imx290_probe()
1592 imx290->regmap = devm_cci_regmap_init_i2c(client, 16); in imx290_probe()
1593 if (IS_ERR(imx290->regmap)) { in imx290_probe()
1598 ret = imx290_parse_dt(imx290); in imx290_probe()
1603 imx290->xclk = devm_clk_get(dev, "xclk"); in imx290_probe()
1604 if (IS_ERR(imx290->xclk)) in imx290_probe()
1605 return dev_err_probe(dev, PTR_ERR(imx290->xclk), in imx290_probe()
1608 ret = imx290_get_regulators(dev, imx290); in imx290_probe()
1612 imx290->rst_gpio = devm_gpiod_get_optional(dev, "reset", in imx290_probe()
1614 if (IS_ERR(imx290->rst_gpio)) in imx290_probe()
1615 return dev_err_probe(dev, PTR_ERR(imx290->rst_gpio), in imx290_probe()
1619 ret = imx290_init_clk(imx290); in imx290_probe()
1628 ret = imx290_power_on(imx290); in imx290_probe()
1649 ret = imx290_stop_streaming(imx290); in imx290_probe()
1656 ret = imx290_subdev_init(imx290); in imx290_probe()
1660 v4l2_i2c_subdev_set_name(&imx290->sd, client, in imx290_probe()
1661 imx290->model->name, NULL); in imx290_probe()
1668 ret = v4l2_async_register_subdev(&imx290->sd); in imx290_probe()
1677 imx290_subdev_cleanup(imx290); in imx290_probe()
1681 imx290_power_off(imx290); in imx290_probe()
1688 struct imx290 *imx290 = to_imx290(sd); in imx290_remove() local
1691 imx290_subdev_cleanup(imx290); in imx290_remove()
1697 pm_runtime_disable(imx290->dev); in imx290_remove()
1698 if (!pm_runtime_status_suspended(imx290->dev)) in imx290_remove()
1699 imx290_power_off(imx290); in imx290_remove()
1700 pm_runtime_set_suspended(imx290->dev); in imx290_remove()