summaryrefslogtreecommitdiff
path: root/drivers/media/v4l2-core/v4l2-ioctl.c
diff options
context:
space:
mode:
authorRicardo Ribalda <ribalda@chromium.org>2025-02-23 18:58:04 +0000
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2025-03-05 10:43:24 +0100
commit46108b41aeb5ac36da3ab613f9ab1b355f196a88 (patch)
tree8c9b2ad4f9c250995e508a01500c3ae816eeafb4 /drivers/media/v4l2-core/v4l2-ioctl.c
parenta79efc44b51432490538a55b9753a721f7d3ea42 (diff)
media: ioctl: Simulate v4l2_queryctrl with v4l2_query_ext_ctrl
v4l2_queryctrl is a subset of v4l2_query_ext_ctrl. If the driver does not implement v4l2_queryctrl we can implement it with v4l2_query_ext_ctrl. Suggested-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index bfdba96e938c..84bb36813cf2 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -2286,9 +2286,11 @@ static int v4l_queryctrl(const struct v4l2_ioctl_ops *ops,
struct file *file, void *fh, void *arg)
{
struct video_device *vfd = video_devdata(file);
+ struct v4l2_query_ext_ctrl qec = {};
struct v4l2_queryctrl *p = arg;
struct v4l2_fh *vfh =
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
+ int ret;
if (vfh && vfh->ctrl_handler)
return v4l2_queryctrl(vfh->ctrl_handler, p);
@@ -2296,7 +2298,40 @@ static int v4l_queryctrl(const struct v4l2_ioctl_ops *ops,
return v4l2_queryctrl(vfd->ctrl_handler, p);
if (ops->vidioc_queryctrl)
return ops->vidioc_queryctrl(file, fh, p);
- return -ENOTTY;
+ if (!ops->vidioc_query_ext_ctrl)
+ return -ENOTTY;
+
+ /* Simulate query_ext_ctr using query_ctrl. */
+ qec.id = p->id;
+ ret = ops->vidioc_query_ext_ctrl(file, fh, &qec);
+ if (ret)
+ return ret;
+
+ p->id = qec.id;
+ p->type = qec.type;
+ p->flags = qec.flags;
+ strscpy(p->name, qec.name, sizeof(p->name));
+ switch (p->type) {
+ case V4L2_CTRL_TYPE_INTEGER:
+ case V4L2_CTRL_TYPE_BOOLEAN:
+ case V4L2_CTRL_TYPE_MENU:
+ case V4L2_CTRL_TYPE_INTEGER_MENU:
+ case V4L2_CTRL_TYPE_STRING:
+ case V4L2_CTRL_TYPE_BITMASK:
+ p->minimum = qec.minimum;
+ p->maximum = qec.maximum;
+ p->step = qec.step;
+ p->default_value = qec.default_value;
+ break;
+ default:
+ p->minimum = 0;
+ p->maximum = 0;
+ p->step = 0;
+ p->default_value = 0;
+ break;
+ }
+
+ return 0;
}
static int v4l_query_ext_ctrl(const struct v4l2_ioctl_ops *ops,