kernel: bump 5.4 to 5.4.48
[oweals/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0674-media-bcm2835-unicam-Re-fetch-mbus-code-from-subdev-.patch
1 From 53d7c93a14d1e0804a96e3a21f472ba5ff033b14 Mon Sep 17 00:00:00 2001
2 From: Naushir Patuck <naush@raspberrypi.com>
3 Date: Tue, 21 Apr 2020 16:26:03 +0100
4 Subject: [PATCH] media: bcm2835-unicam: Re-fetch mbus code from subdev
5  on a g_fmt call
6
7 The sensor subdevice may change the Bayer order if a H/V flip is
8 requested after a s_fmt call.  Unicam g_fmt must call the subdev get_fmt
9 in case this has happened and return out the correct format 4cc.
10
11 Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
12 ---
13  .../media/platform/bcm2835/bcm2835-unicam.c   | 21 ++++++++++++++++++-
14  1 file changed, 20 insertions(+), 1 deletion(-)
15
16 --- a/drivers/media/platform/bcm2835/bcm2835-unicam.c
17 +++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c
18 @@ -967,11 +967,30 @@ static int unicam_enum_fmt_vid_cap(struc
19  static int unicam_g_fmt_vid_cap(struct file *file, void *priv,
20                                 struct v4l2_format *f)
21  {
22 +       struct v4l2_mbus_framefmt mbus_fmt = {0};
23         struct unicam_node *node = video_drvdata(file);
24 +       struct unicam_device *dev = node->dev;
25 +       const struct unicam_fmt *fmt = NULL;
26 +       int ret;
27  
28 -       if (node->pad_id == METADATA_PAD)
29 +       if (node->pad_id != IMAGE_PAD)
30                 return -EINVAL;
31  
32 +       /*
33 +        * If a flip has occurred in the sensor, the fmt code might have
34 +        * changed. So we will need to re-fetch the format from the subdevice.
35 +        */
36 +       ret = __subdev_get_format(dev, &mbus_fmt, node->pad_id);
37 +       if (ret)
38 +               return -EINVAL;
39 +
40 +       /* Find the V4L2 format from mbus code. We must match a known format. */
41 +       fmt = find_format_by_code(mbus_fmt.code);
42 +       if (!fmt)
43 +               return -EINVAL;
44 +
45 +       node->fmt = fmt;
46 +       node->v_fmt.fmt.pix.pixelformat = fmt->fourcc;
47         *f = node->v_fmt;
48  
49         return 0;