Now that all V4L2 drivers set device_caps in struct video_device, we can add
a check for this to ensure all future drivers fill this in.

Also verify that when the querycap ioctl is called the driver didn't mess
with the device_caps value and that capabilities is a superset of device_caps.

Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
---
diff --git a/drivers/media/v4l2-core/v4l2-dev.c 
b/drivers/media/v4l2-core/v4l2-dev.c
index cbb74f748555..3af72e3bbd65 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -859,6 +859,9 @@ int __video_register_device(struct video_device *vdev,
        /* the v4l2_dev pointer MUST be present */
        if (WARN_ON(!vdev->v4l2_dev))
                return -EINVAL;
+       /* the device_caps field MUST be set */
+       if (WARN_ON(!vdev->device_caps))
+               return -EINVAL;

        /* v4l2_fh support */
        spin_lock_init(&vdev->fh_lock);
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c 
b/drivers/media/v4l2-core/v4l2-ioctl.c
index e36629ae2203..61846c355627 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1057,14 +1057,18 @@ static int v4l_querycap(const struct v4l2_ioctl_ops 
*ops,

        ret = ops->vidioc_querycap(file, fh, cap);

-       cap->capabilities |= V4L2_CAP_EXT_PIX_FORMAT;
        /*
-        * Drivers MUST fill in device_caps, so check for this and
-        * warn if it was forgotten.
+        * Drivers must not change device_caps, so check for this and
+        * warn if this happened.
+        */
+       WARN_ON(cap->device_caps != vfd->device_caps);
+       /*
+        * Check that capabilities is a superset of
+        * vfd->device_caps | V4L2_CAP_DEVICE_CAPS
         */
-       WARN(!(cap->capabilities & V4L2_CAP_DEVICE_CAPS) ||
-               !cap->device_caps, "Bad caps for driver %s, %x %x",
-               cap->driver, cap->capabilities, cap->device_caps);
+       WARN_ON((cap->capabilities & (vfd->device_caps | V4L2_CAP_DEVICE_CAPS)) 
!=
+               (vfd->device_caps | V4L2_CAP_DEVICE_CAPS));
+       cap->capabilities |= V4L2_CAP_EXT_PIX_FORMAT;
        cap->device_caps |= V4L2_CAP_EXT_PIX_FORMAT;

        return ret;

Reply via email to