media: uvcvideo: Store device information pointer in struct uvc_device
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Fri, 17 Aug 2018 08:50:02 +0000 (04:50 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Tue, 11 Sep 2018 12:47:05 +0000 (08:47 -0400)
The device information structure is currently copied field by field in
the uvc_device structure. As we only have two fields at the moment this
isn't much of an issue, but it prevents easy addition of new info
fields.

Fix this by storing the uvc_device_info pointer in the uvc_device
structure. As a result the uvc_device meta_format field can be removed.
The quirks field, however, needs to stay as it can be modified through a
module parameter.

As not all device have an information structure, we declare a global
"NULL" info instance that is used as a fallback when the driver_info is
empty.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvc_metadata.c
drivers/media/usb/uvc/uvcvideo.h

index 371313a7366ba1dc3690b3776e7ba946e50bda70..9bc6027d04d0e8c42694da9bddb8ff7a766f5498 100644 (file)
@@ -2040,10 +2040,7 @@ static int uvc_register_chains(struct uvc_device *dev)
  * USB probe, disconnect, suspend and resume
  */
 
-struct uvc_device_info {
-       u32     quirks;
-       u32     meta_format;
-};
+static const struct uvc_device_info uvc_quirk_none = { 0 };
 
 static int uvc_probe(struct usb_interface *intf,
                     const struct usb_device_id *id)
@@ -2052,7 +2049,6 @@ static int uvc_probe(struct usb_interface *intf,
        struct uvc_device *dev;
        const struct uvc_device_info *info =
                (const struct uvc_device_info *)id->driver_info;
-       u32 quirks = info ? info->quirks : 0;
        int function;
        int ret;
 
@@ -2079,10 +2075,9 @@ static int uvc_probe(struct usb_interface *intf,
        dev->udev = usb_get_dev(udev);
        dev->intf = usb_get_intf(intf);
        dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
-       dev->quirks = (uvc_quirks_param == -1)
-                   ? quirks : uvc_quirks_param;
-       if (info)
-               dev->meta_format = info->meta_format;
+       dev->info = info ? info : &uvc_quirk_none;
+       dev->quirks = uvc_quirks_param == -1
+                   ? dev->info->quirks : uvc_quirks_param;
 
        if (udev->product != NULL)
                strlcpy(dev->name, udev->product, sizeof(dev->name));
@@ -2123,7 +2118,7 @@ static int uvc_probe(struct usb_interface *intf,
                le16_to_cpu(udev->descriptor.idVendor),
                le16_to_cpu(udev->descriptor.idProduct));
 
-       if (dev->quirks != quirks) {
+       if (dev->quirks != dev->info->quirks) {
                uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module "
                        "parameter for testing purpose.\n", dev->quirks);
                uvc_printk(KERN_INFO, "Please report required quirks to the "
index cd1aec19cc5b583fabd9770f735e9bd3f8804686..ed0f0c0732cbbeabab3d88bfd4e88f74ca5ad2d3 100644 (file)
@@ -74,7 +74,8 @@ static int uvc_meta_v4l2_try_format(struct file *file, void *fh,
 
        memset(fmt, 0, sizeof(*fmt));
 
-       fmt->dataformat = fmeta == dev->meta_format ? fmeta : V4L2_META_FMT_UVC;
+       fmt->dataformat = fmeta == dev->info->meta_format
+                       ? fmeta : V4L2_META_FMT_UVC;
        fmt->buffersize = UVC_METATADA_BUF_SIZE;
 
        return 0;
@@ -118,14 +119,14 @@ static int uvc_meta_v4l2_enum_formats(struct file *file, void *fh,
        u32 index = fdesc->index;
 
        if (fdesc->type != vfh->vdev->queue->type ||
-           index > 1U || (index && !dev->meta_format))
+           index > 1U || (index && !dev->info->meta_format))
                return -EINVAL;
 
        memset(fdesc, 0, sizeof(*fdesc));
 
        fdesc->type = vfh->vdev->queue->type;
        fdesc->index = index;
-       fdesc->pixelformat = index ? dev->meta_format : V4L2_META_FMT_UVC;
+       fdesc->pixelformat = index ? dev->info->meta_format : V4L2_META_FMT_UVC;
 
        return 0;
 }
index 59d66e5b88871e68b5f5551d122e4b7b2a80f150..591eae3d0b0d524502be8ce404e78bc8420ffecd 100644 (file)
@@ -572,15 +572,21 @@ struct uvc_streaming {
        } clock;
 };
 
+struct uvc_device_info {
+       u32     quirks;
+       u32     meta_format;
+};
+
 struct uvc_device {
        struct usb_device *udev;
        struct usb_interface *intf;
        unsigned long warnings;
        u32 quirks;
-       u32 meta_format;
        int intfnum;
        char name[32];
 
+       const struct uvc_device_info *info;
+
        struct mutex lock;              /* Protects users */
        unsigned int users;
        atomic_t nmappings;