1 From c4b4c783173ae54db7f9f656b25b45f7719f068d 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
7 Sensors are now reflecting cropping and scaling parameters through
8 the selection API, therefore Unicam needs to forward the requests
11 Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
13 .../media/platform/bcm2835/bcm2835-unicam.c | 44 +++++++++++++++++++
14 1 file changed, 44 insertions(+)
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);
22 +static int unicam_s_selection(struct file *file, void *priv,
23 + struct v4l2_selection *sel)
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,
34 + return v4l2_subdev_call(dev->sensor, pad, set_selection, NULL, &sdsel);
37 +static int unicam_g_selection(struct file *file, void *priv,
38 + struct v4l2_selection *sel)
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,
48 + ret = v4l2_subdev_call(dev->sensor, pad, get_selection, NULL, &sdsel);
55 static int unicam_enum_framesizes(struct file *file, void *priv,
56 struct v4l2_frmsizeenum *fsize)
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,
62 + .vidioc_g_selection = unicam_g_selection,
63 + .vidioc_s_selection = unicam_s_selection,
65 .vidioc_g_parm = unicam_g_parm,
66 .vidioc_s_parm = unicam_s_parm,
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);
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);
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);
80 ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
82 unicam_err(unicam, "Unable to register video device.\n");