xref: /OK3568_Linux_fs/kernel/drivers/media/test-drivers/vivid/vivid-vid-common.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * vivid-vid-common.c - common video support functions.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/errno.h>
9*4882a593Smuzhiyun #include <linux/kernel.h>
10*4882a593Smuzhiyun #include <linux/sched.h>
11*4882a593Smuzhiyun #include <linux/videodev2.h>
12*4882a593Smuzhiyun #include <linux/v4l2-dv-timings.h>
13*4882a593Smuzhiyun #include <media/v4l2-common.h>
14*4882a593Smuzhiyun #include <media/v4l2-event.h>
15*4882a593Smuzhiyun #include <media/v4l2-dv-timings.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include "vivid-core.h"
18*4882a593Smuzhiyun #include "vivid-vid-common.h"
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun const struct v4l2_dv_timings_cap vivid_dv_timings_cap = {
21*4882a593Smuzhiyun 	.type = V4L2_DV_BT_656_1120,
22*4882a593Smuzhiyun 	/* keep this initialization for compatibility with GCC < 4.4.6 */
23*4882a593Smuzhiyun 	.reserved = { 0 },
24*4882a593Smuzhiyun 	V4L2_INIT_BT_TIMINGS(16, MAX_WIDTH, 16, MAX_HEIGHT, 14000000, 775000000,
25*4882a593Smuzhiyun 		V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
26*4882a593Smuzhiyun 		V4L2_DV_BT_STD_CVT | V4L2_DV_BT_STD_GTF,
27*4882a593Smuzhiyun 		V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_INTERLACED)
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* ------------------------------------------------------------------
31*4882a593Smuzhiyun 	Basic structures
32*4882a593Smuzhiyun    ------------------------------------------------------------------*/
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun struct vivid_fmt vivid_formats[] = {
35*4882a593Smuzhiyun 	{
36*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUYV,
37*4882a593Smuzhiyun 		.vdownsampling = { 1 },
38*4882a593Smuzhiyun 		.bit_depth = { 16 },
39*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
40*4882a593Smuzhiyun 		.planes   = 1,
41*4882a593Smuzhiyun 		.buffers = 1,
42*4882a593Smuzhiyun 		.data_offset = { PLANE0_DATA_OFFSET },
43*4882a593Smuzhiyun 	},
44*4882a593Smuzhiyun 	{
45*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_UYVY,
46*4882a593Smuzhiyun 		.vdownsampling = { 1 },
47*4882a593Smuzhiyun 		.bit_depth = { 16 },
48*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
49*4882a593Smuzhiyun 		.planes   = 1,
50*4882a593Smuzhiyun 		.buffers = 1,
51*4882a593Smuzhiyun 	},
52*4882a593Smuzhiyun 	{
53*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YVYU,
54*4882a593Smuzhiyun 		.vdownsampling = { 1 },
55*4882a593Smuzhiyun 		.bit_depth = { 16 },
56*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
57*4882a593Smuzhiyun 		.planes   = 1,
58*4882a593Smuzhiyun 		.buffers = 1,
59*4882a593Smuzhiyun 	},
60*4882a593Smuzhiyun 	{
61*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_VYUY,
62*4882a593Smuzhiyun 		.vdownsampling = { 1 },
63*4882a593Smuzhiyun 		.bit_depth = { 16 },
64*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
65*4882a593Smuzhiyun 		.planes   = 1,
66*4882a593Smuzhiyun 		.buffers = 1,
67*4882a593Smuzhiyun 	},
68*4882a593Smuzhiyun 	{
69*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV422P,
70*4882a593Smuzhiyun 		.vdownsampling = { 1, 1, 1 },
71*4882a593Smuzhiyun 		.bit_depth = { 8, 4, 4 },
72*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
73*4882a593Smuzhiyun 		.planes   = 3,
74*4882a593Smuzhiyun 		.buffers = 1,
75*4882a593Smuzhiyun 	},
76*4882a593Smuzhiyun 	{
77*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV420,
78*4882a593Smuzhiyun 		.vdownsampling = { 1, 2, 2 },
79*4882a593Smuzhiyun 		.bit_depth = { 8, 4, 4 },
80*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
81*4882a593Smuzhiyun 		.planes   = 3,
82*4882a593Smuzhiyun 		.buffers = 1,
83*4882a593Smuzhiyun 	},
84*4882a593Smuzhiyun 	{
85*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YVU420,
86*4882a593Smuzhiyun 		.vdownsampling = { 1, 2, 2 },
87*4882a593Smuzhiyun 		.bit_depth = { 8, 4, 4 },
88*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
89*4882a593Smuzhiyun 		.planes   = 3,
90*4882a593Smuzhiyun 		.buffers = 1,
91*4882a593Smuzhiyun 	},
92*4882a593Smuzhiyun 	{
93*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV12,
94*4882a593Smuzhiyun 		.vdownsampling = { 1, 2 },
95*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
96*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
97*4882a593Smuzhiyun 		.planes   = 2,
98*4882a593Smuzhiyun 		.buffers = 1,
99*4882a593Smuzhiyun 	},
100*4882a593Smuzhiyun 	{
101*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV21,
102*4882a593Smuzhiyun 		.vdownsampling = { 1, 2 },
103*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
104*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
105*4882a593Smuzhiyun 		.planes   = 2,
106*4882a593Smuzhiyun 		.buffers = 1,
107*4882a593Smuzhiyun 	},
108*4882a593Smuzhiyun 	{
109*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV16,
110*4882a593Smuzhiyun 		.vdownsampling = { 1, 1 },
111*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
112*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
113*4882a593Smuzhiyun 		.planes   = 2,
114*4882a593Smuzhiyun 		.buffers = 1,
115*4882a593Smuzhiyun 	},
116*4882a593Smuzhiyun 	{
117*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV61,
118*4882a593Smuzhiyun 		.vdownsampling = { 1, 1 },
119*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
120*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
121*4882a593Smuzhiyun 		.planes   = 2,
122*4882a593Smuzhiyun 		.buffers = 1,
123*4882a593Smuzhiyun 	},
124*4882a593Smuzhiyun 	{
125*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV24,
126*4882a593Smuzhiyun 		.vdownsampling = { 1, 1 },
127*4882a593Smuzhiyun 		.bit_depth = { 8, 16 },
128*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
129*4882a593Smuzhiyun 		.planes   = 2,
130*4882a593Smuzhiyun 		.buffers = 1,
131*4882a593Smuzhiyun 	},
132*4882a593Smuzhiyun 	{
133*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV42,
134*4882a593Smuzhiyun 		.vdownsampling = { 1, 1 },
135*4882a593Smuzhiyun 		.bit_depth = { 8, 16 },
136*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
137*4882a593Smuzhiyun 		.planes   = 2,
138*4882a593Smuzhiyun 		.buffers = 1,
139*4882a593Smuzhiyun 	},
140*4882a593Smuzhiyun 	{
141*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV555, /* uuuvvvvv ayyyyyuu */
142*4882a593Smuzhiyun 		.vdownsampling = { 1 },
143*4882a593Smuzhiyun 		.bit_depth = { 16 },
144*4882a593Smuzhiyun 		.planes   = 1,
145*4882a593Smuzhiyun 		.buffers = 1,
146*4882a593Smuzhiyun 		.alpha_mask = 0x8000,
147*4882a593Smuzhiyun 	},
148*4882a593Smuzhiyun 	{
149*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV565, /* uuuvvvvv yyyyyuuu */
150*4882a593Smuzhiyun 		.vdownsampling = { 1 },
151*4882a593Smuzhiyun 		.bit_depth = { 16 },
152*4882a593Smuzhiyun 		.planes   = 1,
153*4882a593Smuzhiyun 		.buffers = 1,
154*4882a593Smuzhiyun 	},
155*4882a593Smuzhiyun 	{
156*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV444, /* uuuuvvvv aaaayyyy */
157*4882a593Smuzhiyun 		.vdownsampling = { 1 },
158*4882a593Smuzhiyun 		.bit_depth = { 16 },
159*4882a593Smuzhiyun 		.planes   = 1,
160*4882a593Smuzhiyun 		.buffers = 1,
161*4882a593Smuzhiyun 		.alpha_mask = 0xf000,
162*4882a593Smuzhiyun 	},
163*4882a593Smuzhiyun 	{
164*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV32, /* ayuv */
165*4882a593Smuzhiyun 		.vdownsampling = { 1 },
166*4882a593Smuzhiyun 		.bit_depth = { 32 },
167*4882a593Smuzhiyun 		.planes   = 1,
168*4882a593Smuzhiyun 		.buffers = 1,
169*4882a593Smuzhiyun 		.alpha_mask = 0x000000ff,
170*4882a593Smuzhiyun 	},
171*4882a593Smuzhiyun 	{
172*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_AYUV32,
173*4882a593Smuzhiyun 		.vdownsampling = { 1 },
174*4882a593Smuzhiyun 		.bit_depth = { 32 },
175*4882a593Smuzhiyun 		.planes   = 1,
176*4882a593Smuzhiyun 		.buffers = 1,
177*4882a593Smuzhiyun 		.alpha_mask = 0x000000ff,
178*4882a593Smuzhiyun 	},
179*4882a593Smuzhiyun 	{
180*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XYUV32,
181*4882a593Smuzhiyun 		.vdownsampling = { 1 },
182*4882a593Smuzhiyun 		.bit_depth = { 32 },
183*4882a593Smuzhiyun 		.planes   = 1,
184*4882a593Smuzhiyun 		.buffers = 1,
185*4882a593Smuzhiyun 	},
186*4882a593Smuzhiyun 	{
187*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_VUYA32,
188*4882a593Smuzhiyun 		.vdownsampling = { 1 },
189*4882a593Smuzhiyun 		.bit_depth = { 32 },
190*4882a593Smuzhiyun 		.planes   = 1,
191*4882a593Smuzhiyun 		.buffers = 1,
192*4882a593Smuzhiyun 		.alpha_mask = 0xff000000,
193*4882a593Smuzhiyun 	},
194*4882a593Smuzhiyun 	{
195*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_VUYX32,
196*4882a593Smuzhiyun 		.vdownsampling = { 1 },
197*4882a593Smuzhiyun 		.bit_depth = { 32 },
198*4882a593Smuzhiyun 		.planes   = 1,
199*4882a593Smuzhiyun 		.buffers = 1,
200*4882a593Smuzhiyun 	},
201*4882a593Smuzhiyun 	{
202*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_GREY,
203*4882a593Smuzhiyun 		.vdownsampling = { 1 },
204*4882a593Smuzhiyun 		.bit_depth = { 8 },
205*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_LUMA,
206*4882a593Smuzhiyun 		.planes   = 1,
207*4882a593Smuzhiyun 		.buffers = 1,
208*4882a593Smuzhiyun 	},
209*4882a593Smuzhiyun 	{
210*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_Y10,
211*4882a593Smuzhiyun 		.vdownsampling = { 1 },
212*4882a593Smuzhiyun 		.bit_depth = { 16 },
213*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_LUMA,
214*4882a593Smuzhiyun 		.planes   = 1,
215*4882a593Smuzhiyun 		.buffers = 1,
216*4882a593Smuzhiyun 	},
217*4882a593Smuzhiyun 	{
218*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_Y12,
219*4882a593Smuzhiyun 		.vdownsampling = { 1 },
220*4882a593Smuzhiyun 		.bit_depth = { 16 },
221*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_LUMA,
222*4882a593Smuzhiyun 		.planes   = 1,
223*4882a593Smuzhiyun 		.buffers = 1,
224*4882a593Smuzhiyun 	},
225*4882a593Smuzhiyun 	{
226*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_Y16,
227*4882a593Smuzhiyun 		.vdownsampling = { 1 },
228*4882a593Smuzhiyun 		.bit_depth = { 16 },
229*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_LUMA,
230*4882a593Smuzhiyun 		.planes   = 1,
231*4882a593Smuzhiyun 		.buffers = 1,
232*4882a593Smuzhiyun 	},
233*4882a593Smuzhiyun 	{
234*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_Y16_BE,
235*4882a593Smuzhiyun 		.vdownsampling = { 1 },
236*4882a593Smuzhiyun 		.bit_depth = { 16 },
237*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_LUMA,
238*4882a593Smuzhiyun 		.planes   = 1,
239*4882a593Smuzhiyun 		.buffers = 1,
240*4882a593Smuzhiyun 	},
241*4882a593Smuzhiyun 	{
242*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB332, /* rrrgggbb */
243*4882a593Smuzhiyun 		.vdownsampling = { 1 },
244*4882a593Smuzhiyun 		.bit_depth = { 8 },
245*4882a593Smuzhiyun 		.planes   = 1,
246*4882a593Smuzhiyun 		.buffers = 1,
247*4882a593Smuzhiyun 	},
248*4882a593Smuzhiyun 	{
249*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
250*4882a593Smuzhiyun 		.vdownsampling = { 1 },
251*4882a593Smuzhiyun 		.bit_depth = { 16 },
252*4882a593Smuzhiyun 		.planes   = 1,
253*4882a593Smuzhiyun 		.buffers = 1,
254*4882a593Smuzhiyun 		.can_do_overlay = true,
255*4882a593Smuzhiyun 	},
256*4882a593Smuzhiyun 	{
257*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */
258*4882a593Smuzhiyun 		.vdownsampling = { 1 },
259*4882a593Smuzhiyun 		.bit_depth = { 16 },
260*4882a593Smuzhiyun 		.planes   = 1,
261*4882a593Smuzhiyun 		.buffers = 1,
262*4882a593Smuzhiyun 		.can_do_overlay = true,
263*4882a593Smuzhiyun 	},
264*4882a593Smuzhiyun 	{
265*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB444, /* ggggbbbb xxxxrrrr */
266*4882a593Smuzhiyun 		.vdownsampling = { 1 },
267*4882a593Smuzhiyun 		.bit_depth = { 16 },
268*4882a593Smuzhiyun 		.planes   = 1,
269*4882a593Smuzhiyun 		.buffers = 1,
270*4882a593Smuzhiyun 	},
271*4882a593Smuzhiyun 	{
272*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XRGB444, /* ggggbbbb xxxxrrrr */
273*4882a593Smuzhiyun 		.vdownsampling = { 1 },
274*4882a593Smuzhiyun 		.bit_depth = { 16 },
275*4882a593Smuzhiyun 		.planes   = 1,
276*4882a593Smuzhiyun 		.buffers = 1,
277*4882a593Smuzhiyun 	},
278*4882a593Smuzhiyun 	{
279*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_ARGB444, /* ggggbbbb aaaarrrr */
280*4882a593Smuzhiyun 		.vdownsampling = { 1 },
281*4882a593Smuzhiyun 		.bit_depth = { 16 },
282*4882a593Smuzhiyun 		.planes   = 1,
283*4882a593Smuzhiyun 		.buffers = 1,
284*4882a593Smuzhiyun 		.alpha_mask = 0x00f0,
285*4882a593Smuzhiyun 	},
286*4882a593Smuzhiyun 	{
287*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGBX444, /* bbbbxxxx rrrrgggg */
288*4882a593Smuzhiyun 		.vdownsampling = { 1 },
289*4882a593Smuzhiyun 		.bit_depth = { 16 },
290*4882a593Smuzhiyun 		.planes   = 1,
291*4882a593Smuzhiyun 		.buffers = 1,
292*4882a593Smuzhiyun 	},
293*4882a593Smuzhiyun 	{
294*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGBA444, /* bbbbaaaa rrrrgggg */
295*4882a593Smuzhiyun 		.vdownsampling = { 1 },
296*4882a593Smuzhiyun 		.bit_depth = { 16 },
297*4882a593Smuzhiyun 		.planes   = 1,
298*4882a593Smuzhiyun 		.buffers = 1,
299*4882a593Smuzhiyun 		.alpha_mask = 0x00f0,
300*4882a593Smuzhiyun 	},
301*4882a593Smuzhiyun 	{
302*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XBGR444, /* ggggrrrr xxxxbbbb */
303*4882a593Smuzhiyun 		.vdownsampling = { 1 },
304*4882a593Smuzhiyun 		.bit_depth = { 16 },
305*4882a593Smuzhiyun 		.planes   = 1,
306*4882a593Smuzhiyun 		.buffers = 1,
307*4882a593Smuzhiyun 	},
308*4882a593Smuzhiyun 	{
309*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_ABGR444, /* ggggrrrr aaaabbbb */
310*4882a593Smuzhiyun 		.vdownsampling = { 1 },
311*4882a593Smuzhiyun 		.bit_depth = { 16 },
312*4882a593Smuzhiyun 		.planes   = 1,
313*4882a593Smuzhiyun 		.buffers = 1,
314*4882a593Smuzhiyun 		.alpha_mask = 0x00f0,
315*4882a593Smuzhiyun 	},
316*4882a593Smuzhiyun 	{
317*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGRX444, /* rrrrxxxx bbbbgggg */
318*4882a593Smuzhiyun 		.vdownsampling = { 1 },
319*4882a593Smuzhiyun 		.bit_depth = { 16 },
320*4882a593Smuzhiyun 		.planes   = 1,
321*4882a593Smuzhiyun 		.buffers = 1,
322*4882a593Smuzhiyun 	},
323*4882a593Smuzhiyun 	{
324*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGRA444, /* rrrraaaa bbbbgggg  */
325*4882a593Smuzhiyun 		.vdownsampling = { 1 },
326*4882a593Smuzhiyun 		.bit_depth = { 16 },
327*4882a593Smuzhiyun 		.planes   = 1,
328*4882a593Smuzhiyun 		.buffers = 1,
329*4882a593Smuzhiyun 		.alpha_mask = 0x00f0,
330*4882a593Smuzhiyun 	},
331*4882a593Smuzhiyun 	{
332*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB555, /* gggbbbbb xrrrrrgg */
333*4882a593Smuzhiyun 		.vdownsampling = { 1 },
334*4882a593Smuzhiyun 		.bit_depth = { 16 },
335*4882a593Smuzhiyun 		.planes   = 1,
336*4882a593Smuzhiyun 		.buffers = 1,
337*4882a593Smuzhiyun 		.can_do_overlay = true,
338*4882a593Smuzhiyun 	},
339*4882a593Smuzhiyun 	{
340*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XRGB555, /* gggbbbbb xrrrrrgg */
341*4882a593Smuzhiyun 		.vdownsampling = { 1 },
342*4882a593Smuzhiyun 		.bit_depth = { 16 },
343*4882a593Smuzhiyun 		.planes   = 1,
344*4882a593Smuzhiyun 		.buffers = 1,
345*4882a593Smuzhiyun 		.can_do_overlay = true,
346*4882a593Smuzhiyun 	},
347*4882a593Smuzhiyun 	{
348*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_ARGB555, /* gggbbbbb arrrrrgg */
349*4882a593Smuzhiyun 		.vdownsampling = { 1 },
350*4882a593Smuzhiyun 		.bit_depth = { 16 },
351*4882a593Smuzhiyun 		.planes   = 1,
352*4882a593Smuzhiyun 		.buffers = 1,
353*4882a593Smuzhiyun 		.can_do_overlay = true,
354*4882a593Smuzhiyun 		.alpha_mask = 0x8000,
355*4882a593Smuzhiyun 	},
356*4882a593Smuzhiyun 	{
357*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGBX555, /* ggbbbbbx rrrrrggg */
358*4882a593Smuzhiyun 		.vdownsampling = { 1 },
359*4882a593Smuzhiyun 		.bit_depth = { 16 },
360*4882a593Smuzhiyun 		.planes   = 1,
361*4882a593Smuzhiyun 		.buffers = 1,
362*4882a593Smuzhiyun 		.can_do_overlay = true,
363*4882a593Smuzhiyun 	},
364*4882a593Smuzhiyun 	{
365*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGBA555, /* ggbbbbba rrrrrggg */
366*4882a593Smuzhiyun 		.vdownsampling = { 1 },
367*4882a593Smuzhiyun 		.bit_depth = { 16 },
368*4882a593Smuzhiyun 		.planes   = 1,
369*4882a593Smuzhiyun 		.buffers = 1,
370*4882a593Smuzhiyun 		.can_do_overlay = true,
371*4882a593Smuzhiyun 		.alpha_mask = 0x8000,
372*4882a593Smuzhiyun 	},
373*4882a593Smuzhiyun 	{
374*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XBGR555, /* gggrrrrr xbbbbbgg */
375*4882a593Smuzhiyun 		.vdownsampling = { 1 },
376*4882a593Smuzhiyun 		.bit_depth = { 16 },
377*4882a593Smuzhiyun 		.planes   = 1,
378*4882a593Smuzhiyun 		.buffers = 1,
379*4882a593Smuzhiyun 		.can_do_overlay = true,
380*4882a593Smuzhiyun 	},
381*4882a593Smuzhiyun 	{
382*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_ABGR555, /* gggrrrrr abbbbbgg */
383*4882a593Smuzhiyun 		.vdownsampling = { 1 },
384*4882a593Smuzhiyun 		.bit_depth = { 16 },
385*4882a593Smuzhiyun 		.planes   = 1,
386*4882a593Smuzhiyun 		.buffers = 1,
387*4882a593Smuzhiyun 		.can_do_overlay = true,
388*4882a593Smuzhiyun 		.alpha_mask = 0x8000,
389*4882a593Smuzhiyun 	},
390*4882a593Smuzhiyun 	{
391*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGRX555, /* ggrrrrrx bbbbbggg */
392*4882a593Smuzhiyun 		.vdownsampling = { 1 },
393*4882a593Smuzhiyun 		.bit_depth = { 16 },
394*4882a593Smuzhiyun 		.planes   = 1,
395*4882a593Smuzhiyun 		.buffers = 1,
396*4882a593Smuzhiyun 		.can_do_overlay = true,
397*4882a593Smuzhiyun 	},
398*4882a593Smuzhiyun 	{
399*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGRA555, /* ggrrrrra bbbbbggg */
400*4882a593Smuzhiyun 		.vdownsampling = { 1 },
401*4882a593Smuzhiyun 		.bit_depth = { 16 },
402*4882a593Smuzhiyun 		.planes   = 1,
403*4882a593Smuzhiyun 		.buffers = 1,
404*4882a593Smuzhiyun 		.can_do_overlay = true,
405*4882a593Smuzhiyun 		.alpha_mask = 0x8000,
406*4882a593Smuzhiyun 	},
407*4882a593Smuzhiyun 	{
408*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB555X, /* xrrrrrgg gggbbbbb */
409*4882a593Smuzhiyun 		.vdownsampling = { 1 },
410*4882a593Smuzhiyun 		.bit_depth = { 16 },
411*4882a593Smuzhiyun 		.planes   = 1,
412*4882a593Smuzhiyun 		.buffers = 1,
413*4882a593Smuzhiyun 	},
414*4882a593Smuzhiyun 	{
415*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XRGB555X, /* xrrrrrgg gggbbbbb */
416*4882a593Smuzhiyun 		.vdownsampling = { 1 },
417*4882a593Smuzhiyun 		.bit_depth = { 16 },
418*4882a593Smuzhiyun 		.planes   = 1,
419*4882a593Smuzhiyun 		.buffers = 1,
420*4882a593Smuzhiyun 	},
421*4882a593Smuzhiyun 	{
422*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_ARGB555X, /* arrrrrgg gggbbbbb */
423*4882a593Smuzhiyun 		.vdownsampling = { 1 },
424*4882a593Smuzhiyun 		.bit_depth = { 16 },
425*4882a593Smuzhiyun 		.planes   = 1,
426*4882a593Smuzhiyun 		.buffers = 1,
427*4882a593Smuzhiyun 		.alpha_mask = 0x0080,
428*4882a593Smuzhiyun 	},
429*4882a593Smuzhiyun 	{
430*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB24, /* rgb */
431*4882a593Smuzhiyun 		.vdownsampling = { 1 },
432*4882a593Smuzhiyun 		.bit_depth = { 24 },
433*4882a593Smuzhiyun 		.planes   = 1,
434*4882a593Smuzhiyun 		.buffers = 1,
435*4882a593Smuzhiyun 	},
436*4882a593Smuzhiyun 	{
437*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGR24, /* bgr */
438*4882a593Smuzhiyun 		.vdownsampling = { 1 },
439*4882a593Smuzhiyun 		.bit_depth = { 24 },
440*4882a593Smuzhiyun 		.planes   = 1,
441*4882a593Smuzhiyun 		.buffers = 1,
442*4882a593Smuzhiyun 	},
443*4882a593Smuzhiyun 	{
444*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGR666, /* bbbbbbgg ggggrrrr rrxxxxxx */
445*4882a593Smuzhiyun 		.vdownsampling = { 1 },
446*4882a593Smuzhiyun 		.bit_depth = { 32 },
447*4882a593Smuzhiyun 		.planes   = 1,
448*4882a593Smuzhiyun 		.buffers = 1,
449*4882a593Smuzhiyun 	},
450*4882a593Smuzhiyun 	{
451*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGB32, /* xrgb */
452*4882a593Smuzhiyun 		.vdownsampling = { 1 },
453*4882a593Smuzhiyun 		.bit_depth = { 32 },
454*4882a593Smuzhiyun 		.planes   = 1,
455*4882a593Smuzhiyun 		.buffers = 1,
456*4882a593Smuzhiyun 	},
457*4882a593Smuzhiyun 	{
458*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGR32, /* bgrx */
459*4882a593Smuzhiyun 		.vdownsampling = { 1 },
460*4882a593Smuzhiyun 		.bit_depth = { 32 },
461*4882a593Smuzhiyun 		.planes   = 1,
462*4882a593Smuzhiyun 		.buffers = 1,
463*4882a593Smuzhiyun 	},
464*4882a593Smuzhiyun 	{
465*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XRGB32, /* xrgb */
466*4882a593Smuzhiyun 		.vdownsampling = { 1 },
467*4882a593Smuzhiyun 		.bit_depth = { 32 },
468*4882a593Smuzhiyun 		.planes   = 1,
469*4882a593Smuzhiyun 		.buffers = 1,
470*4882a593Smuzhiyun 	},
471*4882a593Smuzhiyun 	{
472*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_XBGR32, /* bgrx */
473*4882a593Smuzhiyun 		.vdownsampling = { 1 },
474*4882a593Smuzhiyun 		.bit_depth = { 32 },
475*4882a593Smuzhiyun 		.planes   = 1,
476*4882a593Smuzhiyun 		.buffers = 1,
477*4882a593Smuzhiyun 	},
478*4882a593Smuzhiyun 	{
479*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_ARGB32, /* argb */
480*4882a593Smuzhiyun 		.vdownsampling = { 1 },
481*4882a593Smuzhiyun 		.bit_depth = { 32 },
482*4882a593Smuzhiyun 		.planes   = 1,
483*4882a593Smuzhiyun 		.buffers = 1,
484*4882a593Smuzhiyun 		.alpha_mask = 0x000000ff,
485*4882a593Smuzhiyun 	},
486*4882a593Smuzhiyun 	{
487*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_ABGR32, /* bgra */
488*4882a593Smuzhiyun 		.vdownsampling = { 1 },
489*4882a593Smuzhiyun 		.bit_depth = { 32 },
490*4882a593Smuzhiyun 		.planes   = 1,
491*4882a593Smuzhiyun 		.buffers = 1,
492*4882a593Smuzhiyun 		.alpha_mask = 0xff000000,
493*4882a593Smuzhiyun 	},
494*4882a593Smuzhiyun 	{
495*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGBX32, /* rgbx */
496*4882a593Smuzhiyun 		.vdownsampling = { 1 },
497*4882a593Smuzhiyun 		.bit_depth = { 32 },
498*4882a593Smuzhiyun 		.planes   = 1,
499*4882a593Smuzhiyun 		.buffers = 1,
500*4882a593Smuzhiyun 	},
501*4882a593Smuzhiyun 	{
502*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGRX32, /* xbgr */
503*4882a593Smuzhiyun 		.vdownsampling = { 1 },
504*4882a593Smuzhiyun 		.bit_depth = { 32 },
505*4882a593Smuzhiyun 		.planes   = 1,
506*4882a593Smuzhiyun 		.buffers = 1,
507*4882a593Smuzhiyun 	},
508*4882a593Smuzhiyun 	{
509*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_RGBA32, /* rgba */
510*4882a593Smuzhiyun 		.vdownsampling = { 1 },
511*4882a593Smuzhiyun 		.bit_depth = { 32 },
512*4882a593Smuzhiyun 		.planes   = 1,
513*4882a593Smuzhiyun 		.buffers = 1,
514*4882a593Smuzhiyun 		.alpha_mask = 0x000000ff,
515*4882a593Smuzhiyun 	},
516*4882a593Smuzhiyun 	{
517*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_BGRA32, /* abgr */
518*4882a593Smuzhiyun 		.vdownsampling = { 1 },
519*4882a593Smuzhiyun 		.bit_depth = { 32 },
520*4882a593Smuzhiyun 		.planes   = 1,
521*4882a593Smuzhiyun 		.buffers = 1,
522*4882a593Smuzhiyun 		.alpha_mask = 0xff000000,
523*4882a593Smuzhiyun 	},
524*4882a593Smuzhiyun 	{
525*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SBGGR8, /* Bayer BG/GR */
526*4882a593Smuzhiyun 		.vdownsampling = { 1 },
527*4882a593Smuzhiyun 		.bit_depth = { 8 },
528*4882a593Smuzhiyun 		.planes   = 1,
529*4882a593Smuzhiyun 		.buffers = 1,
530*4882a593Smuzhiyun 	},
531*4882a593Smuzhiyun 	{
532*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGBRG8, /* Bayer GB/RG */
533*4882a593Smuzhiyun 		.vdownsampling = { 1 },
534*4882a593Smuzhiyun 		.bit_depth = { 8 },
535*4882a593Smuzhiyun 		.planes   = 1,
536*4882a593Smuzhiyun 		.buffers = 1,
537*4882a593Smuzhiyun 	},
538*4882a593Smuzhiyun 	{
539*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGRBG8, /* Bayer GR/BG */
540*4882a593Smuzhiyun 		.vdownsampling = { 1 },
541*4882a593Smuzhiyun 		.bit_depth = { 8 },
542*4882a593Smuzhiyun 		.planes   = 1,
543*4882a593Smuzhiyun 		.buffers = 1,
544*4882a593Smuzhiyun 	},
545*4882a593Smuzhiyun 	{
546*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SRGGB8, /* Bayer RG/GB */
547*4882a593Smuzhiyun 		.vdownsampling = { 1 },
548*4882a593Smuzhiyun 		.bit_depth = { 8 },
549*4882a593Smuzhiyun 		.planes   = 1,
550*4882a593Smuzhiyun 		.buffers = 1,
551*4882a593Smuzhiyun 	},
552*4882a593Smuzhiyun 	{
553*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SBGGR10, /* Bayer BG/GR */
554*4882a593Smuzhiyun 		.vdownsampling = { 1 },
555*4882a593Smuzhiyun 		.bit_depth = { 16 },
556*4882a593Smuzhiyun 		.planes   = 1,
557*4882a593Smuzhiyun 		.buffers = 1,
558*4882a593Smuzhiyun 	},
559*4882a593Smuzhiyun 	{
560*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGBRG10, /* Bayer GB/RG */
561*4882a593Smuzhiyun 		.vdownsampling = { 1 },
562*4882a593Smuzhiyun 		.bit_depth = { 16 },
563*4882a593Smuzhiyun 		.planes   = 1,
564*4882a593Smuzhiyun 		.buffers = 1,
565*4882a593Smuzhiyun 	},
566*4882a593Smuzhiyun 	{
567*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGRBG10, /* Bayer GR/BG */
568*4882a593Smuzhiyun 		.vdownsampling = { 1 },
569*4882a593Smuzhiyun 		.bit_depth = { 16 },
570*4882a593Smuzhiyun 		.planes   = 1,
571*4882a593Smuzhiyun 		.buffers = 1,
572*4882a593Smuzhiyun 	},
573*4882a593Smuzhiyun 	{
574*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SRGGB10, /* Bayer RG/GB */
575*4882a593Smuzhiyun 		.vdownsampling = { 1 },
576*4882a593Smuzhiyun 		.bit_depth = { 16 },
577*4882a593Smuzhiyun 		.planes   = 1,
578*4882a593Smuzhiyun 		.buffers = 1,
579*4882a593Smuzhiyun 	},
580*4882a593Smuzhiyun 	{
581*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SBGGR12, /* Bayer BG/GR */
582*4882a593Smuzhiyun 		.vdownsampling = { 1 },
583*4882a593Smuzhiyun 		.bit_depth = { 16 },
584*4882a593Smuzhiyun 		.planes   = 1,
585*4882a593Smuzhiyun 		.buffers = 1,
586*4882a593Smuzhiyun 	},
587*4882a593Smuzhiyun 	{
588*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGBRG12, /* Bayer GB/RG */
589*4882a593Smuzhiyun 		.vdownsampling = { 1 },
590*4882a593Smuzhiyun 		.bit_depth = { 16 },
591*4882a593Smuzhiyun 		.planes   = 1,
592*4882a593Smuzhiyun 		.buffers = 1,
593*4882a593Smuzhiyun 	},
594*4882a593Smuzhiyun 	{
595*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGRBG12, /* Bayer GR/BG */
596*4882a593Smuzhiyun 		.vdownsampling = { 1 },
597*4882a593Smuzhiyun 		.bit_depth = { 16 },
598*4882a593Smuzhiyun 		.planes   = 1,
599*4882a593Smuzhiyun 		.buffers = 1,
600*4882a593Smuzhiyun 	},
601*4882a593Smuzhiyun 	{
602*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SRGGB12, /* Bayer RG/GB */
603*4882a593Smuzhiyun 		.vdownsampling = { 1 },
604*4882a593Smuzhiyun 		.bit_depth = { 16 },
605*4882a593Smuzhiyun 		.planes   = 1,
606*4882a593Smuzhiyun 		.buffers = 1,
607*4882a593Smuzhiyun 	},
608*4882a593Smuzhiyun 	{
609*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SBGGR16, /* Bayer BG/GR */
610*4882a593Smuzhiyun 		.vdownsampling = { 1 },
611*4882a593Smuzhiyun 		.bit_depth = { 16 },
612*4882a593Smuzhiyun 		.planes   = 1,
613*4882a593Smuzhiyun 		.buffers = 1,
614*4882a593Smuzhiyun 	},
615*4882a593Smuzhiyun 	{
616*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGBRG16, /* Bayer GB/RG */
617*4882a593Smuzhiyun 		.vdownsampling = { 1 },
618*4882a593Smuzhiyun 		.bit_depth = { 16 },
619*4882a593Smuzhiyun 		.planes   = 1,
620*4882a593Smuzhiyun 		.buffers = 1,
621*4882a593Smuzhiyun 	},
622*4882a593Smuzhiyun 	{
623*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SGRBG16, /* Bayer GR/BG */
624*4882a593Smuzhiyun 		.vdownsampling = { 1 },
625*4882a593Smuzhiyun 		.bit_depth = { 16 },
626*4882a593Smuzhiyun 		.planes   = 1,
627*4882a593Smuzhiyun 		.buffers = 1,
628*4882a593Smuzhiyun 	},
629*4882a593Smuzhiyun 	{
630*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_SRGGB16, /* Bayer RG/GB */
631*4882a593Smuzhiyun 		.vdownsampling = { 1 },
632*4882a593Smuzhiyun 		.bit_depth = { 16 },
633*4882a593Smuzhiyun 		.planes   = 1,
634*4882a593Smuzhiyun 		.buffers = 1,
635*4882a593Smuzhiyun 	},
636*4882a593Smuzhiyun 	{
637*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_HSV24, /* HSV 24bits */
638*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_HSV,
639*4882a593Smuzhiyun 		.vdownsampling = { 1 },
640*4882a593Smuzhiyun 		.bit_depth = { 24 },
641*4882a593Smuzhiyun 		.planes   = 1,
642*4882a593Smuzhiyun 		.buffers = 1,
643*4882a593Smuzhiyun 	},
644*4882a593Smuzhiyun 	{
645*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_HSV32, /* HSV 32bits */
646*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_HSV,
647*4882a593Smuzhiyun 		.vdownsampling = { 1 },
648*4882a593Smuzhiyun 		.bit_depth = { 32 },
649*4882a593Smuzhiyun 		.planes   = 1,
650*4882a593Smuzhiyun 		.buffers = 1,
651*4882a593Smuzhiyun 	},
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun 	/* Multiplanar formats */
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun 	{
656*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV16M,
657*4882a593Smuzhiyun 		.vdownsampling = { 1, 1 },
658*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
659*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
660*4882a593Smuzhiyun 		.planes   = 2,
661*4882a593Smuzhiyun 		.buffers = 2,
662*4882a593Smuzhiyun 		.data_offset = { PLANE0_DATA_OFFSET, 0 },
663*4882a593Smuzhiyun 	},
664*4882a593Smuzhiyun 	{
665*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV61M,
666*4882a593Smuzhiyun 		.vdownsampling = { 1, 1 },
667*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
668*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
669*4882a593Smuzhiyun 		.planes   = 2,
670*4882a593Smuzhiyun 		.buffers = 2,
671*4882a593Smuzhiyun 		.data_offset = { 0, PLANE0_DATA_OFFSET },
672*4882a593Smuzhiyun 	},
673*4882a593Smuzhiyun 	{
674*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV420M,
675*4882a593Smuzhiyun 		.vdownsampling = { 1, 2, 2 },
676*4882a593Smuzhiyun 		.bit_depth = { 8, 4, 4 },
677*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
678*4882a593Smuzhiyun 		.planes   = 3,
679*4882a593Smuzhiyun 		.buffers = 3,
680*4882a593Smuzhiyun 	},
681*4882a593Smuzhiyun 	{
682*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YVU420M,
683*4882a593Smuzhiyun 		.vdownsampling = { 1, 2, 2 },
684*4882a593Smuzhiyun 		.bit_depth = { 8, 4, 4 },
685*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
686*4882a593Smuzhiyun 		.planes   = 3,
687*4882a593Smuzhiyun 		.buffers = 3,
688*4882a593Smuzhiyun 	},
689*4882a593Smuzhiyun 	{
690*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV12M,
691*4882a593Smuzhiyun 		.vdownsampling = { 1, 2 },
692*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
693*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
694*4882a593Smuzhiyun 		.planes   = 2,
695*4882a593Smuzhiyun 		.buffers = 2,
696*4882a593Smuzhiyun 	},
697*4882a593Smuzhiyun 	{
698*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_NV21M,
699*4882a593Smuzhiyun 		.vdownsampling = { 1, 2 },
700*4882a593Smuzhiyun 		.bit_depth = { 8, 8 },
701*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
702*4882a593Smuzhiyun 		.planes   = 2,
703*4882a593Smuzhiyun 		.buffers = 2,
704*4882a593Smuzhiyun 	},
705*4882a593Smuzhiyun 	{
706*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV422M,
707*4882a593Smuzhiyun 		.vdownsampling = { 1, 1, 1 },
708*4882a593Smuzhiyun 		.bit_depth = { 8, 4, 4 },
709*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
710*4882a593Smuzhiyun 		.planes   = 3,
711*4882a593Smuzhiyun 		.buffers = 3,
712*4882a593Smuzhiyun 	},
713*4882a593Smuzhiyun 	{
714*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YVU422M,
715*4882a593Smuzhiyun 		.vdownsampling = { 1, 1, 1 },
716*4882a593Smuzhiyun 		.bit_depth = { 8, 4, 4 },
717*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
718*4882a593Smuzhiyun 		.planes   = 3,
719*4882a593Smuzhiyun 		.buffers = 3,
720*4882a593Smuzhiyun 	},
721*4882a593Smuzhiyun 	{
722*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YUV444M,
723*4882a593Smuzhiyun 		.vdownsampling = { 1, 1, 1 },
724*4882a593Smuzhiyun 		.bit_depth = { 8, 8, 8 },
725*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
726*4882a593Smuzhiyun 		.planes   = 3,
727*4882a593Smuzhiyun 		.buffers = 3,
728*4882a593Smuzhiyun 	},
729*4882a593Smuzhiyun 	{
730*4882a593Smuzhiyun 		.fourcc   = V4L2_PIX_FMT_YVU444M,
731*4882a593Smuzhiyun 		.vdownsampling = { 1, 1, 1 },
732*4882a593Smuzhiyun 		.bit_depth = { 8, 8, 8 },
733*4882a593Smuzhiyun 		.color_enc = TGP_COLOR_ENC_YCBCR,
734*4882a593Smuzhiyun 		.planes   = 3,
735*4882a593Smuzhiyun 		.buffers = 3,
736*4882a593Smuzhiyun 	},
737*4882a593Smuzhiyun };
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun /* There are this many multiplanar formats in the list */
740*4882a593Smuzhiyun #define VIVID_MPLANAR_FORMATS 10
741*4882a593Smuzhiyun 
vivid_get_format(struct vivid_dev * dev,u32 pixelformat)742*4882a593Smuzhiyun const struct vivid_fmt *vivid_get_format(struct vivid_dev *dev, u32 pixelformat)
743*4882a593Smuzhiyun {
744*4882a593Smuzhiyun 	const struct vivid_fmt *fmt;
745*4882a593Smuzhiyun 	unsigned k;
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	for (k = 0; k < ARRAY_SIZE(vivid_formats); k++) {
748*4882a593Smuzhiyun 		fmt = &vivid_formats[k];
749*4882a593Smuzhiyun 		if (fmt->fourcc == pixelformat)
750*4882a593Smuzhiyun 			if (fmt->buffers == 1 || dev->multiplanar)
751*4882a593Smuzhiyun 				return fmt;
752*4882a593Smuzhiyun 	}
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun 	return NULL;
755*4882a593Smuzhiyun }
756*4882a593Smuzhiyun 
vivid_vid_can_loop(struct vivid_dev * dev)757*4882a593Smuzhiyun bool vivid_vid_can_loop(struct vivid_dev *dev)
758*4882a593Smuzhiyun {
759*4882a593Smuzhiyun 	if (dev->src_rect.width != dev->sink_rect.width ||
760*4882a593Smuzhiyun 	    dev->src_rect.height != dev->sink_rect.height)
761*4882a593Smuzhiyun 		return false;
762*4882a593Smuzhiyun 	if (dev->fmt_cap->fourcc != dev->fmt_out->fourcc)
763*4882a593Smuzhiyun 		return false;
764*4882a593Smuzhiyun 	if (dev->field_cap != dev->field_out)
765*4882a593Smuzhiyun 		return false;
766*4882a593Smuzhiyun 	/*
767*4882a593Smuzhiyun 	 * While this can be supported, it is just too much work
768*4882a593Smuzhiyun 	 * to actually implement.
769*4882a593Smuzhiyun 	 */
770*4882a593Smuzhiyun 	if (dev->field_cap == V4L2_FIELD_SEQ_TB ||
771*4882a593Smuzhiyun 	    dev->field_cap == V4L2_FIELD_SEQ_BT)
772*4882a593Smuzhiyun 		return false;
773*4882a593Smuzhiyun 	if (vivid_is_svid_cap(dev) && vivid_is_svid_out(dev)) {
774*4882a593Smuzhiyun 		if (!(dev->std_cap[dev->input] & V4L2_STD_525_60) !=
775*4882a593Smuzhiyun 		    !(dev->std_out & V4L2_STD_525_60))
776*4882a593Smuzhiyun 			return false;
777*4882a593Smuzhiyun 		return true;
778*4882a593Smuzhiyun 	}
779*4882a593Smuzhiyun 	if (vivid_is_hdmi_cap(dev) && vivid_is_hdmi_out(dev))
780*4882a593Smuzhiyun 		return true;
781*4882a593Smuzhiyun 	return false;
782*4882a593Smuzhiyun }
783*4882a593Smuzhiyun 
vivid_send_source_change(struct vivid_dev * dev,unsigned type)784*4882a593Smuzhiyun void vivid_send_source_change(struct vivid_dev *dev, unsigned type)
785*4882a593Smuzhiyun {
786*4882a593Smuzhiyun 	struct v4l2_event ev = {
787*4882a593Smuzhiyun 		.type = V4L2_EVENT_SOURCE_CHANGE,
788*4882a593Smuzhiyun 		.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
789*4882a593Smuzhiyun 	};
790*4882a593Smuzhiyun 	unsigned i;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	for (i = 0; i < dev->num_inputs; i++) {
793*4882a593Smuzhiyun 		ev.id = i;
794*4882a593Smuzhiyun 		if (dev->input_type[i] == type) {
795*4882a593Smuzhiyun 			if (video_is_registered(&dev->vid_cap_dev) && dev->has_vid_cap)
796*4882a593Smuzhiyun 				v4l2_event_queue(&dev->vid_cap_dev, &ev);
797*4882a593Smuzhiyun 			if (video_is_registered(&dev->vbi_cap_dev) && dev->has_vbi_cap)
798*4882a593Smuzhiyun 				v4l2_event_queue(&dev->vbi_cap_dev, &ev);
799*4882a593Smuzhiyun 		}
800*4882a593Smuzhiyun 	}
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun /*
804*4882a593Smuzhiyun  * Conversion function that converts a single-planar format to a
805*4882a593Smuzhiyun  * single-plane multiplanar format.
806*4882a593Smuzhiyun  */
fmt_sp2mp(const struct v4l2_format * sp_fmt,struct v4l2_format * mp_fmt)807*4882a593Smuzhiyun void fmt_sp2mp(const struct v4l2_format *sp_fmt, struct v4l2_format *mp_fmt)
808*4882a593Smuzhiyun {
809*4882a593Smuzhiyun 	struct v4l2_pix_format_mplane *mp = &mp_fmt->fmt.pix_mp;
810*4882a593Smuzhiyun 	struct v4l2_plane_pix_format *ppix = &mp->plane_fmt[0];
811*4882a593Smuzhiyun 	const struct v4l2_pix_format *pix = &sp_fmt->fmt.pix;
812*4882a593Smuzhiyun 	bool is_out = sp_fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT;
813*4882a593Smuzhiyun 
814*4882a593Smuzhiyun 	memset(mp->reserved, 0, sizeof(mp->reserved));
815*4882a593Smuzhiyun 	mp_fmt->type = is_out ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE :
816*4882a593Smuzhiyun 			   V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
817*4882a593Smuzhiyun 	mp->width = pix->width;
818*4882a593Smuzhiyun 	mp->height = pix->height;
819*4882a593Smuzhiyun 	mp->pixelformat = pix->pixelformat;
820*4882a593Smuzhiyun 	mp->field = pix->field;
821*4882a593Smuzhiyun 	mp->colorspace = pix->colorspace;
822*4882a593Smuzhiyun 	mp->xfer_func = pix->xfer_func;
823*4882a593Smuzhiyun 	/* Also copies hsv_enc */
824*4882a593Smuzhiyun 	mp->ycbcr_enc = pix->ycbcr_enc;
825*4882a593Smuzhiyun 	mp->quantization = pix->quantization;
826*4882a593Smuzhiyun 	mp->num_planes = 1;
827*4882a593Smuzhiyun 	mp->flags = pix->flags;
828*4882a593Smuzhiyun 	ppix->sizeimage = pix->sizeimage;
829*4882a593Smuzhiyun 	ppix->bytesperline = pix->bytesperline;
830*4882a593Smuzhiyun 	memset(ppix->reserved, 0, sizeof(ppix->reserved));
831*4882a593Smuzhiyun }
832*4882a593Smuzhiyun 
fmt_sp2mp_func(struct file * file,void * priv,struct v4l2_format * f,fmtfunc func)833*4882a593Smuzhiyun int fmt_sp2mp_func(struct file *file, void *priv,
834*4882a593Smuzhiyun 		struct v4l2_format *f, fmtfunc func)
835*4882a593Smuzhiyun {
836*4882a593Smuzhiyun 	struct v4l2_format fmt;
837*4882a593Smuzhiyun 	struct v4l2_pix_format_mplane *mp = &fmt.fmt.pix_mp;
838*4882a593Smuzhiyun 	struct v4l2_plane_pix_format *ppix = &mp->plane_fmt[0];
839*4882a593Smuzhiyun 	struct v4l2_pix_format *pix = &f->fmt.pix;
840*4882a593Smuzhiyun 	int ret;
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun 	/* Converts to a mplane format */
843*4882a593Smuzhiyun 	fmt_sp2mp(f, &fmt);
844*4882a593Smuzhiyun 	/* Passes it to the generic mplane format function */
845*4882a593Smuzhiyun 	ret = func(file, priv, &fmt);
846*4882a593Smuzhiyun 	/* Copies back the mplane data to the single plane format */
847*4882a593Smuzhiyun 	pix->width = mp->width;
848*4882a593Smuzhiyun 	pix->height = mp->height;
849*4882a593Smuzhiyun 	pix->pixelformat = mp->pixelformat;
850*4882a593Smuzhiyun 	pix->field = mp->field;
851*4882a593Smuzhiyun 	pix->colorspace = mp->colorspace;
852*4882a593Smuzhiyun 	pix->xfer_func = mp->xfer_func;
853*4882a593Smuzhiyun 	/* Also copies hsv_enc */
854*4882a593Smuzhiyun 	pix->ycbcr_enc = mp->ycbcr_enc;
855*4882a593Smuzhiyun 	pix->quantization = mp->quantization;
856*4882a593Smuzhiyun 	pix->sizeimage = ppix->sizeimage;
857*4882a593Smuzhiyun 	pix->bytesperline = ppix->bytesperline;
858*4882a593Smuzhiyun 	pix->flags = mp->flags;
859*4882a593Smuzhiyun 	return ret;
860*4882a593Smuzhiyun }
861*4882a593Smuzhiyun 
vivid_vid_adjust_sel(unsigned flags,struct v4l2_rect * r)862*4882a593Smuzhiyun int vivid_vid_adjust_sel(unsigned flags, struct v4l2_rect *r)
863*4882a593Smuzhiyun {
864*4882a593Smuzhiyun 	unsigned w = r->width;
865*4882a593Smuzhiyun 	unsigned h = r->height;
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 	/* sanitize w and h in case someone passes ~0 as the value */
868*4882a593Smuzhiyun 	w &= 0xffff;
869*4882a593Smuzhiyun 	h &= 0xffff;
870*4882a593Smuzhiyun 	if (!(flags & V4L2_SEL_FLAG_LE)) {
871*4882a593Smuzhiyun 		w++;
872*4882a593Smuzhiyun 		h++;
873*4882a593Smuzhiyun 		if (w < 2)
874*4882a593Smuzhiyun 			w = 2;
875*4882a593Smuzhiyun 		if (h < 2)
876*4882a593Smuzhiyun 			h = 2;
877*4882a593Smuzhiyun 	}
878*4882a593Smuzhiyun 	if (!(flags & V4L2_SEL_FLAG_GE)) {
879*4882a593Smuzhiyun 		if (w > MAX_WIDTH)
880*4882a593Smuzhiyun 			w = MAX_WIDTH;
881*4882a593Smuzhiyun 		if (h > MAX_HEIGHT)
882*4882a593Smuzhiyun 			h = MAX_HEIGHT;
883*4882a593Smuzhiyun 	}
884*4882a593Smuzhiyun 	w = w & ~1;
885*4882a593Smuzhiyun 	h = h & ~1;
886*4882a593Smuzhiyun 	if (w < 2 || h < 2)
887*4882a593Smuzhiyun 		return -ERANGE;
888*4882a593Smuzhiyun 	if (w > MAX_WIDTH || h > MAX_HEIGHT)
889*4882a593Smuzhiyun 		return -ERANGE;
890*4882a593Smuzhiyun 	if (r->top < 0)
891*4882a593Smuzhiyun 		r->top = 0;
892*4882a593Smuzhiyun 	if (r->left < 0)
893*4882a593Smuzhiyun 		r->left = 0;
894*4882a593Smuzhiyun 	/* sanitize left and top in case someone passes ~0 as the value */
895*4882a593Smuzhiyun 	r->left &= 0xfffe;
896*4882a593Smuzhiyun 	r->top &= 0xfffe;
897*4882a593Smuzhiyun 	if (r->left + w > MAX_WIDTH)
898*4882a593Smuzhiyun 		r->left = MAX_WIDTH - w;
899*4882a593Smuzhiyun 	if (r->top + h > MAX_HEIGHT)
900*4882a593Smuzhiyun 		r->top = MAX_HEIGHT - h;
901*4882a593Smuzhiyun 	if ((flags & (V4L2_SEL_FLAG_GE | V4L2_SEL_FLAG_LE)) ==
902*4882a593Smuzhiyun 			(V4L2_SEL_FLAG_GE | V4L2_SEL_FLAG_LE) &&
903*4882a593Smuzhiyun 	    (r->width != w || r->height != h))
904*4882a593Smuzhiyun 		return -ERANGE;
905*4882a593Smuzhiyun 	r->width = w;
906*4882a593Smuzhiyun 	r->height = h;
907*4882a593Smuzhiyun 	return 0;
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun 
vivid_enum_fmt_vid(struct file * file,void * priv,struct v4l2_fmtdesc * f)910*4882a593Smuzhiyun int vivid_enum_fmt_vid(struct file *file, void  *priv,
911*4882a593Smuzhiyun 					struct v4l2_fmtdesc *f)
912*4882a593Smuzhiyun {
913*4882a593Smuzhiyun 	struct vivid_dev *dev = video_drvdata(file);
914*4882a593Smuzhiyun 	const struct vivid_fmt *fmt;
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun 	if (f->index >= ARRAY_SIZE(vivid_formats) -
917*4882a593Smuzhiyun 	    (dev->multiplanar ? 0 : VIVID_MPLANAR_FORMATS))
918*4882a593Smuzhiyun 		return -EINVAL;
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 	fmt = &vivid_formats[f->index];
921*4882a593Smuzhiyun 
922*4882a593Smuzhiyun 	f->pixelformat = fmt->fourcc;
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun 	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
925*4882a593Smuzhiyun 	    f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
926*4882a593Smuzhiyun 		return 0;
927*4882a593Smuzhiyun 	/*
928*4882a593Smuzhiyun 	 * For capture devices, we support the CSC API.
929*4882a593Smuzhiyun 	 * We allow userspace to:
930*4882a593Smuzhiyun 	 * 1. set the colorspace
931*4882a593Smuzhiyun 	 * 2. set the xfer_func
932*4882a593Smuzhiyun 	 * 3. set the ycbcr_enc on YUV formats
933*4882a593Smuzhiyun 	 * 4. set the hsv_enc on HSV formats
934*4882a593Smuzhiyun 	 * 5. set the quantization on YUV and RGB formats
935*4882a593Smuzhiyun 	 */
936*4882a593Smuzhiyun 	f->flags |= V4L2_FMT_FLAG_CSC_COLORSPACE;
937*4882a593Smuzhiyun 	f->flags |= V4L2_FMT_FLAG_CSC_XFER_FUNC;
938*4882a593Smuzhiyun 
939*4882a593Smuzhiyun 	if (fmt->color_enc == TGP_COLOR_ENC_YCBCR) {
940*4882a593Smuzhiyun 		f->flags |= V4L2_FMT_FLAG_CSC_YCBCR_ENC;
941*4882a593Smuzhiyun 		f->flags |= V4L2_FMT_FLAG_CSC_QUANTIZATION;
942*4882a593Smuzhiyun 	} else if (fmt->color_enc == TGP_COLOR_ENC_HSV) {
943*4882a593Smuzhiyun 		f->flags |= V4L2_FMT_FLAG_CSC_HSV_ENC;
944*4882a593Smuzhiyun 	} else if (fmt->color_enc == TGP_COLOR_ENC_RGB) {
945*4882a593Smuzhiyun 		f->flags |= V4L2_FMT_FLAG_CSC_QUANTIZATION;
946*4882a593Smuzhiyun 	}
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun 	return 0;
949*4882a593Smuzhiyun }
950*4882a593Smuzhiyun 
vidioc_g_std(struct file * file,void * priv,v4l2_std_id * id)951*4882a593Smuzhiyun int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
952*4882a593Smuzhiyun {
953*4882a593Smuzhiyun 	struct vivid_dev *dev = video_drvdata(file);
954*4882a593Smuzhiyun 	struct video_device *vdev = video_devdata(file);
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun 	if (vdev->vfl_dir == VFL_DIR_RX) {
957*4882a593Smuzhiyun 		if (!vivid_is_sdtv_cap(dev))
958*4882a593Smuzhiyun 			return -ENODATA;
959*4882a593Smuzhiyun 		*id = dev->std_cap[dev->input];
960*4882a593Smuzhiyun 	} else {
961*4882a593Smuzhiyun 		if (!vivid_is_svid_out(dev))
962*4882a593Smuzhiyun 			return -ENODATA;
963*4882a593Smuzhiyun 		*id = dev->std_out;
964*4882a593Smuzhiyun 	}
965*4882a593Smuzhiyun 	return 0;
966*4882a593Smuzhiyun }
967*4882a593Smuzhiyun 
vidioc_g_dv_timings(struct file * file,void * _fh,struct v4l2_dv_timings * timings)968*4882a593Smuzhiyun int vidioc_g_dv_timings(struct file *file, void *_fh,
969*4882a593Smuzhiyun 				    struct v4l2_dv_timings *timings)
970*4882a593Smuzhiyun {
971*4882a593Smuzhiyun 	struct vivid_dev *dev = video_drvdata(file);
972*4882a593Smuzhiyun 	struct video_device *vdev = video_devdata(file);
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	if (vdev->vfl_dir == VFL_DIR_RX) {
975*4882a593Smuzhiyun 		if (!vivid_is_hdmi_cap(dev))
976*4882a593Smuzhiyun 			return -ENODATA;
977*4882a593Smuzhiyun 		*timings = dev->dv_timings_cap[dev->input];
978*4882a593Smuzhiyun 	} else {
979*4882a593Smuzhiyun 		if (!vivid_is_hdmi_out(dev))
980*4882a593Smuzhiyun 			return -ENODATA;
981*4882a593Smuzhiyun 		*timings = dev->dv_timings_out;
982*4882a593Smuzhiyun 	}
983*4882a593Smuzhiyun 	return 0;
984*4882a593Smuzhiyun }
985*4882a593Smuzhiyun 
vidioc_enum_dv_timings(struct file * file,void * _fh,struct v4l2_enum_dv_timings * timings)986*4882a593Smuzhiyun int vidioc_enum_dv_timings(struct file *file, void *_fh,
987*4882a593Smuzhiyun 				    struct v4l2_enum_dv_timings *timings)
988*4882a593Smuzhiyun {
989*4882a593Smuzhiyun 	struct vivid_dev *dev = video_drvdata(file);
990*4882a593Smuzhiyun 	struct video_device *vdev = video_devdata(file);
991*4882a593Smuzhiyun 
992*4882a593Smuzhiyun 	if (vdev->vfl_dir == VFL_DIR_RX) {
993*4882a593Smuzhiyun 		if (!vivid_is_hdmi_cap(dev))
994*4882a593Smuzhiyun 			return -ENODATA;
995*4882a593Smuzhiyun 	} else {
996*4882a593Smuzhiyun 		if (!vivid_is_hdmi_out(dev))
997*4882a593Smuzhiyun 			return -ENODATA;
998*4882a593Smuzhiyun 	}
999*4882a593Smuzhiyun 	return v4l2_enum_dv_timings_cap(timings, &vivid_dv_timings_cap,
1000*4882a593Smuzhiyun 			NULL, NULL);
1001*4882a593Smuzhiyun }
1002*4882a593Smuzhiyun 
vidioc_dv_timings_cap(struct file * file,void * _fh,struct v4l2_dv_timings_cap * cap)1003*4882a593Smuzhiyun int vidioc_dv_timings_cap(struct file *file, void *_fh,
1004*4882a593Smuzhiyun 				    struct v4l2_dv_timings_cap *cap)
1005*4882a593Smuzhiyun {
1006*4882a593Smuzhiyun 	struct vivid_dev *dev = video_drvdata(file);
1007*4882a593Smuzhiyun 	struct video_device *vdev = video_devdata(file);
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	if (vdev->vfl_dir == VFL_DIR_RX) {
1010*4882a593Smuzhiyun 		if (!vivid_is_hdmi_cap(dev))
1011*4882a593Smuzhiyun 			return -ENODATA;
1012*4882a593Smuzhiyun 	} else {
1013*4882a593Smuzhiyun 		if (!vivid_is_hdmi_out(dev))
1014*4882a593Smuzhiyun 			return -ENODATA;
1015*4882a593Smuzhiyun 	}
1016*4882a593Smuzhiyun 	*cap = vivid_dv_timings_cap;
1017*4882a593Smuzhiyun 	return 0;
1018*4882a593Smuzhiyun }
1019*4882a593Smuzhiyun 
vidioc_g_edid(struct file * file,void * _fh,struct v4l2_edid * edid)1020*4882a593Smuzhiyun int vidioc_g_edid(struct file *file, void *_fh,
1021*4882a593Smuzhiyun 			 struct v4l2_edid *edid)
1022*4882a593Smuzhiyun {
1023*4882a593Smuzhiyun 	struct vivid_dev *dev = video_drvdata(file);
1024*4882a593Smuzhiyun 	struct video_device *vdev = video_devdata(file);
1025*4882a593Smuzhiyun 	struct cec_adapter *adap;
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun 	memset(edid->reserved, 0, sizeof(edid->reserved));
1028*4882a593Smuzhiyun 	if (vdev->vfl_dir == VFL_DIR_RX) {
1029*4882a593Smuzhiyun 		if (edid->pad >= dev->num_inputs)
1030*4882a593Smuzhiyun 			return -EINVAL;
1031*4882a593Smuzhiyun 		if (dev->input_type[edid->pad] != HDMI)
1032*4882a593Smuzhiyun 			return -EINVAL;
1033*4882a593Smuzhiyun 		adap = dev->cec_rx_adap;
1034*4882a593Smuzhiyun 	} else {
1035*4882a593Smuzhiyun 		unsigned int bus_idx;
1036*4882a593Smuzhiyun 
1037*4882a593Smuzhiyun 		if (edid->pad >= dev->num_outputs)
1038*4882a593Smuzhiyun 			return -EINVAL;
1039*4882a593Smuzhiyun 		if (dev->output_type[edid->pad] != HDMI)
1040*4882a593Smuzhiyun 			return -EINVAL;
1041*4882a593Smuzhiyun 		if (!dev->display_present[edid->pad])
1042*4882a593Smuzhiyun 			return -ENODATA;
1043*4882a593Smuzhiyun 		bus_idx = dev->cec_output2bus_map[edid->pad];
1044*4882a593Smuzhiyun 		adap = dev->cec_tx_adap[bus_idx];
1045*4882a593Smuzhiyun 	}
1046*4882a593Smuzhiyun 	if (edid->start_block == 0 && edid->blocks == 0) {
1047*4882a593Smuzhiyun 		edid->blocks = dev->edid_blocks;
1048*4882a593Smuzhiyun 		return 0;
1049*4882a593Smuzhiyun 	}
1050*4882a593Smuzhiyun 	if (dev->edid_blocks == 0)
1051*4882a593Smuzhiyun 		return -ENODATA;
1052*4882a593Smuzhiyun 	if (edid->start_block >= dev->edid_blocks)
1053*4882a593Smuzhiyun 		return -EINVAL;
1054*4882a593Smuzhiyun 	if (edid->blocks > dev->edid_blocks - edid->start_block)
1055*4882a593Smuzhiyun 		edid->blocks = dev->edid_blocks - edid->start_block;
1056*4882a593Smuzhiyun 	if (adap)
1057*4882a593Smuzhiyun 		v4l2_set_edid_phys_addr(dev->edid, dev->edid_blocks * 128, adap->phys_addr);
1058*4882a593Smuzhiyun 	memcpy(edid->edid, dev->edid + edid->start_block * 128, edid->blocks * 128);
1059*4882a593Smuzhiyun 	return 0;
1060*4882a593Smuzhiyun }
1061