2 * soc-camera media bus helper routines
4 * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
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.
11 #include <linux/kernel.h>
12 #include <linux/module.h>
14 #include <media/v4l2-device.h>
15 #include <media/v4l2-mediabus.h>
16 #include <media/soc_mediabus.h>
18 #define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1)
20 static const struct soc_mbus_pixelfmt mbus_fmt
[] = {
21 [MBUS_IDX(YUYV8_2X8_LE
)] = {
22 .fourcc
= V4L2_PIX_FMT_YUYV
,
25 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
26 .order
= SOC_MBUS_ORDER_LE
,
27 }, [MBUS_IDX(YVYU8_2X8_LE
)] = {
28 .fourcc
= V4L2_PIX_FMT_YVYU
,
31 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
32 .order
= SOC_MBUS_ORDER_LE
,
33 }, [MBUS_IDX(YUYV8_2X8_BE
)] = {
34 .fourcc
= V4L2_PIX_FMT_UYVY
,
37 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
38 .order
= SOC_MBUS_ORDER_LE
,
39 }, [MBUS_IDX(YVYU8_2X8_BE
)] = {
40 .fourcc
= V4L2_PIX_FMT_VYUY
,
43 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
44 .order
= SOC_MBUS_ORDER_LE
,
45 }, [MBUS_IDX(RGB555_2X8_PADHI_LE
)] = {
46 .fourcc
= V4L2_PIX_FMT_RGB555
,
49 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
50 .order
= SOC_MBUS_ORDER_LE
,
51 }, [MBUS_IDX(RGB555_2X8_PADHI_BE
)] = {
52 .fourcc
= V4L2_PIX_FMT_RGB555X
,
55 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
56 .order
= SOC_MBUS_ORDER_LE
,
57 }, [MBUS_IDX(RGB565_2X8_LE
)] = {
58 .fourcc
= V4L2_PIX_FMT_RGB565
,
61 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
62 .order
= SOC_MBUS_ORDER_LE
,
63 }, [MBUS_IDX(RGB565_2X8_BE
)] = {
64 .fourcc
= V4L2_PIX_FMT_RGB565X
,
67 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
68 .order
= SOC_MBUS_ORDER_LE
,
69 }, [MBUS_IDX(SBGGR8_1X8
)] = {
70 .fourcc
= V4L2_PIX_FMT_SBGGR8
,
71 .name
= "Bayer 8 BGGR",
73 .packing
= SOC_MBUS_PACKING_NONE
,
74 .order
= SOC_MBUS_ORDER_LE
,
75 }, [MBUS_IDX(SBGGR10_1X10
)] = {
76 .fourcc
= V4L2_PIX_FMT_SBGGR10
,
77 .name
= "Bayer 10 BGGR",
78 .bits_per_sample
= 10,
79 .packing
= SOC_MBUS_PACKING_EXTEND16
,
80 .order
= SOC_MBUS_ORDER_LE
,
81 }, [MBUS_IDX(GREY8_1X8
)] = {
82 .fourcc
= V4L2_PIX_FMT_GREY
,
85 .packing
= SOC_MBUS_PACKING_NONE
,
86 .order
= SOC_MBUS_ORDER_LE
,
87 }, [MBUS_IDX(Y10_1X10
)] = {
88 .fourcc
= V4L2_PIX_FMT_Y10
,
90 .bits_per_sample
= 10,
91 .packing
= SOC_MBUS_PACKING_EXTEND16
,
92 .order
= SOC_MBUS_ORDER_LE
,
93 }, [MBUS_IDX(SBGGR10_2X8_PADHI_LE
)] = {
94 .fourcc
= V4L2_PIX_FMT_SBGGR10
,
95 .name
= "Bayer 10 BGGR",
97 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
98 .order
= SOC_MBUS_ORDER_LE
,
99 }, [MBUS_IDX(SBGGR10_2X8_PADLO_LE
)] = {
100 .fourcc
= V4L2_PIX_FMT_SBGGR10
,
101 .name
= "Bayer 10 BGGR",
102 .bits_per_sample
= 8,
103 .packing
= SOC_MBUS_PACKING_2X8_PADLO
,
104 .order
= SOC_MBUS_ORDER_LE
,
105 }, [MBUS_IDX(SBGGR10_2X8_PADHI_BE
)] = {
106 .fourcc
= V4L2_PIX_FMT_SBGGR10
,
107 .name
= "Bayer 10 BGGR",
108 .bits_per_sample
= 8,
109 .packing
= SOC_MBUS_PACKING_2X8_PADHI
,
110 .order
= SOC_MBUS_ORDER_BE
,
111 }, [MBUS_IDX(SBGGR10_2X8_PADLO_BE
)] = {
112 .fourcc
= V4L2_PIX_FMT_SBGGR10
,
113 .name
= "Bayer 10 BGGR",
114 .bits_per_sample
= 8,
115 .packing
= SOC_MBUS_PACKING_2X8_PADLO
,
116 .order
= SOC_MBUS_ORDER_BE
,
120 s32
soc_mbus_bytes_per_line(u32 width
, const struct soc_mbus_pixelfmt
*mf
)
122 switch (mf
->packing
) {
123 case SOC_MBUS_PACKING_NONE
:
124 return width
* mf
->bits_per_sample
/ 8;
125 case SOC_MBUS_PACKING_2X8_PADHI
:
126 case SOC_MBUS_PACKING_2X8_PADLO
:
127 case SOC_MBUS_PACKING_EXTEND16
:
132 EXPORT_SYMBOL(soc_mbus_bytes_per_line
);
134 const struct soc_mbus_pixelfmt
*soc_mbus_get_fmtdesc(
135 enum v4l2_mbus_pixelcode code
)
137 if ((unsigned int)(code
- V4L2_MBUS_FMT_FIXED
) > ARRAY_SIZE(mbus_fmt
))
139 return mbus_fmt
+ code
- V4L2_MBUS_FMT_FIXED
- 1;
141 EXPORT_SYMBOL(soc_mbus_get_fmtdesc
);
143 static int __init
soc_mbus_init(void)
148 static void __exit
soc_mbus_exit(void)
152 module_init(soc_mbus_init
);
153 module_exit(soc_mbus_exit
);
155 MODULE_DESCRIPTION("soc-camera media bus interface");
156 MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
157 MODULE_LICENSE("GPL v2");