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 static const struct soc_mbus_lookup mbus_fmt[] = {
20 .code = V4L2_MBUS_FMT_YUYV8_2X8,
22 .fourcc = V4L2_PIX_FMT_YUYV,
25 .packing = SOC_MBUS_PACKING_2X8_PADHI,
26 .order = SOC_MBUS_ORDER_LE,
29 .code = V4L2_MBUS_FMT_YVYU8_2X8,
31 .fourcc = V4L2_PIX_FMT_YVYU,
34 .packing = SOC_MBUS_PACKING_2X8_PADHI,
35 .order = SOC_MBUS_ORDER_LE,
38 .code = V4L2_MBUS_FMT_UYVY8_2X8,
40 .fourcc = V4L2_PIX_FMT_UYVY,
43 .packing = SOC_MBUS_PACKING_2X8_PADHI,
44 .order = SOC_MBUS_ORDER_LE,
47 .code = V4L2_MBUS_FMT_VYUY8_2X8,
49 .fourcc = V4L2_PIX_FMT_VYUY,
52 .packing = SOC_MBUS_PACKING_2X8_PADHI,
53 .order = SOC_MBUS_ORDER_LE,
56 .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
58 .fourcc = V4L2_PIX_FMT_RGB555,
61 .packing = SOC_MBUS_PACKING_2X8_PADHI,
62 .order = SOC_MBUS_ORDER_LE,
65 .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE,
67 .fourcc = V4L2_PIX_FMT_RGB555X,
70 .packing = SOC_MBUS_PACKING_2X8_PADHI,
71 .order = SOC_MBUS_ORDER_LE,
74 .code = V4L2_MBUS_FMT_RGB565_2X8_LE,
76 .fourcc = V4L2_PIX_FMT_RGB565,
79 .packing = SOC_MBUS_PACKING_2X8_PADHI,
80 .order = SOC_MBUS_ORDER_LE,
83 .code = V4L2_MBUS_FMT_RGB565_2X8_BE,
85 .fourcc = V4L2_PIX_FMT_RGB565X,
88 .packing = SOC_MBUS_PACKING_2X8_PADHI,
89 .order = SOC_MBUS_ORDER_LE,
92 .code = V4L2_MBUS_FMT_SBGGR8_1X8,
94 .fourcc = V4L2_PIX_FMT_SBGGR8,
95 .name = "Bayer 8 BGGR",
97 .packing = SOC_MBUS_PACKING_NONE,
98 .order = SOC_MBUS_ORDER_LE,
101 .code = V4L2_MBUS_FMT_SBGGR10_1X10,
103 .fourcc = V4L2_PIX_FMT_SBGGR10,
104 .name = "Bayer 10 BGGR",
105 .bits_per_sample = 10,
106 .packing = SOC_MBUS_PACKING_EXTEND16,
107 .order = SOC_MBUS_ORDER_LE,
110 .code = V4L2_MBUS_FMT_Y8_1X8,
112 .fourcc = V4L2_PIX_FMT_GREY,
114 .bits_per_sample = 8,
115 .packing = SOC_MBUS_PACKING_NONE,
116 .order = SOC_MBUS_ORDER_LE,
119 .code = V4L2_MBUS_FMT_Y10_1X10,
121 .fourcc = V4L2_PIX_FMT_Y10,
122 .name = "Grey 10bit",
123 .bits_per_sample = 10,
124 .packing = SOC_MBUS_PACKING_EXTEND16,
125 .order = SOC_MBUS_ORDER_LE,
128 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE,
130 .fourcc = V4L2_PIX_FMT_SBGGR10,
131 .name = "Bayer 10 BGGR",
132 .bits_per_sample = 8,
133 .packing = SOC_MBUS_PACKING_2X8_PADHI,
134 .order = SOC_MBUS_ORDER_LE,
137 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE,
139 .fourcc = V4L2_PIX_FMT_SBGGR10,
140 .name = "Bayer 10 BGGR",
141 .bits_per_sample = 8,
142 .packing = SOC_MBUS_PACKING_2X8_PADLO,
143 .order = SOC_MBUS_ORDER_LE,
146 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE,
148 .fourcc = V4L2_PIX_FMT_SBGGR10,
149 .name = "Bayer 10 BGGR",
150 .bits_per_sample = 8,
151 .packing = SOC_MBUS_PACKING_2X8_PADHI,
152 .order = SOC_MBUS_ORDER_BE,
155 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE,
157 .fourcc = V4L2_PIX_FMT_SBGGR10,
158 .name = "Bayer 10 BGGR",
159 .bits_per_sample = 8,
160 .packing = SOC_MBUS_PACKING_2X8_PADLO,
161 .order = SOC_MBUS_ORDER_BE,
164 .code = V4L2_MBUS_FMT_JPEG_1X8,
166 .fourcc = V4L2_PIX_FMT_JPEG,
168 .bits_per_sample = 8,
169 .packing = SOC_MBUS_PACKING_VARIABLE,
170 .order = SOC_MBUS_ORDER_LE,
175 int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf,
176 unsigned int *numerator, unsigned int *denominator)
178 switch (mf->packing) {
179 case SOC_MBUS_PACKING_NONE:
180 case SOC_MBUS_PACKING_EXTEND16:
184 case SOC_MBUS_PACKING_2X8_PADHI:
185 case SOC_MBUS_PACKING_2X8_PADLO:
189 case SOC_MBUS_PACKING_1_5X8:
193 case SOC_MBUS_PACKING_VARIABLE:
200 EXPORT_SYMBOL(soc_mbus_samples_per_pixel);
202 s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
204 switch (mf->packing) {
205 case SOC_MBUS_PACKING_NONE:
206 return width * mf->bits_per_sample / 8;
207 case SOC_MBUS_PACKING_2X8_PADHI:
208 case SOC_MBUS_PACKING_2X8_PADLO:
209 case SOC_MBUS_PACKING_EXTEND16:
211 case SOC_MBUS_PACKING_1_5X8:
212 return width * 3 / 2;
213 case SOC_MBUS_PACKING_VARIABLE:
218 EXPORT_SYMBOL(soc_mbus_bytes_per_line);
220 const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
221 enum v4l2_mbus_pixelcode code,
222 const struct soc_mbus_lookup *lookup,
227 for (i = 0; i < n; i++)
228 if (lookup[i].code == code)
229 return &lookup[i].fmt;
233 EXPORT_SYMBOL(soc_mbus_find_fmtdesc);
235 const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
236 enum v4l2_mbus_pixelcode code)
238 return soc_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt));
240 EXPORT_SYMBOL(soc_mbus_get_fmtdesc);
242 static int __init soc_mbus_init(void)
247 static void __exit soc_mbus_exit(void)
251 module_init(soc_mbus_init);
252 module_exit(soc_mbus_exit);
254 MODULE_DESCRIPTION("soc-camera media bus interface");
255 MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
256 MODULE_LICENSE("GPL v2");