aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-08-17 04:50:02 -0400
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2018-09-11 08:47:05 -0400
commit3a03284dd4e7a9923acda7d73ec418378d3af6cc (patch)
treed14d003233c851dd0d91bbfa6f4cf1a04e5a9581
parent88d8034c943fb5a0e3c49eb878a87edcb376e2c2 (diff)
media: uvcvideo: Store device information pointer in struct uvc_device
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>
-rw-r--r--drivers/media/usb/uvc/uvc_driver.c15
-rw-r--r--drivers/media/usb/uvc/uvc_metadata.c7
-rw-r--r--drivers/media/usb/uvc/uvcvideo.h8
3 files changed, 16 insertions, 14 deletions
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index 371313a7366b..9bc6027d04d0 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -2040,10 +2040,7 @@ static int uvc_register_chains(struct uvc_device *dev)
2040 * USB probe, disconnect, suspend and resume 2040 * USB probe, disconnect, suspend and resume
2041 */ 2041 */
2042 2042
2043struct uvc_device_info { 2043static const struct uvc_device_info uvc_quirk_none = { 0 };
2044 u32 quirks;
2045 u32 meta_format;
2046};
2047 2044
2048static int uvc_probe(struct usb_interface *intf, 2045static int uvc_probe(struct usb_interface *intf,
2049 const struct usb_device_id *id) 2046 const struct usb_device_id *id)
@@ -2052,7 +2049,6 @@ static int uvc_probe(struct usb_interface *intf,
2052 struct uvc_device *dev; 2049 struct uvc_device *dev;
2053 const struct uvc_device_info *info = 2050 const struct uvc_device_info *info =
2054 (const struct uvc_device_info *)id->driver_info; 2051 (const struct uvc_device_info *)id->driver_info;
2055 u32 quirks = info ? info->quirks : 0;
2056 int function; 2052 int function;
2057 int ret; 2053 int ret;
2058 2054
@@ -2079,10 +2075,9 @@ static int uvc_probe(struct usb_interface *intf,
2079 dev->udev = usb_get_dev(udev); 2075 dev->udev = usb_get_dev(udev);
2080 dev->intf = usb_get_intf(intf); 2076 dev->intf = usb_get_intf(intf);
2081 dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; 2077 dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
2082 dev->quirks = (uvc_quirks_param == -1) 2078 dev->info = info ? info : &uvc_quirk_none;
2083 ? quirks : uvc_quirks_param; 2079 dev->quirks = uvc_quirks_param == -1
2084 if (info) 2080 ? dev->info->quirks : uvc_quirks_param;
2085 dev->meta_format = info->meta_format;
2086 2081
2087 if (udev->product != NULL) 2082 if (udev->product != NULL)
2088 strlcpy(dev->name, udev->product, sizeof(dev->name)); 2083 strlcpy(dev->name, udev->product, sizeof(dev->name));
@@ -2123,7 +2118,7 @@ static int uvc_probe(struct usb_interface *intf,
2123 le16_to_cpu(udev->descriptor.idVendor), 2118 le16_to_cpu(udev->descriptor.idVendor),
2124 le16_to_cpu(udev->descriptor.idProduct)); 2119 le16_to_cpu(udev->descriptor.idProduct));
2125 2120
2126 if (dev->quirks != quirks) { 2121 if (dev->quirks != dev->info->quirks) {
2127 uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module " 2122 uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module "
2128 "parameter for testing purpose.\n", dev->quirks); 2123 "parameter for testing purpose.\n", dev->quirks);
2129 uvc_printk(KERN_INFO, "Please report required quirks to the " 2124 uvc_printk(KERN_INFO, "Please report required quirks to the "
diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/uvc_metadata.c
index cd1aec19cc5b..ed0f0c0732cb 100644
--- a/drivers/media/usb/uvc/uvc_metadata.c
+++ b/drivers/media/usb/uvc/uvc_metadata.c
@@ -74,7 +74,8 @@ static int uvc_meta_v4l2_try_format(struct file *file, void *fh,
74 74
75 memset(fmt, 0, sizeof(*fmt)); 75 memset(fmt, 0, sizeof(*fmt));
76 76
77 fmt->dataformat = fmeta == dev->meta_format ? fmeta : V4L2_META_FMT_UVC; 77 fmt->dataformat = fmeta == dev->info->meta_format
78 ? fmeta : V4L2_META_FMT_UVC;
78 fmt->buffersize = UVC_METATADA_BUF_SIZE; 79 fmt->buffersize = UVC_METATADA_BUF_SIZE;
79 80
80 return 0; 81 return 0;
@@ -118,14 +119,14 @@ static int uvc_meta_v4l2_enum_formats(struct file *file, void *fh,
118 u32 index = fdesc->index; 119 u32 index = fdesc->index;
119 120
120 if (fdesc->type != vfh->vdev->queue->type || 121 if (fdesc->type != vfh->vdev->queue->type ||
121 index > 1U || (index && !dev->meta_format)) 122 index > 1U || (index && !dev->info->meta_format))
122 return -EINVAL; 123 return -EINVAL;
123 124
124 memset(fdesc, 0, sizeof(*fdesc)); 125 memset(fdesc, 0, sizeof(*fdesc));
125 126
126 fdesc->type = vfh->vdev->queue->type; 127 fdesc->type = vfh->vdev->queue->type;
127 fdesc->index = index; 128 fdesc->index = index;
128 fdesc->pixelformat = index ? dev->meta_format : V4L2_META_FMT_UVC; 129 fdesc->pixelformat = index ? dev->info->meta_format : V4L2_META_FMT_UVC;
129 130
130 return 0; 131 return 0;
131} 132}
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
index 59d66e5b8887..591eae3d0b0d 100644
--- a/drivers/media/usb/uvc/uvcvideo.h
+++ b/drivers/media/usb/uvc/uvcvideo.h
@@ -572,15 +572,21 @@ struct uvc_streaming {
572 } clock; 572 } clock;
573}; 573};
574 574
575struct uvc_device_info {
576 u32 quirks;
577 u32 meta_format;
578};
579
575struct uvc_device { 580struct uvc_device {
576 struct usb_device *udev; 581 struct usb_device *udev;
577 struct usb_interface *intf; 582 struct usb_interface *intf;
578 unsigned long warnings; 583 unsigned long warnings;
579 u32 quirks; 584 u32 quirks;
580 u32 meta_format;
581 int intfnum; 585 int intfnum;
582 char name[32]; 586 char name[32];
583 587
588 const struct uvc_device_info *info;
589
584 struct mutex lock; /* Protects users */ 590 struct mutex lock; /* Protects users */
585 unsigned int users; 591 unsigned int users;
586 atomic_t nmappings; 592 atomic_t nmappings;