Merge branch 'slab/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penber...
[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>
16#include <media/soc_mediabus.h>
17
93f116d5
GL
18static const struct soc_mbus_lookup mbus_fmt[] = {
19{
20 .code = V4L2_MBUS_FMT_YUYV8_2X8,
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
GL
29}, {
30 .code = V4L2_MBUS_FMT_YVYU8_2X8,
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
GL
39}, {
40 .code = V4L2_MBUS_FMT_UYVY8_2X8,
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
GL
49}, {
50 .code = V4L2_MBUS_FMT_VYUY8_2X8,
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
GL
59}, {
60 .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
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
GL
69}, {
70 .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE,
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
GL
79}, {
80 .code = V4L2_MBUS_FMT_RGB565_2X8_LE,
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
GL
89}, {
90 .code = V4L2_MBUS_FMT_RGB565_2X8_BE,
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
PE
99}, {
100 .code = V4L2_MBUS_FMT_RGB666_1X18,
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}, {
109 .code = V4L2_MBUS_FMT_RGB888_1X24,
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}, {
118 .code = V4L2_MBUS_FMT_RGB888_2X12_BE,
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}, {
127 .code = V4L2_MBUS_FMT_RGB888_2X12_LE,
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
GL
135}, {
136 .code = V4L2_MBUS_FMT_SBGGR8_1X8,
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
GL
145}, {
146 .code = V4L2_MBUS_FMT_SBGGR10_1X10,
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
GL
155}, {
156 .code = V4L2_MBUS_FMT_Y8_1X8,
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
GL
165}, {
166 .code = V4L2_MBUS_FMT_Y10_1X10,
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
GL
175}, {
176 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE,
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
GL
185}, {
186 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE,
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
GL
195}, {
196 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE,
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
GL
205}, {
206 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE,
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
GL
215}, {
216 .code = V4L2_MBUS_FMT_JPEG_1X8,
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
GL
225}, {
226 .code = V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE,
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}, {
236 .code = V4L2_MBUS_FMT_YUYV8_1_5X8,
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}, {
246 .code = V4L2_MBUS_FMT_YVYU8_1_5X8,
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}, {
256 .code = V4L2_MBUS_FMT_UYVY8_1X16,
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}, {
266 .code = V4L2_MBUS_FMT_VYUY8_1X16,
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}, {
276 .code = V4L2_MBUS_FMT_YUYV8_1X16,
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}, {
286 .code = V4L2_MBUS_FMT_YVYU8_1X16,
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}, {
296 .code = V4L2_MBUS_FMT_SGRBG8_1X8,
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}, {
306 .code = V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8,
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}, {
316 .code = V4L2_MBUS_FMT_SGBRG10_1X10,
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}, {
326 .code = V4L2_MBUS_FMT_SGRBG10_1X10,
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}, {
336 .code = V4L2_MBUS_FMT_SRGGB10_1X10,
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}, {
346 .code = V4L2_MBUS_FMT_SBGGR12_1X12,
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}, {
356 .code = V4L2_MBUS_FMT_SGBRG12_1X12,
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}, {
366 .code = V4L2_MBUS_FMT_SGRBG12_1X12,
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}, {
376 .code = V4L2_MBUS_FMT_SRGGB12_1X12,
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
GL
460const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
461 enum v4l2_mbus_pixelcode code,
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
GL
475const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
476 enum v4l2_mbus_pixelcode code)
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.457757 seconds and 5 git commands to generate.