Lines Matching +full:vcore +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0
21 #include <media/mipi-csi2.h>
22 #include <media/v4l2-async.h>
23 #include <media/v4l2-cci.h>
24 #include <media/v4l2-ctrls.h>
25 #include <media/v4l2-device.h>
26 #include <media/v4l2-event.h>
27 #include <media/v4l2-fwnode.h>
28 #include <media/v4l2-subdev.h>
434 "Pseudo-random Noise",
438 -3000, -2500, -2000, -1500, -1000, -500,
454 "vcore",
568 struct v4l2_subdev *sd = &container_of_const(ctrl->handler, in ctrl_to_vd55g1()
570 ctrl_handler)->sd; in ctrl_to_vd55g1()
586 dev_warn(sensor->dev, "Unsupported code %d. default to 8 bpp\n", code); in vd55g1_get_fmt_desc()
594 return sensor->mipi_rate / in vd55g1_get_pixel_rate()
595 vd55g1_get_fmt_desc(sensor, format->code)->bpp; in vd55g1_get_pixel_rate()
607 mipi_req_line_time = (crop->width * in vd55g1_get_hblank_min()
608 vd55g1_get_fmt_desc(sensor, format->code)->bpp + in vd55g1_get_hblank_min()
610 (sensor->mipi_rate / MEGA); in vd55g1_get_hblank_min()
611 mipi_req_line_length = mipi_req_line_time * sensor->pixel_clock / in vd55g1_get_hblank_min()
616 if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB) in vd55g1_get_hblank_min()
622 return min_line_length - crop->width; in vd55g1_get_hblank_min()
629 limits->min = VD55G1_VBLANK_MIN; in vd55g1_get_vblank_limits()
630 limits->def = VD55G1_FRAME_LENGTH_DEF - crop->height; in vd55g1_get_vblank_limits()
631 limits->max = VD55G1_VBLANK_MAX - crop->height; in vd55g1_get_vblank_limits()
635 cci_read((sensor)->regmap, reg, val, err)
638 cci_write((sensor)->regmap, reg, val, err)
656 ret = regmap_bulk_write(sensor->regmap, reg, array, sz); in vd55g1_write_array()
659 len -= sz; in vd55g1_write_array()
680 ret = regmap_read_poll_timeout(sensor->regmap, CCI_REG_ADDR(reg), val, in vd55g1_poll_reg()
699 if (sensor->xclk_freq < VD55G1_XCLK_FREQ_MIN || in vd55g1_prepare_clock_tree()
700 sensor->xclk_freq > VD55G1_XCLK_FREQ_MAX) { in vd55g1_prepare_clock_tree()
701 dev_err(sensor->dev, in vd55g1_prepare_clock_tree()
702 "Only %luMhz-%luMhz clock range supported. Provided %lu MHz\n", in vd55g1_prepare_clock_tree()
705 sensor->xclk_freq / HZ_PER_MHZ); in vd55g1_prepare_clock_tree()
706 return -EINVAL; in vd55g1_prepare_clock_tree()
710 sensor->mipi_rate = sensor->link_freq * 2; in vd55g1_prepare_clock_tree()
712 if (sensor->mipi_rate < VD55G1_MIPI_RATE_MIN || in vd55g1_prepare_clock_tree()
713 sensor->mipi_rate > VD55G1_MIPI_RATE_MAX) { in vd55g1_prepare_clock_tree()
714 dev_err(sensor->dev, in vd55g1_prepare_clock_tree()
715 "Only %luMbps-%luMbps data rate range supported. Provided %lu Mbps\n", in vd55g1_prepare_clock_tree()
718 sensor->mipi_rate / MEGA); in vd55g1_prepare_clock_tree()
719 return -EINVAL; in vd55g1_prepare_clock_tree()
722 if (sensor->mipi_rate <= 300 * MEGA) in vd55g1_prepare_clock_tree()
724 else if (sensor->mipi_rate <= 600 * MEGA) in vd55g1_prepare_clock_tree()
729 sys_clk = sensor->mipi_rate * mipi_div; in vd55g1_prepare_clock_tree()
738 sensor->pixel_clock = sys_clk / pixel_div; in vd55g1_prepare_clock_tree()
774 if (sensor->ae_ctrl->is_new) in vd55g1_update_expo_cluster()
777 if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB && in vd55g1_update_expo_cluster()
778 sensor->hdr_ctrl->is_new) { in vd55g1_update_expo_cluster()
785 if (!is_auto && sensor->expo_ctrl->is_new) in vd55g1_update_expo_cluster()
787 sensor->expo_ctrl->val, &ret); in vd55g1_update_expo_cluster()
789 if (!is_auto && sensor->again_ctrl->is_new) in vd55g1_update_expo_cluster()
791 sensor->again_ctrl->val, &ret); in vd55g1_update_expo_cluster()
793 if (!is_auto && sensor->dgain_ctrl->is_new) in vd55g1_update_expo_cluster()
795 sensor->dgain_ctrl->val, &ret); in vd55g1_update_expo_cluster()
807 if (sensor->ae_ctrl->val == V4L2_EXPOSURE_AUTO) in vd55g1_lock_exposure()
827 sensor->expo_ctrl->cur.val = exposure; in vd55g1_read_expo_cluster()
828 sensor->again_ctrl->cur.val = again; in vd55g1_read_expo_cluster()
829 sensor->dgain_ctrl->cur.val = dgain; in vd55g1_read_expo_cluster()
839 if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB) in vd55g1_update_frame_length()
871 unsigned int line_length = crop->width + sensor->hblank_ctrl->val; in vd55g1_apply_cold_start()
873 sensor->pixel_clock); in vd55g1_apply_cold_start()
874 u8 d_gain = DIV_ROUND_CLOSEST(sensor->dgain_ctrl->val, 1 << 8); in vd55g1_apply_cold_start()
875 u8 a_gain = DIV_ROUND_CLOSEST(32, (32 - sensor->again_ctrl->val)); in vd55g1_apply_cold_start()
876 unsigned int expo_us = sensor->expo_ctrl->val * d_gain * a_gain * in vd55g1_apply_cold_start()
890 fmt->code = code; in vd55g1_update_pad_fmt()
891 fmt->width = mode->width; in vd55g1_update_pad_fmt()
892 fmt->height = mode->height; in vd55g1_update_pad_fmt()
893 fmt->colorspace = V4L2_COLORSPACE_RAW; in vd55g1_update_pad_fmt()
894 fmt->field = V4L2_FIELD_NONE; in vd55g1_update_pad_fmt()
895 fmt->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; in vd55g1_update_pad_fmt()
896 fmt->quantization = V4L2_QUANTIZATION_DEFAULT; in vd55g1_update_pad_fmt()
897 fmt->xfer_func = V4L2_XFER_FUNC_DEFAULT; in vd55g1_update_pad_fmt()
904 switch (sensor->hdr_ctrl->val) { in vd55g1_update_hdr_mode()
940 ret = -EINVAL; in vd55g1_update_hdr_mode()
954 vd55g1_get_fmt_desc(sensor, format->code)->bpp, &ret); in vd55g1_set_framefmt()
956 vd55g1_get_fmt_desc(sensor, format->code)->data_type, in vd55g1_set_framefmt()
959 switch (crop->width / format->width) { in vd55g1_set_framefmt()
970 vd55g1_write(sensor, VD55G1_REG_X_START(0), crop->left, &ret); in vd55g1_set_framefmt()
971 vd55g1_write(sensor, VD55G1_REG_X_WIDTH(0), crop->width, &ret); in vd55g1_set_framefmt()
972 vd55g1_write(sensor, VD55G1_REG_Y_START(0), crop->top, &ret); in vd55g1_set_framefmt()
973 vd55g1_write(sensor, VD55G1_REG_Y_HEIGHT(0), crop->height, &ret); in vd55g1_set_framefmt()
975 vd55g1_write(sensor, VD55G1_REG_X_START(1), crop->left, &ret); in vd55g1_set_framefmt()
976 vd55g1_write(sensor, VD55G1_REG_X_WIDTH(1), crop->width, &ret); in vd55g1_set_framefmt()
977 vd55g1_write(sensor, VD55G1_REG_Y_START(1), crop->top, &ret); in vd55g1_set_framefmt()
978 vd55g1_write(sensor, VD55G1_REG_Y_HEIGHT(1), crop->height, &ret); in vd55g1_set_framefmt()
990 gpio_val = sensor->gpios[io]; in vd55g1_update_gpios()
993 sensor->led_ctrl->val == V4L2_FLASH_LED_MODE_NONE) { in vd55g1_update_gpios()
995 if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB) { in vd55g1_update_gpios()
1013 crop->width + sensor->hblank_ctrl->val, NULL); in vd55g1_ro_ctrls_setup()
1019 v4l2_ctrl_grab(sensor->hflip_ctrl, enable); in vd55g1_grab_ctrls()
1020 v4l2_ctrl_grab(sensor->vflip_ctrl, enable); in vd55g1_grab_ctrls()
1021 v4l2_ctrl_grab(sensor->patgen_ctrl, enable); in vd55g1_grab_ctrls()
1022 v4l2_ctrl_grab(sensor->hdr_ctrl, enable); in vd55g1_grab_ctrls()
1036 ret = pm_runtime_resume_and_get(sensor->dev); in vd55g1_enable_streams()
1042 sensor->mipi_rate, &ret); in vd55g1_enable_streams()
1043 vd55g1_write(sensor, VD55G1_REG_OIF_CTRL, sensor->oif_ctrl, &ret); in vd55g1_enable_streams()
1053 ret = vd55g1_update_gpios(sensor, GENMASK(VD55G1_NB_GPIOS - 1, 0)); in vd55g1_enable_streams()
1062 ret = __v4l2_ctrl_handler_setup(&sensor->ctrl_handler); in vd55g1_enable_streams()
1066 /* Also apply settings from read-only V4L2 ctrls */ in vd55g1_enable_streams()
1083 pm_runtime_put(sensor->dev); in vd55g1_enable_streams()
1084 return -EINVAL; in vd55g1_enable_streams()
1103 dev_warn(sensor->dev, "Can't disable stream\n"); in vd55g1_disable_streams()
1107 pm_runtime_mark_last_busy(sensor->dev); in vd55g1_disable_streams()
1108 pm_runtime_put_autosuspend(sensor->dev); in vd55g1_disable_streams()
1123 dev_err(sensor->dev, "Failed to apply patch\n"); in vd55g1_patch()
1130 dev_err(sensor->dev, "Bad patch version expected %d.%d got %d.%d\n", in vd55g1_patch()
1134 return -ENODEV; in vd55g1_patch()
1136 dev_dbg(sensor->dev, "patch %d.%d applied\n", in vd55g1_patch()
1148 switch (sel->target) { in vd55g1_get_selection()
1150 sel->r = *crop; in vd55g1_get_selection()
1155 sel->r.top = 0; in vd55g1_get_selection()
1156 sel->r.left = 0; in vd55g1_get_selection()
1157 sel->r.width = VD55G1_WIDTH; in vd55g1_get_selection()
1158 sel->r.height = VD55G1_HEIGHT; in vd55g1_get_selection()
1162 return -EINVAL; in vd55g1_get_selection()
1169 if (code->index >= ARRAY_SIZE(vd55g1_mbus_codes)) in vd55g1_enum_mbus_code()
1170 return -EINVAL; in vd55g1_enum_mbus_code()
1172 code->code = vd55g1_mbus_codes[code->index].code; in vd55g1_enum_mbus_code()
1189 ret = __v4l2_ctrl_modify_range(sensor->vblank_ctrl, vblank.min, in vd55g1_new_format_change_controls()
1195 frame_length = crop->height + sensor->vblank_ctrl->val; in vd55g1_new_format_change_controls()
1196 expo_max = frame_length - VD55G1_EXPO_MAX_TERM; in vd55g1_new_format_change_controls()
1197 ret = __v4l2_ctrl_modify_range(sensor->expo_ctrl, 0, expo_max, 1, in vd55g1_new_format_change_controls()
1203 ret = __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_ctrl, in vd55g1_new_format_change_controls()
1210 ret = __v4l2_ctrl_modify_range(sensor->hblank_ctrl, hblank, hblank, 1, in vd55g1_new_format_change_controls()
1228 width, height, sd_fmt->format.width, in vd55g1_set_pad_fmt()
1229 sd_fmt->format.height); in vd55g1_set_pad_fmt()
1231 vd55g1_update_pad_fmt(sensor, new_mode, sd_fmt->format.code, in vd55g1_set_pad_fmt()
1232 &sd_fmt->format); in vd55g1_set_pad_fmt()
1238 binning = min(VD55G1_WIDTH / sd_fmt->format.width, in vd55g1_set_pad_fmt()
1239 VD55G1_HEIGHT / sd_fmt->format.height); in vd55g1_set_pad_fmt()
1241 pad_crop.width = sd_fmt->format.width * binning; in vd55g1_set_pad_fmt()
1242 pad_crop.height = sd_fmt->format.height * binning; in vd55g1_set_pad_fmt()
1243 pad_crop.left = (VD55G1_WIDTH - pad_crop.width) / 2; in vd55g1_set_pad_fmt()
1244 pad_crop.top = (VD55G1_HEIGHT - pad_crop.height) / 2; in vd55g1_set_pad_fmt()
1246 format = v4l2_subdev_state_get_format(sd_state, sd_fmt->pad); in vd55g1_set_pad_fmt()
1248 *format = sd_fmt->format; in vd55g1_set_pad_fmt()
1250 *v4l2_subdev_state_get_crop(sd_state, sd_fmt->pad) = pad_crop; in vd55g1_set_pad_fmt()
1251 if (sd_fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) in vd55g1_set_pad_fmt()
1253 &sd_fmt->format, in vd55g1_set_pad_fmt()
1289 if (fse->index >= ARRAY_SIZE(vd55g1_supported_modes)) in vd55g1_enum_frame_size()
1290 return -EINVAL; in vd55g1_enum_frame_size()
1292 fse->min_width = vd55g1_supported_modes[fse->index].width; in vd55g1_enum_frame_size()
1293 fse->max_width = fse->min_width; in vd55g1_enum_frame_size()
1294 fse->min_height = vd55g1_supported_modes[fse->index].height; in vd55g1_enum_frame_size()
1295 fse->max_height = fse->min_height; in vd55g1_enum_frame_size()
1329 if (!pm_runtime_get_if_in_use(sensor->dev)) in vd55g1_g_volatile_ctrl()
1332 switch (ctrl->id) { in vd55g1_g_volatile_ctrl()
1337 ret = -EINVAL; in vd55g1_g_volatile_ctrl()
1341 pm_runtime_mark_last_busy(sensor->dev); in vd55g1_g_volatile_ctrl()
1342 pm_runtime_put_autosuspend(sensor->dev); in vd55g1_g_volatile_ctrl()
1353 v4l2_subdev_get_locked_active_state(&sensor->sd); in vd55g1_s_ctrl()
1362 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) in vd55g1_s_ctrl()
1366 switch (ctrl->id) { in vd55g1_s_ctrl()
1368 frame_length = crop->height + ctrl->val; in vd55g1_s_ctrl()
1369 expo_max = frame_length - VD55G1_EXPO_MAX_TERM; in vd55g1_s_ctrl()
1370 ret = __v4l2_ctrl_modify_range(sensor->expo_ctrl, 0, expo_max, in vd55g1_s_ctrl()
1374 is_auto = (ctrl->val == V4L2_EXPOSURE_AUTO); in vd55g1_s_ctrl()
1375 __v4l2_ctrl_grab(sensor->ae_lock_ctrl, !is_auto); in vd55g1_s_ctrl()
1376 __v4l2_ctrl_grab(sensor->ae_bias_ctrl, !is_auto); in vd55g1_s_ctrl()
1380 if (ctrl->val != ctrl->cur.val) { in vd55g1_s_ctrl()
1382 ret = __v4l2_ctrl_modify_range(sensor->hblank_ctrl, in vd55g1_s_ctrl()
1396 if (!pm_runtime_get_if_in_use(sensor->dev)) in vd55g1_s_ctrl()
1399 switch (ctrl->id) { in vd55g1_s_ctrl()
1402 sensor->hflip_ctrl->val | in vd55g1_s_ctrl()
1403 (sensor->vflip_ctrl->val << 1), in vd55g1_s_ctrl()
1407 ret = vd55g1_update_patgen(sensor, ctrl->val); in vd55g1_s_ctrl()
1413 ret = vd55g1_lock_exposure(sensor, ctrl->val); in vd55g1_s_ctrl()
1420 ret = vd55g1_update_exposure_target(sensor, ctrl->val); in vd55g1_s_ctrl()
1426 ret = vd55g1_update_gpios(sensor, sensor->ext_leds_mask); in vd55g1_s_ctrl()
1432 ret = -EINVAL; in vd55g1_s_ctrl()
1436 pm_runtime_mark_last_busy(sensor->dev); in vd55g1_s_ctrl()
1437 pm_runtime_put_autosuspend(sensor->dev); in vd55g1_s_ctrl()
1450 struct v4l2_ctrl_handler *hdl = &sensor->ctrl_handler; in vd55g1_init_ctrls()
1456 v4l2_subdev_lock_and_get_active_state(&sensor->sd); in vd55g1_init_ctrls()
1467 sensor->hflip_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HFLIP, in vd55g1_init_ctrls()
1469 sensor->vflip_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VFLIP, in vd55g1_init_ctrls()
1471 v4l2_ctrl_cluster(2, &sensor->hflip_ctrl); in vd55g1_init_ctrls()
1474 sensor->ae_ctrl = v4l2_ctrl_new_std_menu(hdl, ops, in vd55g1_init_ctrls()
1477 sensor->again_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_ANALOGUE_GAIN, in vd55g1_init_ctrls()
1479 sensor->dgain_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_DIGITAL_GAIN, in vd55g1_init_ctrls()
1482 sensor->expo_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE, 0, in vd55g1_init_ctrls()
1483 VD55G1_FRAME_LENGTH_DEF - in vd55g1_init_ctrls()
1486 v4l2_ctrl_auto_cluster(4, &sensor->ae_ctrl, V4L2_EXPOSURE_MANUAL, true); in vd55g1_init_ctrls()
1488 sensor->patgen_ctrl = in vd55g1_init_ctrls()
1490 ARRAY_SIZE(vd55g1_tp_menu) - 1, 0, in vd55g1_init_ctrls()
1493 0, 0, &sensor->link_freq); in vd55g1_init_ctrls()
1495 ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in vd55g1_init_ctrls()
1496 sensor->pixel_rate_ctrl = v4l2_ctrl_new_std(hdl, ops, in vd55g1_init_ctrls()
1500 if (sensor->pixel_rate_ctrl) in vd55g1_init_ctrls()
1501 sensor->pixel_rate_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in vd55g1_init_ctrls()
1502 sensor->ae_lock_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_3A_LOCK, in vd55g1_init_ctrls()
1504 sensor->ae_bias_ctrl = in vd55g1_init_ctrls()
1507 ARRAY_SIZE(vd55g1_ev_bias_menu) - 1, in vd55g1_init_ctrls()
1510 sensor->hdr_ctrl = in vd55g1_init_ctrls()
1513 ARRAY_SIZE(vd55g1_hdr_menu) - 1, 0, in vd55g1_init_ctrls()
1516 sensor->hblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HBLANK, in vd55g1_init_ctrls()
1518 if (sensor->hblank_ctrl) in vd55g1_init_ctrls()
1519 sensor->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in vd55g1_init_ctrls()
1521 sensor->vblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VBLANK, in vd55g1_init_ctrls()
1526 if (sensor->ext_leds_mask) { in vd55g1_init_ctrls()
1527 sensor->led_ctrl = in vd55g1_init_ctrls()
1534 ret = v4l2_fwnode_device_parse(sensor->dev, &fwnode_props); in vd55g1_init_ctrls()
1542 sensor->sd.ctrl_handler = hdl; in vd55g1_init_ctrls()
1563 dev_warn(sensor->dev, "Unsupported sensor id %x\n", (u32)id); in vd55g1_detect()
1564 return -ENODEV; in vd55g1_detect()
1572 dev_err(sensor->dev, "Unsupported sensor revision (0x%x)\n", in vd55g1_detect()
1574 return -ENODEV; in vd55g1_detect()
1587 sensor->supplies); in vd55g1_power_on()
1593 ret = clk_prepare_enable(sensor->xclk); in vd55g1_power_on()
1599 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in vd55g1_power_on()
1614 vd55g1_write(sensor, VD55G1_REG_EXT_CLOCK, sensor->xclk_freq, &ret); in vd55g1_power_on()
1632 gpiod_set_value_cansleep(sensor->reset_gpio, 1); in vd55g1_power_on()
1633 clk_disable_unprepare(sensor->xclk); in vd55g1_power_on()
1636 sensor->supplies); in vd55g1_power_on()
1646 gpiod_set_value_cansleep(sensor->reset_gpio, 1); in vd55g1_power_off()
1647 clk_disable_unprepare(sensor->xclk); in vd55g1_power_off()
1648 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); in vd55g1_power_off()
1662 return -EINVAL; in vd55g1_check_csi_conf()
1667 dev_err(sensor->dev, "Sensor only supports 1 lane, found %d\n", in vd55g1_check_csi_conf()
1669 ret = -EINVAL; in vd55g1_check_csi_conf()
1675 dev_err(sensor->dev, "Clock lane must be mapped to lane 0\n"); in vd55g1_check_csi_conf()
1676 ret = -EINVAL; in vd55g1_check_csi_conf()
1681 sensor->oif_ctrl = (ep.bus.mipi_csi2.lane_polarities[0] << 3) | in vd55g1_check_csi_conf()
1686 dev_err(sensor->dev, "link-frequency property not found in DT\n"); in vd55g1_check_csi_conf()
1687 ret = -EINVAL; in vd55g1_check_csi_conf()
1691 dev_err(sensor->dev, "Multiple link frequencies not supported\n"); in vd55g1_check_csi_conf()
1692 ret = -EINVAL; in vd55g1_check_csi_conf()
1695 sensor->link_freq = ep.link_frequencies[0]; in vd55g1_check_csi_conf()
1709 *nb = device_property_count_u32(sensor->dev, prop_name); in vd55g1_parse_dt_gpios_array()
1710 if (*nb == -EINVAL) { in vd55g1_parse_dt_gpios_array()
1716 ret = device_property_read_u32_array(sensor->dev, in vd55g1_parse_dt_gpios_array()
1719 dev_err(sensor->dev, "Failed to read %s prop\n", prop_name); in vd55g1_parse_dt_gpios_array()
1724 dev_err(sensor->dev, "Invalid GPIO number %d\n", in vd55g1_parse_dt_gpios_array()
1726 return -EINVAL; in vd55g1_parse_dt_gpios_array()
1742 sensor->gpios[i] = VD55G1_GPIO_MODE_IN; in vd55g1_parse_dt_gpios()
1743 sensor->ext_leds_mask = 0; in vd55g1_parse_dt_gpios()
1752 sensor->gpios[led_gpios[i]] = VD55G1_GPIO_MODE_STROBE; in vd55g1_parse_dt_gpios()
1753 set_bit(led_gpios[i], &sensor->ext_leds_mask); in vd55g1_parse_dt_gpios()
1764 endpoint = fwnode_graph_get_endpoint_by_id(dev_fwnode(sensor->dev), in vd55g1_parse_dt()
1767 dev_err(sensor->dev, "Endpoint node not found\n"); in vd55g1_parse_dt()
1768 return -EINVAL; in vd55g1_parse_dt()
1784 sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in vd55g1_subdev_init()
1785 sensor->sd.internal_ops = &vd55g1_internal_ops; in vd55g1_subdev_init()
1788 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in vd55g1_subdev_init()
1789 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in vd55g1_subdev_init()
1790 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in vd55g1_subdev_init()
1792 dev_err(sensor->dev, "Failed to init media entity: %d\n", ret); in vd55g1_subdev_init()
1796 sensor->sd.state_lock = sensor->ctrl_handler.lock; in vd55g1_subdev_init()
1797 ret = v4l2_subdev_init_finalize(&sensor->sd); in vd55g1_subdev_init()
1799 dev_err(sensor->dev, "Subdev init error: %d\n", ret); in vd55g1_subdev_init()
1809 dev_err(sensor->dev, "Controls initialization failed %d\n", in vd55g1_subdev_init()
1817 v4l2_ctrl_handler_free(sensor->sd.ctrl_handler); in vd55g1_subdev_init()
1820 media_entity_cleanup(&sensor->sd.entity); in vd55g1_subdev_init()
1826 v4l2_async_unregister_subdev(&sensor->sd); in vd55g1_subdev_cleanup()
1827 v4l2_subdev_cleanup(&sensor->sd); in vd55g1_subdev_cleanup()
1828 media_entity_cleanup(&sensor->sd.entity); in vd55g1_subdev_cleanup()
1829 v4l2_ctrl_handler_free(sensor->sd.ctrl_handler); in vd55g1_subdev_cleanup()
1837 sensor->supplies[i].supply = vd55g1_supply_name[i]; in vd55g1_get_regulators()
1839 return devm_regulator_bulk_get(sensor->dev, in vd55g1_get_regulators()
1841 sensor->supplies); in vd55g1_get_regulators()
1846 struct device *dev = &client->dev; in vd55g1_probe()
1852 return -ENOMEM; in vd55g1_probe()
1853 sensor->dev = &client->dev; in vd55g1_probe()
1855 v4l2_i2c_subdev_init(&sensor->sd, client, &vd55g1_subdev_ops); in vd55g1_probe()
1866 sensor->xclk = devm_clk_get(dev, NULL); in vd55g1_probe()
1867 if (IS_ERR(sensor->xclk)) in vd55g1_probe()
1868 return dev_err_probe(dev, PTR_ERR(sensor->xclk), in vd55g1_probe()
1871 sensor->xclk_freq = clk_get_rate(sensor->xclk); in vd55g1_probe()
1876 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in vd55g1_probe()
1878 if (IS_ERR(sensor->reset_gpio)) in vd55g1_probe()
1879 return dev_err_probe(dev, PTR_ERR(sensor->reset_gpio), in vd55g1_probe()
1882 sensor->regmap = devm_cci_regmap_init_i2c(client, 16); in vd55g1_probe()
1883 if (IS_ERR(sensor->regmap)) in vd55g1_probe()
1884 return dev_err_probe(dev, PTR_ERR(sensor->regmap), in vd55g1_probe()
1907 ret = v4l2_async_register_subdev(&sensor->sd); in vd55g1_probe()
1933 pm_runtime_disable(&client->dev); in vd55g1_remove()
1934 if (!pm_runtime_status_suspended(&client->dev)) in vd55g1_remove()
1935 vd55g1_power_off(&client->dev); in vd55g1_remove()
1936 pm_runtime_set_suspended(&client->dev); in vd55g1_remove()
1937 pm_runtime_dont_use_autosuspend(&client->dev); in vd55g1_remove()