Lines Matching +full:four +full:- +full:lane
1 // SPDX-License-Identifier: GPL-2.0
3 * imx274.c - IMX274 CMOS Image Sensor driver
23 #include <linux/v4l2-mediabus.h>
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-device.h>
28 #include <media/v4l2-subdev.h>
48 #define IMX274_GAIN_SHIFT_MASK ((1 << IMX274_GAIN_SHIFT) - 1)
58 / (2048 - IMX274_GAIN_REG_MAX))
76 * register SHR is limited to (SVR value + 1) x VMAX value - 4
163 * Adjustment (CSI-2)" in the datasheet)
164 * @min_SHR: Minimum SHR register value (see "Shutter Setting (CSI-2)" in the
168 * in Each Readout Drive Mode (CSI-2)" in the datasheet)
215 * All-pixel scan mode (10-bit)
217 * 3840x2160 resolution, raw10 data and mipi four lane output
255 * Horizontal/vertical 2/2-line binning
256 * (Horizontal and vertical weightedbinning, 10-bit)
258 * 1920x1080 resolution, raw10 data and mipi four lane output
298 * 1280x720 resolution, raw10 data and mipi four lane output
476 * struct imx274_ctrls - imx274 ctrl structure
492 * struct stim274 - imx274 device structure
548 return &container_of(ctrl->handler, in ctrl_to_sd()
549 struct stimx274, ctrls.handler)->sd; in ctrl_to_sd()
569 struct regmap *regmap = priv->regmap; in imx274_write_table()
574 int range_start = -1; in imx274_write_table()
580 if ((next->addr != range_start + range_count) || in imx274_write_table()
581 (next->addr == IMX274_TABLE_END) || in imx274_write_table()
582 (next->addr == IMX274_TABLE_WAIT_MS) || in imx274_write_table()
597 range_start = -1; in imx274_write_table()
601 if (next->addr == IMX274_TABLE_END) in imx274_write_table()
604 if (next->addr == IMX274_TABLE_WAIT_MS) { in imx274_write_table()
605 msleep_range(next->val); in imx274_write_table()
610 val = next->val; in imx274_write_table()
612 if (range_start == -1) in imx274_write_table()
613 range_start = next->addr; in imx274_write_table()
624 err = regmap_write(priv->regmap, addr, val); in imx274_write_reg()
626 dev_err(&priv->client->dev, in imx274_write_reg()
630 dev_dbg(&priv->client->dev, in imx274_write_reg()
643 * consecutive, least-to-most significant.
656 err = regmap_bulk_read(priv->regmap, addr, &val_le, nbytes); in imx274_read_mbreg()
658 dev_err(&priv->client->dev, in imx274_read_mbreg()
663 dev_dbg(&priv->client->dev, in imx274_read_mbreg()
678 * consecutive, least-to-most significant.
688 err = regmap_bulk_write(priv->regmap, addr, &val_le, nbytes); in imx274_write_mbreg()
690 dev_err(&priv->client->dev, in imx274_write_mbreg()
694 dev_dbg(&priv->client->dev, in imx274_write_mbreg()
714 err = imx274_write_table(priv, priv->mode->init_regs); in imx274_mode_regs()
720 * imx274_start_stream - Function for starting stream per mode index
730 * Refer to "Standby Cancel Sequence when using CSI-2" in in imx274_start_stream()
740 * Refer to "Standby Cancel Sequence when using CSI-2" in in imx274_start_stream()
753 * imx274_reset - Function called to reset the sensor
764 gpiod_set_value_cansleep(priv->reset_gpio, 0); in imx274_reset()
766 gpiod_set_value_cansleep(priv->reset_gpio, !!rst); in imx274_reset()
771 * imx274_s_ctrl - This is used to set the imx274 V4L2 controls
782 int ret = -EINVAL; in imx274_s_ctrl()
784 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
786 ctrl->name, ctrl->val); in imx274_s_ctrl()
788 switch (ctrl->id) { in imx274_s_ctrl()
790 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
792 ret = imx274_set_exposure(imx274, ctrl->val); in imx274_s_ctrl()
796 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
802 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
804 ret = imx274_set_vflip(imx274, ctrl->val); in imx274_s_ctrl()
808 dev_dbg(&imx274->client->dev, in imx274_s_ctrl()
810 ret = imx274_set_test_pattern(imx274, ctrl->val); in imx274_s_ctrl()
821 struct device *dev = &imx274->client->dev; in imx274_binning_goodness()
827 val -= goodness; in imx274_binning_goodness()
829 val -= goodness; in imx274_binning_goodness()
834 val -= goodness; in imx274_binning_goodness()
836 val -= goodness; in imx274_binning_goodness()
839 val -= abs(w - ask_w); in imx274_binning_goodness()
840 val -= abs(h - ask_h); in imx274_binning_goodness()
861 * Must be called with imx274->lock locked.
866 * @width: Input-output parameter: set to the desired width before
868 * @height: Input-output parameter for height (see @width)
879 struct device *dev = &imx274->client->dev; in __imx274_change_compose()
887 cur_crop = &cfg->try_crop; in __imx274_change_compose()
888 tgt_fmt = &cfg->try_fmt; in __imx274_change_compose()
890 cur_crop = &imx274->crop; in __imx274_change_compose()
891 tgt_fmt = &imx274->format; in __imx274_change_compose()
899 cur_crop->width / ratio, *width, in __imx274_change_compose()
900 cur_crop->height / ratio, *height, in __imx274_change_compose()
909 *width = cur_crop->width / best_mode->bin_ratio; in __imx274_change_compose()
910 *height = cur_crop->height / best_mode->bin_ratio; in __imx274_change_compose()
913 imx274->mode = best_mode; in __imx274_change_compose()
916 __func__, best_mode->bin_ratio); in __imx274_change_compose()
918 tgt_fmt->width = *width; in __imx274_change_compose()
919 tgt_fmt->height = *height; in __imx274_change_compose()
920 tgt_fmt->field = V4L2_FIELD_NONE; in __imx274_change_compose()
926 * imx274_get_fmt - Get the pad format
941 mutex_lock(&imx274->lock); in imx274_get_fmt()
942 fmt->format = imx274->format; in imx274_get_fmt()
943 mutex_unlock(&imx274->lock); in imx274_get_fmt()
948 * imx274_set_fmt - This is used to set the pad format
961 struct v4l2_mbus_framefmt *fmt = &format->format; in imx274_set_fmt()
965 mutex_lock(&imx274->lock); in imx274_set_fmt()
967 err = __imx274_change_compose(imx274, cfg, format->which, in imx274_set_fmt()
968 &fmt->width, &fmt->height, 0); in imx274_set_fmt()
978 fmt->field = V4L2_FIELD_NONE; in imx274_set_fmt()
979 if (format->which == V4L2_SUBDEV_FORMAT_TRY) in imx274_set_fmt()
980 cfg->try_fmt = *fmt; in imx274_set_fmt()
982 imx274->format = *fmt; in imx274_set_fmt()
985 mutex_unlock(&imx274->lock); in imx274_set_fmt()
999 if (sel->pad != 0) in imx274_get_selection()
1000 return -EINVAL; in imx274_get_selection()
1002 if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) { in imx274_get_selection()
1003 sel->r.left = 0; in imx274_get_selection()
1004 sel->r.top = 0; in imx274_get_selection()
1005 sel->r.width = IMX274_MAX_WIDTH; in imx274_get_selection()
1006 sel->r.height = IMX274_MAX_HEIGHT; in imx274_get_selection()
1010 if (sel->which == V4L2_SUBDEV_FORMAT_TRY) { in imx274_get_selection()
1011 src_crop = &cfg->try_crop; in imx274_get_selection()
1012 src_fmt = &cfg->try_fmt; in imx274_get_selection()
1014 src_crop = &imx274->crop; in imx274_get_selection()
1015 src_fmt = &imx274->format; in imx274_get_selection()
1018 mutex_lock(&imx274->lock); in imx274_get_selection()
1020 switch (sel->target) { in imx274_get_selection()
1022 sel->r = *src_crop; in imx274_get_selection()
1025 sel->r.top = 0; in imx274_get_selection()
1026 sel->r.left = 0; in imx274_get_selection()
1027 sel->r.width = src_crop->width; in imx274_get_selection()
1028 sel->r.height = src_crop->height; in imx274_get_selection()
1031 sel->r.top = 0; in imx274_get_selection()
1032 sel->r.left = 0; in imx274_get_selection()
1033 sel->r.width = src_fmt->width; in imx274_get_selection()
1034 sel->r.height = src_fmt->height; in imx274_get_selection()
1037 ret = -EINVAL; in imx274_get_selection()
1040 mutex_unlock(&imx274->lock); in imx274_get_selection()
1062 IMX274_ROUND(sel->r.width, h_step, sel->flags), in imx274_set_selection_crop()
1065 /* Constraint: HTRIMMING_END - HTRIMMING_START >= 144 */ in imx274_set_selection_crop()
1070 IMX274_ROUND(sel->r.left, h_step, 0), in imx274_set_selection_crop()
1071 IMX274_MAX_WIDTH - new_crop.width); in imx274_set_selection_crop()
1074 IMX274_ROUND(sel->r.height, 2, sel->flags), in imx274_set_selection_crop()
1077 new_crop.top = min_t(u32, IMX274_ROUND(sel->r.top, 2, 0), in imx274_set_selection_crop()
1078 IMX274_MAX_HEIGHT - new_crop.height); in imx274_set_selection_crop()
1080 sel->r = new_crop; in imx274_set_selection_crop()
1082 if (sel->which == V4L2_SUBDEV_FORMAT_TRY) in imx274_set_selection_crop()
1083 tgt_crop = &cfg->try_crop; in imx274_set_selection_crop()
1085 tgt_crop = &imx274->crop; in imx274_set_selection_crop()
1087 mutex_lock(&imx274->lock); in imx274_set_selection_crop()
1089 size_changed = (new_crop.width != tgt_crop->width || in imx274_set_selection_crop()
1090 new_crop.height != tgt_crop->height); in imx274_set_selection_crop()
1097 __imx274_change_compose(imx274, cfg, sel->which, in imx274_set_selection_crop()
1099 sel->flags); in imx274_set_selection_crop()
1101 mutex_unlock(&imx274->lock); in imx274_set_selection_crop()
1112 if (sel->pad != 0) in imx274_set_selection()
1113 return -EINVAL; in imx274_set_selection()
1115 if (sel->target == V4L2_SEL_TGT_CROP) in imx274_set_selection()
1118 if (sel->target == V4L2_SEL_TGT_COMPOSE) { in imx274_set_selection()
1121 mutex_lock(&imx274->lock); in imx274_set_selection()
1122 err = __imx274_change_compose(imx274, cfg, sel->which, in imx274_set_selection()
1123 &sel->r.width, &sel->r.height, in imx274_set_selection()
1124 sel->flags); in imx274_set_selection()
1125 mutex_unlock(&imx274->lock); in imx274_set_selection()
1129 * height in set->r, we still need to set top-left in imx274_set_selection()
1132 sel->r.top = 0; in imx274_set_selection()
1133 sel->r.left = 0; in imx274_set_selection()
1139 return -EINVAL; in imx274_set_selection()
1153 h_start = imx274->crop.left + 12; in imx274_apply_trimming()
1154 h_end = h_start + imx274->crop.width; in imx274_apply_trimming()
1159 hmax = max_t(u32, 260, (imx274->crop.width) / 16 + 23); in imx274_apply_trimming()
1162 v_pos = imx274->ctrls.vflip->cur.val ? in imx274_apply_trimming()
1163 (-imx274->crop.top / 2) : (imx274->crop.top / 2); in imx274_apply_trimming()
1164 v_cut = (IMX274_MAX_HEIGHT - imx274->crop.height) / 2; in imx274_apply_trimming()
1165 write_v_size = imx274->crop.height + 22; in imx274_apply_trimming()
1166 y_out_size = imx274->crop.height + 14; in imx274_apply_trimming()
1196 * imx274_g_frame_interval - Get the frame interval
1209 fi->interval = imx274->frame_interval; in imx274_g_frame_interval()
1210 dev_dbg(&imx274->client->dev, "%s frame rate = %d / %d\n", in imx274_g_frame_interval()
1211 __func__, imx274->frame_interval.numerator, in imx274_g_frame_interval()
1212 imx274->frame_interval.denominator); in imx274_g_frame_interval()
1218 * imx274_s_frame_interval - Set the frame interval
1230 struct v4l2_ctrl *ctrl = imx274->ctrls.exposure; in imx274_s_frame_interval()
1234 mutex_lock(&imx274->lock); in imx274_s_frame_interval()
1235 ret = imx274_set_frame_interval(imx274, fi->interval); in imx274_s_frame_interval()
1238 fi->interval = imx274->frame_interval; in imx274_s_frame_interval()
1245 max = fi->interval.numerator * 1000000 in imx274_s_frame_interval()
1246 / fi->interval.denominator; in imx274_s_frame_interval()
1249 dev_err(&imx274->client->dev, in imx274_s_frame_interval()
1255 imx274_set_exposure(imx274, ctrl->val); in imx274_s_frame_interval()
1257 dev_dbg(&imx274->client->dev, "set frame interval to %uus\n", in imx274_s_frame_interval()
1258 fi->interval.numerator * 1000000 in imx274_s_frame_interval()
1259 / fi->interval.denominator); in imx274_s_frame_interval()
1263 mutex_unlock(&imx274->lock); in imx274_s_frame_interval()
1269 * imx274_load_default - load default control values
1279 priv->frame_interval.numerator = 1; in imx274_load_default()
1280 priv->frame_interval.denominator = IMX274_DEF_FRAME_RATE; in imx274_load_default()
1281 priv->ctrls.exposure->val = 1000000 / IMX274_DEF_FRAME_RATE; in imx274_load_default()
1282 priv->ctrls.gain->val = IMX274_DEF_GAIN; in imx274_load_default()
1283 priv->ctrls.vflip->val = 0; in imx274_load_default()
1284 priv->ctrls.test_pattern->val = TEST_PATTERN_DISABLED; in imx274_load_default()
1288 priv->frame_interval); in imx274_load_default()
1293 ret = v4l2_ctrl_s_ctrl(priv->ctrls.exposure, priv->ctrls.exposure->val); in imx274_load_default()
1298 ret = v4l2_ctrl_s_ctrl(priv->ctrls.gain, priv->ctrls.gain->val); in imx274_load_default()
1303 ret = v4l2_ctrl_s_ctrl(priv->ctrls.vflip, priv->ctrls.vflip->val); in imx274_load_default()
1311 * imx274_s_stream - It is used to start/stop the streaming.
1325 dev_dbg(&imx274->client->dev, "%s : %s, mode index = %td\n", __func__, in imx274_s_stream()
1327 imx274->mode - &imx274_modes[0]); in imx274_s_stream()
1329 mutex_lock(&imx274->lock); in imx274_s_stream()
1348 imx274->frame_interval); in imx274_s_stream()
1353 ret = __v4l2_ctrl_s_ctrl(imx274->ctrls.exposure, in imx274_s_stream()
1354 imx274->ctrls.exposure->val); in imx274_s_stream()
1369 mutex_unlock(&imx274->lock); in imx274_s_stream()
1370 dev_dbg(&imx274->client->dev, "%s : Done\n", __func__); in imx274_s_stream()
1374 mutex_unlock(&imx274->lock); in imx274_s_stream()
1375 dev_err(&imx274->client->dev, "s_stream failed\n"); in imx274_s_stream()
1380 * imx274_get_frame_length - Function for obtaining current frame length
1407 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_get_frame_length()
1420 if (*frame_length < priv->mode->min_frame_len) in imx274_clamp_coarse_time()
1421 *frame_length = priv->mode->min_frame_len; in imx274_clamp_coarse_time()
1423 *val = *frame_length - *val; /* convert to raw shr */ in imx274_clamp_coarse_time()
1424 if (*val > *frame_length - IMX274_SHR_LIMIT_CONST) in imx274_clamp_coarse_time()
1425 *val = *frame_length - IMX274_SHR_LIMIT_CONST; in imx274_clamp_coarse_time()
1426 else if (*val < priv->mode->min_SHR) in imx274_clamp_coarse_time()
1427 *val = priv->mode->min_SHR; in imx274_clamp_coarse_time()
1433 * imx274_set_digital gain - Function called when setting digital gain
1448 reg_val--; in imx274_set_digital_gain()
1457 * imx274_set_gain - Function called when setting gain
1463 * The caller should hold the mutex lock imx274->lock if necessary
1472 gain = (u32)(ctrl->val); in imx274_set_gain()
1474 dev_dbg(&priv->client->dev, in imx274_set_gain()
1495 dev_dbg(&priv->client->dev, in imx274_set_gain()
1506 gain_reg = (u32)IMX274_GAIN_CONST - in imx274_set_gain()
1516 if (IMX274_GAIN_CONST - gain_reg == 0) { in imx274_set_gain()
1517 err = -EINVAL; in imx274_set_gain()
1522 ctrl->val = (IMX274_GAIN_CONST << IMX274_GAIN_SHIFT) in imx274_set_gain()
1523 / (IMX274_GAIN_CONST - gain_reg) * digital_gain; in imx274_set_gain()
1525 dev_dbg(&priv->client->dev, in imx274_set_gain()
1527 __func__, gain_reg, ctrl->val); in imx274_set_gain()
1532 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_gain()
1537 * imx274_set_coarse_time - Function called when setting SHR value
1561 *val = frame_length - coarse_time; in imx274_set_coarse_time()
1565 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_coarse_time()
1570 * imx274_set_exposure - Function called when setting exposure time
1572 * @val: Variable for exposure time, in the unit of micro-second
1575 * The caller should hold the mutex lock imx274->lock if necessary
1585 dev_dbg(&priv->client->dev, in imx274_set_exposure()
1595 err = -EINVAL; in imx274_set_exposure()
1600 - priv->mode->nocpiop) / hmax; in imx274_set_exposure()
1609 priv->ctrls.exposure->val = in imx274_set_exposure()
1610 (coarse_time * hmax + priv->mode->nocpiop) in imx274_set_exposure()
1613 dev_dbg(&priv->client->dev, in imx274_set_exposure()
1618 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_exposure()
1624 * imx274_set_vflip - Function called when setting vertical flip
1631 * The caller should hold the mutex lock imx274->lock if necessary
1641 dev_err(&priv->client->dev, "VFLIP control error\n"); in imx274_set_vflip()
1645 dev_dbg(&priv->client->dev, in imx274_set_vflip()
1652 * imx274_set_test_pattern - Function called when setting test pattern
1667 err = imx274_write_reg(priv, IMX274_TEST_PATTERN_REG, val - 1); in imx274_set_test_pattern()
1671 err = -EINVAL; in imx274_set_test_pattern()
1675 dev_dbg(&priv->client->dev, in imx274_set_test_pattern()
1678 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_test_pattern()
1684 * imx274_set_frame_length - Function called when setting frame length
1697 dev_dbg(&priv->client->dev, "%s : input length = %d\n", in imx274_set_frame_length()
1709 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_frame_length()
1714 * imx274_set_frame_interval - Function called when setting frame interval
1719 * The caller should hold the mutex lock imx274->lock if necessary
1731 dev_dbg(&priv->client->dev, "%s: input frame interval = %d / %d", in imx274_set_frame_interval()
1744 if (req_frame_rate > priv->mode->max_fps) { in imx274_set_frame_interval()
1746 frame_interval.denominator = priv->mode->max_fps; in imx274_set_frame_interval()
1761 dev_dbg(&priv->client->dev, in imx274_set_frame_interval()
1768 dev_dbg(&priv->client->dev, in imx274_set_frame_interval()
1772 err = -EINVAL; in imx274_set_frame_interval()
1784 priv->frame_interval = frame_interval; in imx274_set_frame_interval()
1788 dev_err(&priv->client->dev, "%s error = %d\n", __func__, err); in imx274_set_frame_interval()
1833 imx274 = devm_kzalloc(&client->dev, sizeof(*imx274), GFP_KERNEL); in imx274_probe()
1835 return -ENOMEM; in imx274_probe()
1837 mutex_init(&imx274->lock); in imx274_probe()
1840 imx274->mode = &imx274_modes[IMX274_DEFAULT_BINNING]; in imx274_probe()
1841 imx274->crop.width = IMX274_MAX_WIDTH; in imx274_probe()
1842 imx274->crop.height = IMX274_MAX_HEIGHT; in imx274_probe()
1843 imx274->format.width = imx274->crop.width / imx274->mode->bin_ratio; in imx274_probe()
1844 imx274->format.height = imx274->crop.height / imx274->mode->bin_ratio; in imx274_probe()
1845 imx274->format.field = V4L2_FIELD_NONE; in imx274_probe()
1846 imx274->format.code = MEDIA_BUS_FMT_SRGGB10_1X10; in imx274_probe()
1847 imx274->format.colorspace = V4L2_COLORSPACE_SRGB; in imx274_probe()
1848 imx274->frame_interval.numerator = 1; in imx274_probe()
1849 imx274->frame_interval.denominator = IMX274_DEF_FRAME_RATE; in imx274_probe()
1852 imx274->regmap = devm_regmap_init_i2c(client, &imx274_regmap_config); in imx274_probe()
1853 if (IS_ERR(imx274->regmap)) { in imx274_probe()
1854 dev_err(&client->dev, in imx274_probe()
1855 "regmap init failed: %ld\n", PTR_ERR(imx274->regmap)); in imx274_probe()
1856 ret = -ENODEV; in imx274_probe()
1861 imx274->client = client; in imx274_probe()
1862 sd = &imx274->sd; in imx274_probe()
1864 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in imx274_probe()
1867 imx274->pad.flags = MEDIA_PAD_FL_SOURCE; in imx274_probe()
1868 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx274_probe()
1869 ret = media_entity_pads_init(&sd->entity, 1, &imx274->pad); in imx274_probe()
1871 dev_err(&client->dev, in imx274_probe()
1877 imx274->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", in imx274_probe()
1879 if (IS_ERR(imx274->reset_gpio)) { in imx274_probe()
1880 if (PTR_ERR(imx274->reset_gpio) != -EPROBE_DEFER) in imx274_probe()
1881 dev_err(&client->dev, "Reset GPIO not setup in DT"); in imx274_probe()
1882 ret = PTR_ERR(imx274->reset_gpio); in imx274_probe()
1890 ret = v4l2_ctrl_handler_init(&imx274->ctrls.handler, 4); in imx274_probe()
1892 dev_err(&client->dev, in imx274_probe()
1897 imx274->ctrls.handler.lock = &imx274->lock; in imx274_probe()
1900 imx274->ctrls.test_pattern = v4l2_ctrl_new_std_menu_items( in imx274_probe()
1901 &imx274->ctrls.handler, &imx274_ctrl_ops, in imx274_probe()
1903 ARRAY_SIZE(tp_qmenu) - 1, 0, 0, tp_qmenu); in imx274_probe()
1905 imx274->ctrls.gain = v4l2_ctrl_new_std( in imx274_probe()
1906 &imx274->ctrls.handler, in imx274_probe()
1912 imx274->ctrls.exposure = v4l2_ctrl_new_std( in imx274_probe()
1913 &imx274->ctrls.handler, in imx274_probe()
1919 imx274->ctrls.vflip = v4l2_ctrl_new_std( in imx274_probe()
1920 &imx274->ctrls.handler, in imx274_probe()
1924 imx274->sd.ctrl_handler = &imx274->ctrls.handler; in imx274_probe()
1925 if (imx274->ctrls.handler.error) { in imx274_probe()
1926 ret = imx274->ctrls.handler.error; in imx274_probe()
1931 ret = v4l2_ctrl_handler_setup(&imx274->ctrls.handler); in imx274_probe()
1933 dev_err(&client->dev, in imx274_probe()
1941 dev_err(&client->dev, in imx274_probe()
1950 dev_err(&client->dev, in imx274_probe()
1956 dev_info(&client->dev, "imx274 : imx274 probe success !\n"); in imx274_probe()
1960 v4l2_ctrl_handler_free(&imx274->ctrls.handler); in imx274_probe()
1962 media_entity_cleanup(&sd->entity); in imx274_probe()
1964 mutex_destroy(&imx274->lock); in imx274_probe()
1977 v4l2_ctrl_handler_free(&imx274->ctrls.handler); in imx274_remove()
1978 media_entity_cleanup(&sd->entity); in imx274_remove()
1979 mutex_destroy(&imx274->lock); in imx274_remove()