GNU Linux-libre 6.8.7-gnu
[releases.git] / drivers / media / common / uvc.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 #include <linux/kernel.h>
4 #include <linux/module.h>
5 #include <linux/string.h>
6 #include <linux/types.h>
7 #include <linux/usb/uvc.h>
8 #include <linux/videodev2.h>
9
10 /* ------------------------------------------------------------------------
11  * Video formats
12  */
13
14 static const struct uvc_format_desc uvc_fmts[] = {
15         {
16                 .guid           = UVC_GUID_FORMAT_YUY2,
17                 .fcc            = V4L2_PIX_FMT_YUYV,
18         },
19         {
20                 .guid           = UVC_GUID_FORMAT_YUY2_ISIGHT,
21                 .fcc            = V4L2_PIX_FMT_YUYV,
22         },
23         {
24                 .guid           = UVC_GUID_FORMAT_NV12,
25                 .fcc            = V4L2_PIX_FMT_NV12,
26         },
27         {
28                 .guid           = UVC_GUID_FORMAT_MJPEG,
29                 .fcc            = V4L2_PIX_FMT_MJPEG,
30         },
31         {
32                 .guid           = UVC_GUID_FORMAT_YV12,
33                 .fcc            = V4L2_PIX_FMT_YVU420,
34         },
35         {
36                 .guid           = UVC_GUID_FORMAT_I420,
37                 .fcc            = V4L2_PIX_FMT_YUV420,
38         },
39         {
40                 .guid           = UVC_GUID_FORMAT_M420,
41                 .fcc            = V4L2_PIX_FMT_M420,
42         },
43         {
44                 .guid           = UVC_GUID_FORMAT_UYVY,
45                 .fcc            = V4L2_PIX_FMT_UYVY,
46         },
47         {
48                 .guid           = UVC_GUID_FORMAT_Y800,
49                 .fcc            = V4L2_PIX_FMT_GREY,
50         },
51         {
52                 .guid           = UVC_GUID_FORMAT_Y8,
53                 .fcc            = V4L2_PIX_FMT_GREY,
54         },
55         {
56                 .guid           = UVC_GUID_FORMAT_D3DFMT_L8,
57                 .fcc            = V4L2_PIX_FMT_GREY,
58         },
59         {
60                 .guid           = UVC_GUID_FORMAT_KSMEDIA_L8_IR,
61                 .fcc            = V4L2_PIX_FMT_GREY,
62         },
63         {
64                 .guid           = UVC_GUID_FORMAT_Y10,
65                 .fcc            = V4L2_PIX_FMT_Y10,
66         },
67         {
68                 .guid           = UVC_GUID_FORMAT_Y12,
69                 .fcc            = V4L2_PIX_FMT_Y12,
70         },
71         {
72                 .guid           = UVC_GUID_FORMAT_Y16,
73                 .fcc            = V4L2_PIX_FMT_Y16,
74         },
75         {
76                 .guid           = UVC_GUID_FORMAT_BY8,
77                 .fcc            = V4L2_PIX_FMT_SBGGR8,
78         },
79         {
80                 .guid           = UVC_GUID_FORMAT_BA81,
81                 .fcc            = V4L2_PIX_FMT_SBGGR8,
82         },
83         {
84                 .guid           = UVC_GUID_FORMAT_GBRG,
85                 .fcc            = V4L2_PIX_FMT_SGBRG8,
86         },
87         {
88                 .guid           = UVC_GUID_FORMAT_GRBG,
89                 .fcc            = V4L2_PIX_FMT_SGRBG8,
90         },
91         {
92                 .guid           = UVC_GUID_FORMAT_RGGB,
93                 .fcc            = V4L2_PIX_FMT_SRGGB8,
94         },
95         {
96                 .guid           = UVC_GUID_FORMAT_RGBP,
97                 .fcc            = V4L2_PIX_FMT_RGB565,
98         },
99         {
100                 .guid           = UVC_GUID_FORMAT_BGR3,
101                 .fcc            = V4L2_PIX_FMT_BGR24,
102         },
103         {
104                 .guid           = UVC_GUID_FORMAT_BGR4,
105                 .fcc            = V4L2_PIX_FMT_XBGR32,
106         },
107         {
108                 .guid           = UVC_GUID_FORMAT_H264,
109                 .fcc            = V4L2_PIX_FMT_H264,
110         },
111         {
112                 .guid           = UVC_GUID_FORMAT_H265,
113                 .fcc            = V4L2_PIX_FMT_HEVC,
114         },
115         {
116                 .guid           = UVC_GUID_FORMAT_Y8I,
117                 .fcc            = V4L2_PIX_FMT_Y8I,
118         },
119         {
120                 .guid           = UVC_GUID_FORMAT_Y12I,
121                 .fcc            = V4L2_PIX_FMT_Y12I,
122         },
123         {
124                 .guid           = UVC_GUID_FORMAT_Z16,
125                 .fcc            = V4L2_PIX_FMT_Z16,
126         },
127         {
128                 .guid           = UVC_GUID_FORMAT_RW10,
129                 .fcc            = V4L2_PIX_FMT_SRGGB10P,
130         },
131         {
132                 .guid           = UVC_GUID_FORMAT_BG16,
133                 .fcc            = V4L2_PIX_FMT_SBGGR16,
134         },
135         {
136                 .guid           = UVC_GUID_FORMAT_GB16,
137                 .fcc            = V4L2_PIX_FMT_SGBRG16,
138         },
139         {
140                 .guid           = UVC_GUID_FORMAT_RG16,
141                 .fcc            = V4L2_PIX_FMT_SRGGB16,
142         },
143         {
144                 .guid           = UVC_GUID_FORMAT_GR16,
145                 .fcc            = V4L2_PIX_FMT_SGRBG16,
146         },
147         {
148                 .guid           = UVC_GUID_FORMAT_INVZ,
149                 .fcc            = V4L2_PIX_FMT_Z16,
150         },
151         {
152                 .guid           = UVC_GUID_FORMAT_INVI,
153                 .fcc            = V4L2_PIX_FMT_Y10,
154         },
155         {
156                 .guid           = UVC_GUID_FORMAT_INZI,
157                 .fcc            = V4L2_PIX_FMT_INZI,
158         },
159         {
160                 .guid           = UVC_GUID_FORMAT_CNF4,
161                 .fcc            = V4L2_PIX_FMT_CNF4,
162         },
163         {
164                 .guid           = UVC_GUID_FORMAT_HEVC,
165                 .fcc            = V4L2_PIX_FMT_HEVC,
166         },
167 };
168
169 const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16])
170 {
171         unsigned int len = ARRAY_SIZE(uvc_fmts);
172         unsigned int i;
173
174         for (i = 0; i < len; ++i) {
175                 if (memcmp(guid, uvc_fmts[i].guid, 16) == 0)
176                         return &uvc_fmts[i];
177         }
178
179         return NULL;
180 }
181 EXPORT_SYMBOL_GPL(uvc_format_by_guid);
182
183 MODULE_LICENSE("GPL");