diff options
| -rw-r--r-- | drivers/media/usb/uvc/uvc_driver.c | 25 | ||||
| -rw-r--r-- | drivers/media/usb/uvc/uvcvideo.h | 1 | 
2 files changed, 26 insertions, 0 deletions
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 2b688cc39bb8..99883550375e 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -497,6 +497,22 @@ static int uvc_parse_format(struct uvc_device *dev,  			}  		} +		/* Some devices report bpp that doesn't match the format. */ +		if (dev->quirks & UVC_QUIRK_FORCE_BPP) { +			const struct v4l2_format_info *info = +				v4l2_format_info(format->fcc); + +			if (info) { +				unsigned int div = info->hdiv * info->vdiv; + +				n = info->bpp[0] * div; +				for (i = 1; i < info->comp_planes; i++) +					n += info->bpp[i]; + +				format->bpp = DIV_ROUND_UP(8 * n, div); +			} +		} +  		if (buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED) {  			ftype = UVC_VS_FRAME_UNCOMPRESSED;  		} else { @@ -2874,6 +2890,15 @@ static const struct usb_device_id uvc_ids[] = {  	  .bInterfaceSubClass	= 1,  	  .bInterfaceProtocol	= 0,  	  .driver_info		= (kernel_ulong_t)&uvc_quirk_force_y8 }, +	/* GEO Semiconductor GC6500 */ +	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE +				| USB_DEVICE_ID_MATCH_INT_INFO, +	  .idVendor		= 0x29fe, +	  .idProduct		= 0x4d53, +	  .bInterfaceClass	= USB_CLASS_VIDEO, +	  .bInterfaceSubClass	= 1, +	  .bInterfaceProtocol	= 0, +	  .driver_info		= UVC_INFO_QUIRK(UVC_QUIRK_FORCE_BPP) },  	/* Intel RealSense D4M */  	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE  				| USB_DEVICE_ID_MATCH_INT_INFO, diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h index f773dc5d802c..6ab972c643e3 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -198,6 +198,7 @@  #define UVC_QUIRK_RESTRICT_FRAME_RATE	0x00000200  #define UVC_QUIRK_RESTORE_CTRLS_ON_INIT	0x00000400  #define UVC_QUIRK_FORCE_Y8		0x00000800 +#define UVC_QUIRK_FORCE_BPP		0x00001000  /* Format flags */  #define UVC_FMT_FLAG_COMPRESSED		0x00000001  | 
