--- a/drivers/media/i2c/imx219.c
+++ b/drivers/media/i2c/imx219.c
-@@ -153,6 +153,9 @@ struct imx219_mode {
+@@ -162,6 +162,9 @@ struct imx219_mode {
- /* Default register values */
- struct imx219_reg_list reg_list;
+ /* 2x2 binning is used */
+ bool binning;
+
+ /* Relative pixel clock rate factor for the mode. */
+ unsigned int rate_factor;
};
- /*
-@@ -495,6 +498,7 @@ static const struct imx219_mode supporte
- .num_of_regs = ARRAY_SIZE(mode_3280x2464_regs),
+ static const struct imx219_reg imx219_common_regs[] = {
+@@ -402,6 +405,7 @@ static const struct imx219_mode supporte
.regs = mode_3280x2464_regs,
},
+ .binning = false,
+ .rate_factor = 1,
},
{
/* 1080P 30fps cropped */
-@@ -511,6 +515,7 @@ static const struct imx219_mode supporte
- .num_of_regs = ARRAY_SIZE(mode_1920_1080_regs),
+@@ -419,6 +423,7 @@ static const struct imx219_mode supporte
.regs = mode_1920_1080_regs,
},
+ .binning = false,
+ .rate_factor = 1,
},
{
/* 2x2 binned 30fps mode */
-@@ -527,6 +532,7 @@ static const struct imx219_mode supporte
- .num_of_regs = ARRAY_SIZE(mode_1640_1232_regs),
+@@ -436,6 +441,7 @@ static const struct imx219_mode supporte
.regs = mode_1640_1232_regs,
},
+ .binning = true,
+ .rate_factor = 1,
},
{
/* 640x480 30fps mode */
-@@ -543,6 +549,11 @@ static const struct imx219_mode supporte
- .num_of_regs = ARRAY_SIZE(mode_640_480_regs),
+@@ -453,6 +459,11 @@ static const struct imx219_mode supporte
.regs = mode_640_480_regs,
},
+ .binning = true,
+ /*
-+ * This mode uses a special 2x2 binning that doubles the
-+ * the internal pixel clock rate.
-+ */
++ * This mode uses a special 2x2 binning that doubles the
++ * the internal pixel clock rate.
++ */
+ .rate_factor = 2,
},
};
-@@ -765,7 +776,8 @@ static int imx219_set_ctrl(struct v4l2_c
+@@ -675,7 +686,8 @@ static int imx219_set_ctrl(struct v4l2_c
break;
case V4L2_CID_EXPOSURE:
ret = imx219_write_reg(imx219, IMX219_REG_EXPOSURE,
break;
case V4L2_CID_DIGITAL_GAIN:
ret = imx219_write_reg(imx219, IMX219_REG_DIGITAL_GAIN,
-@@ -785,7 +797,8 @@ static int imx219_set_ctrl(struct v4l2_c
+@@ -695,7 +707,8 @@ static int imx219_set_ctrl(struct v4l2_c
case V4L2_CID_VBLANK:
ret = imx219_write_reg(imx219, IMX219_REG_VTS,
IMX219_REG_VALUE_16BIT,
break;
case V4L2_CID_TEST_PATTERN_RED:
ret = imx219_write_reg(imx219, IMX219_REG_TESTP_RED,
-@@ -957,7 +970,7 @@ static int imx219_set_pad_format(struct
+@@ -867,7 +880,7 @@ static int imx219_set_pad_format(struct
struct imx219 *imx219 = to_imx219(sd);
const struct imx219_mode *mode;
struct v4l2_mbus_framefmt *framefmt;
unsigned int i;
if (fmt->pad >= NUM_PADS)
-@@ -1018,6 +1031,12 @@ static int imx219_set_pad_format(struct
+@@ -928,6 +941,12 @@ static int imx219_set_pad_format(struct
hblank = IMX219_PPL_DEFAULT - mode->width;
__v4l2_ctrl_modify_range(imx219->hblank, hblank, hblank,
1, hblank);
}
} else {
if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
-@@ -1362,7 +1381,7 @@ static int imx219_init_controls(struct i
+@@ -1315,7 +1334,7 @@ static int imx219_init_controls(struct i
struct v4l2_ctrl_handler *ctrl_hdlr;
unsigned int height = imx219->mode->height;
struct v4l2_fwnode_device_properties props;
int i, ret;
ctrl_hdlr = &imx219->ctrl_handler;
-@@ -1374,11 +1393,11 @@ static int imx219_init_controls(struct i
+@@ -1327,11 +1346,11 @@ static int imx219_init_controls(struct i
ctrl_hdlr->lock = &imx219->mutex;
/* By default, PIXEL_RATE is read only */