/* 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);
 
 
        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;