Lines Matching +full:four +full:- +full:lane

1 // SPDX-License-Identifier: GPL-2.0
3 * imx274.c - IMX274 CMOS Image Sensor driver
25 #include <linux/v4l2-mediabus.h>
28 #include <media/v4l2-ctrls.h>
29 #include <media/v4l2-device.h>
30 #include <media/v4l2-subdev.h>
50 #define IMX274_GAIN_SHIFT_MASK ((1 << IMX274_GAIN_SHIFT) - 1)
60 / (2048 - IMX274_GAIN_REG_MAX))
77 * register SHR is limited to (SVR value + 1) x VMAX value - 4
168 * Adjustment (CSI-2)" in the datasheet)
169 * @min_SHR: Minimum SHR register value (see "Shutter Setting (CSI-2)" in the
173 * in Each Readout Drive Mode (CSI-2)" in the datasheet)
221 * All-pixel scan mode (10-bit)
223 * 3840x2160 resolution, raw10 data and mipi four lane output
261 * Horizontal/vertical 2/2-line binning
262 * (Horizontal and vertical weightedbinning, 10-bit)
264 * 1920x1080 resolution, raw10 data and mipi four lane output
304 * 1280x720 resolution, raw10 data and mipi four lane output
344 * 1280x540 resolution, raw10 data and mipi four lane output
535 * struct imx274_ctrls - imx274 ctrl structure
551 * struct stim274 - imx274 device structure
611 return &container_of(ctrl->handler, in ctrl_to_sd()
612 struct stimx274, ctrls.handler)->sd; in ctrl_to_sd()
632 struct regmap *regmap = priv->regmap; in imx274_write_table()
637 int range_start = -1; in imx274_write_table()
643 if ((next->addr != range_start + range_count) || in imx274_write_table()
644 (next->addr == IMX274_TABLE_END) || in imx274_write_table()
645 (next->addr == IMX274_TABLE_WAIT_MS) || in imx274_write_table()
660 range_start = -1; in imx274_write_table()
664 if (next->addr == IMX274_TABLE_END) in imx274_write_table()
667 if (next->addr == IMX274_TABLE_WAIT_MS) { in imx274_write_table()
668 msleep_range(next->val); in imx274_write_table()
673 val = next->val; in imx274_write_table()
675 if (range_start == -1) in imx274_write_table()
676 range_start = next->addr; in imx274_write_table()
687 err = regmap_write(priv->regmap, addr, val); in imx274_write_reg()
689 dev_err(&priv->client->dev, in imx274_write_reg()
693 dev_dbg(&priv->client->dev, in imx274_write_reg()
700 * imx274_read_mbreg - Read a multibyte register.
706 * consecutive, least-to-most significant.
719 err = regmap_bulk_read(priv->regmap, addr, &val_le, nbytes); in imx274_read_mbreg()
721 dev_err(&priv->client->dev, in imx274_read_mbreg()
726 dev_dbg(&priv->client->dev, in imx274_read_mbreg()
735 * imx274_write_mbreg - Write a multibyte register.
741 * consecutive, least-to-most significant.
751 err = regmap_bulk_write(priv->regmap, addr, &val_le, nbytes); in imx274_write_mbreg()
753 dev_err(&priv->client->dev, in imx274_write_mbreg()
757 dev_dbg(&priv->client->dev, in imx274_write_mbreg()
777 err = imx274_write_table(priv, priv->mode->init_regs); in imx274_mode_regs()
783 * imx274_start_stream - Function for starting stream per mode index
792 err = __v4l2_ctrl_handler_setup(&priv->ctrls.handler); in imx274_start_stream()
794 dev_err(&priv->client->dev, "Error %d setup controls\n", err); in imx274_start_stream()
799 * Refer to "Standby Cancel Sequence when using CSI-2" in in imx274_start_stream()
809 * Refer to "Standby Cancel Sequence when using CSI-2" in in imx274_start_stream()
822 * imx274_reset - Function called to reset the sensor
833 gpiod_set_value_cansleep(priv->reset_gpio, 0); in imx274_reset()
835 gpiod_set_value_cansleep(priv->reset_gpio, !!rst); in imx274_reset()
849 ret = clk_prepare_enable(imx274->inck); in imx274_power_on()
851 dev_err(&imx274->client->dev, in imx274_power_on()
856 ret = regulator_bulk_enable(IMX274_NUM_SUPPLIES, imx274->supplies); in imx274_power_on()
858 dev_err(&imx274->client->dev, in imx274_power_on()
869 clk_disable_unprepare(imx274->inck); in imx274_power_on()
881 regulator_bulk_disable(IMX274_NUM_SUPPLIES, imx274->supplies); in imx274_power_off()
883 clk_disable_unprepare(imx274->inck); in imx274_power_off()
893 imx274->supplies[i].supply = imx274_supply_names[i]; in imx274_regulators_get()
896 imx274->supplies); in imx274_regulators_get()
900 * imx274_s_ctrl - This is used to set the imx274 V4L2 controls
911 int ret = -EINVAL; in imx274_s_ctrl()
913 if (!pm_runtime_get_if_in_use(&imx274->client->dev)) in imx274_s_ctrl()
916 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
918 ctrl->name, ctrl->val); in imx274_s_ctrl()
920 switch (ctrl->id) { in imx274_s_ctrl()
922 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
924 ret = imx274_set_exposure(imx274, ctrl->val); in imx274_s_ctrl()
928 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
934 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
936 ret = imx274_set_vflip(imx274, ctrl->val); in imx274_s_ctrl()
940 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
942 ret = imx274_set_test_pattern(imx274, ctrl->val); in imx274_s_ctrl()
946 pm_runtime_put(&imx274->client->dev); in imx274_s_ctrl()
955 struct device *dev = &imx274->client->dev; in imx274_binning_goodness()
961 val -= goodness; in imx274_binning_goodness()
963 val -= goodness; in imx274_binning_goodness()
968 val -= goodness; in imx274_binning_goodness()
970 val -= goodness; in imx274_binning_goodness()
973 val -= abs(w - ask_w); in imx274_binning_goodness()
974 val -= abs(h - ask_h); in imx274_binning_goodness()
983 * __imx274_change_compose - Helper function to change binning and set both
996 * Must be called with imx274->lock locked.
1001 * @width: Input-output parameter: set to the desired width before
1003 * @height: Input-output parameter for height (see @width)
1014 struct device *dev = &imx274->client->dev; in __imx274_change_compose()
1022 cur_crop = &sd_state->pads->try_crop; in __imx274_change_compose()
1023 tgt_fmt = &sd_state->pads->try_fmt; in __imx274_change_compose()
1025 cur_crop = &imx274->crop; in __imx274_change_compose()
1026 tgt_fmt = &imx274->format; in __imx274_change_compose()
1035 cur_crop->width / wratio, *width, in __imx274_change_compose()
1036 cur_crop->height / hratio, *height, in __imx274_change_compose()
1045 *width = cur_crop->width / best_mode->wbin_ratio; in __imx274_change_compose()
1046 *height = cur_crop->height / best_mode->hbin_ratio; in __imx274_change_compose()
1049 imx274->mode = best_mode; in __imx274_change_compose()
1052 __func__, best_mode->wbin_ratio, best_mode->hbin_ratio); in __imx274_change_compose()
1054 tgt_fmt->width = *width; in __imx274_change_compose()
1055 tgt_fmt->height = *height; in __imx274_change_compose()
1056 tgt_fmt->field = V4L2_FIELD_NONE; in __imx274_change_compose()
1062 * imx274_get_fmt - Get the pad format
1077 mutex_lock(&imx274->lock); in imx274_get_fmt()
1078 fmt->format = imx274->format; in imx274_get_fmt()
1079 mutex_unlock(&imx274->lock); in imx274_get_fmt()
1084 * imx274_set_fmt - This is used to set the pad format
1097 struct v4l2_mbus_framefmt *fmt = &format->format; in imx274_set_fmt()
1101 mutex_lock(&imx274->lock); in imx274_set_fmt()
1103 err = __imx274_change_compose(imx274, sd_state, format->which, in imx274_set_fmt()
1104 &fmt->width, &fmt->height, 0); in imx274_set_fmt()
1114 fmt->field = V4L2_FIELD_NONE; in imx274_set_fmt()
1115 if (format->which == V4L2_SUBDEV_FORMAT_TRY) in imx274_set_fmt()
1116 sd_state->pads->try_fmt = *fmt; in imx274_set_fmt()
1118 imx274->format = *fmt; in imx274_set_fmt()
1121 mutex_unlock(&imx274->lock); in imx274_set_fmt()
1135 if (sel->pad != 0) in imx274_get_selection()
1136 return -EINVAL; in imx274_get_selection()
1138 if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) { in imx274_get_selection()
1139 sel->r.left = 0; in imx274_get_selection()
1140 sel->r.top = 0; in imx274_get_selection()
1141 sel->r.width = IMX274_MAX_WIDTH; in imx274_get_selection()
1142 sel->r.height = IMX274_MAX_HEIGHT; in imx274_get_selection()
1146 if (sel->which == V4L2_SUBDEV_FORMAT_TRY) { in imx274_get_selection()
1147 src_crop = &sd_state->pads->try_crop; in imx274_get_selection()
1148 src_fmt = &sd_state->pads->try_fmt; in imx274_get_selection()
1150 src_crop = &imx274->crop; in imx274_get_selection()
1151 src_fmt = &imx274->format; in imx274_get_selection()
1154 mutex_lock(&imx274->lock); in imx274_get_selection()
1156 switch (sel->target) { in imx274_get_selection()
1158 sel->r = *src_crop; in imx274_get_selection()
1161 sel->r.top = 0; in imx274_get_selection()
1162 sel->r.left = 0; in imx274_get_selection()
1163 sel->r.width = src_crop->width; in imx274_get_selection()
1164 sel->r.height = src_crop->height; in imx274_get_selection()
1167 sel->r.top = 0; in imx274_get_selection()
1168 sel->r.left = 0; in imx274_get_selection()
1169 sel->r.width = src_fmt->width; in imx274_get_selection()
1170 sel->r.height = src_fmt->height; in imx274_get_selection()
1173 ret = -EINVAL; in imx274_get_selection()
1176 mutex_unlock(&imx274->lock); in imx274_get_selection()
1198 IMX274_ROUND(sel->r.width, h_step, sel->flags), in imx274_set_selection_crop()
1201 /* Constraint: HTRIMMING_END - HTRIMMING_START >= 144 */ in imx274_set_selection_crop()
1206 IMX274_ROUND(sel->r.left, h_step, 0), in imx274_set_selection_crop()
1207 IMX274_MAX_WIDTH - new_crop.width); in imx274_set_selection_crop()
1210 IMX274_ROUND(sel->r.height, 2, sel->flags), in imx274_set_selection_crop()
1213 new_crop.top = min_t(u32, IMX274_ROUND(sel->r.top, 2, 0), in imx274_set_selection_crop()
1214 IMX274_MAX_HEIGHT - new_crop.height); in imx274_set_selection_crop()
1216 sel->r = new_crop; in imx274_set_selection_crop()
1218 if (sel->which == V4L2_SUBDEV_FORMAT_TRY) in imx274_set_selection_crop()
1219 tgt_crop = &sd_state->pads->try_crop; in imx274_set_selection_crop()
1221 tgt_crop = &imx274->crop; in imx274_set_selection_crop()
1223 mutex_lock(&imx274->lock); in imx274_set_selection_crop()
1225 size_changed = (new_crop.width != tgt_crop->width || in imx274_set_selection_crop()
1226 new_crop.height != tgt_crop->height); in imx274_set_selection_crop()
1233 __imx274_change_compose(imx274, sd_state, sel->which, in imx274_set_selection_crop()
1235 sel->flags); in imx274_set_selection_crop()
1237 mutex_unlock(&imx274->lock); in imx274_set_selection_crop()
1248 if (sel->pad != 0) in imx274_set_selection()
1249 return -EINVAL; in imx274_set_selection()
1251 if (sel->target == V4L2_SEL_TGT_CROP) in imx274_set_selection()
1254 if (sel->target == V4L2_SEL_TGT_COMPOSE) { in imx274_set_selection()
1257 mutex_lock(&imx274->lock); in imx274_set_selection()
1258 err = __imx274_change_compose(imx274, sd_state, sel->which, in imx274_set_selection()
1259 &sel->r.width, &sel->r.height, in imx274_set_selection()
1260 sel->flags); in imx274_set_selection()
1261 mutex_unlock(&imx274->lock); in imx274_set_selection()
1265 * height in set->r, we still need to set top-left in imx274_set_selection()
1268 sel->r.top = 0; in imx274_set_selection()
1269 sel->r.left = 0; in imx274_set_selection()
1275 return -EINVAL; in imx274_set_selection()
1289 h_start = imx274->crop.left + 12; in imx274_apply_trimming()
1290 h_end = h_start + imx274->crop.width; in imx274_apply_trimming()
1295 hmax = max_t(u32, 260, (imx274->crop.width) / 16 + 23); in imx274_apply_trimming()
1298 v_pos = imx274->ctrls.vflip->cur.val ? in imx274_apply_trimming()
1299 (-imx274->crop.top / 2) : (imx274->crop.top / 2); in imx274_apply_trimming()
1300 v_cut = (IMX274_MAX_HEIGHT - imx274->crop.height) / 2; in imx274_apply_trimming()
1301 write_v_size = imx274->crop.height + 22; in imx274_apply_trimming()
1302 y_out_size = imx274->crop.height; in imx274_apply_trimming()
1332 * imx274_g_frame_interval - Get the frame interval
1345 fi->interval = imx274->frame_interval; in imx274_g_frame_interval()
1346 dev_dbg(&imx274->client->dev, "%s frame rate = %d / %d\n", in imx274_g_frame_interval()
1347 __func__, imx274->frame_interval.numerator, in imx274_g_frame_interval()
1348 imx274->frame_interval.denominator); in imx274_g_frame_interval()
1354 * imx274_s_frame_interval - Set the frame interval
1366 struct v4l2_ctrl *ctrl = imx274->ctrls.exposure; in imx274_s_frame_interval()
1370 mutex_lock(&imx274->lock); in imx274_s_frame_interval()
1371 ret = imx274_set_frame_interval(imx274, fi->interval); in imx274_s_frame_interval()
1374 fi->interval = imx274->frame_interval; in imx274_s_frame_interval()
1381 max = fi->interval.numerator * 1000000 in imx274_s_frame_interval()
1382 / fi->interval.denominator; in imx274_s_frame_interval()
1386 dev_err(&imx274->client->dev, in imx274_s_frame_interval()
1392 imx274_set_exposure(imx274, ctrl->val); in imx274_s_frame_interval()
1394 dev_dbg(&imx274->client->dev, "set frame interval to %uus\n", in imx274_s_frame_interval()
1395 fi->interval.numerator * 1000000 in imx274_s_frame_interval()
1396 / fi->interval.denominator); in imx274_s_frame_interval()
1400 mutex_unlock(&imx274->lock); in imx274_s_frame_interval()
1406 * imx274_load_default - load default control values
1414 priv->frame_interval.numerator = 1; in imx274_load_default()
1415 priv->frame_interval.denominator = IMX274_DEF_FRAME_RATE; in imx274_load_default()
1416 priv->ctrls.exposure->val = 1000000 / IMX274_DEF_FRAME_RATE; in imx274_load_default()
1417 priv->ctrls.gain->val = IMX274_DEF_GAIN; in imx274_load_default()
1418 priv->ctrls.vflip->val = 0; in imx274_load_default()
1419 priv->ctrls.test_pattern->val = TEST_PATTERN_DISABLED; in imx274_load_default()
1423 * imx274_s_stream - It is used to start/stop the streaming.
1437 dev_dbg(&imx274->client->dev, "%s : %s, mode index = %td\n", __func__, in imx274_s_stream()
1439 imx274->mode - &imx274_modes[0]); in imx274_s_stream()
1441 mutex_lock(&imx274->lock); in imx274_s_stream()
1444 ret = pm_runtime_resume_and_get(&imx274->client->dev); in imx274_s_stream()
1446 mutex_unlock(&imx274->lock); in imx274_s_stream()
1466 imx274->frame_interval); in imx274_s_stream()
1480 pm_runtime_put(&imx274->client->dev); in imx274_s_stream()
1483 mutex_unlock(&imx274->lock); in imx274_s_stream()
1484 dev_dbg(&imx274->client->dev, "%s : Done\n", __func__); in imx274_s_stream()
1488 pm_runtime_put(&imx274->client->dev); in imx274_s_stream()
1489 mutex_unlock(&imx274->lock); in imx274_s_stream()
1490 dev_err(&imx274->client->dev, "s_stream failed\n"); in imx274_s_stream()
1495 * imx274_get_frame_length - Function for obtaining current frame length
1522 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_get_frame_length()
1535 if (*frame_length < priv->mode->min_frame_len) in imx274_clamp_coarse_time()
1536 *frame_length = priv->mode->min_frame_len; in imx274_clamp_coarse_time()
1538 *val = *frame_length - *val; /* convert to raw shr */ in imx274_clamp_coarse_time()
1539 if (*val > *frame_length - IMX274_SHR_LIMIT_CONST) in imx274_clamp_coarse_time()
1540 *val = *frame_length - IMX274_SHR_LIMIT_CONST; in imx274_clamp_coarse_time()
1541 else if (*val < priv->mode->min_SHR) in imx274_clamp_coarse_time()
1542 *val = priv->mode->min_SHR; in imx274_clamp_coarse_time()
1548 * imx274_set_digital gain - Function called when setting digital gain
1563 reg_val--; in imx274_set_digital_gain()
1572 * imx274_set_gain - Function called when setting gain
1578 * The caller should hold the mutex lock imx274->lock if necessary
1587 gain = (u32)(ctrl->val); in imx274_set_gain()
1589 dev_dbg(&priv->client->dev, in imx274_set_gain()
1610 dev_dbg(&priv->client->dev, in imx274_set_gain()
1621 gain_reg = (u32)IMX274_GAIN_CONST - in imx274_set_gain()
1631 if (IMX274_GAIN_CONST - gain_reg == 0) { in imx274_set_gain()
1632 err = -EINVAL; in imx274_set_gain()
1637 ctrl->val = (IMX274_GAIN_CONST << IMX274_GAIN_SHIFT) in imx274_set_gain()
1638 / (IMX274_GAIN_CONST - gain_reg) * digital_gain; in imx274_set_gain()
1640 dev_dbg(&priv->client->dev, in imx274_set_gain()
1642 __func__, gain_reg, ctrl->val); in imx274_set_gain()
1647 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_gain()
1652 * imx274_set_coarse_time - Function called when setting SHR value
1676 *val = frame_length - coarse_time; in imx274_set_coarse_time()
1680 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_coarse_time()
1685 * imx274_set_exposure - Function called when setting exposure time
1687 * @val: Variable for exposure time, in the unit of micro-second
1690 * The caller should hold the mutex lock imx274->lock if necessary
1700 dev_dbg(&priv->client->dev, in imx274_set_exposure()
1710 err = -EINVAL; in imx274_set_exposure()
1715 - priv->mode->nocpiop) / hmax; in imx274_set_exposure()
1724 priv->ctrls.exposure->val = in imx274_set_exposure()
1725 (coarse_time * hmax + priv->mode->nocpiop) in imx274_set_exposure()
1728 dev_dbg(&priv->client->dev, in imx274_set_exposure()
1733 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_exposure()
1739 * imx274_set_vflip - Function called when setting vertical flip
1746 * The caller should hold the mutex lock imx274->lock if necessary
1756 dev_err(&priv->client->dev, "VFLIP control error\n"); in imx274_set_vflip()
1760 dev_dbg(&priv->client->dev, in imx274_set_vflip()
1767 * imx274_set_test_pattern - Function called when setting test pattern
1782 err = imx274_write_reg(priv, IMX274_TEST_PATTERN_REG, val - 1); in imx274_set_test_pattern()
1786 err = -EINVAL; in imx274_set_test_pattern()
1790 dev_dbg(&priv->client->dev, in imx274_set_test_pattern()
1793 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_test_pattern()
1799 * imx274_set_frame_length - Function called when setting frame length
1812 dev_dbg(&priv->client->dev, "%s : input length = %d\n", in imx274_set_frame_length()
1824 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_frame_length()
1829 * imx274_set_frame_interval - Function called when setting frame interval
1834 * The caller should hold the mutex lock imx274->lock if necessary
1846 dev_dbg(&priv->client->dev, "%s: input frame interval = %d / %d", in imx274_set_frame_interval()
1859 if (req_frame_rate > priv->mode->max_fps) { in imx274_set_frame_interval()
1861 frame_interval.denominator = priv->mode->max_fps; in imx274_set_frame_interval()
1876 dev_dbg(&priv->client->dev, in imx274_set_frame_interval()
1883 dev_dbg(&priv->client->dev, in imx274_set_frame_interval()
1887 err = -EINVAL; in imx274_set_frame_interval()
1899 priv->frame_interval = frame_interval; in imx274_set_frame_interval()
1903 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_frame_interval()
1948 imx274 = devm_kzalloc(&client->dev, sizeof(*imx274), GFP_KERNEL); in imx274_probe()
1950 return -ENOMEM; in imx274_probe()
1952 mutex_init(&imx274->lock); in imx274_probe()
1954 imx274->inck = devm_clk_get_optional(&client->dev, "inck"); in imx274_probe()
1955 if (IS_ERR(imx274->inck)) in imx274_probe()
1956 return PTR_ERR(imx274->inck); in imx274_probe()
1958 ret = imx274_regulators_get(&client->dev, imx274); in imx274_probe()
1960 dev_err(&client->dev, in imx274_probe()
1966 imx274->mode = &imx274_modes[0]; in imx274_probe()
1967 imx274->crop.width = IMX274_MAX_WIDTH; in imx274_probe()
1968 imx274->crop.height = IMX274_MAX_HEIGHT; in imx274_probe()
1969 imx274->format.width = imx274->crop.width / imx274->mode->wbin_ratio; in imx274_probe()
1970 imx274->format.height = imx274->crop.height / imx274->mode->hbin_ratio; in imx274_probe()
1971 imx274->format.field = V4L2_FIELD_NONE; in imx274_probe()
1972 imx274->format.code = MEDIA_BUS_FMT_SRGGB10_1X10; in imx274_probe()
1973 imx274->format.colorspace = V4L2_COLORSPACE_SRGB; in imx274_probe()
1974 imx274->frame_interval.numerator = 1; in imx274_probe()
1975 imx274->frame_interval.denominator = IMX274_DEF_FRAME_RATE; in imx274_probe()
1978 imx274->regmap = devm_regmap_init_i2c(client, &imx274_regmap_config); in imx274_probe()
1979 if (IS_ERR(imx274->regmap)) { in imx274_probe()
1980 dev_err(&client->dev, in imx274_probe()
1981 "regmap init failed: %ld\n", PTR_ERR(imx274->regmap)); in imx274_probe()
1982 ret = -ENODEV; in imx274_probe()
1987 imx274->client = client; in imx274_probe()
1988 sd = &imx274->sd; in imx274_probe()
1990 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in imx274_probe()
1993 imx274->pad.flags = MEDIA_PAD_FL_SOURCE; in imx274_probe()
1994 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx274_probe()
1995 ret = media_entity_pads_init(&sd->entity, 1, &imx274->pad); in imx274_probe()
1997 dev_err(&client->dev, in imx274_probe()
2003 imx274->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", in imx274_probe()
2005 if (IS_ERR(imx274->reset_gpio)) { in imx274_probe()
2006 if (PTR_ERR(imx274->reset_gpio) != -EPROBE_DEFER) in imx274_probe()
2007 dev_err(&client->dev, "Reset GPIO not setup in DT"); in imx274_probe()
2008 ret = PTR_ERR(imx274->reset_gpio); in imx274_probe()
2013 ret = imx274_power_on(&client->dev); in imx274_probe()
2015 dev_err(&client->dev, in imx274_probe()
2021 ret = v4l2_ctrl_handler_init(&imx274->ctrls.handler, 4); in imx274_probe()
2023 dev_err(&client->dev, in imx274_probe()
2028 imx274->ctrls.handler.lock = &imx274->lock; in imx274_probe()
2031 imx274->ctrls.test_pattern = v4l2_ctrl_new_std_menu_items( in imx274_probe()
2032 &imx274->ctrls.handler, &imx274_ctrl_ops, in imx274_probe()
2034 ARRAY_SIZE(tp_qmenu) - 1, 0, 0, tp_qmenu); in imx274_probe()
2036 imx274->ctrls.gain = v4l2_ctrl_new_std( in imx274_probe()
2037 &imx274->ctrls.handler, in imx274_probe()
2043 imx274->ctrls.exposure = v4l2_ctrl_new_std( in imx274_probe()
2044 &imx274->ctrls.handler, in imx274_probe()
2050 imx274->ctrls.vflip = v4l2_ctrl_new_std( in imx274_probe()
2051 &imx274->ctrls.handler, in imx274_probe()
2055 imx274->sd.ctrl_handler = &imx274->ctrls.handler; in imx274_probe()
2056 if (imx274->ctrls.handler.error) { in imx274_probe()
2057 ret = imx274->ctrls.handler.error; in imx274_probe()
2067 dev_err(&client->dev, in imx274_probe()
2073 pm_runtime_set_active(&client->dev); in imx274_probe()
2074 pm_runtime_enable(&client->dev); in imx274_probe()
2075 pm_runtime_idle(&client->dev); in imx274_probe()
2077 dev_info(&client->dev, "imx274 : imx274 probe success !\n"); in imx274_probe()
2081 v4l2_ctrl_handler_free(&imx274->ctrls.handler); in imx274_probe()
2083 imx274_power_off(&client->dev); in imx274_probe()
2085 media_entity_cleanup(&sd->entity); in imx274_probe()
2087 mutex_destroy(&imx274->lock); in imx274_probe()
2096 pm_runtime_disable(&client->dev); in imx274_remove()
2097 if (!pm_runtime_status_suspended(&client->dev)) in imx274_remove()
2098 imx274_power_off(&client->dev); in imx274_remove()
2099 pm_runtime_set_suspended(&client->dev); in imx274_remove()
2102 v4l2_ctrl_handler_free(&imx274->ctrls.handler); in imx274_remove()
2104 media_entity_cleanup(&sd->entity); in imx274_remove()
2105 mutex_destroy(&imx274->lock); in imx274_remove()