aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0491-media-i2c-imx477-Remove-internal-v4l2_mbus_framefmt-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0491-media-i2c-imx477-Remove-internal-v4l2_mbus_framefmt-.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0491-media-i2c-imx477-Remove-internal-v4l2_mbus_framefmt-.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0491-media-i2c-imx477-Remove-internal-v4l2_mbus_framefmt-.patch b/target/linux/bcm27xx/patches-5.10/950-0491-media-i2c-imx477-Remove-internal-v4l2_mbus_framefmt-.patch
new file mode 100644
index 0000000000..5e15d6b4a3
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.10/950-0491-media-i2c-imx477-Remove-internal-v4l2_mbus_framefmt-.patch
@@ -0,0 +1,70 @@
+From 013bd52fb83d145e90b8678c004ae1b32854d7f7 Mon Sep 17 00:00:00 2001
+From: Naushir Patuck <naush@raspberrypi.com>
+Date: Fri, 19 Feb 2021 10:30:49 +0000
+Subject: [PATCH] media: i2c: imx477: Remove internal
+ v4l2_mbus_framefmt from the state
+
+The only field in this struct that is used is the format code, so
+replace the struct with this single field.
+
+Save the format code in imx477_set_pad_format() when setting up a new
+mode so that imx477_get_pad_format() performs the right lookup.
+Otherwise, this caused a bug where the mode lookup occurred on the
+12-bit table rather than the 10-bit table.
+
+Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
+---
+ drivers/media/i2c/imx477.c | 19 ++++---------------
+ 1 file changed, 4 insertions(+), 15 deletions(-)
+
+--- a/drivers/media/i2c/imx477.c
++++ b/drivers/media/i2c/imx477.c
+@@ -1073,7 +1073,7 @@ struct imx477 {
+ struct v4l2_subdev sd;
+ struct media_pad pad[NUM_PADS];
+
+- struct v4l2_mbus_framefmt fmt;
++ unsigned int fmt_code;
+
+ struct clk *xclk;
+ u32 xclk_freq;
+@@ -1235,21 +1235,9 @@ static u32 imx477_get_format_code(struct
+
+ static void imx477_set_default_format(struct imx477 *imx477)
+ {
+- struct v4l2_mbus_framefmt *fmt = &imx477->fmt;
+-
+ /* Set default mode to max resolution */
+ imx477->mode = &supported_modes_12bit[0];
+-
+- fmt->code = MEDIA_BUS_FMT_SRGGB12_1X12;
+- fmt->colorspace = V4L2_COLORSPACE_SRGB;
+- fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
+- fmt->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true,
+- fmt->colorspace,
+- fmt->ycbcr_enc);
+- fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
+- fmt->width = imx477->mode->width;
+- fmt->height = imx477->mode->height;
+- fmt->field = V4L2_FIELD_NONE;
++ imx477->fmt_code = MEDIA_BUS_FMT_SRGGB12_1X12;
+ }
+
+ static int imx477_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+@@ -1520,7 +1508,7 @@ static int imx477_get_pad_format(struct
+ imx477_update_image_pad_format(imx477, imx477->mode,
+ fmt);
+ fmt->format.code =
+- imx477_get_format_code(imx477, imx477->fmt.code);
++ imx477_get_format_code(imx477, imx477->fmt_code);
+ } else {
+ imx477_update_metadata_pad_format(fmt);
+ }
+@@ -1611,6 +1599,7 @@ static int imx477_set_pad_format(struct
+ *framefmt = fmt->format;
+ } else {
+ imx477->mode = mode;
++ imx477->fmt_code = fmt->format.code;
+ imx477_set_framing_limits(imx477);
+ }
+ } else {