Commit 3a03284d authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 88d8034c
...@@ -2040,10 +2040,7 @@ static int uvc_register_chains(struct uvc_device *dev) ...@@ -2040,10 +2040,7 @@ static int uvc_register_chains(struct uvc_device *dev)
* USB probe, disconnect, suspend and resume * USB probe, disconnect, suspend and resume
*/ */
struct uvc_device_info { static const struct uvc_device_info uvc_quirk_none = { 0 };
u32 quirks;
u32 meta_format;
};
static int uvc_probe(struct usb_interface *intf, static int uvc_probe(struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id)
...@@ -2052,7 +2049,6 @@ static int uvc_probe(struct usb_interface *intf, ...@@ -2052,7 +2049,6 @@ static int uvc_probe(struct usb_interface *intf,
struct uvc_device *dev; struct uvc_device *dev;
const struct uvc_device_info *info = const struct uvc_device_info *info =
(const struct uvc_device_info *)id->driver_info; (const struct uvc_device_info *)id->driver_info;
u32 quirks = info ? info->quirks : 0;
int function; int function;
int ret; int ret;
...@@ -2079,10 +2075,9 @@ static int uvc_probe(struct usb_interface *intf, ...@@ -2079,10 +2075,9 @@ static int uvc_probe(struct usb_interface *intf,
dev->udev = usb_get_dev(udev); dev->udev = usb_get_dev(udev);
dev->intf = usb_get_intf(intf); dev->intf = usb_get_intf(intf);
dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; dev->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
dev->quirks = (uvc_quirks_param == -1) dev->info = info ? info : &uvc_quirk_none;
? quirks : uvc_quirks_param; dev->quirks = uvc_quirks_param == -1
if (info) ? dev->info->quirks : uvc_quirks_param;
dev->meta_format = info->meta_format;
if (udev->product != NULL) if (udev->product != NULL)
strlcpy(dev->name, udev->product, sizeof(dev->name)); strlcpy(dev->name, udev->product, sizeof(dev->name));
...@@ -2123,7 +2118,7 @@ static int uvc_probe(struct usb_interface *intf, ...@@ -2123,7 +2118,7 @@ static int uvc_probe(struct usb_interface *intf,
le16_to_cpu(udev->descriptor.idVendor), le16_to_cpu(udev->descriptor.idVendor),
le16_to_cpu(udev->descriptor.idProduct)); 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 " uvc_printk(KERN_INFO, "Forcing device quirks to 0x%x by module "
"parameter for testing purpose.\n", dev->quirks); "parameter for testing purpose.\n", dev->quirks);
uvc_printk(KERN_INFO, "Please report required quirks to the " uvc_printk(KERN_INFO, "Please report required quirks to the "
......
...@@ -74,7 +74,8 @@ static int uvc_meta_v4l2_try_format(struct file *file, void *fh, ...@@ -74,7 +74,8 @@ static int uvc_meta_v4l2_try_format(struct file *file, void *fh,
memset(fmt, 0, sizeof(*fmt)); 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; fmt->buffersize = UVC_METATADA_BUF_SIZE;
return 0; return 0;
...@@ -118,14 +119,14 @@ static int uvc_meta_v4l2_enum_formats(struct file *file, void *fh, ...@@ -118,14 +119,14 @@ static int uvc_meta_v4l2_enum_formats(struct file *file, void *fh,
u32 index = fdesc->index; u32 index = fdesc->index;
if (fdesc->type != vfh->vdev->queue->type || if (fdesc->type != vfh->vdev->queue->type ||
index > 1U || (index && !dev->meta_format)) index > 1U || (index && !dev->info->meta_format))
return -EINVAL; return -EINVAL;
memset(fdesc, 0, sizeof(*fdesc)); memset(fdesc, 0, sizeof(*fdesc));
fdesc->type = vfh->vdev->queue->type; fdesc->type = vfh->vdev->queue->type;
fdesc->index = index; 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; return 0;
} }
......
...@@ -572,15 +572,21 @@ struct uvc_streaming { ...@@ -572,15 +572,21 @@ struct uvc_streaming {
} clock; } clock;
}; };
struct uvc_device_info {
u32 quirks;
u32 meta_format;
};
struct uvc_device { struct uvc_device {
struct usb_device *udev; struct usb_device *udev;
struct usb_interface *intf; struct usb_interface *intf;
unsigned long warnings; unsigned long warnings;
u32 quirks; u32 quirks;
u32 meta_format;
int intfnum; int intfnum;
char name[32]; char name[32];
const struct uvc_device_info *info;
struct mutex lock; /* Protects users */ struct mutex lock; /* Protects users */
unsigned int users; unsigned int users;
atomic_t nmappings; atomic_t nmappings;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment