All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] usb: uvc: improve header files and function use
@ 2022-12-12 19:47 Michael Grzeschik
  2022-12-12 19:47 ` [PATCH 1/5] usb: uvc: move media/v4l2-uvc.h to usb/uvc.h Michael Grzeschik
                   ` (5 more replies)
  0 siblings, 6 replies; 14+ messages in thread
From: Michael Grzeschik @ 2022-12-12 19:47 UTC (permalink / raw)
  To: laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

This series is improving the use of the uvc_format_desc
in v4l2-uvc.h and also reuses the declarative strings from
v4l_fill_fmtdesc.

Michael Grzeschik (5):
  usb: uvc: move media/v4l2-uvc.h to usb/uvc.h
  usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit
  usb: uvc: make uvc_format_desc table const
  media: v4l2: move v4l_fill_fmtdesc to common v4l2_fill_fmtdesc
    function
  usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name

 drivers/media/common/Kconfig                  |   3 +
 drivers/media/common/Makefile                 |   1 +
 drivers/media/common/uvc.c                    | 177 ++++++++++++
 drivers/media/usb/uvc/Kconfig                 |   1 +
 drivers/media/usb/uvc/uvc_ctrl.c              |   2 +-
 drivers/media/usb/uvc/uvc_driver.c            |  12 +-
 drivers/media/v4l2-core/v4l2-common.c         | 263 +++++++++++++++++
 drivers/media/v4l2-core/v4l2-ioctl.c          | 264 +-----------------
 drivers/usb/gadget/Kconfig                    |   1 +
 drivers/usb/gadget/function/uvc_v4l2.c        |  16 +-
 include/{media/v4l2-uvc.h => linux/usb/uvc.h} | 206 +-------------
 include/media/v4l2-common.h                   |   2 +
 12 files changed, 466 insertions(+), 482 deletions(-)
 create mode 100644 drivers/media/common/uvc.c
 rename include/{media/v4l2-uvc.h => linux/usb/uvc.h} (59%)

-- 
2.30.2


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/5] usb: uvc: move media/v4l2-uvc.h to usb/uvc.h
  2022-12-12 19:47 [PATCH 0/5] usb: uvc: improve header files and function use Michael Grzeschik
@ 2022-12-12 19:47 ` Michael Grzeschik
  2022-12-14 10:30   ` Laurent Pinchart
  2022-12-12 19:47 ` [PATCH 2/5] usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit Michael Grzeschik
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Grzeschik @ 2022-12-12 19:47 UTC (permalink / raw)
  To: laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Since the headerfile is only used in usb devices it is better
placed with the other usb files.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
---
 drivers/media/usb/uvc/uvc_ctrl.c              | 2 +-
 drivers/media/usb/uvc/uvc_driver.c            | 2 +-
 drivers/usb/gadget/function/uvc_v4l2.c        | 2 +-
 include/{media/v4l2-uvc.h => linux/usb/uvc.h} | 0
 4 files changed, 3 insertions(+), 3 deletions(-)
 rename include/{media/v4l2-uvc.h => linux/usb/uvc.h} (100%)

diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
index c95a2229f4fa9f..454d4374990ea1 100644
--- a/drivers/media/usb/uvc/uvc_ctrl.c
+++ b/drivers/media/usb/uvc/uvc_ctrl.c
@@ -12,13 +12,13 @@
 #include <linux/slab.h>
 #include <linux/uaccess.h>
 #include <linux/usb.h>
+#include <linux/usb/uvc.h>
 #include <linux/videodev2.h>
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
 #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 215fb483efb00b..13023cdd37e50b 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -13,6 +13,7 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/usb.h>
+#include <linux/usb/uvc.h>
 #include <linux/videodev2.h>
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
@@ -20,7 +21,6 @@
 
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
-#include <media/v4l2-uvc.h>
 
 #include "uvcvideo.h"
 
diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index a189b08bba800d..7435df0cf2a847 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -11,6 +11,7 @@
 #include <linux/kernel.h>
 #include <linux/list.h>
 #include <linux/usb/g_uvc.h>
+#include <linux/usb/uvc.h>
 #include <linux/videodev2.h>
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
@@ -18,7 +19,6 @@
 #include <media/v4l2-dev.h>
 #include <media/v4l2-event.h>
 #include <media/v4l2-ioctl.h>
-#include <media/v4l2-uvc.h>
 
 #include "f_uvc.h"
 #include "uvc.h"
diff --git a/include/media/v4l2-uvc.h b/include/linux/usb/uvc.h
similarity index 100%
rename from include/media/v4l2-uvc.h
rename to include/linux/usb/uvc.h
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/5] usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit
  2022-12-12 19:47 [PATCH 0/5] usb: uvc: improve header files and function use Michael Grzeschik
  2022-12-12 19:47 ` [PATCH 1/5] usb: uvc: move media/v4l2-uvc.h to usb/uvc.h Michael Grzeschik
@ 2022-12-12 19:47 ` Michael Grzeschik
  2022-12-14 10:59   ` Laurent Pinchart
  2022-12-12 19:47 ` [PATCH 3/5] usb: uvc: make uvc_format_desc table const Michael Grzeschik
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Grzeschik @ 2022-12-12 19:47 UTC (permalink / raw)
  To: laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

The media driver USB_VIDEO_CLASS and USB_F_UVC are using the same
function uvc_format_by_guid. Since the function is inline, every user
will get a copy of the used uvc_fmts array and the function. This patch
moves the code to an own compile unit and add this dependency as
UVC_COMMON to both users.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
---
 drivers/media/common/Kconfig  |   3 +
 drivers/media/common/Makefile |   1 +
 drivers/media/common/uvc.c    | 214 ++++++++++++++++++++++++++++++++++
 drivers/media/usb/uvc/Kconfig |   1 +
 drivers/usb/gadget/Kconfig    |   1 +
 include/linux/usb/uvc.h       | 205 +-------------------------------
 6 files changed, 221 insertions(+), 204 deletions(-)
 create mode 100644 drivers/media/common/uvc.c

diff --git a/drivers/media/common/Kconfig b/drivers/media/common/Kconfig
index 852b7d92fbdd93..b1bc58da27fcdd 100644
--- a/drivers/media/common/Kconfig
+++ b/drivers/media/common/Kconfig
@@ -14,6 +14,9 @@ config TTPCI_EEPROM
         tristate
         depends on I2C
 
+config UVC_COMMON
+	tristate
+
 config VIDEO_CX2341X
 	tristate
 
diff --git a/drivers/media/common/Makefile b/drivers/media/common/Makefile
index d78a0df154783a..3f17d696feb24c 100644
--- a/drivers/media/common/Makefile
+++ b/drivers/media/common/Makefile
@@ -5,5 +5,6 @@ obj-y += b2c2/ siano/ v4l2-tpg/ videobuf2/
 # (e. g. LC_ALL=C sort Makefile)
 obj-$(CONFIG_CYPRESS_FIRMWARE) += cypress_firmware.o
 obj-$(CONFIG_TTPCI_EEPROM) += ttpci-eeprom.o
+obj-$(CONFIG_UVC_COMMON) += uvc.o
 obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o
 obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
new file mode 100644
index 00000000000000..a3cf40215a0754
--- /dev/null
+++ b/drivers/media/common/uvc.c
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/usb/uvc.h>
+#include <linux/videodev2.h>
+
+/* ------------------------------------------------------------------------
+ * 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,
+	},
+};
+
+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;
+}
+EXPORT_SYMBOL_GPL(uvc_format_by_guid);
+
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/usb/uvc/Kconfig b/drivers/media/usb/uvc/Kconfig
index ca51ee8e45f39c..579532272fd6d7 100644
--- a/drivers/media/usb/uvc/Kconfig
+++ b/drivers/media/usb/uvc/Kconfig
@@ -3,6 +3,7 @@ config USB_VIDEO_CLASS
 	tristate "USB Video Class (UVC)"
 	depends on VIDEO_DEV
 	select VIDEOBUF2_VMALLOC
+	select UVC_COMMON
 	help
 	  Support for the USB Video Class (UVC).  Currently only video
 	  input devices, such as webcams, are supported.
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 4fa2ddf322b48d..336db8f92afa6a 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -203,6 +203,7 @@ config USB_F_UAC2
 
 config USB_F_UVC
 	tristate
+	select UVC_COMMON
 
 config USB_F_MIDI
 	tristate
diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
index f83e31661333bb..a2dae2b40a2318 100644
--- a/include/linux/usb/uvc.h
+++ b/include/linux/usb/uvc.h
@@ -145,215 +145,12 @@
 	{ '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,
-	},
-};
-
-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;
-}
+struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]);
 
 #endif /* __LINUX_V4L2_UVC_H */
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/5] usb: uvc: make uvc_format_desc table const
  2022-12-12 19:47 [PATCH 0/5] usb: uvc: improve header files and function use Michael Grzeschik
  2022-12-12 19:47 ` [PATCH 1/5] usb: uvc: move media/v4l2-uvc.h to usb/uvc.h Michael Grzeschik
  2022-12-12 19:47 ` [PATCH 2/5] usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit Michael Grzeschik
@ 2022-12-12 19:47 ` Michael Grzeschik
  2022-12-14 10:37   ` Laurent Pinchart
  2022-12-12 19:47 ` [PATCH 4/5] media: v4l2: move v4l_fill_fmtdesc to common v4l2_fill_fmtdesc function Michael Grzeschik
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Grzeschik @ 2022-12-12 19:47 UTC (permalink / raw)
  To: laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Since the uvc_fmts array can not be modified we declare it const and
change every user of the uvc_format_by_guid function aswell.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
---
 drivers/media/common/uvc.c             | 4 ++--
 drivers/media/usb/uvc/uvc_driver.c     | 2 +-
 drivers/usb/gadget/function/uvc_v4l2.c | 8 ++++----
 include/linux/usb/uvc.h                | 2 +-
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
index a3cf40215a0754..a6787f1999becd 100644
--- a/drivers/media/common/uvc.c
+++ b/drivers/media/common/uvc.c
@@ -9,7 +9,7 @@
  * Video formats
  */
 
-static struct uvc_format_desc uvc_fmts[] = {
+static const struct uvc_format_desc uvc_fmts[] = {
 	{
 		.name		= "YUV 4:2:2 (YUYV)",
 		.guid		= UVC_GUID_FORMAT_YUY2,
@@ -197,7 +197,7 @@ static struct uvc_format_desc uvc_fmts[] = {
 	},
 };
 
-struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16])
+const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16])
 {
 	unsigned int len = ARRAY_SIZE(uvc_fmts);
 	unsigned int i;
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index 13023cdd37e50b..12b6ad0966d94a 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -224,7 +224,7 @@ static int uvc_parse_format(struct uvc_device *dev,
 {
 	struct usb_interface *intf = streaming->intf;
 	struct usb_host_interface *alts = intf->cur_altsetting;
-	struct uvc_format_desc *fmtdesc;
+	const struct uvc_format_desc *fmtdesc;
 	struct uvc_frame *frame;
 	const unsigned char *start = buffer;
 	unsigned int width_multiplier = 1;
diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index 7435df0cf2a847..21e573e628f4e7 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -27,10 +27,10 @@
 #include "uvc_v4l2.h"
 #include "uvc_configfs.h"
 
-static struct uvc_format_desc *to_uvc_format(struct uvcg_format *uformat)
+static const struct uvc_format_desc *to_uvc_format(struct uvcg_format *uformat)
 {
 	char guid[16] = UVC_GUID_FORMAT_MJPEG;
-	struct uvc_format_desc *format;
+	const struct uvc_format_desc *format;
 	struct uvcg_uncompressed *unc;
 
 	if (uformat->type == UVCG_UNCOMPRESSED) {
@@ -119,7 +119,7 @@ static struct uvcg_format *find_format_by_pix(struct uvc_device *uvc,
 	struct uvcg_format *uformat = NULL;
 
 	list_for_each_entry(format, &uvc->header->formats, entry) {
-		struct uvc_format_desc *fmtdesc = to_uvc_format(format->fmt);
+		const struct uvc_format_desc *fmtdesc = to_uvc_format(format->fmt);
 
 		if (fmtdesc->fcc == pixelformat) {
 			uformat = format->fmt;
@@ -364,7 +364,7 @@ uvc_v4l2_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f)
 {
 	struct video_device *vdev = video_devdata(file);
 	struct uvc_device *uvc = video_get_drvdata(vdev);
-	struct uvc_format_desc *fmtdesc;
+	const struct uvc_format_desc *fmtdesc;
 	struct uvcg_format *uformat;
 
 	if (f->index >= uvc->header->num_fmt)
diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
index a2dae2b40a2318..227a03f252a5c0 100644
--- a/include/linux/usb/uvc.h
+++ b/include/linux/usb/uvc.h
@@ -151,6 +151,6 @@ struct uvc_format_desc {
 	u32 fcc;
 };
 
-struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]);
+const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]);
 
 #endif /* __LINUX_V4L2_UVC_H */
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 4/5] media: v4l2: move v4l_fill_fmtdesc to common v4l2_fill_fmtdesc function
  2022-12-12 19:47 [PATCH 0/5] usb: uvc: improve header files and function use Michael Grzeschik
                   ` (2 preceding siblings ...)
  2022-12-12 19:47 ` [PATCH 3/5] usb: uvc: make uvc_format_desc table const Michael Grzeschik
@ 2022-12-12 19:47 ` Michael Grzeschik
  2022-12-12 19:47 ` [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name Michael Grzeschik
  2022-12-14 10:57 ` [PATCH 0/5] usb: uvc: improve header files and function use Dan Scally
  5 siblings, 0 replies; 14+ messages in thread
From: Michael Grzeschik @ 2022-12-12 19:47 UTC (permalink / raw)
  To: laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

The function v4l_fill_fmtdesc is a function that fills v4l2_fmtdesc with
its description data and compressed flag that is matching the
pixelformat. Since more v4l2 users other than v4l_enum_fmt can benefit
from it we move the function to the v4l2-common code and rename it to
v4l2_fill_fmtdesc.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
---
 drivers/media/v4l2-core/v4l2-common.c | 263 +++++++++++++++++++++++++
 drivers/media/v4l2-core/v4l2-ioctl.c  | 264 +-------------------------
 include/media/v4l2-common.h           |   2 +
 3 files changed, 266 insertions(+), 263 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c
index 40f56e044640d7..e92974a6d9ecd6 100644
--- a/drivers/media/v4l2-core/v4l2-common.c
+++ b/drivers/media/v4l2-core/v4l2-common.c
@@ -570,3 +570,266 @@ u32 v4l2_fraction_to_interval(u32 numerator, u32 denominator)
 	return denominator ? numerator * multiplier / denominator : 0;
 }
 EXPORT_SYMBOL_GPL(v4l2_fraction_to_interval);
+
+void v4l2_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
+{
+	const unsigned sz = sizeof(fmt->description);
+	const char *descr = NULL;
+	u32 flags = 0;
+
+	/*
+	 * We depart from the normal coding style here since the descriptions
+	 * should be aligned so it is easy to see which descriptions will be
+	 * longer than 31 characters (the max length for a description).
+	 * And frankly, this is easier to read anyway.
+	 *
+	 * Note that gcc will use O(log N) comparisons to find the right case.
+	 */
+	switch (fmt->pixelformat) {
+	/* Max description length mask:	descr = "0123456789012345678901234567890" */
+	case V4L2_PIX_FMT_RGB332:	descr = "8-bit RGB 3-3-2"; break;
+	case V4L2_PIX_FMT_RGB444:	descr = "16-bit A/XRGB 4-4-4-4"; break;
+	case V4L2_PIX_FMT_ARGB444:	descr = "16-bit ARGB 4-4-4-4"; break;
+	case V4L2_PIX_FMT_XRGB444:	descr = "16-bit XRGB 4-4-4-4"; break;
+	case V4L2_PIX_FMT_RGBA444:	descr = "16-bit RGBA 4-4-4-4"; break;
+	case V4L2_PIX_FMT_RGBX444:	descr = "16-bit RGBX 4-4-4-4"; break;
+	case V4L2_PIX_FMT_ABGR444:	descr = "16-bit ABGR 4-4-4-4"; break;
+	case V4L2_PIX_FMT_XBGR444:	descr = "16-bit XBGR 4-4-4-4"; break;
+	case V4L2_PIX_FMT_BGRA444:	descr = "16-bit BGRA 4-4-4-4"; break;
+	case V4L2_PIX_FMT_BGRX444:	descr = "16-bit BGRX 4-4-4-4"; break;
+	case V4L2_PIX_FMT_RGB555:	descr = "16-bit A/XRGB 1-5-5-5"; break;
+	case V4L2_PIX_FMT_ARGB555:	descr = "16-bit ARGB 1-5-5-5"; break;
+	case V4L2_PIX_FMT_XRGB555:	descr = "16-bit XRGB 1-5-5-5"; break;
+	case V4L2_PIX_FMT_ABGR555:	descr = "16-bit ABGR 1-5-5-5"; break;
+	case V4L2_PIX_FMT_XBGR555:	descr = "16-bit XBGR 1-5-5-5"; break;
+	case V4L2_PIX_FMT_RGBA555:	descr = "16-bit RGBA 5-5-5-1"; break;
+	case V4L2_PIX_FMT_RGBX555:	descr = "16-bit RGBX 5-5-5-1"; break;
+	case V4L2_PIX_FMT_BGRA555:	descr = "16-bit BGRA 5-5-5-1"; break;
+	case V4L2_PIX_FMT_BGRX555:	descr = "16-bit BGRX 5-5-5-1"; break;
+	case V4L2_PIX_FMT_RGB565:	descr = "16-bit RGB 5-6-5"; break;
+	case V4L2_PIX_FMT_RGB555X:	descr = "16-bit A/XRGB 1-5-5-5 BE"; break;
+	case V4L2_PIX_FMT_ARGB555X:	descr = "16-bit ARGB 1-5-5-5 BE"; break;
+	case V4L2_PIX_FMT_XRGB555X:	descr = "16-bit XRGB 1-5-5-5 BE"; break;
+	case V4L2_PIX_FMT_RGB565X:	descr = "16-bit RGB 5-6-5 BE"; break;
+	case V4L2_PIX_FMT_BGR666:	descr = "18-bit BGRX 6-6-6-14"; break;
+	case V4L2_PIX_FMT_BGR24:	descr = "24-bit BGR 8-8-8"; break;
+	case V4L2_PIX_FMT_RGB24:	descr = "24-bit RGB 8-8-8"; break;
+	case V4L2_PIX_FMT_BGR32:	descr = "32-bit BGRA/X 8-8-8-8"; break;
+	case V4L2_PIX_FMT_ABGR32:	descr = "32-bit BGRA 8-8-8-8"; break;
+	case V4L2_PIX_FMT_XBGR32:	descr = "32-bit BGRX 8-8-8-8"; break;
+	case V4L2_PIX_FMT_RGB32:	descr = "32-bit A/XRGB 8-8-8-8"; break;
+	case V4L2_PIX_FMT_ARGB32:	descr = "32-bit ARGB 8-8-8-8"; break;
+	case V4L2_PIX_FMT_XRGB32:	descr = "32-bit XRGB 8-8-8-8"; break;
+	case V4L2_PIX_FMT_BGRA32:	descr = "32-bit ABGR 8-8-8-8"; break;
+	case V4L2_PIX_FMT_BGRX32:	descr = "32-bit XBGR 8-8-8-8"; break;
+	case V4L2_PIX_FMT_RGBA32:	descr = "32-bit RGBA 8-8-8-8"; break;
+	case V4L2_PIX_FMT_RGBX32:	descr = "32-bit RGBX 8-8-8-8"; break;
+	case V4L2_PIX_FMT_GREY:		descr = "8-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y4:		descr = "4-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y6:		descr = "6-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y10:		descr = "10-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y12:		descr = "12-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y14:		descr = "14-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y16:		descr = "16-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y16_BE:	descr = "16-bit Greyscale BE"; break;
+	case V4L2_PIX_FMT_Y10BPACK:	descr = "10-bit Greyscale (Packed)"; break;
+	case V4L2_PIX_FMT_Y10P:		descr = "10-bit Greyscale (MIPI Packed)"; break;
+	case V4L2_PIX_FMT_IPU3_Y10:	descr = "10-bit greyscale (IPU3 Packed)"; break;
+	case V4L2_PIX_FMT_Y8I:		descr = "Interleaved 8-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Y12I:		descr = "Interleaved 12-bit Greyscale"; break;
+	case V4L2_PIX_FMT_Z16:		descr = "16-bit Depth"; break;
+	case V4L2_PIX_FMT_INZI:		descr = "Planar 10:16 Greyscale Depth"; break;
+	case V4L2_PIX_FMT_CNF4:		descr = "4-bit Depth Confidence (Packed)"; break;
+	case V4L2_PIX_FMT_PAL8:		descr = "8-bit Palette"; break;
+	case V4L2_PIX_FMT_UV8:		descr = "8-bit Chrominance UV 4-4"; break;
+	case V4L2_PIX_FMT_YVU410:	descr = "Planar YVU 4:1:0"; break;
+	case V4L2_PIX_FMT_YVU420:	descr = "Planar YVU 4:2:0"; break;
+	case V4L2_PIX_FMT_YUYV:		descr = "YUYV 4:2:2"; break;
+	case V4L2_PIX_FMT_YYUV:		descr = "YYUV 4:2:2"; break;
+	case V4L2_PIX_FMT_YVYU:		descr = "YVYU 4:2:2"; break;
+	case V4L2_PIX_FMT_UYVY:		descr = "UYVY 4:2:2"; break;
+	case V4L2_PIX_FMT_VYUY:		descr = "VYUY 4:2:2"; break;
+	case V4L2_PIX_FMT_YUV422P:	descr = "Planar YUV 4:2:2"; break;
+	case V4L2_PIX_FMT_YUV411P:	descr = "Planar YUV 4:1:1"; break;
+	case V4L2_PIX_FMT_Y41P:		descr = "YUV 4:1:1 (Packed)"; break;
+	case V4L2_PIX_FMT_YUV444:	descr = "16-bit A/XYUV 4-4-4-4"; break;
+	case V4L2_PIX_FMT_YUV555:	descr = "16-bit A/XYUV 1-5-5-5"; break;
+	case V4L2_PIX_FMT_YUV565:	descr = "16-bit YUV 5-6-5"; break;
+	case V4L2_PIX_FMT_YUV24:	descr = "24-bit YUV 4:4:4 8-8-8"; break;
+	case V4L2_PIX_FMT_YUV32:	descr = "32-bit A/XYUV 8-8-8-8"; break;
+	case V4L2_PIX_FMT_AYUV32:	descr = "32-bit AYUV 8-8-8-8"; break;
+	case V4L2_PIX_FMT_XYUV32:	descr = "32-bit XYUV 8-8-8-8"; break;
+	case V4L2_PIX_FMT_VUYA32:	descr = "32-bit VUYA 8-8-8-8"; break;
+	case V4L2_PIX_FMT_VUYX32:	descr = "32-bit VUYX 8-8-8-8"; break;
+	case V4L2_PIX_FMT_YUVA32:	descr = "32-bit YUVA 8-8-8-8"; break;
+	case V4L2_PIX_FMT_YUVX32:	descr = "32-bit YUVX 8-8-8-8"; break;
+	case V4L2_PIX_FMT_YUV410:	descr = "Planar YUV 4:1:0"; break;
+	case V4L2_PIX_FMT_YUV420:	descr = "Planar YUV 4:2:0"; break;
+	case V4L2_PIX_FMT_HI240:	descr = "8-bit Dithered RGB (BTTV)"; break;
+	case V4L2_PIX_FMT_M420:		descr = "YUV 4:2:0 (M420)"; break;
+	case V4L2_PIX_FMT_NV12:		descr = "Y/CbCr 4:2:0"; break;
+	case V4L2_PIX_FMT_NV21:		descr = "Y/CrCb 4:2:0"; break;
+	case V4L2_PIX_FMT_NV16:		descr = "Y/CbCr 4:2:2"; break;
+	case V4L2_PIX_FMT_NV61:		descr = "Y/CrCb 4:2:2"; break;
+	case V4L2_PIX_FMT_NV24:		descr = "Y/CbCr 4:4:4"; break;
+	case V4L2_PIX_FMT_NV42:		descr = "Y/CrCb 4:4:4"; break;
+	case V4L2_PIX_FMT_P010:		descr = "10-bit Y/CbCr 4:2:0"; break;
+	case V4L2_PIX_FMT_NV12_4L4:	descr = "Y/CbCr 4:2:0 (4x4 Linear)"; break;
+	case V4L2_PIX_FMT_NV12_16L16:	descr = "Y/CbCr 4:2:0 (16x16 Linear)"; break;
+	case V4L2_PIX_FMT_NV12_32L32:   descr = "Y/CbCr 4:2:0 (32x32 Linear)"; break;
+	case V4L2_PIX_FMT_P010_4L4:	descr = "10-bit Y/CbCr 4:2:0 (4x4 Linear)"; break;
+	case V4L2_PIX_FMT_NV12M:	descr = "Y/CbCr 4:2:0 (N-C)"; break;
+	case V4L2_PIX_FMT_NV21M:	descr = "Y/CrCb 4:2:0 (N-C)"; break;
+	case V4L2_PIX_FMT_NV16M:	descr = "Y/CbCr 4:2:2 (N-C)"; break;
+	case V4L2_PIX_FMT_NV61M:	descr = "Y/CrCb 4:2:2 (N-C)"; break;
+	case V4L2_PIX_FMT_NV12MT:	descr = "Y/CbCr 4:2:0 (64x32 MB, N-C)"; break;
+	case V4L2_PIX_FMT_NV12MT_16X16:	descr = "Y/CbCr 4:2:0 (16x16 MB, N-C)"; break;
+	case V4L2_PIX_FMT_YUV420M:	descr = "Planar YUV 4:2:0 (N-C)"; break;
+	case V4L2_PIX_FMT_YVU420M:	descr = "Planar YVU 4:2:0 (N-C)"; break;
+	case V4L2_PIX_FMT_YUV422M:	descr = "Planar YUV 4:2:2 (N-C)"; break;
+	case V4L2_PIX_FMT_YVU422M:	descr = "Planar YVU 4:2:2 (N-C)"; break;
+	case V4L2_PIX_FMT_YUV444M:	descr = "Planar YUV 4:4:4 (N-C)"; break;
+	case V4L2_PIX_FMT_YVU444M:	descr = "Planar YVU 4:4:4 (N-C)"; break;
+	case V4L2_PIX_FMT_SBGGR8:	descr = "8-bit Bayer BGBG/GRGR"; break;
+	case V4L2_PIX_FMT_SGBRG8:	descr = "8-bit Bayer GBGB/RGRG"; break;
+	case V4L2_PIX_FMT_SGRBG8:	descr = "8-bit Bayer GRGR/BGBG"; break;
+	case V4L2_PIX_FMT_SRGGB8:	descr = "8-bit Bayer RGRG/GBGB"; break;
+	case V4L2_PIX_FMT_SBGGR10:	descr = "10-bit Bayer BGBG/GRGR"; break;
+	case V4L2_PIX_FMT_SGBRG10:	descr = "10-bit Bayer GBGB/RGRG"; break;
+	case V4L2_PIX_FMT_SGRBG10:	descr = "10-bit Bayer GRGR/BGBG"; break;
+	case V4L2_PIX_FMT_SRGGB10:	descr = "10-bit Bayer RGRG/GBGB"; break;
+	case V4L2_PIX_FMT_SBGGR10P:	descr = "10-bit Bayer BGBG/GRGR Packed"; break;
+	case V4L2_PIX_FMT_SGBRG10P:	descr = "10-bit Bayer GBGB/RGRG Packed"; break;
+	case V4L2_PIX_FMT_SGRBG10P:	descr = "10-bit Bayer GRGR/BGBG Packed"; break;
+	case V4L2_PIX_FMT_SRGGB10P:	descr = "10-bit Bayer RGRG/GBGB Packed"; break;
+	case V4L2_PIX_FMT_IPU3_SBGGR10: descr = "10-bit bayer BGGR IPU3 Packed"; break;
+	case V4L2_PIX_FMT_IPU3_SGBRG10: descr = "10-bit bayer GBRG IPU3 Packed"; break;
+	case V4L2_PIX_FMT_IPU3_SGRBG10: descr = "10-bit bayer GRBG IPU3 Packed"; break;
+	case V4L2_PIX_FMT_IPU3_SRGGB10: descr = "10-bit bayer RGGB IPU3 Packed"; break;
+	case V4L2_PIX_FMT_SBGGR10ALAW8:	descr = "8-bit Bayer BGBG/GRGR (A-law)"; break;
+	case V4L2_PIX_FMT_SGBRG10ALAW8:	descr = "8-bit Bayer GBGB/RGRG (A-law)"; break;
+	case V4L2_PIX_FMT_SGRBG10ALAW8:	descr = "8-bit Bayer GRGR/BGBG (A-law)"; break;
+	case V4L2_PIX_FMT_SRGGB10ALAW8:	descr = "8-bit Bayer RGRG/GBGB (A-law)"; break;
+	case V4L2_PIX_FMT_SBGGR10DPCM8:	descr = "8-bit Bayer BGBG/GRGR (DPCM)"; break;
+	case V4L2_PIX_FMT_SGBRG10DPCM8:	descr = "8-bit Bayer GBGB/RGRG (DPCM)"; break;
+	case V4L2_PIX_FMT_SGRBG10DPCM8:	descr = "8-bit Bayer GRGR/BGBG (DPCM)"; break;
+	case V4L2_PIX_FMT_SRGGB10DPCM8:	descr = "8-bit Bayer RGRG/GBGB (DPCM)"; break;
+	case V4L2_PIX_FMT_SBGGR12:	descr = "12-bit Bayer BGBG/GRGR"; break;
+	case V4L2_PIX_FMT_SGBRG12:	descr = "12-bit Bayer GBGB/RGRG"; break;
+	case V4L2_PIX_FMT_SGRBG12:	descr = "12-bit Bayer GRGR/BGBG"; break;
+	case V4L2_PIX_FMT_SRGGB12:	descr = "12-bit Bayer RGRG/GBGB"; break;
+	case V4L2_PIX_FMT_SBGGR12P:	descr = "12-bit Bayer BGBG/GRGR Packed"; break;
+	case V4L2_PIX_FMT_SGBRG12P:	descr = "12-bit Bayer GBGB/RGRG Packed"; break;
+	case V4L2_PIX_FMT_SGRBG12P:	descr = "12-bit Bayer GRGR/BGBG Packed"; break;
+	case V4L2_PIX_FMT_SRGGB12P:	descr = "12-bit Bayer RGRG/GBGB Packed"; break;
+	case V4L2_PIX_FMT_SBGGR14:	descr = "14-bit Bayer BGBG/GRGR"; break;
+	case V4L2_PIX_FMT_SGBRG14:	descr = "14-bit Bayer GBGB/RGRG"; break;
+	case V4L2_PIX_FMT_SGRBG14:	descr = "14-bit Bayer GRGR/BGBG"; break;
+	case V4L2_PIX_FMT_SRGGB14:	descr = "14-bit Bayer RGRG/GBGB"; break;
+	case V4L2_PIX_FMT_SBGGR14P:	descr = "14-bit Bayer BGBG/GRGR Packed"; break;
+	case V4L2_PIX_FMT_SGBRG14P:	descr = "14-bit Bayer GBGB/RGRG Packed"; break;
+	case V4L2_PIX_FMT_SGRBG14P:	descr = "14-bit Bayer GRGR/BGBG Packed"; break;
+	case V4L2_PIX_FMT_SRGGB14P:	descr = "14-bit Bayer RGRG/GBGB Packed"; break;
+	case V4L2_PIX_FMT_SBGGR16:	descr = "16-bit Bayer BGBG/GRGR"; break;
+	case V4L2_PIX_FMT_SGBRG16:	descr = "16-bit Bayer GBGB/RGRG"; break;
+	case V4L2_PIX_FMT_SGRBG16:	descr = "16-bit Bayer GRGR/BGBG"; break;
+	case V4L2_PIX_FMT_SRGGB16:	descr = "16-bit Bayer RGRG/GBGB"; break;
+	case V4L2_PIX_FMT_SN9C20X_I420:	descr = "GSPCA SN9C20X I420"; break;
+	case V4L2_PIX_FMT_SPCA501:	descr = "GSPCA SPCA501"; break;
+	case V4L2_PIX_FMT_SPCA505:	descr = "GSPCA SPCA505"; break;
+	case V4L2_PIX_FMT_SPCA508:	descr = "GSPCA SPCA508"; break;
+	case V4L2_PIX_FMT_STV0680:	descr = "GSPCA STV0680"; break;
+	case V4L2_PIX_FMT_TM6000:	descr = "A/V + VBI Mux Packet"; break;
+	case V4L2_PIX_FMT_CIT_YYVYUY:	descr = "GSPCA CIT YYVYUY"; break;
+	case V4L2_PIX_FMT_KONICA420:	descr = "GSPCA KONICA420"; break;
+	case V4L2_PIX_FMT_MM21:		descr = "Mediatek 8-bit Block Format"; break;
+	case V4L2_PIX_FMT_HSV24:	descr = "24-bit HSV 8-8-8"; break;
+	case V4L2_PIX_FMT_HSV32:	descr = "32-bit XHSV 8-8-8-8"; break;
+	case V4L2_SDR_FMT_CU8:		descr = "Complex U8"; break;
+	case V4L2_SDR_FMT_CU16LE:	descr = "Complex U16LE"; break;
+	case V4L2_SDR_FMT_CS8:		descr = "Complex S8"; break;
+	case V4L2_SDR_FMT_CS14LE:	descr = "Complex S14LE"; break;
+	case V4L2_SDR_FMT_RU12LE:	descr = "Real U12LE"; break;
+	case V4L2_SDR_FMT_PCU16BE:	descr = "Planar Complex U16BE"; break;
+	case V4L2_SDR_FMT_PCU18BE:	descr = "Planar Complex U18BE"; break;
+	case V4L2_SDR_FMT_PCU20BE:	descr = "Planar Complex U20BE"; break;
+	case V4L2_TCH_FMT_DELTA_TD16:	descr = "16-bit Signed Deltas"; break;
+	case V4L2_TCH_FMT_DELTA_TD08:	descr = "8-bit Signed Deltas"; break;
+	case V4L2_TCH_FMT_TU16:		descr = "16-bit Unsigned Touch Data"; break;
+	case V4L2_TCH_FMT_TU08:		descr = "8-bit Unsigned Touch Data"; break;
+	case V4L2_META_FMT_VSP1_HGO:	descr = "R-Car VSP1 1-D Histogram"; break;
+	case V4L2_META_FMT_VSP1_HGT:	descr = "R-Car VSP1 2-D Histogram"; break;
+	case V4L2_META_FMT_UVC:		descr = "UVC Payload Header Metadata"; break;
+	case V4L2_META_FMT_D4XX:	descr = "Intel D4xx UVC Metadata"; break;
+	case V4L2_META_FMT_VIVID:       descr = "Vivid Metadata"; break;
+	case V4L2_META_FMT_RK_ISP1_PARAMS:	descr = "Rockchip ISP1 3A Parameters"; break;
+	case V4L2_META_FMT_RK_ISP1_STAT_3A:	descr = "Rockchip ISP1 3A Statistics"; break;
+	case V4L2_PIX_FMT_NV12M_8L128:	descr = "NV12M (8x128 Linear)"; break;
+	case V4L2_PIX_FMT_NV12M_10BE_8L128:	descr = "10-bit NV12M (8x128 Linear, BE)"; break;
+
+	default:
+		/* Compressed formats */
+		flags = V4L2_FMT_FLAG_COMPRESSED;
+		switch (fmt->pixelformat) {
+		/* Max description length mask:	descr = "0123456789012345678901234567890" */
+		case V4L2_PIX_FMT_MJPEG:	descr = "Motion-JPEG"; break;
+		case V4L2_PIX_FMT_JPEG:		descr = "JFIF JPEG"; break;
+		case V4L2_PIX_FMT_DV:		descr = "1394"; break;
+		case V4L2_PIX_FMT_MPEG:		descr = "MPEG-1/2/4"; break;
+		case V4L2_PIX_FMT_H264:		descr = "H.264"; break;
+		case V4L2_PIX_FMT_H264_NO_SC:	descr = "H.264 (No Start Codes)"; break;
+		case V4L2_PIX_FMT_H264_MVC:	descr = "H.264 MVC"; break;
+		case V4L2_PIX_FMT_H264_SLICE:	descr = "H.264 Parsed Slice Data"; break;
+		case V4L2_PIX_FMT_H263:		descr = "H.263"; break;
+		case V4L2_PIX_FMT_MPEG1:	descr = "MPEG-1 ES"; break;
+		case V4L2_PIX_FMT_MPEG2:	descr = "MPEG-2 ES"; break;
+		case V4L2_PIX_FMT_MPEG2_SLICE:	descr = "MPEG-2 Parsed Slice Data"; break;
+		case V4L2_PIX_FMT_MPEG4:	descr = "MPEG-4 Part 2 ES"; break;
+		case V4L2_PIX_FMT_XVID:		descr = "Xvid"; break;
+		case V4L2_PIX_FMT_VC1_ANNEX_G:	descr = "VC-1 (SMPTE 412M Annex G)"; break;
+		case V4L2_PIX_FMT_VC1_ANNEX_L:	descr = "VC-1 (SMPTE 412M Annex L)"; break;
+		case V4L2_PIX_FMT_VP8:		descr = "VP8"; break;
+		case V4L2_PIX_FMT_VP8_FRAME:    descr = "VP8 Frame"; break;
+		case V4L2_PIX_FMT_VP9:		descr = "VP9"; break;
+		case V4L2_PIX_FMT_VP9_FRAME:    descr = "VP9 Frame"; break;
+		case V4L2_PIX_FMT_HEVC:		descr = "HEVC"; break; /* aka H.265 */
+		case V4L2_PIX_FMT_HEVC_SLICE:	descr = "HEVC Parsed Slice Data"; break;
+		case V4L2_PIX_FMT_FWHT:		descr = "FWHT"; break; /* used in vicodec */
+		case V4L2_PIX_FMT_FWHT_STATELESS:	descr = "FWHT Stateless"; break; /* used in vicodec */
+		case V4L2_PIX_FMT_CPIA1:	descr = "GSPCA CPiA YUV"; break;
+		case V4L2_PIX_FMT_WNVA:		descr = "WNVA"; break;
+		case V4L2_PIX_FMT_SN9C10X:	descr = "GSPCA SN9C10X"; break;
+		case V4L2_PIX_FMT_PWC1:		descr = "Raw Philips Webcam Type (Old)"; break;
+		case V4L2_PIX_FMT_PWC2:		descr = "Raw Philips Webcam Type (New)"; break;
+		case V4L2_PIX_FMT_ET61X251:	descr = "GSPCA ET61X251"; break;
+		case V4L2_PIX_FMT_SPCA561:	descr = "GSPCA SPCA561"; break;
+		case V4L2_PIX_FMT_PAC207:	descr = "GSPCA PAC207"; break;
+		case V4L2_PIX_FMT_MR97310A:	descr = "GSPCA MR97310A"; break;
+		case V4L2_PIX_FMT_JL2005BCD:	descr = "GSPCA JL2005BCD"; break;
+		case V4L2_PIX_FMT_SN9C2028:	descr = "GSPCA SN9C2028"; break;
+		case V4L2_PIX_FMT_SQ905C:	descr = "GSPCA SQ905C"; break;
+		case V4L2_PIX_FMT_PJPG:		descr = "GSPCA PJPG"; break;
+		case V4L2_PIX_FMT_OV511:	descr = "GSPCA OV511"; break;
+		case V4L2_PIX_FMT_OV518:	descr = "GSPCA OV518"; break;
+		case V4L2_PIX_FMT_JPGL:		descr = "JPEG Lite"; break;
+		case V4L2_PIX_FMT_SE401:	descr = "GSPCA SE401"; break;
+		case V4L2_PIX_FMT_S5C_UYVY_JPG:	descr = "S5C73MX interleaved UYVY/JPEG"; break;
+		case V4L2_PIX_FMT_MT21C:	descr = "Mediatek Compressed Format"; break;
+		case V4L2_PIX_FMT_QC08C:	descr = "QCOM Compressed 8-bit Format"; break;
+		case V4L2_PIX_FMT_QC10C:	descr = "QCOM Compressed 10-bit Format"; break;
+		default:
+			if (fmt->description[0])
+				return;
+			WARN(1, "Unknown pixelformat 0x%08x\n", fmt->pixelformat);
+			flags = 0;
+			snprintf(fmt->description, sz, "%p4cc",
+				 &fmt->pixelformat);
+			break;
+		}
+	}
+
+	if (descr)
+		WARN_ON(strscpy(fmt->description, descr, sz) < 0);
+	fmt->flags |= flags;
+}
+EXPORT_SYMBOL_GPL(v4l2_fill_fmtdesc);
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index fddba75d907458..9693ee39f6dc83 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1251,268 +1251,6 @@ static int v4l_enumoutput(const struct v4l2_ioctl_ops *ops,
 	return ops->vidioc_enum_output(file, fh, p);
 }
 
-static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
-{
-	const unsigned sz = sizeof(fmt->description);
-	const char *descr = NULL;
-	u32 flags = 0;
-
-	/*
-	 * We depart from the normal coding style here since the descriptions
-	 * should be aligned so it is easy to see which descriptions will be
-	 * longer than 31 characters (the max length for a description).
-	 * And frankly, this is easier to read anyway.
-	 *
-	 * Note that gcc will use O(log N) comparisons to find the right case.
-	 */
-	switch (fmt->pixelformat) {
-	/* Max description length mask:	descr = "0123456789012345678901234567890" */
-	case V4L2_PIX_FMT_RGB332:	descr = "8-bit RGB 3-3-2"; break;
-	case V4L2_PIX_FMT_RGB444:	descr = "16-bit A/XRGB 4-4-4-4"; break;
-	case V4L2_PIX_FMT_ARGB444:	descr = "16-bit ARGB 4-4-4-4"; break;
-	case V4L2_PIX_FMT_XRGB444:	descr = "16-bit XRGB 4-4-4-4"; break;
-	case V4L2_PIX_FMT_RGBA444:	descr = "16-bit RGBA 4-4-4-4"; break;
-	case V4L2_PIX_FMT_RGBX444:	descr = "16-bit RGBX 4-4-4-4"; break;
-	case V4L2_PIX_FMT_ABGR444:	descr = "16-bit ABGR 4-4-4-4"; break;
-	case V4L2_PIX_FMT_XBGR444:	descr = "16-bit XBGR 4-4-4-4"; break;
-	case V4L2_PIX_FMT_BGRA444:	descr = "16-bit BGRA 4-4-4-4"; break;
-	case V4L2_PIX_FMT_BGRX444:	descr = "16-bit BGRX 4-4-4-4"; break;
-	case V4L2_PIX_FMT_RGB555:	descr = "16-bit A/XRGB 1-5-5-5"; break;
-	case V4L2_PIX_FMT_ARGB555:	descr = "16-bit ARGB 1-5-5-5"; break;
-	case V4L2_PIX_FMT_XRGB555:	descr = "16-bit XRGB 1-5-5-5"; break;
-	case V4L2_PIX_FMT_ABGR555:	descr = "16-bit ABGR 1-5-5-5"; break;
-	case V4L2_PIX_FMT_XBGR555:	descr = "16-bit XBGR 1-5-5-5"; break;
-	case V4L2_PIX_FMT_RGBA555:	descr = "16-bit RGBA 5-5-5-1"; break;
-	case V4L2_PIX_FMT_RGBX555:	descr = "16-bit RGBX 5-5-5-1"; break;
-	case V4L2_PIX_FMT_BGRA555:	descr = "16-bit BGRA 5-5-5-1"; break;
-	case V4L2_PIX_FMT_BGRX555:	descr = "16-bit BGRX 5-5-5-1"; break;
-	case V4L2_PIX_FMT_RGB565:	descr = "16-bit RGB 5-6-5"; break;
-	case V4L2_PIX_FMT_RGB555X:	descr = "16-bit A/XRGB 1-5-5-5 BE"; break;
-	case V4L2_PIX_FMT_ARGB555X:	descr = "16-bit ARGB 1-5-5-5 BE"; break;
-	case V4L2_PIX_FMT_XRGB555X:	descr = "16-bit XRGB 1-5-5-5 BE"; break;
-	case V4L2_PIX_FMT_RGB565X:	descr = "16-bit RGB 5-6-5 BE"; break;
-	case V4L2_PIX_FMT_BGR666:	descr = "18-bit BGRX 6-6-6-14"; break;
-	case V4L2_PIX_FMT_BGR24:	descr = "24-bit BGR 8-8-8"; break;
-	case V4L2_PIX_FMT_RGB24:	descr = "24-bit RGB 8-8-8"; break;
-	case V4L2_PIX_FMT_BGR32:	descr = "32-bit BGRA/X 8-8-8-8"; break;
-	case V4L2_PIX_FMT_ABGR32:	descr = "32-bit BGRA 8-8-8-8"; break;
-	case V4L2_PIX_FMT_XBGR32:	descr = "32-bit BGRX 8-8-8-8"; break;
-	case V4L2_PIX_FMT_RGB32:	descr = "32-bit A/XRGB 8-8-8-8"; break;
-	case V4L2_PIX_FMT_ARGB32:	descr = "32-bit ARGB 8-8-8-8"; break;
-	case V4L2_PIX_FMT_XRGB32:	descr = "32-bit XRGB 8-8-8-8"; break;
-	case V4L2_PIX_FMT_BGRA32:	descr = "32-bit ABGR 8-8-8-8"; break;
-	case V4L2_PIX_FMT_BGRX32:	descr = "32-bit XBGR 8-8-8-8"; break;
-	case V4L2_PIX_FMT_RGBA32:	descr = "32-bit RGBA 8-8-8-8"; break;
-	case V4L2_PIX_FMT_RGBX32:	descr = "32-bit RGBX 8-8-8-8"; break;
-	case V4L2_PIX_FMT_GREY:		descr = "8-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y4:		descr = "4-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y6:		descr = "6-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y10:		descr = "10-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y12:		descr = "12-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y14:		descr = "14-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y16:		descr = "16-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y16_BE:	descr = "16-bit Greyscale BE"; break;
-	case V4L2_PIX_FMT_Y10BPACK:	descr = "10-bit Greyscale (Packed)"; break;
-	case V4L2_PIX_FMT_Y10P:		descr = "10-bit Greyscale (MIPI Packed)"; break;
-	case V4L2_PIX_FMT_IPU3_Y10:	descr = "10-bit greyscale (IPU3 Packed)"; break;
-	case V4L2_PIX_FMT_Y8I:		descr = "Interleaved 8-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Y12I:		descr = "Interleaved 12-bit Greyscale"; break;
-	case V4L2_PIX_FMT_Z16:		descr = "16-bit Depth"; break;
-	case V4L2_PIX_FMT_INZI:		descr = "Planar 10:16 Greyscale Depth"; break;
-	case V4L2_PIX_FMT_CNF4:		descr = "4-bit Depth Confidence (Packed)"; break;
-	case V4L2_PIX_FMT_PAL8:		descr = "8-bit Palette"; break;
-	case V4L2_PIX_FMT_UV8:		descr = "8-bit Chrominance UV 4-4"; break;
-	case V4L2_PIX_FMT_YVU410:	descr = "Planar YVU 4:1:0"; break;
-	case V4L2_PIX_FMT_YVU420:	descr = "Planar YVU 4:2:0"; break;
-	case V4L2_PIX_FMT_YUYV:		descr = "YUYV 4:2:2"; break;
-	case V4L2_PIX_FMT_YYUV:		descr = "YYUV 4:2:2"; break;
-	case V4L2_PIX_FMT_YVYU:		descr = "YVYU 4:2:2"; break;
-	case V4L2_PIX_FMT_UYVY:		descr = "UYVY 4:2:2"; break;
-	case V4L2_PIX_FMT_VYUY:		descr = "VYUY 4:2:2"; break;
-	case V4L2_PIX_FMT_YUV422P:	descr = "Planar YUV 4:2:2"; break;
-	case V4L2_PIX_FMT_YUV411P:	descr = "Planar YUV 4:1:1"; break;
-	case V4L2_PIX_FMT_Y41P:		descr = "YUV 4:1:1 (Packed)"; break;
-	case V4L2_PIX_FMT_YUV444:	descr = "16-bit A/XYUV 4-4-4-4"; break;
-	case V4L2_PIX_FMT_YUV555:	descr = "16-bit A/XYUV 1-5-5-5"; break;
-	case V4L2_PIX_FMT_YUV565:	descr = "16-bit YUV 5-6-5"; break;
-	case V4L2_PIX_FMT_YUV24:	descr = "24-bit YUV 4:4:4 8-8-8"; break;
-	case V4L2_PIX_FMT_YUV32:	descr = "32-bit A/XYUV 8-8-8-8"; break;
-	case V4L2_PIX_FMT_AYUV32:	descr = "32-bit AYUV 8-8-8-8"; break;
-	case V4L2_PIX_FMT_XYUV32:	descr = "32-bit XYUV 8-8-8-8"; break;
-	case V4L2_PIX_FMT_VUYA32:	descr = "32-bit VUYA 8-8-8-8"; break;
-	case V4L2_PIX_FMT_VUYX32:	descr = "32-bit VUYX 8-8-8-8"; break;
-	case V4L2_PIX_FMT_YUVA32:	descr = "32-bit YUVA 8-8-8-8"; break;
-	case V4L2_PIX_FMT_YUVX32:	descr = "32-bit YUVX 8-8-8-8"; break;
-	case V4L2_PIX_FMT_YUV410:	descr = "Planar YUV 4:1:0"; break;
-	case V4L2_PIX_FMT_YUV420:	descr = "Planar YUV 4:2:0"; break;
-	case V4L2_PIX_FMT_HI240:	descr = "8-bit Dithered RGB (BTTV)"; break;
-	case V4L2_PIX_FMT_M420:		descr = "YUV 4:2:0 (M420)"; break;
-	case V4L2_PIX_FMT_NV12:		descr = "Y/CbCr 4:2:0"; break;
-	case V4L2_PIX_FMT_NV21:		descr = "Y/CrCb 4:2:0"; break;
-	case V4L2_PIX_FMT_NV16:		descr = "Y/CbCr 4:2:2"; break;
-	case V4L2_PIX_FMT_NV61:		descr = "Y/CrCb 4:2:2"; break;
-	case V4L2_PIX_FMT_NV24:		descr = "Y/CbCr 4:4:4"; break;
-	case V4L2_PIX_FMT_NV42:		descr = "Y/CrCb 4:4:4"; break;
-	case V4L2_PIX_FMT_P010:		descr = "10-bit Y/CbCr 4:2:0"; break;
-	case V4L2_PIX_FMT_NV12_4L4:	descr = "Y/CbCr 4:2:0 (4x4 Linear)"; break;
-	case V4L2_PIX_FMT_NV12_16L16:	descr = "Y/CbCr 4:2:0 (16x16 Linear)"; break;
-	case V4L2_PIX_FMT_NV12_32L32:   descr = "Y/CbCr 4:2:0 (32x32 Linear)"; break;
-	case V4L2_PIX_FMT_P010_4L4:	descr = "10-bit Y/CbCr 4:2:0 (4x4 Linear)"; break;
-	case V4L2_PIX_FMT_NV12M:	descr = "Y/CbCr 4:2:0 (N-C)"; break;
-	case V4L2_PIX_FMT_NV21M:	descr = "Y/CrCb 4:2:0 (N-C)"; break;
-	case V4L2_PIX_FMT_NV16M:	descr = "Y/CbCr 4:2:2 (N-C)"; break;
-	case V4L2_PIX_FMT_NV61M:	descr = "Y/CrCb 4:2:2 (N-C)"; break;
-	case V4L2_PIX_FMT_NV12MT:	descr = "Y/CbCr 4:2:0 (64x32 MB, N-C)"; break;
-	case V4L2_PIX_FMT_NV12MT_16X16:	descr = "Y/CbCr 4:2:0 (16x16 MB, N-C)"; break;
-	case V4L2_PIX_FMT_YUV420M:	descr = "Planar YUV 4:2:0 (N-C)"; break;
-	case V4L2_PIX_FMT_YVU420M:	descr = "Planar YVU 4:2:0 (N-C)"; break;
-	case V4L2_PIX_FMT_YUV422M:	descr = "Planar YUV 4:2:2 (N-C)"; break;
-	case V4L2_PIX_FMT_YVU422M:	descr = "Planar YVU 4:2:2 (N-C)"; break;
-	case V4L2_PIX_FMT_YUV444M:	descr = "Planar YUV 4:4:4 (N-C)"; break;
-	case V4L2_PIX_FMT_YVU444M:	descr = "Planar YVU 4:4:4 (N-C)"; break;
-	case V4L2_PIX_FMT_SBGGR8:	descr = "8-bit Bayer BGBG/GRGR"; break;
-	case V4L2_PIX_FMT_SGBRG8:	descr = "8-bit Bayer GBGB/RGRG"; break;
-	case V4L2_PIX_FMT_SGRBG8:	descr = "8-bit Bayer GRGR/BGBG"; break;
-	case V4L2_PIX_FMT_SRGGB8:	descr = "8-bit Bayer RGRG/GBGB"; break;
-	case V4L2_PIX_FMT_SBGGR10:	descr = "10-bit Bayer BGBG/GRGR"; break;
-	case V4L2_PIX_FMT_SGBRG10:	descr = "10-bit Bayer GBGB/RGRG"; break;
-	case V4L2_PIX_FMT_SGRBG10:	descr = "10-bit Bayer GRGR/BGBG"; break;
-	case V4L2_PIX_FMT_SRGGB10:	descr = "10-bit Bayer RGRG/GBGB"; break;
-	case V4L2_PIX_FMT_SBGGR10P:	descr = "10-bit Bayer BGBG/GRGR Packed"; break;
-	case V4L2_PIX_FMT_SGBRG10P:	descr = "10-bit Bayer GBGB/RGRG Packed"; break;
-	case V4L2_PIX_FMT_SGRBG10P:	descr = "10-bit Bayer GRGR/BGBG Packed"; break;
-	case V4L2_PIX_FMT_SRGGB10P:	descr = "10-bit Bayer RGRG/GBGB Packed"; break;
-	case V4L2_PIX_FMT_IPU3_SBGGR10: descr = "10-bit bayer BGGR IPU3 Packed"; break;
-	case V4L2_PIX_FMT_IPU3_SGBRG10: descr = "10-bit bayer GBRG IPU3 Packed"; break;
-	case V4L2_PIX_FMT_IPU3_SGRBG10: descr = "10-bit bayer GRBG IPU3 Packed"; break;
-	case V4L2_PIX_FMT_IPU3_SRGGB10: descr = "10-bit bayer RGGB IPU3 Packed"; break;
-	case V4L2_PIX_FMT_SBGGR10ALAW8:	descr = "8-bit Bayer BGBG/GRGR (A-law)"; break;
-	case V4L2_PIX_FMT_SGBRG10ALAW8:	descr = "8-bit Bayer GBGB/RGRG (A-law)"; break;
-	case V4L2_PIX_FMT_SGRBG10ALAW8:	descr = "8-bit Bayer GRGR/BGBG (A-law)"; break;
-	case V4L2_PIX_FMT_SRGGB10ALAW8:	descr = "8-bit Bayer RGRG/GBGB (A-law)"; break;
-	case V4L2_PIX_FMT_SBGGR10DPCM8:	descr = "8-bit Bayer BGBG/GRGR (DPCM)"; break;
-	case V4L2_PIX_FMT_SGBRG10DPCM8:	descr = "8-bit Bayer GBGB/RGRG (DPCM)"; break;
-	case V4L2_PIX_FMT_SGRBG10DPCM8:	descr = "8-bit Bayer GRGR/BGBG (DPCM)"; break;
-	case V4L2_PIX_FMT_SRGGB10DPCM8:	descr = "8-bit Bayer RGRG/GBGB (DPCM)"; break;
-	case V4L2_PIX_FMT_SBGGR12:	descr = "12-bit Bayer BGBG/GRGR"; break;
-	case V4L2_PIX_FMT_SGBRG12:	descr = "12-bit Bayer GBGB/RGRG"; break;
-	case V4L2_PIX_FMT_SGRBG12:	descr = "12-bit Bayer GRGR/BGBG"; break;
-	case V4L2_PIX_FMT_SRGGB12:	descr = "12-bit Bayer RGRG/GBGB"; break;
-	case V4L2_PIX_FMT_SBGGR12P:	descr = "12-bit Bayer BGBG/GRGR Packed"; break;
-	case V4L2_PIX_FMT_SGBRG12P:	descr = "12-bit Bayer GBGB/RGRG Packed"; break;
-	case V4L2_PIX_FMT_SGRBG12P:	descr = "12-bit Bayer GRGR/BGBG Packed"; break;
-	case V4L2_PIX_FMT_SRGGB12P:	descr = "12-bit Bayer RGRG/GBGB Packed"; break;
-	case V4L2_PIX_FMT_SBGGR14:	descr = "14-bit Bayer BGBG/GRGR"; break;
-	case V4L2_PIX_FMT_SGBRG14:	descr = "14-bit Bayer GBGB/RGRG"; break;
-	case V4L2_PIX_FMT_SGRBG14:	descr = "14-bit Bayer GRGR/BGBG"; break;
-	case V4L2_PIX_FMT_SRGGB14:	descr = "14-bit Bayer RGRG/GBGB"; break;
-	case V4L2_PIX_FMT_SBGGR14P:	descr = "14-bit Bayer BGBG/GRGR Packed"; break;
-	case V4L2_PIX_FMT_SGBRG14P:	descr = "14-bit Bayer GBGB/RGRG Packed"; break;
-	case V4L2_PIX_FMT_SGRBG14P:	descr = "14-bit Bayer GRGR/BGBG Packed"; break;
-	case V4L2_PIX_FMT_SRGGB14P:	descr = "14-bit Bayer RGRG/GBGB Packed"; break;
-	case V4L2_PIX_FMT_SBGGR16:	descr = "16-bit Bayer BGBG/GRGR"; break;
-	case V4L2_PIX_FMT_SGBRG16:	descr = "16-bit Bayer GBGB/RGRG"; break;
-	case V4L2_PIX_FMT_SGRBG16:	descr = "16-bit Bayer GRGR/BGBG"; break;
-	case V4L2_PIX_FMT_SRGGB16:	descr = "16-bit Bayer RGRG/GBGB"; break;
-	case V4L2_PIX_FMT_SN9C20X_I420:	descr = "GSPCA SN9C20X I420"; break;
-	case V4L2_PIX_FMT_SPCA501:	descr = "GSPCA SPCA501"; break;
-	case V4L2_PIX_FMT_SPCA505:	descr = "GSPCA SPCA505"; break;
-	case V4L2_PIX_FMT_SPCA508:	descr = "GSPCA SPCA508"; break;
-	case V4L2_PIX_FMT_STV0680:	descr = "GSPCA STV0680"; break;
-	case V4L2_PIX_FMT_TM6000:	descr = "A/V + VBI Mux Packet"; break;
-	case V4L2_PIX_FMT_CIT_YYVYUY:	descr = "GSPCA CIT YYVYUY"; break;
-	case V4L2_PIX_FMT_KONICA420:	descr = "GSPCA KONICA420"; break;
-	case V4L2_PIX_FMT_MM21:		descr = "Mediatek 8-bit Block Format"; break;
-	case V4L2_PIX_FMT_HSV24:	descr = "24-bit HSV 8-8-8"; break;
-	case V4L2_PIX_FMT_HSV32:	descr = "32-bit XHSV 8-8-8-8"; break;
-	case V4L2_SDR_FMT_CU8:		descr = "Complex U8"; break;
-	case V4L2_SDR_FMT_CU16LE:	descr = "Complex U16LE"; break;
-	case V4L2_SDR_FMT_CS8:		descr = "Complex S8"; break;
-	case V4L2_SDR_FMT_CS14LE:	descr = "Complex S14LE"; break;
-	case V4L2_SDR_FMT_RU12LE:	descr = "Real U12LE"; break;
-	case V4L2_SDR_FMT_PCU16BE:	descr = "Planar Complex U16BE"; break;
-	case V4L2_SDR_FMT_PCU18BE:	descr = "Planar Complex U18BE"; break;
-	case V4L2_SDR_FMT_PCU20BE:	descr = "Planar Complex U20BE"; break;
-	case V4L2_TCH_FMT_DELTA_TD16:	descr = "16-bit Signed Deltas"; break;
-	case V4L2_TCH_FMT_DELTA_TD08:	descr = "8-bit Signed Deltas"; break;
-	case V4L2_TCH_FMT_TU16:		descr = "16-bit Unsigned Touch Data"; break;
-	case V4L2_TCH_FMT_TU08:		descr = "8-bit Unsigned Touch Data"; break;
-	case V4L2_META_FMT_VSP1_HGO:	descr = "R-Car VSP1 1-D Histogram"; break;
-	case V4L2_META_FMT_VSP1_HGT:	descr = "R-Car VSP1 2-D Histogram"; break;
-	case V4L2_META_FMT_UVC:		descr = "UVC Payload Header Metadata"; break;
-	case V4L2_META_FMT_D4XX:	descr = "Intel D4xx UVC Metadata"; break;
-	case V4L2_META_FMT_VIVID:       descr = "Vivid Metadata"; break;
-	case V4L2_META_FMT_RK_ISP1_PARAMS:	descr = "Rockchip ISP1 3A Parameters"; break;
-	case V4L2_META_FMT_RK_ISP1_STAT_3A:	descr = "Rockchip ISP1 3A Statistics"; break;
-	case V4L2_PIX_FMT_NV12M_8L128:	descr = "NV12M (8x128 Linear)"; break;
-	case V4L2_PIX_FMT_NV12M_10BE_8L128:	descr = "10-bit NV12M (8x128 Linear, BE)"; break;
-
-	default:
-		/* Compressed formats */
-		flags = V4L2_FMT_FLAG_COMPRESSED;
-		switch (fmt->pixelformat) {
-		/* Max description length mask:	descr = "0123456789012345678901234567890" */
-		case V4L2_PIX_FMT_MJPEG:	descr = "Motion-JPEG"; break;
-		case V4L2_PIX_FMT_JPEG:		descr = "JFIF JPEG"; break;
-		case V4L2_PIX_FMT_DV:		descr = "1394"; break;
-		case V4L2_PIX_FMT_MPEG:		descr = "MPEG-1/2/4"; break;
-		case V4L2_PIX_FMT_H264:		descr = "H.264"; break;
-		case V4L2_PIX_FMT_H264_NO_SC:	descr = "H.264 (No Start Codes)"; break;
-		case V4L2_PIX_FMT_H264_MVC:	descr = "H.264 MVC"; break;
-		case V4L2_PIX_FMT_H264_SLICE:	descr = "H.264 Parsed Slice Data"; break;
-		case V4L2_PIX_FMT_H263:		descr = "H.263"; break;
-		case V4L2_PIX_FMT_MPEG1:	descr = "MPEG-1 ES"; break;
-		case V4L2_PIX_FMT_MPEG2:	descr = "MPEG-2 ES"; break;
-		case V4L2_PIX_FMT_MPEG2_SLICE:	descr = "MPEG-2 Parsed Slice Data"; break;
-		case V4L2_PIX_FMT_MPEG4:	descr = "MPEG-4 Part 2 ES"; break;
-		case V4L2_PIX_FMT_XVID:		descr = "Xvid"; break;
-		case V4L2_PIX_FMT_VC1_ANNEX_G:	descr = "VC-1 (SMPTE 412M Annex G)"; break;
-		case V4L2_PIX_FMT_VC1_ANNEX_L:	descr = "VC-1 (SMPTE 412M Annex L)"; break;
-		case V4L2_PIX_FMT_VP8:		descr = "VP8"; break;
-		case V4L2_PIX_FMT_VP8_FRAME:    descr = "VP8 Frame"; break;
-		case V4L2_PIX_FMT_VP9:		descr = "VP9"; break;
-		case V4L2_PIX_FMT_VP9_FRAME:    descr = "VP9 Frame"; break;
-		case V4L2_PIX_FMT_HEVC:		descr = "HEVC"; break; /* aka H.265 */
-		case V4L2_PIX_FMT_HEVC_SLICE:	descr = "HEVC Parsed Slice Data"; break;
-		case V4L2_PIX_FMT_FWHT:		descr = "FWHT"; break; /* used in vicodec */
-		case V4L2_PIX_FMT_FWHT_STATELESS:	descr = "FWHT Stateless"; break; /* used in vicodec */
-		case V4L2_PIX_FMT_CPIA1:	descr = "GSPCA CPiA YUV"; break;
-		case V4L2_PIX_FMT_WNVA:		descr = "WNVA"; break;
-		case V4L2_PIX_FMT_SN9C10X:	descr = "GSPCA SN9C10X"; break;
-		case V4L2_PIX_FMT_PWC1:		descr = "Raw Philips Webcam Type (Old)"; break;
-		case V4L2_PIX_FMT_PWC2:		descr = "Raw Philips Webcam Type (New)"; break;
-		case V4L2_PIX_FMT_ET61X251:	descr = "GSPCA ET61X251"; break;
-		case V4L2_PIX_FMT_SPCA561:	descr = "GSPCA SPCA561"; break;
-		case V4L2_PIX_FMT_PAC207:	descr = "GSPCA PAC207"; break;
-		case V4L2_PIX_FMT_MR97310A:	descr = "GSPCA MR97310A"; break;
-		case V4L2_PIX_FMT_JL2005BCD:	descr = "GSPCA JL2005BCD"; break;
-		case V4L2_PIX_FMT_SN9C2028:	descr = "GSPCA SN9C2028"; break;
-		case V4L2_PIX_FMT_SQ905C:	descr = "GSPCA SQ905C"; break;
-		case V4L2_PIX_FMT_PJPG:		descr = "GSPCA PJPG"; break;
-		case V4L2_PIX_FMT_OV511:	descr = "GSPCA OV511"; break;
-		case V4L2_PIX_FMT_OV518:	descr = "GSPCA OV518"; break;
-		case V4L2_PIX_FMT_JPGL:		descr = "JPEG Lite"; break;
-		case V4L2_PIX_FMT_SE401:	descr = "GSPCA SE401"; break;
-		case V4L2_PIX_FMT_S5C_UYVY_JPG:	descr = "S5C73MX interleaved UYVY/JPEG"; break;
-		case V4L2_PIX_FMT_MT21C:	descr = "Mediatek Compressed Format"; break;
-		case V4L2_PIX_FMT_QC08C:	descr = "QCOM Compressed 8-bit Format"; break;
-		case V4L2_PIX_FMT_QC10C:	descr = "QCOM Compressed 10-bit Format"; break;
-		default:
-			if (fmt->description[0])
-				return;
-			WARN(1, "Unknown pixelformat 0x%08x\n", fmt->pixelformat);
-			flags = 0;
-			snprintf(fmt->description, sz, "%p4cc",
-				 &fmt->pixelformat);
-			break;
-		}
-	}
-
-	if (descr)
-		WARN_ON(strscpy(fmt->description, descr, sz) < 0);
-	fmt->flags |= flags;
-}
-
 static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
 				struct file *file, void *fh, void *arg)
 {
@@ -1585,7 +1323,7 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
 		break;
 	}
 	if (ret == 0)
-		v4l_fill_fmtdesc(p);
+		v4l2_fill_fmtdesc(p);
 	return ret;
 }
 
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h
index 1bdaea24808947..16c9870f6655d5 100644
--- a/include/media/v4l2-common.h
+++ b/include/media/v4l2-common.h
@@ -594,4 +594,6 @@ static inline bool v4l2_is_quant_valid(__u8 quantization)
 	       quantization == V4L2_QUANTIZATION_LIM_RANGE;
 }
 
+void v4l2_fill_fmtdesc(struct v4l2_fmtdesc *fmt);
+
 #endif /* V4L2_COMMON_H_ */
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name
  2022-12-12 19:47 [PATCH 0/5] usb: uvc: improve header files and function use Michael Grzeschik
                   ` (3 preceding siblings ...)
  2022-12-12 19:47 ` [PATCH 4/5] media: v4l2: move v4l_fill_fmtdesc to common v4l2_fill_fmtdesc function Michael Grzeschik
@ 2022-12-12 19:47 ` Michael Grzeschik
  2022-12-14  9:38   ` Dan Scally
  2022-12-14 10:57 ` [PATCH 0/5] usb: uvc: improve header files and function use Dan Scally
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Grzeschik @ 2022-12-12 19:47 UTC (permalink / raw)
  To: laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Since we have the helper function v4l2_fill_fmtdesc, we can use this to
get the corresponding descriptive string for the pixelformat and set the
compressed flag. This patch is removing the redundant name field in
uvc_format_desc and makes use of v4l2_fill_fmtdesc instead.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
---
 drivers/media/common/uvc.c             | 37 --------------------------
 drivers/media/usb/uvc/uvc_driver.c     |  8 +++++-
 drivers/usb/gadget/function/uvc_v4l2.c |  6 +----
 include/linux/usb/uvc.h                |  1 -
 4 files changed, 8 insertions(+), 44 deletions(-)

diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
index a6787f1999becd..02de0dcad0f088 100644
--- a/drivers/media/common/uvc.c
+++ b/drivers/media/common/uvc.c
@@ -11,187 +11,150 @@
 
 static const 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,
 	},
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index 12b6ad0966d94a..af92e730bde7c7 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -251,7 +251,13 @@ static int uvc_parse_format(struct uvc_device *dev,
 		fmtdesc = uvc_format_by_guid(&buffer[5]);
 
 		if (fmtdesc != NULL) {
-			strscpy(format->name, fmtdesc->name,
+			struct v4l2_fmtdesc fmt;
+
+			fmt.pixelformat = fmtdesc->fcc;
+
+			v4l2_fill_fmtdesc(&fmt);
+
+			strscpy(format->name, fmt.description,
 				sizeof(format->name));
 			format->fcc = fmtdesc->fcc;
 		} else {
diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index 21e573e628f4e7..6e46fa1695f212 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -374,14 +374,10 @@ uvc_v4l2_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f)
 	if (!uformat)
 		return -EINVAL;
 
-	if (uformat->type != UVCG_UNCOMPRESSED)
-		f->flags |= V4L2_FMT_FLAG_COMPRESSED;
-
 	fmtdesc = to_uvc_format(uformat);
 	f->pixelformat = fmtdesc->fcc;
 
-	strscpy(f->description, fmtdesc->name, sizeof(f->description));
-	f->description[strlen(fmtdesc->name) - 1] = 0;
+	v4l2_fill_fmtdesc(f);
 
 	return 0;
 }
diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
index 227a03f252a5c0..e407a7b8a91c70 100644
--- a/include/linux/usb/uvc.h
+++ b/include/linux/usb/uvc.h
@@ -146,7 +146,6 @@
 	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 
 struct uvc_format_desc {
-	char *name;
 	u8 guid[16];
 	u32 fcc;
 };
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name
  2022-12-12 19:47 ` [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name Michael Grzeschik
@ 2022-12-14  9:38   ` Dan Scally
  2022-12-14 10:20     ` Ricardo Ribalda
  0 siblings, 1 reply; 14+ messages in thread
From: Dan Scally @ 2022-12-14  9:38 UTC (permalink / raw)
  To: Michael Grzeschik, laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Hi Michael

On 12/12/2022 19:47, Michael Grzeschik wrote:
> Since we have the helper function v4l2_fill_fmtdesc, we can use this to
> get the corresponding descriptive string for the pixelformat and set the
> compressed flag. This patch is removing the redundant name field in
> uvc_format_desc and makes use of v4l2_fill_fmtdesc instead.
>
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> ---


The only thing that makes me wary about this one is that it will change 
the format names reported by the uvcvideo driver to userspace, since 
those returned by v4l2_fill_fmtdesc() are not the same as the ones being 
dropped from uvc_format_desc[]...are we sure that's not going to matter?

>   drivers/media/common/uvc.c             | 37 --------------------------
>   drivers/media/usb/uvc/uvc_driver.c     |  8 +++++-
>   drivers/usb/gadget/function/uvc_v4l2.c |  6 +----
>   include/linux/usb/uvc.h                |  1 -
>   4 files changed, 8 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
> index a6787f1999becd..02de0dcad0f088 100644
> --- a/drivers/media/common/uvc.c
> +++ b/drivers/media/common/uvc.c
> @@ -11,187 +11,150 @@
>   
>   static const 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,
>   	},
> diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> index 12b6ad0966d94a..af92e730bde7c7 100644
> --- a/drivers/media/usb/uvc/uvc_driver.c
> +++ b/drivers/media/usb/uvc/uvc_driver.c
> @@ -251,7 +251,13 @@ static int uvc_parse_format(struct uvc_device *dev,
>   		fmtdesc = uvc_format_by_guid(&buffer[5]);
>   
>   		if (fmtdesc != NULL) {
> -			strscpy(format->name, fmtdesc->name,
> +			struct v4l2_fmtdesc fmt;
> +
> +			fmt.pixelformat = fmtdesc->fcc;
> +
> +			v4l2_fill_fmtdesc(&fmt);
> +
> +			strscpy(format->name, fmt.description,
>   				sizeof(format->name));
>   			format->fcc = fmtdesc->fcc;
>   		} else {
> diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
> index 21e573e628f4e7..6e46fa1695f212 100644
> --- a/drivers/usb/gadget/function/uvc_v4l2.c
> +++ b/drivers/usb/gadget/function/uvc_v4l2.c
> @@ -374,14 +374,10 @@ uvc_v4l2_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f)
>   	if (!uformat)
>   		return -EINVAL;
>   
> -	if (uformat->type != UVCG_UNCOMPRESSED)
> -		f->flags |= V4L2_FMT_FLAG_COMPRESSED;
> -
>   	fmtdesc = to_uvc_format(uformat);
>   	f->pixelformat = fmtdesc->fcc;
>   
> -	strscpy(f->description, fmtdesc->name, sizeof(f->description));
> -	f->description[strlen(fmtdesc->name) - 1] = 0;
> +	v4l2_fill_fmtdesc(f);
>   
>   	return 0;
>   }
> diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
> index 227a03f252a5c0..e407a7b8a91c70 100644
> --- a/include/linux/usb/uvc.h
> +++ b/include/linux/usb/uvc.h
> @@ -146,7 +146,6 @@
>   	 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
>   
>   struct uvc_format_desc {
> -	char *name;
>   	u8 guid[16];
>   	u32 fcc;
>   };

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name
  2022-12-14  9:38   ` Dan Scally
@ 2022-12-14 10:20     ` Ricardo Ribalda
  2022-12-14 10:25       ` Laurent Pinchart
  0 siblings, 1 reply; 14+ messages in thread
From: Ricardo Ribalda @ 2022-12-14 10:20 UTC (permalink / raw)
  To: Dan Scally
  Cc: Michael Grzeschik, laurent.pinchart, gregkh, mchehab,
	hverkuil-cisco, linux-usb, linux-media, kernel

Hi Dan

On Wed, 14 Dec 2022 at 10:48, Dan Scally <dan.scally@ideasonboard.com> wrote:
>
> Hi Michael
>
> On 12/12/2022 19:47, Michael Grzeschik wrote:
> > Since we have the helper function v4l2_fill_fmtdesc, we can use this to
> > get the corresponding descriptive string for the pixelformat and set the
> > compressed flag. This patch is removing the redundant name field in
> > uvc_format_desc and makes use of v4l2_fill_fmtdesc instead.
> >
> > Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> > ---
>
>
> The only thing that makes me wary about this one is that it will change
> the format names reported by the uvcvideo driver to userspace, since
> those returned by v4l2_fill_fmtdesc() are not the same as the ones being
> dropped from uvc_format_desc[]...are we sure that's not going to matter?

I would expect apps using the fourcc, not the string to select one
format or the other.

>
> >   drivers/media/common/uvc.c             | 37 --------------------------
> >   drivers/media/usb/uvc/uvc_driver.c     |  8 +++++-
> >   drivers/usb/gadget/function/uvc_v4l2.c |  6 +----
> >   include/linux/usb/uvc.h                |  1 -
> >   4 files changed, 8 insertions(+), 44 deletions(-)
> >
> > diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
> > index a6787f1999becd..02de0dcad0f088 100644
> > --- a/drivers/media/common/uvc.c
> > +++ b/drivers/media/common/uvc.c
> > @@ -11,187 +11,150 @@
> >
> >   static const 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,
> >       },
> > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> > index 12b6ad0966d94a..af92e730bde7c7 100644
> > --- a/drivers/media/usb/uvc/uvc_driver.c
> > +++ b/drivers/media/usb/uvc/uvc_driver.c
> > @@ -251,7 +251,13 @@ static int uvc_parse_format(struct uvc_device *dev,
> >               fmtdesc = uvc_format_by_guid(&buffer[5]);
> >
> >               if (fmtdesc != NULL) {
> > -                     strscpy(format->name, fmtdesc->name,
> > +                     struct v4l2_fmtdesc fmt;
> > +
> > +                     fmt.pixelformat = fmtdesc->fcc;
> > +
> > +                     v4l2_fill_fmtdesc(&fmt);
> > +
> > +                     strscpy(format->name, fmt.description,
> >                               sizeof(format->name));
> >                       format->fcc = fmtdesc->fcc;
> >               } else {
> > diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
> > index 21e573e628f4e7..6e46fa1695f212 100644
> > --- a/drivers/usb/gadget/function/uvc_v4l2.c
> > +++ b/drivers/usb/gadget/function/uvc_v4l2.c
> > @@ -374,14 +374,10 @@ uvc_v4l2_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f)
> >       if (!uformat)
> >               return -EINVAL;
> >
> > -     if (uformat->type != UVCG_UNCOMPRESSED)
> > -             f->flags |= V4L2_FMT_FLAG_COMPRESSED;
> > -
> >       fmtdesc = to_uvc_format(uformat);
> >       f->pixelformat = fmtdesc->fcc;
> >
> > -     strscpy(f->description, fmtdesc->name, sizeof(f->description));
> > -     f->description[strlen(fmtdesc->name) - 1] = 0;
> > +     v4l2_fill_fmtdesc(f);
> >
> >       return 0;
> >   }
> > diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
> > index 227a03f252a5c0..e407a7b8a91c70 100644
> > --- a/include/linux/usb/uvc.h
> > +++ b/include/linux/usb/uvc.h
> > @@ -146,7 +146,6 @@
> >        0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
> >
> >   struct uvc_format_desc {
> > -     char *name;
> >       u8 guid[16];
> >       u32 fcc;
> >   };



-- 
Ricardo Ribalda

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name
  2022-12-14 10:20     ` Ricardo Ribalda
@ 2022-12-14 10:25       ` Laurent Pinchart
  2022-12-14 10:30         ` Dan Scally
  0 siblings, 1 reply; 14+ messages in thread
From: Laurent Pinchart @ 2022-12-14 10:25 UTC (permalink / raw)
  To: Ricardo Ribalda
  Cc: Dan Scally, Michael Grzeschik, gregkh, mchehab, hverkuil-cisco,
	linux-usb, linux-media, kernel

On Wed, Dec 14, 2022 at 11:20:20AM +0100, Ricardo Ribalda wrote:
> On Wed, 14 Dec 2022 at 10:48, Dan Scally wrote:
> > On 12/12/2022 19:47, Michael Grzeschik wrote:
> > > Since we have the helper function v4l2_fill_fmtdesc, we can use this to
> > > get the corresponding descriptive string for the pixelformat and set the
> > > compressed flag. This patch is removing the redundant name field in
> > > uvc_format_desc and makes use of v4l2_fill_fmtdesc instead.
> > >
> > > Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> > > ---
> >
> > The only thing that makes me wary about this one is that it will change
> > the format names reported by the uvcvideo driver to userspace, since
> > those returned by v4l2_fill_fmtdesc() are not the same as the ones being
> > dropped from uvc_format_desc[]...are we sure that's not going to matter?
> 
> I would expect apps using the fourcc, not the string to select one
> format or the other.

I also believe it shouldn't be an issue. The format description is
likely used only for the purpose of displaying it directly to the user,
if used at all (we shouldn't have a format description in the kernel API
in the first place, but that's another issue). It should thus be fine.

> > >   drivers/media/common/uvc.c             | 37 --------------------------
> > >   drivers/media/usb/uvc/uvc_driver.c     |  8 +++++-
> > >   drivers/usb/gadget/function/uvc_v4l2.c |  6 +----
> > >   include/linux/usb/uvc.h                |  1 -
> > >   4 files changed, 8 insertions(+), 44 deletions(-)
> > >
> > > diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
> > > index a6787f1999becd..02de0dcad0f088 100644
> > > --- a/drivers/media/common/uvc.c
> > > +++ b/drivers/media/common/uvc.c
> > > @@ -11,187 +11,150 @@
> > >
> > >   static const 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,
> > >       },
> > > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> > > index 12b6ad0966d94a..af92e730bde7c7 100644
> > > --- a/drivers/media/usb/uvc/uvc_driver.c
> > > +++ b/drivers/media/usb/uvc/uvc_driver.c
> > > @@ -251,7 +251,13 @@ static int uvc_parse_format(struct uvc_device *dev,
> > >               fmtdesc = uvc_format_by_guid(&buffer[5]);
> > >
> > >               if (fmtdesc != NULL) {
> > > -                     strscpy(format->name, fmtdesc->name,
> > > +                     struct v4l2_fmtdesc fmt;
> > > +
> > > +                     fmt.pixelformat = fmtdesc->fcc;
> > > +
> > > +                     v4l2_fill_fmtdesc(&fmt);
> > > +
> > > +                     strscpy(format->name, fmt.description,
> > >                               sizeof(format->name));
> > >                       format->fcc = fmtdesc->fcc;
> > >               } else {
> > > diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
> > > index 21e573e628f4e7..6e46fa1695f212 100644
> > > --- a/drivers/usb/gadget/function/uvc_v4l2.c
> > > +++ b/drivers/usb/gadget/function/uvc_v4l2.c
> > > @@ -374,14 +374,10 @@ uvc_v4l2_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f)
> > >       if (!uformat)
> > >               return -EINVAL;
> > >
> > > -     if (uformat->type != UVCG_UNCOMPRESSED)
> > > -             f->flags |= V4L2_FMT_FLAG_COMPRESSED;
> > > -
> > >       fmtdesc = to_uvc_format(uformat);
> > >       f->pixelformat = fmtdesc->fcc;
> > >
> > > -     strscpy(f->description, fmtdesc->name, sizeof(f->description));
> > > -     f->description[strlen(fmtdesc->name) - 1] = 0;
> > > +     v4l2_fill_fmtdesc(f);
> > >
> > >       return 0;
> > >   }
> > > diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
> > > index 227a03f252a5c0..e407a7b8a91c70 100644
> > > --- a/include/linux/usb/uvc.h
> > > +++ b/include/linux/usb/uvc.h
> > > @@ -146,7 +146,6 @@
> > >        0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
> > >
> > >   struct uvc_format_desc {
> > > -     char *name;
> > >       u8 guid[16];
> > >       u32 fcc;
> > >   };
> 
> 
> 
> -- 
> Ricardo Ribalda

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/5] usb: uvc: move media/v4l2-uvc.h to usb/uvc.h
  2022-12-12 19:47 ` [PATCH 1/5] usb: uvc: move media/v4l2-uvc.h to usb/uvc.h Michael Grzeschik
@ 2022-12-14 10:30   ` Laurent Pinchart
  0 siblings, 0 replies; 14+ messages in thread
From: Laurent Pinchart @ 2022-12-14 10:30 UTC (permalink / raw)
  To: Michael Grzeschik
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Hi Michael,

Thank you for the patch.

On Mon, Dec 12, 2022 at 08:47:12PM +0100, Michael Grzeschik wrote:
> Since the headerfile is only used in usb devices it is better
> placed with the other usb files.
> 
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  drivers/media/usb/uvc/uvc_ctrl.c              | 2 +-
>  drivers/media/usb/uvc/uvc_driver.c            | 2 +-
>  drivers/usb/gadget/function/uvc_v4l2.c        | 2 +-
>  include/{media/v4l2-uvc.h => linux/usb/uvc.h} | 0
>  4 files changed, 3 insertions(+), 3 deletions(-)
>  rename include/{media/v4l2-uvc.h => linux/usb/uvc.h} (100%)
> 
> diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
> index c95a2229f4fa9f..454d4374990ea1 100644
> --- a/drivers/media/usb/uvc/uvc_ctrl.c
> +++ b/drivers/media/usb/uvc/uvc_ctrl.c
> @@ -12,13 +12,13 @@
>  #include <linux/slab.h>
>  #include <linux/uaccess.h>
>  #include <linux/usb.h>
> +#include <linux/usb/uvc.h>
>  #include <linux/videodev2.h>
>  #include <linux/vmalloc.h>
>  #include <linux/wait.h>
>  #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 215fb483efb00b..13023cdd37e50b 100644
> --- a/drivers/media/usb/uvc/uvc_driver.c
> +++ b/drivers/media/usb/uvc/uvc_driver.c
> @@ -13,6 +13,7 @@
>  #include <linux/module.h>
>  #include <linux/slab.h>
>  #include <linux/usb.h>
> +#include <linux/usb/uvc.h>
>  #include <linux/videodev2.h>
>  #include <linux/vmalloc.h>
>  #include <linux/wait.h>
> @@ -20,7 +21,6 @@
>  
>  #include <media/v4l2-common.h>
>  #include <media/v4l2-ioctl.h>
> -#include <media/v4l2-uvc.h>
>  
>  #include "uvcvideo.h"
>  
> diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
> index a189b08bba800d..7435df0cf2a847 100644
> --- a/drivers/usb/gadget/function/uvc_v4l2.c
> +++ b/drivers/usb/gadget/function/uvc_v4l2.c
> @@ -11,6 +11,7 @@
>  #include <linux/kernel.h>
>  #include <linux/list.h>
>  #include <linux/usb/g_uvc.h>
> +#include <linux/usb/uvc.h>
>  #include <linux/videodev2.h>
>  #include <linux/vmalloc.h>
>  #include <linux/wait.h>
> @@ -18,7 +19,6 @@
>  #include <media/v4l2-dev.h>
>  #include <media/v4l2-event.h>
>  #include <media/v4l2-ioctl.h>
> -#include <media/v4l2-uvc.h>
>  
>  #include "f_uvc.h"
>  #include "uvc.h"
> diff --git a/include/media/v4l2-uvc.h b/include/linux/usb/uvc.h
> similarity index 100%
> rename from include/media/v4l2-uvc.h
> rename to include/linux/usb/uvc.h

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name
  2022-12-14 10:25       ` Laurent Pinchart
@ 2022-12-14 10:30         ` Dan Scally
  0 siblings, 0 replies; 14+ messages in thread
From: Dan Scally @ 2022-12-14 10:30 UTC (permalink / raw)
  To: Laurent Pinchart, Ricardo Ribalda
  Cc: Michael Grzeschik, gregkh, mchehab, hverkuil-cisco, linux-usb,
	linux-media, kernel

Hi all

On 14/12/2022 10:25, Laurent Pinchart wrote:
> On Wed, Dec 14, 2022 at 11:20:20AM +0100, Ricardo Ribalda wrote:
>> On Wed, 14 Dec 2022 at 10:48, Dan Scally wrote:
>>> On 12/12/2022 19:47, Michael Grzeschik wrote:
>>>> Since we have the helper function v4l2_fill_fmtdesc, we can use this to
>>>> get the corresponding descriptive string for the pixelformat and set the
>>>> compressed flag. This patch is removing the redundant name field in
>>>> uvc_format_desc and makes use of v4l2_fill_fmtdesc instead.
>>>>
>>>> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
>>>> ---
>>> The only thing that makes me wary about this one is that it will change
>>> the format names reported by the uvcvideo driver to userspace, since
>>> those returned by v4l2_fill_fmtdesc() are not the same as the ones being
>>> dropped from uvc_format_desc[]...are we sure that's not going to matter?
>> I would expect apps using the fourcc, not the string to select one
>> format or the other.
> I also believe it shouldn't be an issue. The format description is
> likely used only for the purpose of displaying it directly to the user,
> if used at all (we shouldn't have a format description in the kernel API
> in the first place, but that's another issue). It should thus be fine.


OK - sounds like we're confident then; worries calmed :)

>
>>>>    drivers/media/common/uvc.c             | 37 --------------------------
>>>>    drivers/media/usb/uvc/uvc_driver.c     |  8 +++++-
>>>>    drivers/usb/gadget/function/uvc_v4l2.c |  6 +----
>>>>    include/linux/usb/uvc.h                |  1 -
>>>>    4 files changed, 8 insertions(+), 44 deletions(-)
>>>>
>>>> diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
>>>> index a6787f1999becd..02de0dcad0f088 100644
>>>> --- a/drivers/media/common/uvc.c
>>>> +++ b/drivers/media/common/uvc.c
>>>> @@ -11,187 +11,150 @@
>>>>
>>>>    static const 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,
>>>>        },
>>>> diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
>>>> index 12b6ad0966d94a..af92e730bde7c7 100644
>>>> --- a/drivers/media/usb/uvc/uvc_driver.c
>>>> +++ b/drivers/media/usb/uvc/uvc_driver.c
>>>> @@ -251,7 +251,13 @@ static int uvc_parse_format(struct uvc_device *dev,
>>>>                fmtdesc = uvc_format_by_guid(&buffer[5]);
>>>>
>>>>                if (fmtdesc != NULL) {
>>>> -                     strscpy(format->name, fmtdesc->name,
>>>> +                     struct v4l2_fmtdesc fmt;
>>>> +
>>>> +                     fmt.pixelformat = fmtdesc->fcc;
>>>> +
>>>> +                     v4l2_fill_fmtdesc(&fmt);
>>>> +
>>>> +                     strscpy(format->name, fmt.description,
>>>>                                sizeof(format->name));
>>>>                        format->fcc = fmtdesc->fcc;
>>>>                } else {
>>>> diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
>>>> index 21e573e628f4e7..6e46fa1695f212 100644
>>>> --- a/drivers/usb/gadget/function/uvc_v4l2.c
>>>> +++ b/drivers/usb/gadget/function/uvc_v4l2.c
>>>> @@ -374,14 +374,10 @@ uvc_v4l2_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f)
>>>>        if (!uformat)
>>>>                return -EINVAL;
>>>>
>>>> -     if (uformat->type != UVCG_UNCOMPRESSED)
>>>> -             f->flags |= V4L2_FMT_FLAG_COMPRESSED;
>>>> -
>>>>        fmtdesc = to_uvc_format(uformat);
>>>>        f->pixelformat = fmtdesc->fcc;
>>>>
>>>> -     strscpy(f->description, fmtdesc->name, sizeof(f->description));
>>>> -     f->description[strlen(fmtdesc->name) - 1] = 0;
>>>> +     v4l2_fill_fmtdesc(f);
>>>>
>>>>        return 0;
>>>>    }
>>>> diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
>>>> index 227a03f252a5c0..e407a7b8a91c70 100644
>>>> --- a/include/linux/usb/uvc.h
>>>> +++ b/include/linux/usb/uvc.h
>>>> @@ -146,7 +146,6 @@
>>>>         0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
>>>>
>>>>    struct uvc_format_desc {
>>>> -     char *name;
>>>>        u8 guid[16];
>>>>        u32 fcc;
>>>>    };
>>
>>
>> -- 
>> Ricardo Ribalda

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/5] usb: uvc: make uvc_format_desc table const
  2022-12-12 19:47 ` [PATCH 3/5] usb: uvc: make uvc_format_desc table const Michael Grzeschik
@ 2022-12-14 10:37   ` Laurent Pinchart
  0 siblings, 0 replies; 14+ messages in thread
From: Laurent Pinchart @ 2022-12-14 10:37 UTC (permalink / raw)
  To: Michael Grzeschik
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Hi Michael,

Thank you for the patch.

On Mon, Dec 12, 2022 at 08:47:14PM +0100, Michael Grzeschik wrote:
> Since the uvc_fmts array can not be modified we declare it const and
> change every user of the uvc_format_by_guid function aswell.
> 
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  drivers/media/common/uvc.c             | 4 ++--
>  drivers/media/usb/uvc/uvc_driver.c     | 2 +-
>  drivers/usb/gadget/function/uvc_v4l2.c | 8 ++++----
>  include/linux/usb/uvc.h                | 2 +-
>  4 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
> index a3cf40215a0754..a6787f1999becd 100644
> --- a/drivers/media/common/uvc.c
> +++ b/drivers/media/common/uvc.c
> @@ -9,7 +9,7 @@
>   * Video formats
>   */
>  
> -static struct uvc_format_desc uvc_fmts[] = {
> +static const struct uvc_format_desc uvc_fmts[] = {
>  	{
>  		.name		= "YUV 4:2:2 (YUYV)",
>  		.guid		= UVC_GUID_FORMAT_YUY2,
> @@ -197,7 +197,7 @@ static struct uvc_format_desc uvc_fmts[] = {
>  	},
>  };
>  
> -struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16])
> +const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16])
>  {
>  	unsigned int len = ARRAY_SIZE(uvc_fmts);
>  	unsigned int i;
> diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> index 13023cdd37e50b..12b6ad0966d94a 100644
> --- a/drivers/media/usb/uvc/uvc_driver.c
> +++ b/drivers/media/usb/uvc/uvc_driver.c
> @@ -224,7 +224,7 @@ static int uvc_parse_format(struct uvc_device *dev,
>  {
>  	struct usb_interface *intf = streaming->intf;
>  	struct usb_host_interface *alts = intf->cur_altsetting;
> -	struct uvc_format_desc *fmtdesc;
> +	const struct uvc_format_desc *fmtdesc;
>  	struct uvc_frame *frame;
>  	const unsigned char *start = buffer;
>  	unsigned int width_multiplier = 1;
> diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
> index 7435df0cf2a847..21e573e628f4e7 100644
> --- a/drivers/usb/gadget/function/uvc_v4l2.c
> +++ b/drivers/usb/gadget/function/uvc_v4l2.c
> @@ -27,10 +27,10 @@
>  #include "uvc_v4l2.h"
>  #include "uvc_configfs.h"
>  
> -static struct uvc_format_desc *to_uvc_format(struct uvcg_format *uformat)
> +static const struct uvc_format_desc *to_uvc_format(struct uvcg_format *uformat)
>  {
>  	char guid[16] = UVC_GUID_FORMAT_MJPEG;
> -	struct uvc_format_desc *format;
> +	const struct uvc_format_desc *format;
>  	struct uvcg_uncompressed *unc;
>  
>  	if (uformat->type == UVCG_UNCOMPRESSED) {
> @@ -119,7 +119,7 @@ static struct uvcg_format *find_format_by_pix(struct uvc_device *uvc,
>  	struct uvcg_format *uformat = NULL;
>  
>  	list_for_each_entry(format, &uvc->header->formats, entry) {
> -		struct uvc_format_desc *fmtdesc = to_uvc_format(format->fmt);
> +		const struct uvc_format_desc *fmtdesc = to_uvc_format(format->fmt);
>  
>  		if (fmtdesc->fcc == pixelformat) {
>  			uformat = format->fmt;
> @@ -364,7 +364,7 @@ uvc_v4l2_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f)
>  {
>  	struct video_device *vdev = video_devdata(file);
>  	struct uvc_device *uvc = video_get_drvdata(vdev);
> -	struct uvc_format_desc *fmtdesc;
> +	const struct uvc_format_desc *fmtdesc;
>  	struct uvcg_format *uformat;
>  
>  	if (f->index >= uvc->header->num_fmt)
> diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
> index a2dae2b40a2318..227a03f252a5c0 100644
> --- a/include/linux/usb/uvc.h
> +++ b/include/linux/usb/uvc.h
> @@ -151,6 +151,6 @@ struct uvc_format_desc {
>  	u32 fcc;
>  };
>  
> -struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]);
> +const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]);
>  
>  #endif /* __LINUX_V4L2_UVC_H */

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 0/5] usb: uvc: improve header files and function use
  2022-12-12 19:47 [PATCH 0/5] usb: uvc: improve header files and function use Michael Grzeschik
                   ` (4 preceding siblings ...)
  2022-12-12 19:47 ` [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name Michael Grzeschik
@ 2022-12-14 10:57 ` Dan Scally
  5 siblings, 0 replies; 14+ messages in thread
From: Dan Scally @ 2022-12-14 10:57 UTC (permalink / raw)
  To: Michael Grzeschik, laurent.pinchart
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Hi Michael

On 12/12/2022 19:47, Michael Grzeschik wrote:
> This series is improving the use of the uvc_format_desc
> in v4l2-uvc.h and also reuses the declarative strings from
> v4l_fill_fmtdesc.
>
> Michael Grzeschik (5):
>    usb: uvc: move media/v4l2-uvc.h to usb/uvc.h
>    usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit
>    usb: uvc: make uvc_format_desc table const
>    media: v4l2: move v4l_fill_fmtdesc to common v4l2_fill_fmtdesc
>      function
>    usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name


For the set:


Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>

Tested-by: Daniel Scally <dan.scally@ideasonboard.com>

>
>   drivers/media/common/Kconfig                  |   3 +
>   drivers/media/common/Makefile                 |   1 +
>   drivers/media/common/uvc.c                    | 177 ++++++++++++
>   drivers/media/usb/uvc/Kconfig                 |   1 +
>   drivers/media/usb/uvc/uvc_ctrl.c              |   2 +-
>   drivers/media/usb/uvc/uvc_driver.c            |  12 +-
>   drivers/media/v4l2-core/v4l2-common.c         | 263 +++++++++++++++++
>   drivers/media/v4l2-core/v4l2-ioctl.c          | 264 +-----------------
>   drivers/usb/gadget/Kconfig                    |   1 +
>   drivers/usb/gadget/function/uvc_v4l2.c        |  16 +-
>   include/{media/v4l2-uvc.h => linux/usb/uvc.h} | 206 +-------------
>   include/media/v4l2-common.h                   |   2 +
>   12 files changed, 466 insertions(+), 482 deletions(-)
>   create mode 100644 drivers/media/common/uvc.c
>   rename include/{media/v4l2-uvc.h => linux/usb/uvc.h} (59%)
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/5] usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit
  2022-12-12 19:47 ` [PATCH 2/5] usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit Michael Grzeschik
@ 2022-12-14 10:59   ` Laurent Pinchart
  0 siblings, 0 replies; 14+ messages in thread
From: Laurent Pinchart @ 2022-12-14 10:59 UTC (permalink / raw)
  To: Michael Grzeschik
  Cc: gregkh, mchehab, hverkuil-cisco, linux-usb, linux-media, kernel

Hi Michael,

Thank you for the patch.

On Mon, Dec 12, 2022 at 08:47:13PM +0100, Michael Grzeschik wrote:
> The media driver USB_VIDEO_CLASS and USB_F_UVC are using the same
> function uvc_format_by_guid. Since the function is inline, every user
> will get a copy of the used uvc_fmts array and the function. This patch
> moves the code to an own compile unit and add this dependency as
> UVC_COMMON to both users.
> 
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> ---
>  drivers/media/common/Kconfig  |   3 +
>  drivers/media/common/Makefile |   1 +
>  drivers/media/common/uvc.c    | 214 ++++++++++++++++++++++++++++++++++
>  drivers/media/usb/uvc/Kconfig |   1 +
>  drivers/usb/gadget/Kconfig    |   1 +
>  include/linux/usb/uvc.h       | 205 +-------------------------------
>  6 files changed, 221 insertions(+), 204 deletions(-)
>  create mode 100644 drivers/media/common/uvc.c
> 
> diff --git a/drivers/media/common/Kconfig b/drivers/media/common/Kconfig
> index 852b7d92fbdd93..b1bc58da27fcdd 100644
> --- a/drivers/media/common/Kconfig
> +++ b/drivers/media/common/Kconfig
> @@ -14,6 +14,9 @@ config TTPCI_EEPROM
>          tristate
>          depends on I2C
>  
> +config UVC_COMMON
> +	tristate
> +
>  config VIDEO_CX2341X
>  	tristate
>  
> diff --git a/drivers/media/common/Makefile b/drivers/media/common/Makefile
> index d78a0df154783a..3f17d696feb24c 100644
> --- a/drivers/media/common/Makefile
> +++ b/drivers/media/common/Makefile
> @@ -5,5 +5,6 @@ obj-y += b2c2/ siano/ v4l2-tpg/ videobuf2/
>  # (e. g. LC_ALL=C sort Makefile)
>  obj-$(CONFIG_CYPRESS_FIRMWARE) += cypress_firmware.o
>  obj-$(CONFIG_TTPCI_EEPROM) += ttpci-eeprom.o
> +obj-$(CONFIG_UVC_COMMON) += uvc.o
>  obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o
>  obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
> diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c
> new file mode 100644
> index 00000000000000..a3cf40215a0754
> --- /dev/null
> +++ b/drivers/media/common/uvc.c
> @@ -0,0 +1,214 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +#include <linux/module.h>

You should also include string.h for memcmp(), and kernel.h for
ARRAY_SIZE().

Conditionally-Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

(which means you can add my Rb tag in the next version with this fixed)

> +#include <linux/types.h>
> +#include <linux/usb/uvc.h>
> +#include <linux/videodev2.h>
> +
> +/* ------------------------------------------------------------------------
> + * 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,
> +	},
> +};
> +
> +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;
> +}
> +EXPORT_SYMBOL_GPL(uvc_format_by_guid);
> +
> +MODULE_LICENSE("GPL");
> diff --git a/drivers/media/usb/uvc/Kconfig b/drivers/media/usb/uvc/Kconfig
> index ca51ee8e45f39c..579532272fd6d7 100644
> --- a/drivers/media/usb/uvc/Kconfig
> +++ b/drivers/media/usb/uvc/Kconfig
> @@ -3,6 +3,7 @@ config USB_VIDEO_CLASS
>  	tristate "USB Video Class (UVC)"
>  	depends on VIDEO_DEV
>  	select VIDEOBUF2_VMALLOC
> +	select UVC_COMMON
>  	help
>  	  Support for the USB Video Class (UVC).  Currently only video
>  	  input devices, such as webcams, are supported.
> diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
> index 4fa2ddf322b48d..336db8f92afa6a 100644
> --- a/drivers/usb/gadget/Kconfig
> +++ b/drivers/usb/gadget/Kconfig
> @@ -203,6 +203,7 @@ config USB_F_UAC2
>  
>  config USB_F_UVC
>  	tristate
> +	select UVC_COMMON
>  
>  config USB_F_MIDI
>  	tristate
> diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h
> index f83e31661333bb..a2dae2b40a2318 100644
> --- a/include/linux/usb/uvc.h
> +++ b/include/linux/usb/uvc.h
> @@ -145,215 +145,12 @@
>  	{ '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,
> -	},
> -};
> -
> -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;
> -}
> +struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]);
>  
>  #endif /* __LINUX_V4L2_UVC_H */

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2022-12-14 10:59 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-12 19:47 [PATCH 0/5] usb: uvc: improve header files and function use Michael Grzeschik
2022-12-12 19:47 ` [PATCH 1/5] usb: uvc: move media/v4l2-uvc.h to usb/uvc.h Michael Grzeschik
2022-12-14 10:30   ` Laurent Pinchart
2022-12-12 19:47 ` [PATCH 2/5] usb: uvc: move uvc_fmts and uvc_format_by_guid to own compile unit Michael Grzeschik
2022-12-14 10:59   ` Laurent Pinchart
2022-12-12 19:47 ` [PATCH 3/5] usb: uvc: make uvc_format_desc table const Michael Grzeschik
2022-12-14 10:37   ` Laurent Pinchart
2022-12-12 19:47 ` [PATCH 4/5] media: v4l2: move v4l_fill_fmtdesc to common v4l2_fill_fmtdesc function Michael Grzeschik
2022-12-12 19:47 ` [PATCH 5/5] usb: uvc: use v4l2_fill_fmtdesc instead of open coded format name Michael Grzeschik
2022-12-14  9:38   ` Dan Scally
2022-12-14 10:20     ` Ricardo Ribalda
2022-12-14 10:25       ` Laurent Pinchart
2022-12-14 10:30         ` Dan Scally
2022-12-14 10:57 ` [PATCH 0/5] usb: uvc: improve header files and function use Dan Scally

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.