media: uvcvideo: Force UVC version to 1.0a for 1bcf:0b40
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Fri, 20 Nov 2020 10:57:48 +0000 (11:57 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 27 Jan 2021 13:45:55 +0000 (14:45 +0100)
The Shenzhen Aoni Electronic Co.,Ltd 2K FHD camera reports a UVC 1.10
version, but implements UVC 1.0a as shown by the UVC probe control being
26 bytes long. Force the UVC version for that device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reported-by: Doncho Minkov <donchominkov@gmail.com>
Tested-by: Doncho Minkov <donchominkov@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvcvideo.h

index ddb9eaa..ae970f1 100644 (file)
@@ -2274,6 +2274,12 @@ static int uvc_probe(struct usb_interface *intf,
                        "linux-uvc-devel mailing list.\n");
        }
 
+       if (dev->info->uvc_version) {
+               dev->uvc_version = dev->info->uvc_version;
+               uvc_printk(KERN_INFO, "Forcing UVC version to %u.%02x\n",
+                          dev->uvc_version >> 8, dev->uvc_version & 0xff);
+       }
+
        /* Register the V4L2 device. */
        if (v4l2_device_register(&intf->dev, &dev->vdev) < 0)
                goto error;
@@ -2923,6 +2929,17 @@ static const struct usb_device_id uvc_ids[] = {
          .bInterfaceSubClass   = 1,
          .bInterfaceProtocol   = 0,
          .driver_info          = (kernel_ulong_t)&uvc_quirk_probe_minmax },
+       /* Shenzhen Aoni Electronic Co.,Ltd 2K FHD camera */
+       { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
+                               | USB_DEVICE_ID_MATCH_INT_INFO,
+         .idVendor             = 0x1bcf,
+         .idProduct            = 0x0b40,
+         .bInterfaceClass      = USB_CLASS_VIDEO,
+         .bInterfaceSubClass   = 1,
+         .bInterfaceProtocol   = 0,
+         .driver_info          = (kernel_ulong_t)&(const struct uvc_device_info){
+               .uvc_version = 0x010a,
+         } },
        /* SiGma Micro USB Web Camera */
        { .match_flags          = USB_DEVICE_ID_MATCH_DEVICE
                                | USB_DEVICE_ID_MATCH_INT_INFO,
index a3dfacf..8ec9eca 100644 (file)
@@ -635,6 +635,7 @@ static inline u32 uvc_urb_index(const struct uvc_urb *uvc_urb)
 struct uvc_device_info {
        u32     quirks;
        u32     meta_format;
+       u16     uvc_version;
 };
 
 struct uvc_device {