GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / media / platform / sunxi / sun8i-rotate / sun8i_formats.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net> */
3
4 #include "sun8i-formats.h"
5 #include "sun8i-rotate.h"
6
7 /*
8  * Formats not included in array:
9  * ROTATE_FORMAT_BGR565
10  * ROTATE_FORMAT_VYUV
11  */
12
13 static const struct rotate_format rotate_formats[] = {
14         {
15                 .fourcc = V4L2_PIX_FMT_ARGB32,
16                 .hw_format = ROTATE_FORMAT_ARGB32,
17                 .planes = 1,
18                 .bpp = { 4, 0, 0 },
19                 .hsub = 1,
20                 .vsub = 1,
21                 .flags = ROTATE_FLAG_OUTPUT
22         }, {
23                 .fourcc = V4L2_PIX_FMT_ABGR32,
24                 .hw_format = ROTATE_FORMAT_ABGR32,
25                 .planes = 1,
26                 .bpp = { 4, 0, 0 },
27                 .hsub = 1,
28                 .vsub = 1,
29                 .flags = ROTATE_FLAG_OUTPUT
30         }, {
31                 .fourcc = V4L2_PIX_FMT_RGBA32,
32                 .hw_format = ROTATE_FORMAT_RGBA32,
33                 .planes = 1,
34                 .bpp = { 4, 0, 0 },
35                 .hsub = 1,
36                 .vsub = 1,
37                 .flags = ROTATE_FLAG_OUTPUT
38         }, {
39                 .fourcc = V4L2_PIX_FMT_BGRA32,
40                 .hw_format = ROTATE_FORMAT_BGRA32,
41                 .planes = 1,
42                 .bpp = { 4, 0, 0 },
43                 .hsub = 1,
44                 .vsub = 1,
45                 .flags = ROTATE_FLAG_OUTPUT
46         }, {
47                 .fourcc = V4L2_PIX_FMT_XRGB32,
48                 .hw_format = ROTATE_FORMAT_XRGB32,
49                 .planes = 1,
50                 .bpp = { 4, 0, 0 },
51                 .hsub = 1,
52                 .vsub = 1,
53                 .flags = ROTATE_FLAG_OUTPUT
54         }, {
55                 .fourcc = V4L2_PIX_FMT_XBGR32,
56                 .hw_format = ROTATE_FORMAT_XBGR32,
57                 .planes = 1,
58                 .bpp = { 4, 0, 0 },
59                 .hsub = 1,
60                 .vsub = 1,
61                 .flags = ROTATE_FLAG_OUTPUT
62         }, {
63                 .fourcc = V4L2_PIX_FMT_RGB32,
64                 .hw_format = ROTATE_FORMAT_RGBX32,
65                 .planes = 1,
66                 .bpp = { 4, 0, 0 },
67                 .hsub = 1,
68                 .vsub = 1,
69                 .flags = ROTATE_FLAG_OUTPUT
70         }, {
71                 .fourcc = V4L2_PIX_FMT_BGR32,
72                 .hw_format = ROTATE_FORMAT_BGRX32,
73                 .planes = 1,
74                 .bpp = { 4, 0, 0 },
75                 .hsub = 1,
76                 .vsub = 1,
77                 .flags = ROTATE_FLAG_OUTPUT
78         }, {
79                 .fourcc = V4L2_PIX_FMT_RGB24,
80                 .hw_format = ROTATE_FORMAT_RGB24,
81                 .planes = 1,
82                 .bpp = { 3, 0, 0 },
83                 .hsub = 1,
84                 .vsub = 1,
85                 .flags = ROTATE_FLAG_OUTPUT
86         }, {
87                 .fourcc = V4L2_PIX_FMT_BGR24,
88                 .hw_format = ROTATE_FORMAT_BGR24,
89                 .planes = 1,
90                 .bpp = { 3, 0, 0 },
91                 .hsub = 1,
92                 .vsub = 1,
93                 .flags = ROTATE_FLAG_OUTPUT
94         }, {
95                 .fourcc = V4L2_PIX_FMT_RGB565,
96                 .hw_format = ROTATE_FORMAT_RGB565,
97                 .planes = 1,
98                 .bpp = { 2, 0, 0 },
99                 .hsub = 1,
100                 .vsub = 1,
101                 .flags = ROTATE_FLAG_OUTPUT
102         }, {
103                 .fourcc = V4L2_PIX_FMT_ARGB444,
104                 .hw_format = ROTATE_FORMAT_ARGB4444,
105                 .planes = 1,
106                 .bpp = { 2, 0, 0 },
107                 .hsub = 1,
108                 .vsub = 1,
109                 .flags = ROTATE_FLAG_OUTPUT
110         }, {
111                 .fourcc = V4L2_PIX_FMT_ABGR444,
112                 .hw_format = ROTATE_FORMAT_ABGR4444,
113                 .planes = 1,
114                 .bpp = { 2, 0, 0 },
115                 .hsub = 1,
116                 .vsub = 1,
117                 .flags = ROTATE_FLAG_OUTPUT
118         }, {
119                 .fourcc = V4L2_PIX_FMT_RGBA444,
120                 .hw_format = ROTATE_FORMAT_RGBA4444,
121                 .planes = 1,
122                 .bpp = { 2, 0, 0 },
123                 .hsub = 1,
124                 .vsub = 1,
125                 .flags = ROTATE_FLAG_OUTPUT
126         }, {
127                 .fourcc = V4L2_PIX_FMT_BGRA444,
128                 .hw_format = ROTATE_FORMAT_BGRA4444,
129                 .planes = 1,
130                 .bpp = { 2, 0, 0 },
131                 .hsub = 1,
132                 .vsub = 1,
133                 .flags = ROTATE_FLAG_OUTPUT
134         }, {
135                 .fourcc = V4L2_PIX_FMT_ARGB555,
136                 .hw_format = ROTATE_FORMAT_ARGB1555,
137                 .planes = 1,
138                 .bpp = { 2, 0, 0 },
139                 .hsub = 1,
140                 .vsub = 1,
141                 .flags = ROTATE_FLAG_OUTPUT
142         }, {
143                 .fourcc = V4L2_PIX_FMT_ABGR555,
144                 .hw_format = ROTATE_FORMAT_ABGR1555,
145                 .planes = 1,
146                 .bpp = { 2, 0, 0 },
147                 .hsub = 1,
148                 .vsub = 1,
149                 .flags = ROTATE_FLAG_OUTPUT
150         }, {
151                 .fourcc = V4L2_PIX_FMT_RGBA555,
152                 .hw_format = ROTATE_FORMAT_RGBA5551,
153                 .planes = 1,
154                 .bpp = { 2, 0, 0 },
155                 .hsub = 1,
156                 .vsub = 1,
157                 .flags = ROTATE_FLAG_OUTPUT
158         }, {
159                 .fourcc = V4L2_PIX_FMT_BGRA555,
160                 .hw_format = ROTATE_FORMAT_BGRA5551,
161                 .planes = 1,
162                 .bpp = { 2, 0, 0 },
163                 .hsub = 1,
164                 .vsub = 1,
165                 .flags = ROTATE_FLAG_OUTPUT
166         }, {
167                 .fourcc = V4L2_PIX_FMT_YVYU,
168                 .hw_format = ROTATE_FORMAT_YVYU,
169                 .planes = 1,
170                 .bpp = { 2, 0, 0 },
171                 .hsub = 2,
172                 .vsub = 1,
173                 .flags = ROTATE_FLAG_YUV
174         }, {
175                 .fourcc = V4L2_PIX_FMT_UYVY,
176                 .hw_format = ROTATE_FORMAT_UYVY,
177                 .planes = 1,
178                 .bpp = { 2, 0, 0 },
179                 .hsub = 2,
180                 .vsub = 1,
181                 .flags = ROTATE_FLAG_YUV
182         }, {
183                 .fourcc = V4L2_PIX_FMT_YUYV,
184                 .hw_format = ROTATE_FORMAT_YUYV,
185                 .planes = 1,
186                 .bpp = { 2, 0, 0 },
187                 .hsub = 2,
188                 .vsub = 1,
189                 .flags = ROTATE_FLAG_YUV
190         }, {
191                 .fourcc = V4L2_PIX_FMT_NV61,
192                 .hw_format = ROTATE_FORMAT_NV61,
193                 .planes = 2,
194                 .bpp = { 1, 2, 0 },
195                 .hsub = 2,
196                 .vsub = 1,
197                 .flags = ROTATE_FLAG_YUV
198         }, {
199                 .fourcc = V4L2_PIX_FMT_NV16,
200                 .hw_format = ROTATE_FORMAT_NV16,
201                 .planes = 2,
202                 .bpp = { 1, 2, 0 },
203                 .hsub = 2,
204                 .vsub = 1,
205                 .flags = ROTATE_FLAG_YUV
206         }, {
207                 .fourcc = V4L2_PIX_FMT_YUV422P,
208                 .hw_format = ROTATE_FORMAT_YUV422P,
209                 .planes = 3,
210                 .bpp = { 1, 1, 1 },
211                 .hsub = 2,
212                 .vsub = 1,
213                 .flags = ROTATE_FLAG_YUV
214         }, {
215                 .fourcc = V4L2_PIX_FMT_NV21,
216                 .hw_format = ROTATE_FORMAT_NV21,
217                 .planes = 2,
218                 .bpp = { 1, 2, 0 },
219                 .hsub = 2,
220                 .vsub = 2,
221                 .flags = ROTATE_FLAG_YUV
222         }, {
223                 .fourcc = V4L2_PIX_FMT_NV12,
224                 .hw_format = ROTATE_FORMAT_NV12,
225                 .planes = 2,
226                 .bpp = { 1, 2, 0 },
227                 .hsub = 2,
228                 .vsub = 2,
229                 .flags = ROTATE_FLAG_YUV
230         }, {
231                 .fourcc = V4L2_PIX_FMT_YUV420,
232                 .hw_format = ROTATE_FORMAT_YUV420P,
233                 .planes = 3,
234                 .bpp = { 1, 1, 1 },
235                 .hsub = 2,
236                 .vsub = 2,
237                 .flags = ROTATE_FLAG_YUV | ROTATE_FLAG_OUTPUT
238         },
239 };
240
241 const struct rotate_format *rotate_find_format(u32 pixelformat)
242 {
243         unsigned int i;
244
245         for (i = 0; i < ARRAY_SIZE(rotate_formats); i++)
246                 if (rotate_formats[i].fourcc == pixelformat)
247                         return &rotate_formats[i];
248
249         return NULL;
250 }
251
252 int rotate_enum_fmt(struct v4l2_fmtdesc *f, bool dst)
253 {
254         int i, index;
255
256         index = 0;
257
258         for (i = 0; i < ARRAY_SIZE(rotate_formats); i++) {
259                 /* not all formats can be used for capture buffers */
260                 if (dst && !(rotate_formats[i].flags & ROTATE_FLAG_OUTPUT))
261                         continue;
262
263                 if (index == f->index) {
264                         f->pixelformat = rotate_formats[i].fourcc;
265
266                         return 0;
267                 }
268
269                 index++;
270         }
271
272         return -EINVAL;
273 }