[media] include/media: move driver interface headers to a separate dir
[deliverable/linux.git] / drivers / media / platform / soc_camera / soc_mediabus.c
CommitLineData
9a74251d
GL
1/*
2 * soc-camera media bus helper routines
3 *
4 * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/kernel.h>
12#include <linux/module.h>
13
14#include <media/v4l2-device.h>
15#include <media/v4l2-mediabus.h>
d647f0b7 16#include <media/drv-intf/soc_mediabus.h>
9a74251d 17
93f116d5
GL
18static const struct soc_mbus_lookup mbus_fmt[] = {
19{
27ffaeb0 20 .code = MEDIA_BUS_FMT_YUYV8_2X8,
93f116d5 21 .fmt = {
9a74251d
GL
22 .fourcc = V4L2_PIX_FMT_YUYV,
23 .name = "YUYV",
24 .bits_per_sample = 8,
25 .packing = SOC_MBUS_PACKING_2X8_PADHI,
26 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 27 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 28 },
93f116d5 29}, {
27ffaeb0 30 .code = MEDIA_BUS_FMT_YVYU8_2X8,
93f116d5 31 .fmt = {
9a74251d
GL
32 .fourcc = V4L2_PIX_FMT_YVYU,
33 .name = "YVYU",
34 .bits_per_sample = 8,
35 .packing = SOC_MBUS_PACKING_2X8_PADHI,
36 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 37 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 38 },
93f116d5 39}, {
27ffaeb0 40 .code = MEDIA_BUS_FMT_UYVY8_2X8,
93f116d5 41 .fmt = {
9a74251d
GL
42 .fourcc = V4L2_PIX_FMT_UYVY,
43 .name = "UYVY",
44 .bits_per_sample = 8,
45 .packing = SOC_MBUS_PACKING_2X8_PADHI,
46 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 47 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 48 },
93f116d5 49}, {
27ffaeb0 50 .code = MEDIA_BUS_FMT_VYUY8_2X8,
93f116d5 51 .fmt = {
9a74251d
GL
52 .fourcc = V4L2_PIX_FMT_VYUY,
53 .name = "VYUY",
54 .bits_per_sample = 8,
55 .packing = SOC_MBUS_PACKING_2X8_PADHI,
56 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 57 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 58 },
93f116d5 59}, {
27ffaeb0 60 .code = MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE,
93f116d5 61 .fmt = {
9a74251d
GL
62 .fourcc = V4L2_PIX_FMT_RGB555,
63 .name = "RGB555",
64 .bits_per_sample = 8,
65 .packing = SOC_MBUS_PACKING_2X8_PADHI,
66 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 67 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 68 },
93f116d5 69}, {
27ffaeb0 70 .code = MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE,
93f116d5 71 .fmt = {
9a74251d
GL
72 .fourcc = V4L2_PIX_FMT_RGB555X,
73 .name = "RGB555X",
74 .bits_per_sample = 8,
75 .packing = SOC_MBUS_PACKING_2X8_PADHI,
abcb6b99 76 .order = SOC_MBUS_ORDER_BE,
ad3b81fa 77 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 78 },
93f116d5 79}, {
27ffaeb0 80 .code = MEDIA_BUS_FMT_RGB565_2X8_LE,
93f116d5 81 .fmt = {
9a74251d
GL
82 .fourcc = V4L2_PIX_FMT_RGB565,
83 .name = "RGB565",
84 .bits_per_sample = 8,
85 .packing = SOC_MBUS_PACKING_2X8_PADHI,
86 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 87 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 88 },
93f116d5 89}, {
27ffaeb0 90 .code = MEDIA_BUS_FMT_RGB565_2X8_BE,
93f116d5 91 .fmt = {
9a74251d
GL
92 .fourcc = V4L2_PIX_FMT_RGB565X,
93 .name = "RGB565X",
94 .bits_per_sample = 8,
95 .packing = SOC_MBUS_PACKING_2X8_PADHI,
abcb6b99 96 .order = SOC_MBUS_ORDER_BE,
ad3b81fa 97 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 98 },
7b88fc08 99}, {
27ffaeb0 100 .code = MEDIA_BUS_FMT_RGB666_1X18,
7b88fc08
PE
101 .fmt = {
102 .fourcc = V4L2_PIX_FMT_RGB32,
103 .name = "RGB666/32bpp",
104 .bits_per_sample = 18,
105 .packing = SOC_MBUS_PACKING_EXTEND32,
106 .order = SOC_MBUS_ORDER_LE,
107 },
108}, {
27ffaeb0 109 .code = MEDIA_BUS_FMT_RGB888_1X24,
7b88fc08
PE
110 .fmt = {
111 .fourcc = V4L2_PIX_FMT_RGB32,
112 .name = "RGB888/32bpp",
113 .bits_per_sample = 24,
114 .packing = SOC_MBUS_PACKING_EXTEND32,
115 .order = SOC_MBUS_ORDER_LE,
116 },
117}, {
27ffaeb0 118 .code = MEDIA_BUS_FMT_RGB888_2X12_BE,
7b88fc08
PE
119 .fmt = {
120 .fourcc = V4L2_PIX_FMT_RGB32,
121 .name = "RGB888/32bpp",
122 .bits_per_sample = 12,
123 .packing = SOC_MBUS_PACKING_EXTEND32,
124 .order = SOC_MBUS_ORDER_BE,
125 },
126}, {
27ffaeb0 127 .code = MEDIA_BUS_FMT_RGB888_2X12_LE,
7b88fc08
PE
128 .fmt = {
129 .fourcc = V4L2_PIX_FMT_RGB32,
130 .name = "RGB888/32bpp",
131 .bits_per_sample = 12,
132 .packing = SOC_MBUS_PACKING_EXTEND32,
133 .order = SOC_MBUS_ORDER_LE,
134 },
93f116d5 135}, {
27ffaeb0 136 .code = MEDIA_BUS_FMT_SBGGR8_1X8,
93f116d5 137 .fmt = {
9a74251d
GL
138 .fourcc = V4L2_PIX_FMT_SBGGR8,
139 .name = "Bayer 8 BGGR",
140 .bits_per_sample = 8,
141 .packing = SOC_MBUS_PACKING_NONE,
142 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 143 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 144 },
93f116d5 145}, {
27ffaeb0 146 .code = MEDIA_BUS_FMT_SBGGR10_1X10,
93f116d5 147 .fmt = {
9a74251d
GL
148 .fourcc = V4L2_PIX_FMT_SBGGR10,
149 .name = "Bayer 10 BGGR",
150 .bits_per_sample = 10,
151 .packing = SOC_MBUS_PACKING_EXTEND16,
152 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 153 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 154 },
93f116d5 155}, {
27ffaeb0 156 .code = MEDIA_BUS_FMT_Y8_1X8,
93f116d5 157 .fmt = {
9a74251d
GL
158 .fourcc = V4L2_PIX_FMT_GREY,
159 .name = "Grey",
160 .bits_per_sample = 8,
161 .packing = SOC_MBUS_PACKING_NONE,
162 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 163 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 164 },
93f116d5 165}, {
27ffaeb0 166 .code = MEDIA_BUS_FMT_Y10_1X10,
93f116d5 167 .fmt = {
9a74251d
GL
168 .fourcc = V4L2_PIX_FMT_Y10,
169 .name = "Grey 10bit",
170 .bits_per_sample = 10,
171 .packing = SOC_MBUS_PACKING_EXTEND16,
172 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 173 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 174 },
93f116d5 175}, {
27ffaeb0 176 .code = MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE,
93f116d5 177 .fmt = {
9a74251d
GL
178 .fourcc = V4L2_PIX_FMT_SBGGR10,
179 .name = "Bayer 10 BGGR",
180 .bits_per_sample = 8,
181 .packing = SOC_MBUS_PACKING_2X8_PADHI,
182 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 183 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 184 },
93f116d5 185}, {
27ffaeb0 186 .code = MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE,
93f116d5 187 .fmt = {
9a74251d
GL
188 .fourcc = V4L2_PIX_FMT_SBGGR10,
189 .name = "Bayer 10 BGGR",
190 .bits_per_sample = 8,
191 .packing = SOC_MBUS_PACKING_2X8_PADLO,
192 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 193 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 194 },
93f116d5 195}, {
27ffaeb0 196 .code = MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE,
93f116d5 197 .fmt = {
9a74251d
GL
198 .fourcc = V4L2_PIX_FMT_SBGGR10,
199 .name = "Bayer 10 BGGR",
200 .bits_per_sample = 8,
201 .packing = SOC_MBUS_PACKING_2X8_PADHI,
202 .order = SOC_MBUS_ORDER_BE,
ad3b81fa 203 .layout = SOC_MBUS_LAYOUT_PACKED,
81355e40 204 },
93f116d5 205}, {
27ffaeb0 206 .code = MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE,
93f116d5 207 .fmt = {
9a74251d
GL
208 .fourcc = V4L2_PIX_FMT_SBGGR10,
209 .name = "Bayer 10 BGGR",
210 .bits_per_sample = 8,
211 .packing = SOC_MBUS_PACKING_2X8_PADLO,
212 .order = SOC_MBUS_ORDER_BE,
ad3b81fa 213 .layout = SOC_MBUS_LAYOUT_PACKED,
9a74251d 214 },
93f116d5 215}, {
27ffaeb0 216 .code = MEDIA_BUS_FMT_JPEG_1X8,
93f116d5 217 .fmt = {
64149deb
KL
218 .fourcc = V4L2_PIX_FMT_JPEG,
219 .name = "JPEG",
220 .bits_per_sample = 8,
221 .packing = SOC_MBUS_PACKING_VARIABLE,
222 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 223 .layout = SOC_MBUS_LAYOUT_PACKED,
64149deb 224 },
e23b961d 225}, {
27ffaeb0 226 .code = MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE,
e23b961d
GL
227 .fmt = {
228 .fourcc = V4L2_PIX_FMT_RGB444,
229 .name = "RGB444",
230 .bits_per_sample = 8,
231 .packing = SOC_MBUS_PACKING_2X8_PADHI,
232 .order = SOC_MBUS_ORDER_BE,
ad3b81fa 233 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
234 },
235}, {
27ffaeb0 236 .code = MEDIA_BUS_FMT_YUYV8_1_5X8,
e23b961d
GL
237 .fmt = {
238 .fourcc = V4L2_PIX_FMT_YUV420,
239 .name = "YUYV 4:2:0",
240 .bits_per_sample = 8,
241 .packing = SOC_MBUS_PACKING_1_5X8,
242 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 243 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
244 },
245}, {
27ffaeb0 246 .code = MEDIA_BUS_FMT_YVYU8_1_5X8,
e23b961d
GL
247 .fmt = {
248 .fourcc = V4L2_PIX_FMT_YVU420,
249 .name = "YVYU 4:2:0",
250 .bits_per_sample = 8,
251 .packing = SOC_MBUS_PACKING_1_5X8,
252 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 253 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
254 },
255}, {
27ffaeb0 256 .code = MEDIA_BUS_FMT_UYVY8_1X16,
e23b961d
GL
257 .fmt = {
258 .fourcc = V4L2_PIX_FMT_UYVY,
259 .name = "UYVY 16bit",
260 .bits_per_sample = 16,
261 .packing = SOC_MBUS_PACKING_EXTEND16,
262 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 263 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
264 },
265}, {
27ffaeb0 266 .code = MEDIA_BUS_FMT_VYUY8_1X16,
e23b961d
GL
267 .fmt = {
268 .fourcc = V4L2_PIX_FMT_VYUY,
269 .name = "VYUY 16bit",
270 .bits_per_sample = 16,
271 .packing = SOC_MBUS_PACKING_EXTEND16,
272 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 273 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
274 },
275}, {
27ffaeb0 276 .code = MEDIA_BUS_FMT_YUYV8_1X16,
e23b961d
GL
277 .fmt = {
278 .fourcc = V4L2_PIX_FMT_YUYV,
279 .name = "YUYV 16bit",
280 .bits_per_sample = 16,
281 .packing = SOC_MBUS_PACKING_EXTEND16,
282 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 283 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
284 },
285}, {
27ffaeb0 286 .code = MEDIA_BUS_FMT_YVYU8_1X16,
e23b961d
GL
287 .fmt = {
288 .fourcc = V4L2_PIX_FMT_YVYU,
289 .name = "YVYU 16bit",
290 .bits_per_sample = 16,
291 .packing = SOC_MBUS_PACKING_EXTEND16,
292 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 293 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
294 },
295}, {
27ffaeb0 296 .code = MEDIA_BUS_FMT_SGRBG8_1X8,
e23b961d
GL
297 .fmt = {
298 .fourcc = V4L2_PIX_FMT_SGRBG8,
299 .name = "Bayer 8 GRBG",
300 .bits_per_sample = 8,
301 .packing = SOC_MBUS_PACKING_NONE,
302 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 303 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
304 },
305}, {
27ffaeb0 306 .code = MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8,
e23b961d
GL
307 .fmt = {
308 .fourcc = V4L2_PIX_FMT_SGRBG10DPCM8,
309 .name = "Bayer 10 BGGR DPCM 8",
310 .bits_per_sample = 8,
311 .packing = SOC_MBUS_PACKING_NONE,
312 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 313 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
314 },
315}, {
27ffaeb0 316 .code = MEDIA_BUS_FMT_SGBRG10_1X10,
e23b961d
GL
317 .fmt = {
318 .fourcc = V4L2_PIX_FMT_SGBRG10,
319 .name = "Bayer 10 GBRG",
320 .bits_per_sample = 10,
321 .packing = SOC_MBUS_PACKING_EXTEND16,
322 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 323 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
324 },
325}, {
27ffaeb0 326 .code = MEDIA_BUS_FMT_SGRBG10_1X10,
e23b961d
GL
327 .fmt = {
328 .fourcc = V4L2_PIX_FMT_SGRBG10,
329 .name = "Bayer 10 GRBG",
330 .bits_per_sample = 10,
331 .packing = SOC_MBUS_PACKING_EXTEND16,
332 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 333 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
334 },
335}, {
27ffaeb0 336 .code = MEDIA_BUS_FMT_SRGGB10_1X10,
e23b961d
GL
337 .fmt = {
338 .fourcc = V4L2_PIX_FMT_SRGGB10,
339 .name = "Bayer 10 RGGB",
340 .bits_per_sample = 10,
341 .packing = SOC_MBUS_PACKING_EXTEND16,
342 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 343 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
344 },
345}, {
27ffaeb0 346 .code = MEDIA_BUS_FMT_SBGGR12_1X12,
e23b961d
GL
347 .fmt = {
348 .fourcc = V4L2_PIX_FMT_SBGGR12,
349 .name = "Bayer 12 BGGR",
350 .bits_per_sample = 12,
351 .packing = SOC_MBUS_PACKING_EXTEND16,
352 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 353 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
354 },
355}, {
27ffaeb0 356 .code = MEDIA_BUS_FMT_SGBRG12_1X12,
e23b961d
GL
357 .fmt = {
358 .fourcc = V4L2_PIX_FMT_SGBRG12,
359 .name = "Bayer 12 GBRG",
360 .bits_per_sample = 12,
361 .packing = SOC_MBUS_PACKING_EXTEND16,
362 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 363 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
364 },
365}, {
27ffaeb0 366 .code = MEDIA_BUS_FMT_SGRBG12_1X12,
e23b961d
GL
367 .fmt = {
368 .fourcc = V4L2_PIX_FMT_SGRBG12,
369 .name = "Bayer 12 GRBG",
370 .bits_per_sample = 12,
371 .packing = SOC_MBUS_PACKING_EXTEND16,
372 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 373 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d
GL
374 },
375}, {
27ffaeb0 376 .code = MEDIA_BUS_FMT_SRGGB12_1X12,
e23b961d
GL
377 .fmt = {
378 .fourcc = V4L2_PIX_FMT_SRGGB12,
379 .name = "Bayer 12 RGGB",
380 .bits_per_sample = 12,
381 .packing = SOC_MBUS_PACKING_EXTEND16,
382 .order = SOC_MBUS_ORDER_LE,
ad3b81fa 383 .layout = SOC_MBUS_LAYOUT_PACKED,
e23b961d 384 },
93f116d5 385},
9a74251d
GL
386};
387
cc552b62
GL
388int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
389 unsigned int *numerator, unsigned int *denominator)
48a3c773
AP
390{
391 switch (mf->packing) {
392 case SOC_MBUS_PACKING_NONE:
393 case SOC_MBUS_PACKING_EXTEND16:
cc552b62
GL
394 *numerator = 1;
395 *denominator = 1;
396 return 0;
7b88fc08
PE
397 case SOC_MBUS_PACKING_EXTEND32:
398 *numerator = 1;
399 *denominator = 1;
400 return 0;
48a3c773
AP
401 case SOC_MBUS_PACKING_2X8_PADHI:
402 case SOC_MBUS_PACKING_2X8_PADLO:
cc552b62
GL
403 *numerator = 2;
404 *denominator = 1;
405 return 0;
406 case SOC_MBUS_PACKING_1_5X8:
407 *numerator = 3;
408 *denominator = 2;
409 return 0;
64149deb 410 case SOC_MBUS_PACKING_VARIABLE:
cc552b62
GL
411 *numerator = 0;
412 *denominator = 1;
64149deb 413 return 0;
48a3c773
AP
414 }
415 return -EINVAL;
416}
417EXPORT_SYMBOL(soc_mbus_samples_per_pixel);
418
9a74251d
GL
419s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
420{
4e0e620c
LP
421 if (mf->layout != SOC_MBUS_LAYOUT_PACKED)
422 return width * mf->bits_per_sample / 8;
423
9a74251d
GL
424 switch (mf->packing) {
425 case SOC_MBUS_PACKING_NONE:
426 return width * mf->bits_per_sample / 8;
427 case SOC_MBUS_PACKING_2X8_PADHI:
428 case SOC_MBUS_PACKING_2X8_PADLO:
429 case SOC_MBUS_PACKING_EXTEND16:
430 return width * 2;
cc552b62
GL
431 case SOC_MBUS_PACKING_1_5X8:
432 return width * 3 / 2;
64149deb
KL
433 case SOC_MBUS_PACKING_VARIABLE:
434 return 0;
7b88fc08
PE
435 case SOC_MBUS_PACKING_EXTEND32:
436 return width * 4;
9a74251d
GL
437 }
438 return -EINVAL;
439}
440EXPORT_SYMBOL(soc_mbus_bytes_per_line);
441
8929c963
LP
442s32 soc_mbus_image_size(const struct soc_mbus_pixelfmt *mf,
443 u32 bytes_per_line, u32 height)
444{
445 if (mf->layout == SOC_MBUS_LAYOUT_PACKED)
446 return bytes_per_line * height;
447
448 switch (mf->packing) {
449 case SOC_MBUS_PACKING_2X8_PADHI:
450 case SOC_MBUS_PACKING_2X8_PADLO:
451 return bytes_per_line * height * 2;
452 case SOC_MBUS_PACKING_1_5X8:
453 return bytes_per_line * height * 3 / 2;
454 default:
455 return -EINVAL;
456 }
457}
458EXPORT_SYMBOL(soc_mbus_image_size);
459
93f116d5 460const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
27ffaeb0 461 u32 code,
93f116d5
GL
462 const struct soc_mbus_lookup *lookup,
463 int n)
464{
465 int i;
466
467 for (i = 0; i < n; i++)
468 if (lookup[i].code == code)
469 return &lookup[i].fmt;
470
471 return NULL;
472}
473EXPORT_SYMBOL(soc_mbus_find_fmtdesc);
474
9a74251d 475const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
27ffaeb0 476 u32 code)
9a74251d 477{
93f116d5 478 return soc_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt));
9a74251d
GL
479}
480EXPORT_SYMBOL(soc_mbus_get_fmtdesc);
481
32c69fcc
GL
482unsigned int soc_mbus_config_compatible(const struct v4l2_mbus_config *cfg,
483 unsigned int flags)
484{
485 unsigned long common_flags;
486 bool hsync = true, vsync = true, pclk, data, mode;
487 bool mipi_lanes, mipi_clock;
488
489 common_flags = cfg->flags & flags;
490
491 switch (cfg->type) {
492 case V4L2_MBUS_PARALLEL:
493 hsync = common_flags & (V4L2_MBUS_HSYNC_ACTIVE_HIGH |
494 V4L2_MBUS_HSYNC_ACTIVE_LOW);
495 vsync = common_flags & (V4L2_MBUS_VSYNC_ACTIVE_HIGH |
496 V4L2_MBUS_VSYNC_ACTIVE_LOW);
497 case V4L2_MBUS_BT656:
498 pclk = common_flags & (V4L2_MBUS_PCLK_SAMPLE_RISING |
499 V4L2_MBUS_PCLK_SAMPLE_FALLING);
500 data = common_flags & (V4L2_MBUS_DATA_ACTIVE_HIGH |
501 V4L2_MBUS_DATA_ACTIVE_LOW);
502 mode = common_flags & (V4L2_MBUS_MASTER | V4L2_MBUS_SLAVE);
503 return (!hsync || !vsync || !pclk || !data || !mode) ?
504 0 : common_flags;
505 case V4L2_MBUS_CSI2:
506 mipi_lanes = common_flags & V4L2_MBUS_CSI2_LANES;
507 mipi_clock = common_flags & (V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK |
508 V4L2_MBUS_CSI2_CONTINUOUS_CLOCK);
509 return (!mipi_lanes || !mipi_clock) ? 0 : common_flags;
510 }
511 return 0;
512}
513EXPORT_SYMBOL(soc_mbus_config_compatible);
514
9a74251d
GL
515static int __init soc_mbus_init(void)
516{
517 return 0;
518}
519
520static void __exit soc_mbus_exit(void)
521{
522}
523
524module_init(soc_mbus_init);
525module_exit(soc_mbus_exit);
526
527MODULE_DESCRIPTION("soc-camera media bus interface");
528MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
529MODULE_LICENSE("GPL v2");
This page took 0.413036 seconds and 5 git commands to generate.