Hi Michael, I've just realized that this patch got merged. There's an issue, please see below. On Sat, Sep 10, 2022 at 12:13:33AM +0200, Michael Grzeschik wrote: > The uvc_format_desc, GUID defines and the uvc_format_by_guid helper is > also useful for the uvc gadget stack. This patch moves them to a common > header. > > Reviewed-by: Daniel Scally <dan.scally@xxxxxxxxxxxxxxxx> > Tested-by: Daniel Scally <dan.scally@xxxxxxxxxxxxxxxx> > Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx> > > --- > v13 -> v1: > - added Reviewed-by and Tested-by from Dan > - moved to this smaller patch series > v1 -> v2: > - > > drivers/media/usb/uvc/uvc_ctrl.c | 1 + > drivers/media/usb/uvc/uvc_driver.c | 206 +---------------- > drivers/media/usb/uvc/uvcvideo.h | 144 ------------ > include/media/v4l2-uvc.h | 359 +++++++++++++++++++++++++++++ > 4 files changed, 361 insertions(+), 349 deletions(-) > create mode 100644 include/media/v4l2-uvc.h > > diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c > index 8c208db9600b46..b8a00a51679f6d 100644 > --- a/drivers/media/usb/uvc/uvc_ctrl.c > +++ b/drivers/media/usb/uvc/uvc_ctrl.c > @@ -18,6 +18,7 @@ > #include <linux/workqueue.h> > #include <linux/atomic.h> > #include <media/v4l2-ctrls.h> > +#include <media/v4l2-uvc.h> > > #include "uvcvideo.h" > > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c > index 0f14dee4b6d794..2891bc9d319280 100644 > --- a/drivers/media/usb/uvc/uvc_driver.c > +++ b/drivers/media/usb/uvc/uvc_driver.c > @@ -20,6 +20,7 @@ > > #include <media/v4l2-common.h> > #include <media/v4l2-ioctl.h> > +#include <media/v4l2-uvc.h> > > #include "uvcvideo.h" > > @@ -34,198 +35,6 @@ static unsigned int uvc_quirks_param = -1; > unsigned int uvc_dbg_param; > unsigned int uvc_timeout_param = UVC_CTRL_STREAMING_TIMEOUT; > > -/* ------------------------------------------------------------------------ > - * Video formats > - */ > - > -static struct uvc_format_desc uvc_fmts[] = { > - { > - .name = "YUV 4:2:2 (YUYV)", > - .guid = UVC_GUID_FORMAT_YUY2, > - .fcc = V4L2_PIX_FMT_YUYV, > - }, > - { > - .name = "YUV 4:2:2 (YUYV)", > - .guid = UVC_GUID_FORMAT_YUY2_ISIGHT, > - .fcc = V4L2_PIX_FMT_YUYV, > - }, > - { > - .name = "YUV 4:2:0 (NV12)", > - .guid = UVC_GUID_FORMAT_NV12, > - .fcc = V4L2_PIX_FMT_NV12, > - }, > - { > - .name = "MJPEG", > - .guid = UVC_GUID_FORMAT_MJPEG, > - .fcc = V4L2_PIX_FMT_MJPEG, > - }, > - { > - .name = "YVU 4:2:0 (YV12)", > - .guid = UVC_GUID_FORMAT_YV12, > - .fcc = V4L2_PIX_FMT_YVU420, > - }, > - { > - .name = "YUV 4:2:0 (I420)", > - .guid = UVC_GUID_FORMAT_I420, > - .fcc = V4L2_PIX_FMT_YUV420, > - }, > - { > - .name = "YUV 4:2:0 (M420)", > - .guid = UVC_GUID_FORMAT_M420, > - .fcc = V4L2_PIX_FMT_M420, > - }, > - { > - .name = "YUV 4:2:2 (UYVY)", > - .guid = UVC_GUID_FORMAT_UYVY, > - .fcc = V4L2_PIX_FMT_UYVY, > - }, > - { > - .name = "Greyscale 8-bit (Y800)", > - .guid = UVC_GUID_FORMAT_Y800, > - .fcc = V4L2_PIX_FMT_GREY, > - }, > - { > - .name = "Greyscale 8-bit (Y8 )", > - .guid = UVC_GUID_FORMAT_Y8, > - .fcc = V4L2_PIX_FMT_GREY, > - }, > - { > - .name = "Greyscale 8-bit (D3DFMT_L8)", > - .guid = UVC_GUID_FORMAT_D3DFMT_L8, > - .fcc = V4L2_PIX_FMT_GREY, > - }, > - { > - .name = "IR 8-bit (L8_IR)", > - .guid = UVC_GUID_FORMAT_KSMEDIA_L8_IR, > - .fcc = V4L2_PIX_FMT_GREY, > - }, > - { > - .name = "Greyscale 10-bit (Y10 )", > - .guid = UVC_GUID_FORMAT_Y10, > - .fcc = V4L2_PIX_FMT_Y10, > - }, > - { > - .name = "Greyscale 12-bit (Y12 )", > - .guid = UVC_GUID_FORMAT_Y12, > - .fcc = V4L2_PIX_FMT_Y12, > - }, > - { > - .name = "Greyscale 16-bit (Y16 )", > - .guid = UVC_GUID_FORMAT_Y16, > - .fcc = V4L2_PIX_FMT_Y16, > - }, > - { > - .name = "BGGR Bayer (BY8 )", > - .guid = UVC_GUID_FORMAT_BY8, > - .fcc = V4L2_PIX_FMT_SBGGR8, > - }, > - { > - .name = "BGGR Bayer (BA81)", > - .guid = UVC_GUID_FORMAT_BA81, > - .fcc = V4L2_PIX_FMT_SBGGR8, > - }, > - { > - .name = "GBRG Bayer (GBRG)", > - .guid = UVC_GUID_FORMAT_GBRG, > - .fcc = V4L2_PIX_FMT_SGBRG8, > - }, > - { > - .name = "GRBG Bayer (GRBG)", > - .guid = UVC_GUID_FORMAT_GRBG, > - .fcc = V4L2_PIX_FMT_SGRBG8, > - }, > - { > - .name = "RGGB Bayer (RGGB)", > - .guid = UVC_GUID_FORMAT_RGGB, > - .fcc = V4L2_PIX_FMT_SRGGB8, > - }, > - { > - .name = "RGB565", > - .guid = UVC_GUID_FORMAT_RGBP, > - .fcc = V4L2_PIX_FMT_RGB565, > - }, > - { > - .name = "BGR 8:8:8 (BGR3)", > - .guid = UVC_GUID_FORMAT_BGR3, > - .fcc = V4L2_PIX_FMT_BGR24, > - }, > - { > - .name = "H.264", > - .guid = UVC_GUID_FORMAT_H264, > - .fcc = V4L2_PIX_FMT_H264, > - }, > - { > - .name = "H.265", > - .guid = UVC_GUID_FORMAT_H265, > - .fcc = V4L2_PIX_FMT_HEVC, > - }, > - { > - .name = "Greyscale 8 L/R (Y8I)", > - .guid = UVC_GUID_FORMAT_Y8I, > - .fcc = V4L2_PIX_FMT_Y8I, > - }, > - { > - .name = "Greyscale 12 L/R (Y12I)", > - .guid = UVC_GUID_FORMAT_Y12I, > - .fcc = V4L2_PIX_FMT_Y12I, > - }, > - { > - .name = "Depth data 16-bit (Z16)", > - .guid = UVC_GUID_FORMAT_Z16, > - .fcc = V4L2_PIX_FMT_Z16, > - }, > - { > - .name = "Bayer 10-bit (SRGGB10P)", > - .guid = UVC_GUID_FORMAT_RW10, > - .fcc = V4L2_PIX_FMT_SRGGB10P, > - }, > - { > - .name = "Bayer 16-bit (SBGGR16)", > - .guid = UVC_GUID_FORMAT_BG16, > - .fcc = V4L2_PIX_FMT_SBGGR16, > - }, > - { > - .name = "Bayer 16-bit (SGBRG16)", > - .guid = UVC_GUID_FORMAT_GB16, > - .fcc = V4L2_PIX_FMT_SGBRG16, > - }, > - { > - .name = "Bayer 16-bit (SRGGB16)", > - .guid = UVC_GUID_FORMAT_RG16, > - .fcc = V4L2_PIX_FMT_SRGGB16, > - }, > - { > - .name = "Bayer 16-bit (SGRBG16)", > - .guid = UVC_GUID_FORMAT_GR16, > - .fcc = V4L2_PIX_FMT_SGRBG16, > - }, > - { > - .name = "Depth data 16-bit (Z16)", > - .guid = UVC_GUID_FORMAT_INVZ, > - .fcc = V4L2_PIX_FMT_Z16, > - }, > - { > - .name = "Greyscale 10-bit (Y10 )", > - .guid = UVC_GUID_FORMAT_INVI, > - .fcc = V4L2_PIX_FMT_Y10, > - }, > - { > - .name = "IR:Depth 26-bit (INZI)", > - .guid = UVC_GUID_FORMAT_INZI, > - .fcc = V4L2_PIX_FMT_INZI, > - }, > - { > - .name = "4-bit Depth Confidence (Packed)", > - .guid = UVC_GUID_FORMAT_CNF4, > - .fcc = V4L2_PIX_FMT_CNF4, > - }, > - { > - .name = "HEVC", > - .guid = UVC_GUID_FORMAT_HEVC, > - .fcc = V4L2_PIX_FMT_HEVC, > - }, > -}; > - > /* ------------------------------------------------------------------------ > * Utility functions > */ > @@ -245,19 +54,6 @@ struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts, > return NULL; > } > > -static struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]) > -{ > - unsigned int len = ARRAY_SIZE(uvc_fmts); > - unsigned int i; > - > - for (i = 0; i < len; ++i) { > - if (memcmp(guid, uvc_fmts[i].guid, 16) == 0) > - return &uvc_fmts[i]; > - } > - > - return NULL; > -} > - > static enum v4l2_colorspace uvc_colorspace(const u8 primaries) > { > static const enum v4l2_colorspace colorprimaries[] = { > diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h > index ff710bdd38b3fd..df93db259312e7 100644 > --- a/drivers/media/usb/uvc/uvcvideo.h > +++ b/drivers/media/usb/uvc/uvcvideo.h > @@ -41,144 +41,6 @@ > #define UVC_EXT_GPIO_UNIT 0x7ffe > #define UVC_EXT_GPIO_UNIT_ID 0x100 > > -/* ------------------------------------------------------------------------ > - * GUIDs > - */ > -#define UVC_GUID_UVC_CAMERA \ > - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} > -#define UVC_GUID_UVC_OUTPUT \ > - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02} > -#define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \ > - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03} > -#define UVC_GUID_UVC_PROCESSING \ > - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01} > -#define UVC_GUID_UVC_SELECTOR \ > - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02} > -#define UVC_GUID_EXT_GPIO_CONTROLLER \ > - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03} > - > -#define UVC_GUID_FORMAT_MJPEG \ > - { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_YUY2 \ > - { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_YUY2_ISIGHT \ > - { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_NV12 \ > - { 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_YV12 \ > - { 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_I420 \ > - { 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_UYVY \ > - { 'U', 'Y', 'V', 'Y', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Y800 \ > - { 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Y8 \ > - { 'Y', '8', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Y10 \ > - { 'Y', '1', '0', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Y12 \ > - { 'Y', '1', '2', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Y16 \ > - { 'Y', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_BY8 \ > - { 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_BA81 \ > - { 'B', 'A', '8', '1', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_GBRG \ > - { 'G', 'B', 'R', 'G', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_GRBG \ > - { 'G', 'R', 'B', 'G', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_RGGB \ > - { 'R', 'G', 'G', 'B', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_BG16 \ > - { 'B', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_GB16 \ > - { 'G', 'B', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_RG16 \ > - { 'R', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_GR16 \ > - { 'G', 'R', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_RGBP \ > - { 'R', 'G', 'B', 'P', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_BGR3 \ > - { 0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ > - 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70} > -#define UVC_GUID_FORMAT_M420 \ > - { 'M', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > - > -#define UVC_GUID_FORMAT_H264 \ > - { 'H', '2', '6', '4', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_H265 \ > - { 'H', '2', '6', '5', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Y8I \ > - { 'Y', '8', 'I', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Y12I \ > - { 'Y', '1', '2', 'I', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_Z16 \ > - { 'Z', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_RW10 \ > - { 'R', 'W', '1', '0', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_INVZ \ > - { 'I', 'N', 'V', 'Z', 0x90, 0x2d, 0x58, 0x4a, \ > - 0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b} > -#define UVC_GUID_FORMAT_INZI \ > - { 'I', 'N', 'Z', 'I', 0x66, 0x1a, 0x42, 0xa2, \ > - 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a} > -#define UVC_GUID_FORMAT_INVI \ > - { 'I', 'N', 'V', 'I', 0xdb, 0x57, 0x49, 0x5e, \ > - 0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f} > -#define UVC_GUID_FORMAT_CNF4 \ > - { 'C', ' ', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > - > -#define UVC_GUID_FORMAT_D3DFMT_L8 \ > - {0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > -#define UVC_GUID_FORMAT_KSMEDIA_L8_IR \ > - {0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > - > -#define UVC_GUID_FORMAT_HEVC \ > - { 'H', 'E', 'V', 'C', 0x00, 0x00, 0x10, 0x00, \ > - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > - > - > /* ------------------------------------------------------------------------ > * Driver specific constants. > */ > @@ -283,12 +145,6 @@ struct uvc_control { > struct uvc_fh *handle; /* File handle that last changed the control. */ > }; > > -struct uvc_format_desc { > - char *name; > - u8 guid[16]; > - u32 fcc; > -}; > - > /* > * The term 'entity' refers to both UVC units and UVC terminals. > * > diff --git a/include/media/v4l2-uvc.h b/include/media/v4l2-uvc.h > new file mode 100644 > index 00000000000000..f83e31661333bb > --- /dev/null > +++ b/include/media/v4l2-uvc.h > @@ -0,0 +1,359 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * v4l2 uvc internal API header > + * > + * Some commonly needed functions for uvc drivers > + */ > + > +#ifndef __LINUX_V4L2_UVC_H > +#define __LINUX_V4L2_UVC_H > + > +/* ------------------------------------------------------------------------ > + * GUIDs > + */ > +#define UVC_GUID_UVC_CAMERA \ > + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} > +#define UVC_GUID_UVC_OUTPUT \ > + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02} > +#define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \ > + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03} > +#define UVC_GUID_UVC_PROCESSING \ > + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01} > +#define UVC_GUID_UVC_SELECTOR \ > + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02} > +#define UVC_GUID_EXT_GPIO_CONTROLLER \ > + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03} > + > +#define UVC_GUID_FORMAT_MJPEG \ > + { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_YUY2 \ > + { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_YUY2_ISIGHT \ > + { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_NV12 \ > + { 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_YV12 \ > + { 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_I420 \ > + { 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_UYVY \ > + { 'U', 'Y', 'V', 'Y', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Y800 \ > + { 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Y8 \ > + { 'Y', '8', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Y10 \ > + { 'Y', '1', '0', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Y12 \ > + { 'Y', '1', '2', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Y16 \ > + { 'Y', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_BY8 \ > + { 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_BA81 \ > + { 'B', 'A', '8', '1', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_GBRG \ > + { 'G', 'B', 'R', 'G', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_GRBG \ > + { 'G', 'R', 'B', 'G', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_RGGB \ > + { 'R', 'G', 'G', 'B', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_BG16 \ > + { 'B', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_GB16 \ > + { 'G', 'B', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_RG16 \ > + { 'R', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_GR16 \ > + { 'G', 'R', '1', '6', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_RGBP \ > + { 'R', 'G', 'B', 'P', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_BGR3 \ > + { 0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ > + 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70} > +#define UVC_GUID_FORMAT_M420 \ > + { 'M', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > + > +#define UVC_GUID_FORMAT_H264 \ > + { 'H', '2', '6', '4', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_H265 \ > + { 'H', '2', '6', '5', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Y8I \ > + { 'Y', '8', 'I', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Y12I \ > + { 'Y', '1', '2', 'I', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_Z16 \ > + { 'Z', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_RW10 \ > + { 'R', 'W', '1', '0', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_INVZ \ > + { 'I', 'N', 'V', 'Z', 0x90, 0x2d, 0x58, 0x4a, \ > + 0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b} > +#define UVC_GUID_FORMAT_INZI \ > + { 'I', 'N', 'Z', 'I', 0x66, 0x1a, 0x42, 0xa2, \ > + 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a} > +#define UVC_GUID_FORMAT_INVI \ > + { 'I', 'N', 'V', 'I', 0xdb, 0x57, 0x49, 0x5e, \ > + 0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f} > +#define UVC_GUID_FORMAT_CNF4 \ > + { 'C', ' ', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > + > +#define UVC_GUID_FORMAT_D3DFMT_L8 \ > + {0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > +#define UVC_GUID_FORMAT_KSMEDIA_L8_IR \ > + {0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > + > +#define UVC_GUID_FORMAT_HEVC \ > + { 'H', 'E', 'V', 'C', 0x00, 0x00, 0x10, 0x00, \ > + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} > + > +/* ------------------------------------------------------------------------ > + * Video formats > + */ > + > +struct uvc_format_desc { > + char *name; > + u8 guid[16]; > + u32 fcc; > +}; > + > +static struct uvc_format_desc uvc_fmts[] = { > + { > + .name = "YUV 4:2:2 (YUYV)", > + .guid = UVC_GUID_FORMAT_YUY2, > + .fcc = V4L2_PIX_FMT_YUYV, > + }, > + { > + .name = "YUV 4:2:2 (YUYV)", > + .guid = UVC_GUID_FORMAT_YUY2_ISIGHT, > + .fcc = V4L2_PIX_FMT_YUYV, > + }, > + { > + .name = "YUV 4:2:0 (NV12)", > + .guid = UVC_GUID_FORMAT_NV12, > + .fcc = V4L2_PIX_FMT_NV12, > + }, > + { > + .name = "MJPEG", > + .guid = UVC_GUID_FORMAT_MJPEG, > + .fcc = V4L2_PIX_FMT_MJPEG, > + }, > + { > + .name = "YVU 4:2:0 (YV12)", > + .guid = UVC_GUID_FORMAT_YV12, > + .fcc = V4L2_PIX_FMT_YVU420, > + }, > + { > + .name = "YUV 4:2:0 (I420)", > + .guid = UVC_GUID_FORMAT_I420, > + .fcc = V4L2_PIX_FMT_YUV420, > + }, > + { > + .name = "YUV 4:2:0 (M420)", > + .guid = UVC_GUID_FORMAT_M420, > + .fcc = V4L2_PIX_FMT_M420, > + }, > + { > + .name = "YUV 4:2:2 (UYVY)", > + .guid = UVC_GUID_FORMAT_UYVY, > + .fcc = V4L2_PIX_FMT_UYVY, > + }, > + { > + .name = "Greyscale 8-bit (Y800)", > + .guid = UVC_GUID_FORMAT_Y800, > + .fcc = V4L2_PIX_FMT_GREY, > + }, > + { > + .name = "Greyscale 8-bit (Y8 )", > + .guid = UVC_GUID_FORMAT_Y8, > + .fcc = V4L2_PIX_FMT_GREY, > + }, > + { > + .name = "Greyscale 8-bit (D3DFMT_L8)", > + .guid = UVC_GUID_FORMAT_D3DFMT_L8, > + .fcc = V4L2_PIX_FMT_GREY, > + }, > + { > + .name = "IR 8-bit (L8_IR)", > + .guid = UVC_GUID_FORMAT_KSMEDIA_L8_IR, > + .fcc = V4L2_PIX_FMT_GREY, > + }, > + { > + .name = "Greyscale 10-bit (Y10 )", > + .guid = UVC_GUID_FORMAT_Y10, > + .fcc = V4L2_PIX_FMT_Y10, > + }, > + { > + .name = "Greyscale 12-bit (Y12 )", > + .guid = UVC_GUID_FORMAT_Y12, > + .fcc = V4L2_PIX_FMT_Y12, > + }, > + { > + .name = "Greyscale 16-bit (Y16 )", > + .guid = UVC_GUID_FORMAT_Y16, > + .fcc = V4L2_PIX_FMT_Y16, > + }, > + { > + .name = "BGGR Bayer (BY8 )", > + .guid = UVC_GUID_FORMAT_BY8, > + .fcc = V4L2_PIX_FMT_SBGGR8, > + }, > + { > + .name = "BGGR Bayer (BA81)", > + .guid = UVC_GUID_FORMAT_BA81, > + .fcc = V4L2_PIX_FMT_SBGGR8, > + }, > + { > + .name = "GBRG Bayer (GBRG)", > + .guid = UVC_GUID_FORMAT_GBRG, > + .fcc = V4L2_PIX_FMT_SGBRG8, > + }, > + { > + .name = "GRBG Bayer (GRBG)", > + .guid = UVC_GUID_FORMAT_GRBG, > + .fcc = V4L2_PIX_FMT_SGRBG8, > + }, > + { > + .name = "RGGB Bayer (RGGB)", > + .guid = UVC_GUID_FORMAT_RGGB, > + .fcc = V4L2_PIX_FMT_SRGGB8, > + }, > + { > + .name = "RGB565", > + .guid = UVC_GUID_FORMAT_RGBP, > + .fcc = V4L2_PIX_FMT_RGB565, > + }, > + { > + .name = "BGR 8:8:8 (BGR3)", > + .guid = UVC_GUID_FORMAT_BGR3, > + .fcc = V4L2_PIX_FMT_BGR24, > + }, > + { > + .name = "H.264", > + .guid = UVC_GUID_FORMAT_H264, > + .fcc = V4L2_PIX_FMT_H264, > + }, > + { > + .name = "H.265", > + .guid = UVC_GUID_FORMAT_H265, > + .fcc = V4L2_PIX_FMT_HEVC, > + }, > + { > + .name = "Greyscale 8 L/R (Y8I)", > + .guid = UVC_GUID_FORMAT_Y8I, > + .fcc = V4L2_PIX_FMT_Y8I, > + }, > + { > + .name = "Greyscale 12 L/R (Y12I)", > + .guid = UVC_GUID_FORMAT_Y12I, > + .fcc = V4L2_PIX_FMT_Y12I, > + }, > + { > + .name = "Depth data 16-bit (Z16)", > + .guid = UVC_GUID_FORMAT_Z16, > + .fcc = V4L2_PIX_FMT_Z16, > + }, > + { > + .name = "Bayer 10-bit (SRGGB10P)", > + .guid = UVC_GUID_FORMAT_RW10, > + .fcc = V4L2_PIX_FMT_SRGGB10P, > + }, > + { > + .name = "Bayer 16-bit (SBGGR16)", > + .guid = UVC_GUID_FORMAT_BG16, > + .fcc = V4L2_PIX_FMT_SBGGR16, > + }, > + { > + .name = "Bayer 16-bit (SGBRG16)", > + .guid = UVC_GUID_FORMAT_GB16, > + .fcc = V4L2_PIX_FMT_SGBRG16, > + }, > + { > + .name = "Bayer 16-bit (SRGGB16)", > + .guid = UVC_GUID_FORMAT_RG16, > + .fcc = V4L2_PIX_FMT_SRGGB16, > + }, > + { > + .name = "Bayer 16-bit (SGRBG16)", > + .guid = UVC_GUID_FORMAT_GR16, > + .fcc = V4L2_PIX_FMT_SGRBG16, > + }, > + { > + .name = "Depth data 16-bit (Z16)", > + .guid = UVC_GUID_FORMAT_INVZ, > + .fcc = V4L2_PIX_FMT_Z16, > + }, > + { > + .name = "Greyscale 10-bit (Y10 )", > + .guid = UVC_GUID_FORMAT_INVI, > + .fcc = V4L2_PIX_FMT_Y10, > + }, > + { > + .name = "IR:Depth 26-bit (INZI)", > + .guid = UVC_GUID_FORMAT_INZI, > + .fcc = V4L2_PIX_FMT_INZI, > + }, > + { > + .name = "4-bit Depth Confidence (Packed)", > + .guid = UVC_GUID_FORMAT_CNF4, > + .fcc = V4L2_PIX_FMT_CNF4, > + }, > + { > + .name = "HEVC", > + .guid = UVC_GUID_FORMAT_HEVC, > + .fcc = V4L2_PIX_FMT_HEVC, > + }, > +}; This large table is now duplicated in all compilation units in which this header is included. That's not good. Could you please send a patch to fix that ? > + > +static inline struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]) > +{ > + unsigned int len = ARRAY_SIZE(uvc_fmts); > + unsigned int i; > + > + for (i = 0; i < len; ++i) { > + if (memcmp(guid, uvc_fmts[i].guid, 16) == 0) > + return &uvc_fmts[i]; > + } > + > + return NULL; > +} While at it, please also de-duplicate this function. > + > +#endif /* __LINUX_V4L2_UVC_H */ -- Regards, Laurent Pinchart