1 // SPDX-License-Identifier: GPL-2.0
3 * A V4L2 driver for Sony IMX477 cameras.
4 * Copyright (C) 2020, Raspberry Pi (Trading) Ltd
6 * Based on Sony imx219 camera driver
7 * Copyright (C) 2019-2020 Raspberry Pi (Trading) Ltd
9 #include <asm/unaligned.h>
10 #include <linux/clk.h>
11 #include <linux/delay.h>
12 #include <linux/gpio/consumer.h>
13 #include <linux/i2c.h>
14 #include <linux/module.h>
15 #include <linux/of_device.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/regulator/consumer.h>
18 #include <media/v4l2-ctrls.h>
19 #include <media/v4l2-device.h>
20 #include <media/v4l2-event.h>
21 #include <media/v4l2-fwnode.h>
22 #include <media/v4l2-mediabus.h>
24 static int dpc_enable = 1;
25 module_param(dpc_enable, int, 0644);
26 MODULE_PARM_DESC(dpc_enable, "Enable on-sensor DPC");
28 static int trigger_mode;
29 module_param(trigger_mode, int, 0644);
30 MODULE_PARM_DESC(trigger_mode, "Set vsync trigger mode: 1=source, 2=sink");
32 #define IMX477_REG_VALUE_08BIT 1
33 #define IMX477_REG_VALUE_16BIT 2
36 #define IMX477_REG_CHIP_ID 0x0016
37 #define IMX477_CHIP_ID 0x0477
38 #define IMX378_CHIP_ID 0x0378
40 #define IMX477_REG_MODE_SELECT 0x0100
41 #define IMX477_MODE_STANDBY 0x00
42 #define IMX477_MODE_STREAMING 0x01
44 #define IMX477_REG_ORIENTATION 0x101
46 #define IMX477_XCLK_FREQ 24000000
48 #define IMX477_DEFAULT_LINK_FREQ 450000000
50 /* Pixel rate is fixed at 840MHz for all the modes */
51 #define IMX477_PIXEL_RATE 840000000
53 /* V_TIMING internal */
54 #define IMX477_REG_FRAME_LENGTH 0x0340
55 #define IMX477_FRAME_LENGTH_MAX 0xffdc
57 /* Long exposure multiplier */
58 #define IMX477_LONG_EXP_SHIFT_MAX 7
59 #define IMX477_LONG_EXP_SHIFT_REG 0x3100
61 /* Exposure control */
62 #define IMX477_REG_EXPOSURE 0x0202
63 #define IMX477_EXPOSURE_OFFSET 22
64 #define IMX477_EXPOSURE_MIN 4
65 #define IMX477_EXPOSURE_STEP 1
66 #define IMX477_EXPOSURE_DEFAULT 0x640
67 #define IMX477_EXPOSURE_MAX (IMX477_FRAME_LENGTH_MAX - \
68 IMX477_EXPOSURE_OFFSET)
70 /* Analog gain control */
71 #define IMX477_REG_ANALOG_GAIN 0x0204
72 #define IMX477_ANA_GAIN_MIN 0
73 #define IMX477_ANA_GAIN_MAX 978
74 #define IMX477_ANA_GAIN_STEP 1
75 #define IMX477_ANA_GAIN_DEFAULT 0x0
77 /* Digital gain control */
78 #define IMX477_REG_DIGITAL_GAIN 0x020e
79 #define IMX477_DGTL_GAIN_MIN 0x0100
80 #define IMX477_DGTL_GAIN_MAX 0xffff
81 #define IMX477_DGTL_GAIN_DEFAULT 0x0100
82 #define IMX477_DGTL_GAIN_STEP 1
84 /* Test Pattern Control */
85 #define IMX477_REG_TEST_PATTERN 0x0600
86 #define IMX477_TEST_PATTERN_DISABLE 0
87 #define IMX477_TEST_PATTERN_SOLID_COLOR 1
88 #define IMX477_TEST_PATTERN_COLOR_BARS 2
89 #define IMX477_TEST_PATTERN_GREY_COLOR 3
90 #define IMX477_TEST_PATTERN_PN9 4
92 /* Test pattern colour components */
93 #define IMX477_REG_TEST_PATTERN_R 0x0602
94 #define IMX477_REG_TEST_PATTERN_GR 0x0604
95 #define IMX477_REG_TEST_PATTERN_B 0x0606
96 #define IMX477_REG_TEST_PATTERN_GB 0x0608
97 #define IMX477_TEST_PATTERN_COLOUR_MIN 0
98 #define IMX477_TEST_PATTERN_COLOUR_MAX 0x0fff
99 #define IMX477_TEST_PATTERN_COLOUR_STEP 1
100 #define IMX477_TEST_PATTERN_R_DEFAULT IMX477_TEST_PATTERN_COLOUR_MAX
101 #define IMX477_TEST_PATTERN_GR_DEFAULT 0
102 #define IMX477_TEST_PATTERN_B_DEFAULT 0
103 #define IMX477_TEST_PATTERN_GB_DEFAULT 0
106 #define IMX477_REG_MC_MODE 0x3f0b
107 #define IMX477_REG_MS_SEL 0x3041
108 #define IMX477_REG_XVS_IO_CTRL 0x3040
109 #define IMX477_REG_EXTOUT_EN 0x4b81
111 /* Embedded metadata stream structure */
112 #define IMX477_EMBEDDED_LINE_WIDTH 16384
113 #define IMX477_NUM_EMBEDDED_LINES 1
121 /* IMX477 native and active pixel array size. */
122 #define IMX477_NATIVE_WIDTH 4072U
123 #define IMX477_NATIVE_HEIGHT 3176U
124 #define IMX477_PIXEL_ARRAY_LEFT 8U
125 #define IMX477_PIXEL_ARRAY_TOP 16U
126 #define IMX477_PIXEL_ARRAY_WIDTH 4056U
127 #define IMX477_PIXEL_ARRAY_HEIGHT 3040U
134 struct imx477_reg_list {
135 unsigned int num_of_regs;
136 const struct imx477_reg *regs;
139 /* Mode : resolution and related config&values */
147 /* H-timing in pixels */
148 unsigned int line_length_pix;
150 /* Analog crop rectangle. */
151 struct v4l2_rect crop;
153 /* Highest possible framerate. */
154 struct v4l2_fract timeperframe_min;
156 /* Default framerate. */
157 struct v4l2_fract timeperframe_default;
159 /* Default register values */
160 struct imx477_reg_list reg_list;
163 static const struct imx477_reg mode_common_regs[] = {
476 static const struct imx477_reg mode_4056x3040_regs[] = {
587 /* 2x2 binned. 40fps */
588 static const struct imx477_reg mode_2028x1520_regs[] = {
688 /* 1080p cropped mode */
689 static const struct imx477_reg mode_2028x1080_regs[] = {
789 /* 4x4 binned. 120fps */
790 static const struct imx477_reg mode_1332x990_regs[] = {
920 static const struct imx477_mode supported_modes_12bit[] = {
922 /* 12MPix 10fps mode */
925 .line_length_pix = 0x5dc0,
927 .left = IMX477_PIXEL_ARRAY_LEFT,
928 .top = IMX477_PIXEL_ARRAY_TOP,
932 .timeperframe_min = {
936 .timeperframe_default = {
941 .num_of_regs = ARRAY_SIZE(mode_4056x3040_regs),
942 .regs = mode_4056x3040_regs,
946 /* 2x2 binned 40fps mode */
949 .line_length_pix = 0x31c4,
951 .left = IMX477_PIXEL_ARRAY_LEFT,
952 .top = IMX477_PIXEL_ARRAY_TOP,
956 .timeperframe_min = {
960 .timeperframe_default = {
965 .num_of_regs = ARRAY_SIZE(mode_2028x1520_regs),
966 .regs = mode_2028x1520_regs,
970 /* 1080p 50fps cropped mode */
973 .line_length_pix = 0x31c4,
975 .left = IMX477_PIXEL_ARRAY_LEFT,
976 .top = IMX477_PIXEL_ARRAY_TOP + 440,
980 .timeperframe_min = {
984 .timeperframe_default = {
989 .num_of_regs = ARRAY_SIZE(mode_2028x1080_regs),
990 .regs = mode_2028x1080_regs,
995 static const struct imx477_mode supported_modes_10bit[] = {
997 /* 120fps. 2x2 binned and cropped */
1000 .line_length_pix = 6664,
1003 * FIXME: the analog crop rectangle is actually
1004 * programmed with a horizontal displacement of 0
1005 * pixels, not 4. It gets shrunk after going through
1006 * the scaler. Move this information to the compose
1007 * rectangle once the driver is expanded to represent
1008 * its processing blocks with multiple subdevs.
1010 .left = IMX477_PIXEL_ARRAY_LEFT + 696,
1011 .top = IMX477_PIXEL_ARRAY_TOP + 528,
1015 .timeperframe_min = {
1017 .denominator = 12000
1019 .timeperframe_default = {
1021 .denominator = 12000
1024 .num_of_regs = ARRAY_SIZE(mode_1332x990_regs),
1025 .regs = mode_1332x990_regs,
1031 * The supported formats.
1032 * This table MUST contain 4 entries per format, to cover the various flip
1033 * combinations in the order
1039 static const u32 codes[] = {
1041 MEDIA_BUS_FMT_SRGGB12_1X12,
1042 MEDIA_BUS_FMT_SGRBG12_1X12,
1043 MEDIA_BUS_FMT_SGBRG12_1X12,
1044 MEDIA_BUS_FMT_SBGGR12_1X12,
1046 MEDIA_BUS_FMT_SRGGB10_1X10,
1047 MEDIA_BUS_FMT_SGRBG10_1X10,
1048 MEDIA_BUS_FMT_SGBRG10_1X10,
1049 MEDIA_BUS_FMT_SBGGR10_1X10,
1052 static const char * const imx477_test_pattern_menu[] = {
1060 static const int imx477_test_pattern_val[] = {
1061 IMX477_TEST_PATTERN_DISABLE,
1062 IMX477_TEST_PATTERN_COLOR_BARS,
1063 IMX477_TEST_PATTERN_SOLID_COLOR,
1064 IMX477_TEST_PATTERN_GREY_COLOR,
1065 IMX477_TEST_PATTERN_PN9,
1068 /* regulator supplies */
1069 static const char * const imx477_supply_name[] = {
1070 /* Supplies can be enabled in any order */
1071 "VANA", /* Analog (2.8V) supply */
1072 "VDIG", /* Digital Core (1.05V) supply */
1073 "VDDL", /* IF (1.8V) supply */
1076 #define IMX477_NUM_SUPPLIES ARRAY_SIZE(imx477_supply_name)
1079 * Initialisation delay between XCLR low->high and the moment when the sensor
1080 * can start capture (i.e. can leave software standby), given by T7 in the
1081 * datasheet is 8ms. This does include I2C setup time as well.
1083 * Note, that delay between XCLR low->high and reading the CCI ID register (T6
1084 * in the datasheet) is much smaller - 600us.
1086 #define IMX477_XCLR_MIN_DELAY_US 8000
1087 #define IMX477_XCLR_DELAY_RANGE_US 1000
1089 struct imx477_compatible_data {
1090 unsigned int chip_id;
1091 struct imx477_reg_list extra_regs;
1095 struct v4l2_subdev sd;
1096 struct media_pad pad[NUM_PADS];
1098 unsigned int fmt_code;
1103 struct gpio_desc *reset_gpio;
1104 struct regulator_bulk_data supplies[IMX477_NUM_SUPPLIES];
1106 struct v4l2_ctrl_handler ctrl_handler;
1108 struct v4l2_ctrl *pixel_rate;
1109 struct v4l2_ctrl *exposure;
1110 struct v4l2_ctrl *vflip;
1111 struct v4l2_ctrl *hflip;
1112 struct v4l2_ctrl *vblank;
1113 struct v4l2_ctrl *hblank;
1116 const struct imx477_mode *mode;
1119 * Mutex for serialized access:
1120 * Protect sensor module set pad format and start/stop streaming safely.
1124 /* Streaming on/off */
1127 /* Rewrite common registers on stream on? */
1128 bool common_regs_written;
1130 /* Current long exposure factor in use. Set through V4L2_CID_VBLANK */
1131 unsigned int long_exp_shift;
1133 /* Any extra information related to different compatible sensors */
1134 const struct imx477_compatible_data *compatible_data;
1137 static inline struct imx477 *to_imx477(struct v4l2_subdev *_sd)
1139 return container_of(_sd, struct imx477, sd);
1142 static inline void get_mode_table(unsigned int code,
1143 const struct imx477_mode **mode_list,
1144 unsigned int *num_modes)
1148 case MEDIA_BUS_FMT_SRGGB12_1X12:
1149 case MEDIA_BUS_FMT_SGRBG12_1X12:
1150 case MEDIA_BUS_FMT_SGBRG12_1X12:
1151 case MEDIA_BUS_FMT_SBGGR12_1X12:
1152 *mode_list = supported_modes_12bit;
1153 *num_modes = ARRAY_SIZE(supported_modes_12bit);
1156 case MEDIA_BUS_FMT_SRGGB10_1X10:
1157 case MEDIA_BUS_FMT_SGRBG10_1X10:
1158 case MEDIA_BUS_FMT_SGBRG10_1X10:
1159 case MEDIA_BUS_FMT_SBGGR10_1X10:
1160 *mode_list = supported_modes_10bit;
1161 *num_modes = ARRAY_SIZE(supported_modes_10bit);
1169 /* Read registers up to 2 at a time */
1170 static int imx477_read_reg(struct imx477 *imx477, u16 reg, u32 len, u32 *val)
1172 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1173 struct i2c_msg msgs[2];
1174 u8 addr_buf[2] = { reg >> 8, reg & 0xff };
1175 u8 data_buf[4] = { 0, };
1181 /* Write register address */
1182 msgs[0].addr = client->addr;
1184 msgs[0].len = ARRAY_SIZE(addr_buf);
1185 msgs[0].buf = addr_buf;
1187 /* Read data from register */
1188 msgs[1].addr = client->addr;
1189 msgs[1].flags = I2C_M_RD;
1191 msgs[1].buf = &data_buf[4 - len];
1193 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
1194 if (ret != ARRAY_SIZE(msgs))
1197 *val = get_unaligned_be32(data_buf);
1202 /* Write registers up to 2 at a time */
1203 static int imx477_write_reg(struct imx477 *imx477, u16 reg, u32 len, u32 val)
1205 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1211 put_unaligned_be16(reg, buf);
1212 put_unaligned_be32(val << (8 * (4 - len)), buf + 2);
1213 if (i2c_master_send(client, buf, len + 2) != len + 2)
1219 /* Write a list of registers */
1220 static int imx477_write_regs(struct imx477 *imx477,
1221 const struct imx477_reg *regs, u32 len)
1223 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1227 for (i = 0; i < len; i++) {
1228 ret = imx477_write_reg(imx477, regs[i].address, 1, regs[i].val);
1230 dev_err_ratelimited(&client->dev,
1231 "Failed to write reg 0x%4.4x. error = %d\n",
1232 regs[i].address, ret);
1241 /* Get bayer order based on flip setting. */
1242 static u32 imx477_get_format_code(struct imx477 *imx477, u32 code)
1246 lockdep_assert_held(&imx477->mutex);
1248 for (i = 0; i < ARRAY_SIZE(codes); i++)
1249 if (codes[i] == code)
1252 if (i >= ARRAY_SIZE(codes))
1255 i = (i & ~3) | (imx477->vflip->val ? 2 : 0) |
1256 (imx477->hflip->val ? 1 : 0);
1261 static void imx477_set_default_format(struct imx477 *imx477)
1263 /* Set default mode to max resolution */
1264 imx477->mode = &supported_modes_12bit[0];
1265 imx477->fmt_code = MEDIA_BUS_FMT_SRGGB12_1X12;
1268 static int imx477_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
1270 struct imx477 *imx477 = to_imx477(sd);
1271 struct v4l2_mbus_framefmt *try_fmt_img =
1272 v4l2_subdev_get_try_format(sd, fh->state, IMAGE_PAD);
1273 struct v4l2_mbus_framefmt *try_fmt_meta =
1274 v4l2_subdev_get_try_format(sd, fh->state, METADATA_PAD);
1275 struct v4l2_rect *try_crop;
1277 mutex_lock(&imx477->mutex);
1279 /* Initialize try_fmt for the image pad */
1280 try_fmt_img->width = supported_modes_12bit[0].width;
1281 try_fmt_img->height = supported_modes_12bit[0].height;
1282 try_fmt_img->code = imx477_get_format_code(imx477,
1283 MEDIA_BUS_FMT_SRGGB12_1X12);
1284 try_fmt_img->field = V4L2_FIELD_NONE;
1286 /* Initialize try_fmt for the embedded metadata pad */
1287 try_fmt_meta->width = IMX477_EMBEDDED_LINE_WIDTH;
1288 try_fmt_meta->height = IMX477_NUM_EMBEDDED_LINES;
1289 try_fmt_meta->code = MEDIA_BUS_FMT_SENSOR_DATA;
1290 try_fmt_meta->field = V4L2_FIELD_NONE;
1292 /* Initialize try_crop */
1293 try_crop = v4l2_subdev_get_try_crop(sd, fh->state, IMAGE_PAD);
1294 try_crop->left = IMX477_PIXEL_ARRAY_LEFT;
1295 try_crop->top = IMX477_PIXEL_ARRAY_TOP;
1296 try_crop->width = IMX477_PIXEL_ARRAY_WIDTH;
1297 try_crop->height = IMX477_PIXEL_ARRAY_HEIGHT;
1299 mutex_unlock(&imx477->mutex);
1304 static void imx477_adjust_exposure_range(struct imx477 *imx477)
1306 int exposure_max, exposure_def;
1308 /* Honour the VBLANK limits when setting exposure. */
1309 exposure_max = imx477->mode->height + imx477->vblank->val -
1310 IMX477_EXPOSURE_OFFSET;
1311 exposure_def = min(exposure_max, imx477->exposure->val);
1312 __v4l2_ctrl_modify_range(imx477->exposure, imx477->exposure->minimum,
1313 exposure_max, imx477->exposure->step,
1317 static int imx477_set_frame_length(struct imx477 *imx477, unsigned int val)
1321 imx477->long_exp_shift = 0;
1323 while (val > IMX477_FRAME_LENGTH_MAX) {
1324 imx477->long_exp_shift++;
1328 ret = imx477_write_reg(imx477, IMX477_REG_FRAME_LENGTH,
1329 IMX477_REG_VALUE_16BIT, val);
1333 return imx477_write_reg(imx477, IMX477_LONG_EXP_SHIFT_REG,
1334 IMX477_REG_VALUE_08BIT, imx477->long_exp_shift);
1337 static int imx477_set_ctrl(struct v4l2_ctrl *ctrl)
1339 struct imx477 *imx477 =
1340 container_of(ctrl->handler, struct imx477, ctrl_handler);
1341 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1345 * The VBLANK control may change the limits of usable exposure, so check
1346 * and adjust if necessary.
1348 if (ctrl->id == V4L2_CID_VBLANK)
1349 imx477_adjust_exposure_range(imx477);
1352 * Applying V4L2 control value only happens
1353 * when power is up for streaming
1355 if (pm_runtime_get_if_in_use(&client->dev) == 0)
1359 case V4L2_CID_ANALOGUE_GAIN:
1360 ret = imx477_write_reg(imx477, IMX477_REG_ANALOG_GAIN,
1361 IMX477_REG_VALUE_16BIT, ctrl->val);
1363 case V4L2_CID_EXPOSURE:
1364 ret = imx477_write_reg(imx477, IMX477_REG_EXPOSURE,
1365 IMX477_REG_VALUE_16BIT, ctrl->val >>
1366 imx477->long_exp_shift);
1368 case V4L2_CID_DIGITAL_GAIN:
1369 ret = imx477_write_reg(imx477, IMX477_REG_DIGITAL_GAIN,
1370 IMX477_REG_VALUE_16BIT, ctrl->val);
1372 case V4L2_CID_TEST_PATTERN:
1373 ret = imx477_write_reg(imx477, IMX477_REG_TEST_PATTERN,
1374 IMX477_REG_VALUE_16BIT,
1375 imx477_test_pattern_val[ctrl->val]);
1377 case V4L2_CID_TEST_PATTERN_RED:
1378 ret = imx477_write_reg(imx477, IMX477_REG_TEST_PATTERN_R,
1379 IMX477_REG_VALUE_16BIT, ctrl->val);
1381 case V4L2_CID_TEST_PATTERN_GREENR:
1382 ret = imx477_write_reg(imx477, IMX477_REG_TEST_PATTERN_GR,
1383 IMX477_REG_VALUE_16BIT, ctrl->val);
1385 case V4L2_CID_TEST_PATTERN_BLUE:
1386 ret = imx477_write_reg(imx477, IMX477_REG_TEST_PATTERN_B,
1387 IMX477_REG_VALUE_16BIT, ctrl->val);
1389 case V4L2_CID_TEST_PATTERN_GREENB:
1390 ret = imx477_write_reg(imx477, IMX477_REG_TEST_PATTERN_GB,
1391 IMX477_REG_VALUE_16BIT, ctrl->val);
1393 case V4L2_CID_HFLIP:
1394 case V4L2_CID_VFLIP:
1395 ret = imx477_write_reg(imx477, IMX477_REG_ORIENTATION, 1,
1396 imx477->hflip->val |
1397 imx477->vflip->val << 1);
1399 case V4L2_CID_VBLANK:
1400 ret = imx477_set_frame_length(imx477,
1401 imx477->mode->height + ctrl->val);
1404 dev_info(&client->dev,
1405 "ctrl(id:0x%x,val:0x%x) is not handled\n",
1406 ctrl->id, ctrl->val);
1411 pm_runtime_put(&client->dev);
1416 static const struct v4l2_ctrl_ops imx477_ctrl_ops = {
1417 .s_ctrl = imx477_set_ctrl,
1420 static int imx477_enum_mbus_code(struct v4l2_subdev *sd,
1421 struct v4l2_subdev_state *sd_state,
1422 struct v4l2_subdev_mbus_code_enum *code)
1424 struct imx477 *imx477 = to_imx477(sd);
1426 if (code->pad >= NUM_PADS)
1429 if (code->pad == IMAGE_PAD) {
1430 if (code->index >= (ARRAY_SIZE(codes) / 4))
1433 code->code = imx477_get_format_code(imx477,
1434 codes[code->index * 4]);
1436 if (code->index > 0)
1439 code->code = MEDIA_BUS_FMT_SENSOR_DATA;
1445 static int imx477_enum_frame_size(struct v4l2_subdev *sd,
1446 struct v4l2_subdev_state *sd_state,
1447 struct v4l2_subdev_frame_size_enum *fse)
1449 struct imx477 *imx477 = to_imx477(sd);
1451 if (fse->pad >= NUM_PADS)
1454 if (fse->pad == IMAGE_PAD) {
1455 const struct imx477_mode *mode_list;
1456 unsigned int num_modes;
1458 get_mode_table(fse->code, &mode_list, &num_modes);
1460 if (fse->index >= num_modes)
1463 if (fse->code != imx477_get_format_code(imx477, fse->code))
1466 fse->min_width = mode_list[fse->index].width;
1467 fse->max_width = fse->min_width;
1468 fse->min_height = mode_list[fse->index].height;
1469 fse->max_height = fse->min_height;
1471 if (fse->code != MEDIA_BUS_FMT_SENSOR_DATA || fse->index > 0)
1474 fse->min_width = IMX477_EMBEDDED_LINE_WIDTH;
1475 fse->max_width = fse->min_width;
1476 fse->min_height = IMX477_NUM_EMBEDDED_LINES;
1477 fse->max_height = fse->min_height;
1483 static void imx477_reset_colorspace(struct v4l2_mbus_framefmt *fmt)
1485 fmt->colorspace = V4L2_COLORSPACE_RAW;
1486 fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
1487 fmt->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true,
1490 fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
1493 static void imx477_update_image_pad_format(struct imx477 *imx477,
1494 const struct imx477_mode *mode,
1495 struct v4l2_subdev_format *fmt)
1497 fmt->format.width = mode->width;
1498 fmt->format.height = mode->height;
1499 fmt->format.field = V4L2_FIELD_NONE;
1500 imx477_reset_colorspace(&fmt->format);
1503 static void imx477_update_metadata_pad_format(struct v4l2_subdev_format *fmt)
1505 fmt->format.width = IMX477_EMBEDDED_LINE_WIDTH;
1506 fmt->format.height = IMX477_NUM_EMBEDDED_LINES;
1507 fmt->format.code = MEDIA_BUS_FMT_SENSOR_DATA;
1508 fmt->format.field = V4L2_FIELD_NONE;
1511 static int imx477_get_pad_format(struct v4l2_subdev *sd,
1512 struct v4l2_subdev_state *sd_state,
1513 struct v4l2_subdev_format *fmt)
1515 struct imx477 *imx477 = to_imx477(sd);
1517 if (fmt->pad >= NUM_PADS)
1520 mutex_lock(&imx477->mutex);
1522 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1523 struct v4l2_mbus_framefmt *try_fmt =
1524 v4l2_subdev_get_try_format(&imx477->sd, sd_state,
1526 /* update the code which could change due to vflip or hflip: */
1527 try_fmt->code = fmt->pad == IMAGE_PAD ?
1528 imx477_get_format_code(imx477, try_fmt->code) :
1529 MEDIA_BUS_FMT_SENSOR_DATA;
1530 fmt->format = *try_fmt;
1532 if (fmt->pad == IMAGE_PAD) {
1533 imx477_update_image_pad_format(imx477, imx477->mode,
1536 imx477_get_format_code(imx477, imx477->fmt_code);
1538 imx477_update_metadata_pad_format(fmt);
1542 mutex_unlock(&imx477->mutex);
1547 unsigned int imx477_get_frame_length(const struct imx477_mode *mode,
1548 const struct v4l2_fract *timeperframe)
1552 frame_length = (u64)timeperframe->numerator * IMX477_PIXEL_RATE;
1553 do_div(frame_length,
1554 (u64)timeperframe->denominator * mode->line_length_pix);
1556 if (WARN_ON(frame_length > IMX477_FRAME_LENGTH_MAX))
1557 frame_length = IMX477_FRAME_LENGTH_MAX;
1559 return max_t(unsigned int, frame_length, mode->height);
1562 static void imx477_set_framing_limits(struct imx477 *imx477)
1564 unsigned int frm_length_min, frm_length_default, hblank;
1565 const struct imx477_mode *mode = imx477->mode;
1567 frm_length_min = imx477_get_frame_length(mode, &mode->timeperframe_min);
1568 frm_length_default =
1569 imx477_get_frame_length(mode, &mode->timeperframe_default);
1571 /* Default to no long exposure multiplier. */
1572 imx477->long_exp_shift = 0;
1574 /* Update limits and set FPS to default */
1575 __v4l2_ctrl_modify_range(imx477->vblank, frm_length_min - mode->height,
1576 ((1 << IMX477_LONG_EXP_SHIFT_MAX) *
1577 IMX477_FRAME_LENGTH_MAX) - mode->height,
1578 1, frm_length_default - mode->height);
1580 /* Setting this will adjust the exposure limits as well. */
1581 __v4l2_ctrl_s_ctrl(imx477->vblank, frm_length_default - mode->height);
1584 * Currently PPL is fixed to the mode specified value, so hblank
1585 * depends on mode->width only, and is not changeable in any
1586 * way other than changing the mode.
1588 hblank = mode->line_length_pix - mode->width;
1589 __v4l2_ctrl_modify_range(imx477->hblank, hblank, hblank, 1, hblank);
1592 static int imx477_set_pad_format(struct v4l2_subdev *sd,
1593 struct v4l2_subdev_state *sd_state,
1594 struct v4l2_subdev_format *fmt)
1596 struct v4l2_mbus_framefmt *framefmt;
1597 const struct imx477_mode *mode;
1598 struct imx477 *imx477 = to_imx477(sd);
1600 if (fmt->pad >= NUM_PADS)
1603 mutex_lock(&imx477->mutex);
1605 if (fmt->pad == IMAGE_PAD) {
1606 const struct imx477_mode *mode_list;
1607 unsigned int num_modes;
1609 /* Bayer order varies with flips */
1610 fmt->format.code = imx477_get_format_code(imx477,
1613 get_mode_table(fmt->format.code, &mode_list, &num_modes);
1615 mode = v4l2_find_nearest_size(mode_list,
1619 fmt->format.height);
1620 imx477_update_image_pad_format(imx477, mode, fmt);
1621 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1622 framefmt = v4l2_subdev_get_try_format(sd, sd_state,
1624 *framefmt = fmt->format;
1626 imx477->mode = mode;
1627 imx477->fmt_code = fmt->format.code;
1628 imx477_set_framing_limits(imx477);
1631 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1632 framefmt = v4l2_subdev_get_try_format(sd, sd_state,
1634 *framefmt = fmt->format;
1636 /* Only one embedded data mode is supported */
1637 imx477_update_metadata_pad_format(fmt);
1641 mutex_unlock(&imx477->mutex);
1646 static const struct v4l2_rect *
1647 __imx477_get_pad_crop(struct imx477 *imx477,
1648 struct v4l2_subdev_state *sd_state,
1649 unsigned int pad, enum v4l2_subdev_format_whence which)
1652 case V4L2_SUBDEV_FORMAT_TRY:
1653 return v4l2_subdev_get_try_crop(&imx477->sd, sd_state, pad);
1654 case V4L2_SUBDEV_FORMAT_ACTIVE:
1655 return &imx477->mode->crop;
1661 static int imx477_get_selection(struct v4l2_subdev *sd,
1662 struct v4l2_subdev_state *sd_state,
1663 struct v4l2_subdev_selection *sel)
1665 switch (sel->target) {
1666 case V4L2_SEL_TGT_CROP: {
1667 struct imx477 *imx477 = to_imx477(sd);
1669 mutex_lock(&imx477->mutex);
1670 sel->r = *__imx477_get_pad_crop(imx477, sd_state, sel->pad,
1672 mutex_unlock(&imx477->mutex);
1677 case V4L2_SEL_TGT_NATIVE_SIZE:
1680 sel->r.width = IMX477_NATIVE_WIDTH;
1681 sel->r.height = IMX477_NATIVE_HEIGHT;
1685 case V4L2_SEL_TGT_CROP_DEFAULT:
1686 case V4L2_SEL_TGT_CROP_BOUNDS:
1687 sel->r.left = IMX477_PIXEL_ARRAY_LEFT;
1688 sel->r.top = IMX477_PIXEL_ARRAY_TOP;
1689 sel->r.width = IMX477_PIXEL_ARRAY_WIDTH;
1690 sel->r.height = IMX477_PIXEL_ARRAY_HEIGHT;
1698 /* Start streaming */
1699 static int imx477_start_streaming(struct imx477 *imx477)
1701 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1702 const struct imx477_reg_list *reg_list;
1703 const struct imx477_reg_list *extra_regs;
1706 if (!imx477->common_regs_written) {
1707 ret = imx477_write_regs(imx477, mode_common_regs,
1708 ARRAY_SIZE(mode_common_regs));
1710 extra_regs = &imx477->compatible_data->extra_regs;
1711 ret = imx477_write_regs(imx477, extra_regs->regs,
1712 extra_regs->num_of_regs);
1716 dev_err(&client->dev, "%s failed to set common settings\n",
1720 imx477->common_regs_written = true;
1723 /* Apply default values of current mode */
1724 reg_list = &imx477->mode->reg_list;
1725 ret = imx477_write_regs(imx477, reg_list->regs, reg_list->num_of_regs);
1727 dev_err(&client->dev, "%s failed to set mode\n", __func__);
1731 /* Set on-sensor DPC. */
1732 imx477_write_reg(imx477, 0x0b05, IMX477_REG_VALUE_08BIT, !!dpc_enable);
1733 imx477_write_reg(imx477, 0x0b06, IMX477_REG_VALUE_08BIT, !!dpc_enable);
1735 /* Set vsync trigger mode */
1736 if (trigger_mode != 0) {
1737 /* trigger_mode == 1 for source, 2 for sink */
1738 const u32 val = (trigger_mode == 1) ? 1 : 0;
1740 imx477_write_reg(imx477, IMX477_REG_MC_MODE,
1741 IMX477_REG_VALUE_08BIT, 1);
1742 imx477_write_reg(imx477, IMX477_REG_MS_SEL,
1743 IMX477_REG_VALUE_08BIT, val);
1744 imx477_write_reg(imx477, IMX477_REG_XVS_IO_CTRL,
1745 IMX477_REG_VALUE_08BIT, val);
1746 imx477_write_reg(imx477, IMX477_REG_EXTOUT_EN,
1747 IMX477_REG_VALUE_08BIT, val);
1750 /* Apply customized values from user */
1751 ret = __v4l2_ctrl_handler_setup(imx477->sd.ctrl_handler);
1755 /* set stream on register */
1756 return imx477_write_reg(imx477, IMX477_REG_MODE_SELECT,
1757 IMX477_REG_VALUE_08BIT, IMX477_MODE_STREAMING);
1760 /* Stop streaming */
1761 static void imx477_stop_streaming(struct imx477 *imx477)
1763 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1766 /* set stream off register */
1767 ret = imx477_write_reg(imx477, IMX477_REG_MODE_SELECT,
1768 IMX477_REG_VALUE_08BIT, IMX477_MODE_STANDBY);
1770 dev_err(&client->dev, "%s failed to set stream\n", __func__);
1773 static int imx477_set_stream(struct v4l2_subdev *sd, int enable)
1775 struct imx477 *imx477 = to_imx477(sd);
1776 struct i2c_client *client = v4l2_get_subdevdata(sd);
1779 mutex_lock(&imx477->mutex);
1780 if (imx477->streaming == enable) {
1781 mutex_unlock(&imx477->mutex);
1786 ret = pm_runtime_get_sync(&client->dev);
1788 pm_runtime_put_noidle(&client->dev);
1793 * Apply default & customized values
1794 * and then start streaming.
1796 ret = imx477_start_streaming(imx477);
1800 imx477_stop_streaming(imx477);
1801 pm_runtime_put(&client->dev);
1804 imx477->streaming = enable;
1806 /* vflip and hflip cannot change during streaming */
1807 __v4l2_ctrl_grab(imx477->vflip, enable);
1808 __v4l2_ctrl_grab(imx477->hflip, enable);
1810 mutex_unlock(&imx477->mutex);
1815 pm_runtime_put(&client->dev);
1817 mutex_unlock(&imx477->mutex);
1822 /* Power/clock management functions */
1823 static int imx477_power_on(struct device *dev)
1825 struct i2c_client *client = to_i2c_client(dev);
1826 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1827 struct imx477 *imx477 = to_imx477(sd);
1830 ret = regulator_bulk_enable(IMX477_NUM_SUPPLIES,
1833 dev_err(&client->dev, "%s: failed to enable regulators\n",
1838 ret = clk_prepare_enable(imx477->xclk);
1840 dev_err(&client->dev, "%s: failed to enable clock\n",
1845 gpiod_set_value_cansleep(imx477->reset_gpio, 1);
1846 usleep_range(IMX477_XCLR_MIN_DELAY_US,
1847 IMX477_XCLR_MIN_DELAY_US + IMX477_XCLR_DELAY_RANGE_US);
1852 regulator_bulk_disable(IMX477_NUM_SUPPLIES, imx477->supplies);
1856 static int imx477_power_off(struct device *dev)
1858 struct i2c_client *client = to_i2c_client(dev);
1859 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1860 struct imx477 *imx477 = to_imx477(sd);
1862 gpiod_set_value_cansleep(imx477->reset_gpio, 0);
1863 regulator_bulk_disable(IMX477_NUM_SUPPLIES, imx477->supplies);
1864 clk_disable_unprepare(imx477->xclk);
1866 /* Force reprogramming of the common registers when powered up again. */
1867 imx477->common_regs_written = false;
1872 static int __maybe_unused imx477_suspend(struct device *dev)
1874 struct i2c_client *client = to_i2c_client(dev);
1875 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1876 struct imx477 *imx477 = to_imx477(sd);
1878 if (imx477->streaming)
1879 imx477_stop_streaming(imx477);
1884 static int __maybe_unused imx477_resume(struct device *dev)
1886 struct i2c_client *client = to_i2c_client(dev);
1887 struct v4l2_subdev *sd = i2c_get_clientdata(client);
1888 struct imx477 *imx477 = to_imx477(sd);
1891 if (imx477->streaming) {
1892 ret = imx477_start_streaming(imx477);
1900 imx477_stop_streaming(imx477);
1901 imx477->streaming = 0;
1905 static int imx477_get_regulators(struct imx477 *imx477)
1907 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1910 for (i = 0; i < IMX477_NUM_SUPPLIES; i++)
1911 imx477->supplies[i].supply = imx477_supply_name[i];
1913 return devm_regulator_bulk_get(&client->dev,
1914 IMX477_NUM_SUPPLIES,
1918 /* Verify chip ID */
1919 static int imx477_identify_module(struct imx477 *imx477, u32 expected_id)
1921 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1925 ret = imx477_read_reg(imx477, IMX477_REG_CHIP_ID,
1926 IMX477_REG_VALUE_16BIT, &val);
1928 dev_err(&client->dev, "failed to read chip id %x, with error %d\n",
1933 if (val != expected_id) {
1934 dev_err(&client->dev, "chip id mismatch: %x!=%x\n",
1939 dev_info(&client->dev, "Device found is imx%x\n", val);
1944 static const struct v4l2_subdev_core_ops imx477_core_ops = {
1945 .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
1946 .unsubscribe_event = v4l2_event_subdev_unsubscribe,
1949 static const struct v4l2_subdev_video_ops imx477_video_ops = {
1950 .s_stream = imx477_set_stream,
1953 static const struct v4l2_subdev_pad_ops imx477_pad_ops = {
1954 .enum_mbus_code = imx477_enum_mbus_code,
1955 .get_fmt = imx477_get_pad_format,
1956 .set_fmt = imx477_set_pad_format,
1957 .get_selection = imx477_get_selection,
1958 .enum_frame_size = imx477_enum_frame_size,
1961 static const struct v4l2_subdev_ops imx477_subdev_ops = {
1962 .core = &imx477_core_ops,
1963 .video = &imx477_video_ops,
1964 .pad = &imx477_pad_ops,
1967 static const struct v4l2_subdev_internal_ops imx477_internal_ops = {
1968 .open = imx477_open,
1971 /* Initialize control handlers */
1972 static int imx477_init_controls(struct imx477 *imx477)
1974 struct v4l2_ctrl_handler *ctrl_hdlr;
1975 struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
1976 struct v4l2_fwnode_device_properties props;
1980 ctrl_hdlr = &imx477->ctrl_handler;
1981 ret = v4l2_ctrl_handler_init(ctrl_hdlr, 16);
1985 mutex_init(&imx477->mutex);
1986 ctrl_hdlr->lock = &imx477->mutex;
1988 /* By default, PIXEL_RATE is read only */
1989 imx477->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops,
1990 V4L2_CID_PIXEL_RATE,
1992 IMX477_PIXEL_RATE, 1,
1996 * Create the controls here, but mode specific limits are setup
1997 * in the imx477_set_framing_limits() call below.
1999 imx477->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops,
2000 V4L2_CID_VBLANK, 0, 0xffff, 1, 0);
2001 imx477->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops,
2002 V4L2_CID_HBLANK, 0, 0xffff, 1, 0);
2004 /* HBLANK is read-only for now, but does change with mode. */
2006 imx477->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2008 imx477->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops,
2010 IMX477_EXPOSURE_MIN,
2011 IMX477_EXPOSURE_MAX,
2012 IMX477_EXPOSURE_STEP,
2013 IMX477_EXPOSURE_DEFAULT);
2015 v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
2016 IMX477_ANA_GAIN_MIN, IMX477_ANA_GAIN_MAX,
2017 IMX477_ANA_GAIN_STEP, IMX477_ANA_GAIN_DEFAULT);
2019 v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
2020 IMX477_DGTL_GAIN_MIN, IMX477_DGTL_GAIN_MAX,
2021 IMX477_DGTL_GAIN_STEP, IMX477_DGTL_GAIN_DEFAULT);
2023 imx477->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops,
2024 V4L2_CID_HFLIP, 0, 1, 1, 0);
2026 imx477->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
2028 imx477->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops,
2029 V4L2_CID_VFLIP, 0, 1, 1, 0);
2031 imx477->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
2033 v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx477_ctrl_ops,
2034 V4L2_CID_TEST_PATTERN,
2035 ARRAY_SIZE(imx477_test_pattern_menu) - 1,
2036 0, 0, imx477_test_pattern_menu);
2037 for (i = 0; i < 4; i++) {
2039 * The assumption is that
2040 * V4L2_CID_TEST_PATTERN_GREENR == V4L2_CID_TEST_PATTERN_RED + 1
2041 * V4L2_CID_TEST_PATTERN_BLUE == V4L2_CID_TEST_PATTERN_RED + 2
2042 * V4L2_CID_TEST_PATTERN_GREENB == V4L2_CID_TEST_PATTERN_RED + 3
2044 v4l2_ctrl_new_std(ctrl_hdlr, &imx477_ctrl_ops,
2045 V4L2_CID_TEST_PATTERN_RED + i,
2046 IMX477_TEST_PATTERN_COLOUR_MIN,
2047 IMX477_TEST_PATTERN_COLOUR_MAX,
2048 IMX477_TEST_PATTERN_COLOUR_STEP,
2049 IMX477_TEST_PATTERN_COLOUR_MAX);
2050 /* The "Solid color" pattern is white by default */
2053 if (ctrl_hdlr->error) {
2054 ret = ctrl_hdlr->error;
2055 dev_err(&client->dev, "%s control init failed (%d)\n",
2060 ret = v4l2_fwnode_device_parse(&client->dev, &props);
2064 ret = v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &imx477_ctrl_ops,
2069 imx477->sd.ctrl_handler = ctrl_hdlr;
2071 /* Setup exposure and frame/line length limits. */
2072 imx477_set_framing_limits(imx477);
2077 v4l2_ctrl_handler_free(ctrl_hdlr);
2078 mutex_destroy(&imx477->mutex);
2083 static void imx477_free_controls(struct imx477 *imx477)
2085 v4l2_ctrl_handler_free(imx477->sd.ctrl_handler);
2086 mutex_destroy(&imx477->mutex);
2089 static int imx477_check_hwcfg(struct device *dev)
2091 struct fwnode_handle *endpoint;
2092 struct v4l2_fwnode_endpoint ep_cfg = {
2093 .bus_type = V4L2_MBUS_CSI2_DPHY
2097 endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
2099 dev_err(dev, "endpoint node not found\n");
2103 if (v4l2_fwnode_endpoint_alloc_parse(endpoint, &ep_cfg)) {
2104 dev_err(dev, "could not parse endpoint\n");
2108 /* Check the number of MIPI CSI2 data lanes */
2109 if (ep_cfg.bus.mipi_csi2.num_data_lanes != 2) {
2110 dev_err(dev, "only 2 data lanes are currently supported\n");
2114 /* Check the link frequency set in device tree */
2115 if (!ep_cfg.nr_of_link_frequencies) {
2116 dev_err(dev, "link-frequency property not found in DT\n");
2120 if (ep_cfg.nr_of_link_frequencies != 1 ||
2121 ep_cfg.link_frequencies[0] != IMX477_DEFAULT_LINK_FREQ) {
2122 dev_err(dev, "Link frequency not supported: %lld\n",
2123 ep_cfg.link_frequencies[0]);
2130 v4l2_fwnode_endpoint_free(&ep_cfg);
2131 fwnode_handle_put(endpoint);
2136 static const struct imx477_compatible_data imx477_compatible = {
2137 .chip_id = IMX477_CHIP_ID,
2144 static const struct imx477_reg imx378_regs[] = {
2150 static const struct imx477_compatible_data imx378_compatible = {
2151 .chip_id = IMX378_CHIP_ID,
2153 .num_of_regs = ARRAY_SIZE(imx378_regs),
2158 static const struct of_device_id imx477_dt_ids[] = {
2159 { .compatible = "sony,imx477", .data = &imx477_compatible },
2160 { .compatible = "sony,imx378", .data = &imx378_compatible },
2164 static int imx477_probe(struct i2c_client *client)
2166 struct device *dev = &client->dev;
2167 struct imx477 *imx477;
2168 const struct of_device_id *match;
2171 imx477 = devm_kzalloc(&client->dev, sizeof(*imx477), GFP_KERNEL);
2175 v4l2_i2c_subdev_init(&imx477->sd, client, &imx477_subdev_ops);
2177 match = of_match_device(imx477_dt_ids, dev);
2180 imx477->compatible_data =
2181 (const struct imx477_compatible_data *)match->data;
2183 /* Check the hardware configuration in device tree */
2184 if (imx477_check_hwcfg(dev))
2187 /* Get system clock (xclk) */
2188 imx477->xclk = devm_clk_get(dev, NULL);
2189 if (IS_ERR(imx477->xclk)) {
2190 dev_err(dev, "failed to get xclk\n");
2191 return PTR_ERR(imx477->xclk);
2194 imx477->xclk_freq = clk_get_rate(imx477->xclk);
2195 if (imx477->xclk_freq != IMX477_XCLK_FREQ) {
2196 dev_err(dev, "xclk frequency not supported: %d Hz\n",
2201 ret = imx477_get_regulators(imx477);
2203 dev_err(dev, "failed to get regulators\n");
2207 /* Request optional enable pin */
2208 imx477->reset_gpio = devm_gpiod_get_optional(dev, "reset",
2212 * The sensor must be powered for imx477_identify_module()
2213 * to be able to read the CHIP_ID register
2215 ret = imx477_power_on(dev);
2219 ret = imx477_identify_module(imx477, imx477->compatible_data->chip_id);
2221 goto error_power_off;
2223 /* Initialize default format */
2224 imx477_set_default_format(imx477);
2226 /* Enable runtime PM and turn off the device */
2227 pm_runtime_set_active(dev);
2228 pm_runtime_enable(dev);
2229 pm_runtime_idle(dev);
2231 /* This needs the pm runtime to be registered. */
2232 ret = imx477_init_controls(imx477);
2234 goto error_power_off;
2236 /* Initialize subdev */
2237 imx477->sd.internal_ops = &imx477_internal_ops;
2238 imx477->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
2239 V4L2_SUBDEV_FL_HAS_EVENTS;
2240 imx477->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
2242 /* Initialize source pads */
2243 imx477->pad[IMAGE_PAD].flags = MEDIA_PAD_FL_SOURCE;
2244 imx477->pad[METADATA_PAD].flags = MEDIA_PAD_FL_SOURCE;
2246 ret = media_entity_pads_init(&imx477->sd.entity, NUM_PADS, imx477->pad);
2248 dev_err(dev, "failed to init entity pads: %d\n", ret);
2249 goto error_handler_free;
2252 ret = v4l2_async_register_subdev_sensor(&imx477->sd);
2254 dev_err(dev, "failed to register sensor sub-device: %d\n", ret);
2255 goto error_media_entity;
2261 media_entity_cleanup(&imx477->sd.entity);
2264 imx477_free_controls(imx477);
2267 pm_runtime_disable(&client->dev);
2268 pm_runtime_set_suspended(&client->dev);
2269 imx477_power_off(&client->dev);
2274 static int imx477_remove(struct i2c_client *client)
2276 struct v4l2_subdev *sd = i2c_get_clientdata(client);
2277 struct imx477 *imx477 = to_imx477(sd);
2279 v4l2_async_unregister_subdev(sd);
2280 media_entity_cleanup(&sd->entity);
2281 imx477_free_controls(imx477);
2283 pm_runtime_disable(&client->dev);
2284 if (!pm_runtime_status_suspended(&client->dev))
2285 imx477_power_off(&client->dev);
2286 pm_runtime_set_suspended(&client->dev);
2291 MODULE_DEVICE_TABLE(of, imx477_dt_ids);
2293 static const struct dev_pm_ops imx477_pm_ops = {
2294 SET_SYSTEM_SLEEP_PM_OPS(imx477_suspend, imx477_resume)
2295 SET_RUNTIME_PM_OPS(imx477_power_off, imx477_power_on, NULL)
2298 static struct i2c_driver imx477_i2c_driver = {
2301 .of_match_table = imx477_dt_ids,
2302 .pm = &imx477_pm_ops,
2304 .probe_new = imx477_probe,
2305 .remove = imx477_remove,
2308 module_i2c_driver(imx477_i2c_driver);
2310 MODULE_AUTHOR("Naushir Patuck <naush@raspberrypi.com>");
2311 MODULE_DESCRIPTION("Sony IMX477 sensor driver");
2312 MODULE_LICENSE("GPL v2");