aboutsummaryrefslogtreecommitdiffstats
path: root/usb/usb-uvc-move-constants-and-structures-definitions-to-linux-usb-video.h.patch
diff options
Diffstat (limited to 'usb/usb-uvc-move-constants-and-structures-definitions-to-linux-usb-video.h.patch')
-rw-r--r--usb/usb-uvc-move-constants-and-structures-definitions-to-linux-usb-video.h.patch1044
1 files changed, 1044 insertions, 0 deletions
diff --git a/usb/usb-uvc-move-constants-and-structures-definitions-to-linux-usb-video.h.patch b/usb/usb-uvc-move-constants-and-structures-definitions-to-linux-usb-video.h.patch
new file mode 100644
index 00000000000000..59c6f4834cb351
--- /dev/null
+++ b/usb/usb-uvc-move-constants-and-structures-definitions-to-linux-usb-video.h.patch
@@ -0,0 +1,1044 @@
+From laurent.pinchart@ideasonboard.com Wed Jun 16 13:25:39 2010
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Mon, 7 Jun 2010 13:09:47 +0200
+Subject: USB: uvc: Move constants and structures definitions to linux/usb/video.h
+To: linux-usb@vger.kernel.org
+Message-ID: <1275908987-5774-1-git-send-email-laurent.pinchart@ideasonboard.com>
+
+
+The UVC host and gadget drivers both define constants and structures in
+private header files. Move all those definitions to linux/usb/video.h
+where they can be shared by the two drivers (and be available for
+userspace applications).
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/media/video/uvc/uvcvideo.h | 19 -
+ drivers/usb/gadget/f_uvc.c | 16 -
+ drivers/usb/gadget/f_uvc.h | 352 --------------------------------
+ drivers/usb/gadget/uvc.h | 36 ---
+ drivers/usb/gadget/webcam.c | 24 +-
+ include/linux/usb/video.h | 397 +++++++++++++++++++++++++++++++++++++
+ 6 files changed, 418 insertions(+), 426 deletions(-)
+
+--- a/drivers/media/video/uvc/uvcvideo.h
++++ b/drivers/media/video/uvc/uvcvideo.h
+@@ -179,25 +179,6 @@ struct uvc_device;
+ /* TODO: Put the most frequently accessed fields at the beginning of
+ * structures to maximize cache efficiency.
+ */
+-struct uvc_streaming_control {
+- __u16 bmHint;
+- __u8 bFormatIndex;
+- __u8 bFrameIndex;
+- __u32 dwFrameInterval;
+- __u16 wKeyFrameRate;
+- __u16 wPFrameRate;
+- __u16 wCompQuality;
+- __u16 wCompWindowSize;
+- __u16 wDelay;
+- __u32 dwMaxVideoFrameSize;
+- __u32 dwMaxPayloadTransferSize;
+- __u32 dwClockFrequency;
+- __u8 bmFramingInfo;
+- __u8 bPreferedVersion;
+- __u8 bMinVersion;
+- __u8 bMaxVersion;
+-};
+-
+ struct uvc_menu_info {
+ __u32 value;
+ __u8 name[32];
+--- a/drivers/usb/gadget/f_uvc.c
++++ b/drivers/usb/gadget/f_uvc.c
+@@ -61,12 +61,12 @@ static struct usb_gadget_strings *uvc_fu
+ #define UVC_INTF_VIDEO_STREAMING 1
+
+ static struct usb_interface_assoc_descriptor uvc_iad __initdata = {
+- .bLength = USB_DT_INTERFACE_ASSOCIATION_SIZE,
++ .bLength = sizeof(uvc_iad),
+ .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
+ .bFirstInterface = 0,
+ .bInterfaceCount = 2,
+ .bFunctionClass = USB_CLASS_VIDEO,
+- .bFunctionSubClass = 0x03,
++ .bFunctionSubClass = UVC_SC_VIDEO_INTERFACE_COLLECTION,
+ .bFunctionProtocol = 0x00,
+ .iFunction = 0,
+ };
+@@ -78,7 +78,7 @@ static struct usb_interface_descriptor u
+ .bAlternateSetting = 0,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = USB_CLASS_VIDEO,
+- .bInterfaceSubClass = 0x01,
++ .bInterfaceSubClass = UVC_SC_VIDEOCONTROL,
+ .bInterfaceProtocol = 0x00,
+ .iInterface = 0,
+ };
+@@ -106,7 +106,7 @@ static struct usb_interface_descriptor u
+ .bAlternateSetting = 0,
+ .bNumEndpoints = 0,
+ .bInterfaceClass = USB_CLASS_VIDEO,
+- .bInterfaceSubClass = 0x02,
++ .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING,
+ .bInterfaceProtocol = 0x00,
+ .iInterface = 0,
+ };
+@@ -118,7 +118,7 @@ static struct usb_interface_descriptor u
+ .bAlternateSetting = 1,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = USB_CLASS_VIDEO,
+- .bInterfaceSubClass = 0x02,
++ .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING,
+ .bInterfaceProtocol = 0x00,
+ .iInterface = 0,
+ };
+@@ -603,15 +603,15 @@ uvc_bind_config(struct usb_configuration
+
+ /* Validate the descriptors. */
+ if (control == NULL || control[0] == NULL ||
+- control[0]->bDescriptorSubType != UVC_DT_HEADER)
++ control[0]->bDescriptorSubType != UVC_VC_HEADER)
+ goto error;
+
+ if (fs_streaming == NULL || fs_streaming[0] == NULL ||
+- fs_streaming[0]->bDescriptorSubType != UVC_DT_INPUT_HEADER)
++ fs_streaming[0]->bDescriptorSubType != UVC_VS_INPUT_HEADER)
+ goto error;
+
+ if (hs_streaming == NULL || hs_streaming[0] == NULL ||
+- hs_streaming[0]->bDescriptorSubType != UVC_DT_INPUT_HEADER)
++ hs_streaming[0]->bDescriptorSubType != UVC_VS_INPUT_HEADER)
+ goto error;
+
+ uvc->desc.control = control;
+--- a/drivers/usb/gadget/f_uvc.h
++++ b/drivers/usb/gadget/f_uvc.h
+@@ -15,357 +15,7 @@
+ #define _F_UVC_H_
+
+ #include <linux/usb/composite.h>
+-
+-#define USB_CLASS_VIDEO_CONTROL 1
+-#define USB_CLASS_VIDEO_STREAMING 2
+-
+-struct uvc_descriptor_header {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+-} __attribute__ ((packed));
+-
+-struct uvc_header_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u16 bcdUVC;
+- __u16 wTotalLength;
+- __u32 dwClockFrequency;
+- __u8 bInCollection;
+- __u8 baInterfaceNr[];
+-} __attribute__((__packed__));
+-
+-#define UVC_HEADER_DESCRIPTOR(n) uvc_header_descriptor_##n
+-
+-#define DECLARE_UVC_HEADER_DESCRIPTOR(n) \
+-struct UVC_HEADER_DESCRIPTOR(n) { \
+- __u8 bLength; \
+- __u8 bDescriptorType; \
+- __u8 bDescriptorSubType; \
+- __u16 bcdUVC; \
+- __u16 wTotalLength; \
+- __u32 dwClockFrequency; \
+- __u8 bInCollection; \
+- __u8 baInterfaceNr[n]; \
+-} __attribute__ ((packed))
+-
+-struct uvc_input_terminal_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bTerminalID;
+- __u16 wTerminalType;
+- __u8 bAssocTerminal;
+- __u8 iTerminal;
+-} __attribute__((__packed__));
+-
+-struct uvc_output_terminal_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bTerminalID;
+- __u16 wTerminalType;
+- __u8 bAssocTerminal;
+- __u8 bSourceID;
+- __u8 iTerminal;
+-} __attribute__((__packed__));
+-
+-struct uvc_camera_terminal_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bTerminalID;
+- __u16 wTerminalType;
+- __u8 bAssocTerminal;
+- __u8 iTerminal;
+- __u16 wObjectiveFocalLengthMin;
+- __u16 wObjectiveFocalLengthMax;
+- __u16 wOcularFocalLength;
+- __u8 bControlSize;
+- __u8 bmControls[3];
+-} __attribute__((__packed__));
+-
+-struct uvc_selector_unit_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bUnitID;
+- __u8 bNrInPins;
+- __u8 baSourceID[0];
+- __u8 iSelector;
+-} __attribute__((__packed__));
+-
+-#define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \
+- uvc_selector_unit_descriptor_##n
+-
+-#define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \
+-struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \
+- __u8 bLength; \
+- __u8 bDescriptorType; \
+- __u8 bDescriptorSubType; \
+- __u8 bUnitID; \
+- __u8 bNrInPins; \
+- __u8 baSourceID[n]; \
+- __u8 iSelector; \
+-} __attribute__ ((packed))
+-
+-struct uvc_processing_unit_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bUnitID;
+- __u8 bSourceID;
+- __u16 wMaxMultiplier;
+- __u8 bControlSize;
+- __u8 bmControls[2];
+- __u8 iProcessing;
+-} __attribute__((__packed__));
+-
+-struct uvc_extension_unit_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bUnitID;
+- __u8 guidExtensionCode[16];
+- __u8 bNumControls;
+- __u8 bNrInPins;
+- __u8 baSourceID[0];
+- __u8 bControlSize;
+- __u8 bmControls[0];
+- __u8 iExtension;
+-} __attribute__((__packed__));
+-
+-#define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
+- uvc_extension_unit_descriptor_##p_##n
+-
+-#define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
+-struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \
+- __u8 bLength; \
+- __u8 bDescriptorType; \
+- __u8 bDescriptorSubType; \
+- __u8 bUnitID; \
+- __u8 guidExtensionCode[16]; \
+- __u8 bNumControls; \
+- __u8 bNrInPins; \
+- __u8 baSourceID[p]; \
+- __u8 bControlSize; \
+- __u8 bmControls[n]; \
+- __u8 iExtension; \
+-} __attribute__ ((packed))
+-
+-struct uvc_control_endpoint_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u16 wMaxTransferSize;
+-} __attribute__((__packed__));
+-
+-#define UVC_DT_HEADER 1
+-#define UVC_DT_INPUT_TERMINAL 2
+-#define UVC_DT_OUTPUT_TERMINAL 3
+-#define UVC_DT_SELECTOR_UNIT 4
+-#define UVC_DT_PROCESSING_UNIT 5
+-#define UVC_DT_EXTENSION_UNIT 6
+-
+-#define UVC_DT_HEADER_SIZE(n) (12+(n))
+-#define UVC_DT_INPUT_TERMINAL_SIZE 8
+-#define UVC_DT_OUTPUT_TERMINAL_SIZE 9
+-#define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n))
+-#define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n))
+-#define UVC_DT_PROCESSING_UNIT_SIZE(n) (9+(n))
+-#define UVC_DT_EXTENSION_UNIT_SIZE(p,n) (24+(p)+(n))
+-#define UVC_DT_CONTROL_ENDPOINT_SIZE 5
+-
+-struct uvc_input_header_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bNumFormats;
+- __u16 wTotalLength;
+- __u8 bEndpointAddress;
+- __u8 bmInfo;
+- __u8 bTerminalLink;
+- __u8 bStillCaptureMethod;
+- __u8 bTriggerSupport;
+- __u8 bTriggerUsage;
+- __u8 bControlSize;
+- __u8 bmaControls[];
+-} __attribute__((__packed__));
+-
+-#define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
+- uvc_input_header_descriptor_##n_##p
+-
+-#define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
+-struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \
+- __u8 bLength; \
+- __u8 bDescriptorType; \
+- __u8 bDescriptorSubType; \
+- __u8 bNumFormats; \
+- __u16 wTotalLength; \
+- __u8 bEndpointAddress; \
+- __u8 bmInfo; \
+- __u8 bTerminalLink; \
+- __u8 bStillCaptureMethod; \
+- __u8 bTriggerSupport; \
+- __u8 bTriggerUsage; \
+- __u8 bControlSize; \
+- __u8 bmaControls[p][n]; \
+-} __attribute__ ((packed))
+-
+-struct uvc_output_header_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bNumFormats;
+- __u16 wTotalLength;
+- __u8 bEndpointAddress;
+- __u8 bTerminalLink;
+- __u8 bControlSize;
+- __u8 bmaControls[];
+-} __attribute__((__packed__));
+-
+-#define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
+- uvc_output_header_descriptor_##n_##p
+-
+-#define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
+-struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \
+- __u8 bLength; \
+- __u8 bDescriptorType; \
+- __u8 bDescriptorSubType; \
+- __u8 bNumFormats; \
+- __u16 wTotalLength; \
+- __u8 bEndpointAddress; \
+- __u8 bTerminalLink; \
+- __u8 bControlSize; \
+- __u8 bmaControls[p][n]; \
+-} __attribute__ ((packed))
+-
+-struct uvc_format_uncompressed {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bFormatIndex;
+- __u8 bNumFrameDescriptors;
+- __u8 guidFormat[16];
+- __u8 bBitsPerPixel;
+- __u8 bDefaultFrameIndex;
+- __u8 bAspectRatioX;
+- __u8 bAspectRatioY;
+- __u8 bmInterfaceFlags;
+- __u8 bCopyProtect;
+-} __attribute__((__packed__));
+-
+-struct uvc_frame_uncompressed {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bFrameIndex;
+- __u8 bmCapabilities;
+- __u16 wWidth;
+- __u16 wHeight;
+- __u32 dwMinBitRate;
+- __u32 dwMaxBitRate;
+- __u32 dwMaxVideoFrameBufferSize;
+- __u32 dwDefaultFrameInterval;
+- __u8 bFrameIntervalType;
+- __u32 dwFrameInterval[];
+-} __attribute__((__packed__));
+-
+-#define UVC_FRAME_UNCOMPRESSED(n) \
+- uvc_frame_uncompressed_##n
+-
+-#define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \
+-struct UVC_FRAME_UNCOMPRESSED(n) { \
+- __u8 bLength; \
+- __u8 bDescriptorType; \
+- __u8 bDescriptorSubType; \
+- __u8 bFrameIndex; \
+- __u8 bmCapabilities; \
+- __u16 wWidth; \
+- __u16 wHeight; \
+- __u32 dwMinBitRate; \
+- __u32 dwMaxBitRate; \
+- __u32 dwMaxVideoFrameBufferSize; \
+- __u32 dwDefaultFrameInterval; \
+- __u8 bFrameIntervalType; \
+- __u32 dwFrameInterval[n]; \
+-} __attribute__ ((packed))
+-
+-struct uvc_format_mjpeg {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bFormatIndex;
+- __u8 bNumFrameDescriptors;
+- __u8 bmFlags;
+- __u8 bDefaultFrameIndex;
+- __u8 bAspectRatioX;
+- __u8 bAspectRatioY;
+- __u8 bmInterfaceFlags;
+- __u8 bCopyProtect;
+-} __attribute__((__packed__));
+-
+-struct uvc_frame_mjpeg {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bFrameIndex;
+- __u8 bmCapabilities;
+- __u16 wWidth;
+- __u16 wHeight;
+- __u32 dwMinBitRate;
+- __u32 dwMaxBitRate;
+- __u32 dwMaxVideoFrameBufferSize;
+- __u32 dwDefaultFrameInterval;
+- __u8 bFrameIntervalType;
+- __u32 dwFrameInterval[];
+-} __attribute__((__packed__));
+-
+-#define UVC_FRAME_MJPEG(n) \
+- uvc_frame_mjpeg_##n
+-
+-#define DECLARE_UVC_FRAME_MJPEG(n) \
+-struct UVC_FRAME_MJPEG(n) { \
+- __u8 bLength; \
+- __u8 bDescriptorType; \
+- __u8 bDescriptorSubType; \
+- __u8 bFrameIndex; \
+- __u8 bmCapabilities; \
+- __u16 wWidth; \
+- __u16 wHeight; \
+- __u32 dwMinBitRate; \
+- __u32 dwMaxBitRate; \
+- __u32 dwMaxVideoFrameBufferSize; \
+- __u32 dwDefaultFrameInterval; \
+- __u8 bFrameIntervalType; \
+- __u32 dwFrameInterval[n]; \
+-} __attribute__ ((packed))
+-
+-struct uvc_color_matching_descriptor {
+- __u8 bLength;
+- __u8 bDescriptorType;
+- __u8 bDescriptorSubType;
+- __u8 bColorPrimaries;
+- __u8 bTransferCharacteristics;
+- __u8 bMatrixCoefficients;
+-} __attribute__((__packed__));
+-
+-#define UVC_DT_INPUT_HEADER 1
+-#define UVC_DT_OUTPUT_HEADER 2
+-#define UVC_DT_FORMAT_UNCOMPRESSED 4
+-#define UVC_DT_FRAME_UNCOMPRESSED 5
+-#define UVC_DT_FORMAT_MJPEG 6
+-#define UVC_DT_FRAME_MJPEG 7
+-#define UVC_DT_COLOR_MATCHING 13
+-
+-#define UVC_DT_INPUT_HEADER_SIZE(n, p) (13+(n*p))
+-#define UVC_DT_OUTPUT_HEADER_SIZE(n, p) (9+(n*p))
+-#define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27
+-#define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n))
+-#define UVC_DT_FORMAT_MJPEG_SIZE 11
+-#define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n))
+-#define UVC_DT_COLOR_MATCHING_SIZE 6
++#include <linux/usb/video.h>
+
+ extern int uvc_bind_config(struct usb_configuration *c,
+ const struct uvc_descriptor_header * const *control,
+--- a/drivers/usb/gadget/uvc.h
++++ b/drivers/usb/gadget/uvc.h
+@@ -48,39 +48,6 @@ struct uvc_event
+ #define UVC_INTF_STREAMING 1
+
+ /* ------------------------------------------------------------------------
+- * UVC constants & structures
+- */
+-
+-/* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */
+-#define UVC_STREAM_EOH (1 << 7)
+-#define UVC_STREAM_ERR (1 << 6)
+-#define UVC_STREAM_STI (1 << 5)
+-#define UVC_STREAM_RES (1 << 4)
+-#define UVC_STREAM_SCR (1 << 3)
+-#define UVC_STREAM_PTS (1 << 2)
+-#define UVC_STREAM_EOF (1 << 1)
+-#define UVC_STREAM_FID (1 << 0)
+-
+-struct uvc_streaming_control {
+- __u16 bmHint;
+- __u8 bFormatIndex;
+- __u8 bFrameIndex;
+- __u32 dwFrameInterval;
+- __u16 wKeyFrameRate;
+- __u16 wPFrameRate;
+- __u16 wCompQuality;
+- __u16 wCompWindowSize;
+- __u16 wDelay;
+- __u32 dwMaxVideoFrameSize;
+- __u32 dwMaxPayloadTransferSize;
+- __u32 dwClockFrequency;
+- __u8 bmFramingInfo;
+- __u8 bPreferedVersion;
+- __u8 bMinVersion;
+- __u8 bMaxVersion;
+-} __attribute__((__packed__));
+-
+-/* ------------------------------------------------------------------------
+ * Debugging, printing and logging
+ */
+
+@@ -137,9 +104,6 @@ extern unsigned int uvc_trace_param;
+ #define UVC_MAX_REQUEST_SIZE 64
+ #define UVC_MAX_EVENTS 4
+
+-#define USB_DT_INTERFACE_ASSOCIATION_SIZE 8
+-#define USB_CLASS_MISC 0xef
+-
+ /* ------------------------------------------------------------------------
+ * Structures
+ */
+--- a/drivers/usb/gadget/webcam.c
++++ b/drivers/usb/gadget/webcam.c
+@@ -90,7 +90,7 @@ DECLARE_UVC_HEADER_DESCRIPTOR(1);
+ static const struct UVC_HEADER_DESCRIPTOR(1) uvc_control_header = {
+ .bLength = UVC_DT_HEADER_SIZE(1),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_HEADER,
++ .bDescriptorSubType = UVC_VC_HEADER,
+ .bcdUVC = cpu_to_le16(0x0100),
+ .wTotalLength = 0, /* dynamic */
+ .dwClockFrequency = cpu_to_le32(48000000),
+@@ -101,7 +101,7 @@ static const struct UVC_HEADER_DESCRIPTO
+ static const struct uvc_camera_terminal_descriptor uvc_camera_terminal = {
+ .bLength = UVC_DT_CAMERA_TERMINAL_SIZE(3),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_INPUT_TERMINAL,
++ .bDescriptorSubType = UVC_VC_INPUT_TERMINAL,
+ .bTerminalID = 1,
+ .wTerminalType = cpu_to_le16(0x0201),
+ .bAssocTerminal = 0,
+@@ -118,7 +118,7 @@ static const struct uvc_camera_terminal_
+ static const struct uvc_processing_unit_descriptor uvc_processing = {
+ .bLength = UVC_DT_PROCESSING_UNIT_SIZE(2),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_PROCESSING_UNIT,
++ .bDescriptorSubType = UVC_VC_PROCESSING_UNIT,
+ .bUnitID = 2,
+ .bSourceID = 1,
+ .wMaxMultiplier = cpu_to_le16(16*1024),
+@@ -131,7 +131,7 @@ static const struct uvc_processing_unit_
+ static const struct uvc_output_terminal_descriptor uvc_output_terminal = {
+ .bLength = UVC_DT_OUTPUT_TERMINAL_SIZE,
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_OUTPUT_TERMINAL,
++ .bDescriptorSubType = UVC_VC_OUTPUT_TERMINAL,
+ .bTerminalID = 3,
+ .wTerminalType = cpu_to_le16(0x0101),
+ .bAssocTerminal = 0,
+@@ -144,7 +144,7 @@ DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(1, 2
+ static const struct UVC_INPUT_HEADER_DESCRIPTOR(1, 2) uvc_input_header = {
+ .bLength = UVC_DT_INPUT_HEADER_SIZE(1, 2),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_INPUT_HEADER,
++ .bDescriptorSubType = UVC_VS_INPUT_HEADER,
+ .bNumFormats = 2,
+ .wTotalLength = 0, /* dynamic */
+ .bEndpointAddress = 0, /* dynamic */
+@@ -161,7 +161,7 @@ static const struct UVC_INPUT_HEADER_DES
+ static const struct uvc_format_uncompressed uvc_format_yuv = {
+ .bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE,
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_FORMAT_UNCOMPRESSED,
++ .bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED,
+ .bFormatIndex = 1,
+ .bNumFrameDescriptors = 2,
+ .guidFormat =
+@@ -181,7 +181,7 @@ DECLARE_UVC_FRAME_UNCOMPRESSED(3);
+ static const struct UVC_FRAME_UNCOMPRESSED(3) uvc_frame_yuv_360p = {
+ .bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(3),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_FRAME_UNCOMPRESSED,
++ .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED,
+ .bFrameIndex = 1,
+ .bmCapabilities = 0,
+ .wWidth = cpu_to_le16(640),
+@@ -199,7 +199,7 @@ static const struct UVC_FRAME_UNCOMPRESS
+ static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_720p = {
+ .bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(1),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_FRAME_UNCOMPRESSED,
++ .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED,
+ .bFrameIndex = 2,
+ .bmCapabilities = 0,
+ .wWidth = cpu_to_le16(1280),
+@@ -215,7 +215,7 @@ static const struct UVC_FRAME_UNCOMPRESS
+ static const struct uvc_format_mjpeg uvc_format_mjpg = {
+ .bLength = UVC_DT_FORMAT_MJPEG_SIZE,
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_FORMAT_MJPEG,
++ .bDescriptorSubType = UVC_VS_FORMAT_MJPEG,
+ .bFormatIndex = 2,
+ .bNumFrameDescriptors = 2,
+ .bmFlags = 0,
+@@ -232,7 +232,7 @@ DECLARE_UVC_FRAME_MJPEG(3);
+ static const struct UVC_FRAME_MJPEG(3) uvc_frame_mjpg_360p = {
+ .bLength = UVC_DT_FRAME_MJPEG_SIZE(3),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_FRAME_MJPEG,
++ .bDescriptorSubType = UVC_VS_FRAME_MJPEG,
+ .bFrameIndex = 1,
+ .bmCapabilities = 0,
+ .wWidth = cpu_to_le16(640),
+@@ -250,7 +250,7 @@ static const struct UVC_FRAME_MJPEG(3) u
+ static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_720p = {
+ .bLength = UVC_DT_FRAME_MJPEG_SIZE(1),
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_FRAME_MJPEG,
++ .bDescriptorSubType = UVC_VS_FRAME_MJPEG,
+ .bFrameIndex = 2,
+ .bmCapabilities = 0,
+ .wWidth = cpu_to_le16(1280),
+@@ -266,7 +266,7 @@ static const struct UVC_FRAME_MJPEG(1) u
+ static const struct uvc_color_matching_descriptor uvc_color_matching = {
+ .bLength = UVC_DT_COLOR_MATCHING_SIZE,
+ .bDescriptorType = USB_DT_CS_INTERFACE,
+- .bDescriptorSubType = UVC_DT_COLOR_MATCHING,
++ .bDescriptorSubType = UVC_VS_COLORFORMAT,
+ .bColorPrimaries = 1,
+ .bTransferCharacteristics = 1,
+ .bMatrixCoefficients = 4,
+--- a/include/linux/usb/video.h
++++ b/include/linux/usb/video.h
+@@ -160,5 +160,402 @@
+ #define UVC_STATUS_TYPE_CONTROL 1
+ #define UVC_STATUS_TYPE_STREAMING 2
+
++/* 2.4.3.3. Payload Header Information */
++#define UVC_STREAM_EOH (1 << 7)
++#define UVC_STREAM_ERR (1 << 6)
++#define UVC_STREAM_STI (1 << 5)
++#define UVC_STREAM_RES (1 << 4)
++#define UVC_STREAM_SCR (1 << 3)
++#define UVC_STREAM_PTS (1 << 2)
++#define UVC_STREAM_EOF (1 << 1)
++#define UVC_STREAM_FID (1 << 0)
++
++/* ------------------------------------------------------------------------
++ * UVC structures
++ */
++
++/* All UVC descriptors have these 3 fields at the beginning */
++struct uvc_descriptor_header {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++} __attribute__((packed));
++
++/* 3.7.2. Video Control Interface Header Descriptor */
++struct uvc_header_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u16 bcdUVC;
++ __u16 wTotalLength;
++ __u32 dwClockFrequency;
++ __u8 bInCollection;
++ __u8 baInterfaceNr[];
++} __attribute__((__packed__));
++
++#define UVC_DT_HEADER_SIZE(n) (12+(n))
++
++#define UVC_HEADER_DESCRIPTOR(n) \
++ uvc_header_descriptor_##n
++
++#define DECLARE_UVC_HEADER_DESCRIPTOR(n) \
++struct UVC_HEADER_DESCRIPTOR(n) { \
++ __u8 bLength; \
++ __u8 bDescriptorType; \
++ __u8 bDescriptorSubType; \
++ __u16 bcdUVC; \
++ __u16 wTotalLength; \
++ __u32 dwClockFrequency; \
++ __u8 bInCollection; \
++ __u8 baInterfaceNr[n]; \
++} __attribute__ ((packed))
++
++/* 3.7.2.1. Input Terminal Descriptor */
++struct uvc_input_terminal_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bTerminalID;
++ __u16 wTerminalType;
++ __u8 bAssocTerminal;
++ __u8 iTerminal;
++} __attribute__((__packed__));
++
++#define UVC_DT_INPUT_TERMINAL_SIZE 8
++
++/* 3.7.2.2. Output Terminal Descriptor */
++struct uvc_output_terminal_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bTerminalID;
++ __u16 wTerminalType;
++ __u8 bAssocTerminal;
++ __u8 bSourceID;
++ __u8 iTerminal;
++} __attribute__((__packed__));
++
++#define UVC_DT_OUTPUT_TERMINAL_SIZE 9
++
++/* 3.7.2.3. Camera Terminal Descriptor */
++struct uvc_camera_terminal_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bTerminalID;
++ __u16 wTerminalType;
++ __u8 bAssocTerminal;
++ __u8 iTerminal;
++ __u16 wObjectiveFocalLengthMin;
++ __u16 wObjectiveFocalLengthMax;
++ __u16 wOcularFocalLength;
++ __u8 bControlSize;
++ __u8 bmControls[3];
++} __attribute__((__packed__));
++
++#define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n))
++
++/* 3.7.2.4. Selector Unit Descriptor */
++struct uvc_selector_unit_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bUnitID;
++ __u8 bNrInPins;
++ __u8 baSourceID[0];
++ __u8 iSelector;
++} __attribute__((__packed__));
++
++#define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n))
++
++#define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \
++ uvc_selector_unit_descriptor_##n
++
++#define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \
++struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \
++ __u8 bLength; \
++ __u8 bDescriptorType; \
++ __u8 bDescriptorSubType; \
++ __u8 bUnitID; \
++ __u8 bNrInPins; \
++ __u8 baSourceID[n]; \
++ __u8 iSelector; \
++} __attribute__ ((packed))
++
++/* 3.7.2.5. Processing Unit Descriptor */
++struct uvc_processing_unit_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bUnitID;
++ __u8 bSourceID;
++ __u16 wMaxMultiplier;
++ __u8 bControlSize;
++ __u8 bmControls[2];
++ __u8 iProcessing;
++} __attribute__((__packed__));
++
++#define UVC_DT_PROCESSING_UNIT_SIZE(n) (9+(n))
++
++/* 3.7.2.6. Extension Unit Descriptor */
++struct uvc_extension_unit_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bUnitID;
++ __u8 guidExtensionCode[16];
++ __u8 bNumControls;
++ __u8 bNrInPins;
++ __u8 baSourceID[0];
++ __u8 bControlSize;
++ __u8 bmControls[0];
++ __u8 iExtension;
++} __attribute__((__packed__));
++
++#define UVC_DT_EXTENSION_UNIT_SIZE(p, n) (24+(p)+(n))
++
++#define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
++ uvc_extension_unit_descriptor_##p_##n
++
++#define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
++struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \
++ __u8 bLength; \
++ __u8 bDescriptorType; \
++ __u8 bDescriptorSubType; \
++ __u8 bUnitID; \
++ __u8 guidExtensionCode[16]; \
++ __u8 bNumControls; \
++ __u8 bNrInPins; \
++ __u8 baSourceID[p]; \
++ __u8 bControlSize; \
++ __u8 bmControls[n]; \
++ __u8 iExtension; \
++} __attribute__ ((packed))
++
++/* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */
++struct uvc_control_endpoint_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u16 wMaxTransferSize;
++} __attribute__((__packed__));
++
++#define UVC_DT_CONTROL_ENDPOINT_SIZE 5
++
++/* 3.9.2.1. Input Header Descriptor */
++struct uvc_input_header_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bNumFormats;
++ __u16 wTotalLength;
++ __u8 bEndpointAddress;
++ __u8 bmInfo;
++ __u8 bTerminalLink;
++ __u8 bStillCaptureMethod;
++ __u8 bTriggerSupport;
++ __u8 bTriggerUsage;
++ __u8 bControlSize;
++ __u8 bmaControls[];
++} __attribute__((__packed__));
++
++#define UVC_DT_INPUT_HEADER_SIZE(n, p) (13+(n*p))
++
++#define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
++ uvc_input_header_descriptor_##n_##p
++
++#define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
++struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \
++ __u8 bLength; \
++ __u8 bDescriptorType; \
++ __u8 bDescriptorSubType; \
++ __u8 bNumFormats; \
++ __u16 wTotalLength; \
++ __u8 bEndpointAddress; \
++ __u8 bmInfo; \
++ __u8 bTerminalLink; \
++ __u8 bStillCaptureMethod; \
++ __u8 bTriggerSupport; \
++ __u8 bTriggerUsage; \
++ __u8 bControlSize; \
++ __u8 bmaControls[p][n]; \
++} __attribute__ ((packed))
++
++/* 3.9.2.2. Output Header Descriptor */
++struct uvc_output_header_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bNumFormats;
++ __u16 wTotalLength;
++ __u8 bEndpointAddress;
++ __u8 bTerminalLink;
++ __u8 bControlSize;
++ __u8 bmaControls[];
++} __attribute__((__packed__));
++
++#define UVC_DT_OUTPUT_HEADER_SIZE(n, p) (9+(n*p))
++
++#define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
++ uvc_output_header_descriptor_##n_##p
++
++#define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
++struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \
++ __u8 bLength; \
++ __u8 bDescriptorType; \
++ __u8 bDescriptorSubType; \
++ __u8 bNumFormats; \
++ __u16 wTotalLength; \
++ __u8 bEndpointAddress; \
++ __u8 bTerminalLink; \
++ __u8 bControlSize; \
++ __u8 bmaControls[p][n]; \
++} __attribute__ ((packed))
++
++/* 3.9.2.6. Color matching descriptor */
++struct uvc_color_matching_descriptor {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bColorPrimaries;
++ __u8 bTransferCharacteristics;
++ __u8 bMatrixCoefficients;
++} __attribute__((__packed__));
++
++#define UVC_DT_COLOR_MATCHING_SIZE 6
++
++/* 4.3.1.1. Video Probe and Commit Controls */
++struct uvc_streaming_control {
++ __u16 bmHint;
++ __u8 bFormatIndex;
++ __u8 bFrameIndex;
++ __u32 dwFrameInterval;
++ __u16 wKeyFrameRate;
++ __u16 wPFrameRate;
++ __u16 wCompQuality;
++ __u16 wCompWindowSize;
++ __u16 wDelay;
++ __u32 dwMaxVideoFrameSize;
++ __u32 dwMaxPayloadTransferSize;
++ __u32 dwClockFrequency;
++ __u8 bmFramingInfo;
++ __u8 bPreferedVersion;
++ __u8 bMinVersion;
++ __u8 bMaxVersion;
++} __attribute__((__packed__));
++
++/* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */
++struct uvc_format_uncompressed {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bFormatIndex;
++ __u8 bNumFrameDescriptors;
++ __u8 guidFormat[16];
++ __u8 bBitsPerPixel;
++ __u8 bDefaultFrameIndex;
++ __u8 bAspectRatioX;
++ __u8 bAspectRatioY;
++ __u8 bmInterfaceFlags;
++ __u8 bCopyProtect;
++} __attribute__((__packed__));
++
++#define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27
++
++/* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */
++struct uvc_frame_uncompressed {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bFrameIndex;
++ __u8 bmCapabilities;
++ __u16 wWidth;
++ __u16 wHeight;
++ __u32 dwMinBitRate;
++ __u32 dwMaxBitRate;
++ __u32 dwMaxVideoFrameBufferSize;
++ __u32 dwDefaultFrameInterval;
++ __u8 bFrameIntervalType;
++ __u32 dwFrameInterval[];
++} __attribute__((__packed__));
++
++#define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n))
++
++#define UVC_FRAME_UNCOMPRESSED(n) \
++ uvc_frame_uncompressed_##n
++
++#define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \
++struct UVC_FRAME_UNCOMPRESSED(n) { \
++ __u8 bLength; \
++ __u8 bDescriptorType; \
++ __u8 bDescriptorSubType; \
++ __u8 bFrameIndex; \
++ __u8 bmCapabilities; \
++ __u16 wWidth; \
++ __u16 wHeight; \
++ __u32 dwMinBitRate; \
++ __u32 dwMaxBitRate; \
++ __u32 dwMaxVideoFrameBufferSize; \
++ __u32 dwDefaultFrameInterval; \
++ __u8 bFrameIntervalType; \
++ __u32 dwFrameInterval[n]; \
++} __attribute__ ((packed))
++
++/* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
++struct uvc_format_mjpeg {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bFormatIndex;
++ __u8 bNumFrameDescriptors;
++ __u8 bmFlags;
++ __u8 bDefaultFrameIndex;
++ __u8 bAspectRatioX;
++ __u8 bAspectRatioY;
++ __u8 bmInterfaceFlags;
++ __u8 bCopyProtect;
++} __attribute__((__packed__));
++
++#define UVC_DT_FORMAT_MJPEG_SIZE 11
++
++/* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */
++struct uvc_frame_mjpeg {
++ __u8 bLength;
++ __u8 bDescriptorType;
++ __u8 bDescriptorSubType;
++ __u8 bFrameIndex;
++ __u8 bmCapabilities;
++ __u16 wWidth;
++ __u16 wHeight;
++ __u32 dwMinBitRate;
++ __u32 dwMaxBitRate;
++ __u32 dwMaxVideoFrameBufferSize;
++ __u32 dwDefaultFrameInterval;
++ __u8 bFrameIntervalType;
++ __u32 dwFrameInterval[];
++} __attribute__((__packed__));
++
++#define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n))
++
++#define UVC_FRAME_MJPEG(n) \
++ uvc_frame_mjpeg_##n
++
++#define DECLARE_UVC_FRAME_MJPEG(n) \
++struct UVC_FRAME_MJPEG(n) { \
++ __u8 bLength; \
++ __u8 bDescriptorType; \
++ __u8 bDescriptorSubType; \
++ __u8 bFrameIndex; \
++ __u8 bmCapabilities; \
++ __u16 wWidth; \
++ __u16 wHeight; \
++ __u32 dwMinBitRate; \
++ __u32 dwMaxBitRate; \
++ __u32 dwMaxVideoFrameBufferSize; \
++ __u32 dwDefaultFrameInterval; \
++ __u8 bFrameIntervalType; \
++ __u32 dwFrameInterval[n]; \
++} __attribute__ ((packed))
++
+ #endif /* __LINUX_USB_VIDEO_H */
+