bcm27xx: update patches from RPi foundation
[openwrt/staging/luka.git] / target / linux / bcm27xx / patches-5.4 / 950-0751-media-bcm2835-unicam-Retain-packing-information-on-G.patch
diff --git a/target/linux/bcm27xx/patches-5.4/950-0751-media-bcm2835-unicam-Retain-packing-information-on-G.patch b/target/linux/bcm27xx/patches-5.4/950-0751-media-bcm2835-unicam-Retain-packing-information-on-G.patch
new file mode 100644 (file)
index 0000000..1e0051b
--- /dev/null
@@ -0,0 +1,48 @@
+From de4d7e44c08c2768de4b638af09072c80f1c3fa1 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Date: Tue, 19 May 2020 11:46:47 +0100
+Subject: [PATCH] media: bcm2835-unicam: Retain packing information on
+ G_FMT
+
+The change to retrieve the pixel format always on g_fmt didn't
+check whether the native or unpacked version of the format
+had been requested, and always returned the packed one.
+Correct this so that the packing setting is retained whereever
+possible.
+
+Fixes "9d59e89 media: bcm2835-unicam: Re-fetch mbus code from subdev
+on a g_fmt call"
+
+Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+---
+ .../media/platform/bcm2835/bcm2835-unicam.c   | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+--- a/drivers/media/platform/bcm2835/bcm2835-unicam.c
++++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c
+@@ -974,8 +974,23 @@ static int unicam_g_fmt_vid_cap(struct f
+       if (!fmt)
+               return -EINVAL;
+-      node->fmt = fmt;
+-      node->v_fmt.fmt.pix.pixelformat = fmt->fourcc;
++      if (node->fmt != fmt) {
++              /*
++               * The sensor format has changed so the pixelformat needs to
++               * be updated. Try and retain the packed/unpacked choice if
++               * at all possible.
++               */
++              if (node->fmt->repacked_fourcc ==
++                                              node->v_fmt.fmt.pix.pixelformat)
++                      /* Using the repacked format */
++                      node->v_fmt.fmt.pix.pixelformat = fmt->repacked_fourcc;
++              else
++                      /* Using the native format */
++                      node->v_fmt.fmt.pix.pixelformat = fmt->fourcc;
++
++              node->fmt = fmt;
++      }
++
+       *f = node->v_fmt;
+       return 0;