kernel: bump 5.4 to 5.4.48
[oweals/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0693-media-bcm2835-unicam-Add-support-for-VIDIOC_-S-G-_SE.patch
1 From 40aaca6ed160e67e518c512908cf49efb4cbed8b Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dave.stevenson@raspberrypi.com>
3 Date: Wed, 29 Apr 2020 16:45:02 +0100
4 Subject: [PATCH] media: bcm2835-unicam: Add support for
5  VIDIOC_[S|G]_SELECTION
6
7 Sensors are now reflecting cropping and scaling parameters through
8 the selection API, therefore Unicam needs to forward the requests
9 through to the subdev.
10
11 Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
12 ---
13  .../media/platform/bcm2835/bcm2835-unicam.c   | 44 +++++++++++++++++++
14  1 file changed, 44 insertions(+)
15
16 --- a/drivers/media/platform/bcm2835/bcm2835-unicam.c
17 +++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c
18 @@ -1898,6 +1898,39 @@ static int unicam_g_edid(struct file *fi
19         return v4l2_subdev_call(dev->sensor, pad, get_edid, edid);
20  }
21  
22 +static int unicam_s_selection(struct file *file, void *priv,
23 +                             struct v4l2_selection *sel)
24 +{
25 +       struct unicam_node *node = video_drvdata(file);
26 +       struct unicam_device *dev = node->dev;
27 +       struct v4l2_subdev_selection sdsel = {
28 +               .which = V4L2_SUBDEV_FORMAT_ACTIVE,
29 +               .target = sel->target,
30 +               .flags = sel->flags,
31 +               .r = sel->r,
32 +       };
33 +
34 +       return v4l2_subdev_call(dev->sensor, pad, set_selection, NULL, &sdsel);
35 +}
36 +
37 +static int unicam_g_selection(struct file *file, void *priv,
38 +                             struct v4l2_selection *sel)
39 +{
40 +       struct unicam_node *node = video_drvdata(file);
41 +       struct unicam_device *dev = node->dev;
42 +       struct v4l2_subdev_selection sdsel = {
43 +               .which = V4L2_SUBDEV_FORMAT_ACTIVE,
44 +               .target = sel->target,
45 +       };
46 +       int ret;
47 +
48 +       ret = v4l2_subdev_call(dev->sensor, pad, get_selection, NULL, &sdsel);
49 +       if (!ret)
50 +               sel->r = sdsel.r;
51 +
52 +       return ret;
53 +}
54 +
55  static int unicam_enum_framesizes(struct file *file, void *priv,
56                                   struct v4l2_frmsizeenum *fsize)
57  {
58 @@ -2218,6 +2251,9 @@ static const struct v4l2_ioctl_ops unica
59         .vidioc_enum_framesizes         = unicam_enum_framesizes,
60         .vidioc_enum_frameintervals     = unicam_enum_frameintervals,
61  
62 +       .vidioc_g_selection             = unicam_g_selection,
63 +       .vidioc_s_selection             = unicam_s_selection,
64 +
65         .vidioc_g_parm                  = unicam_g_parm,
66         .vidioc_s_parm                  = unicam_s_parm,
67  
68 @@ -2446,6 +2482,14 @@ static int register_node(struct unicam_d
69             !v4l2_subdev_has_op(unicam->sensor, pad, enum_frame_size))
70                 v4l2_disable_ioctl(&node->video_dev, VIDIOC_ENUM_FRAMESIZES);
71  
72 +       if (node->pad_id == METADATA_PAD ||
73 +           !v4l2_subdev_has_op(unicam->sensor, pad, set_selection))
74 +               v4l2_disable_ioctl(&node->video_dev, VIDIOC_S_SELECTION);
75 +
76 +       if (node->pad_id == METADATA_PAD ||
77 +           !v4l2_subdev_has_op(unicam->sensor, pad, get_selection))
78 +               v4l2_disable_ioctl(&node->video_dev, VIDIOC_G_SELECTION);
79 +
80         ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
81         if (ret) {
82                 unicam_err(unicam, "Unable to register video device.\n");