aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2011-05-13 12:21:36 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-05-20 11:04:22 -0400
commit93f116d595e9aa7dca5f6507376d6995f217d420 (patch)
tree683617d71b12678ed976cc5c2eaa7a2e5bcb9d11 /drivers
parentee1b6f4bf3aa827b0daf65d7441e75212604b1c9 (diff)
[media] V4L: soc-camera: avoid huge arrays, caused by changed format codes
Recently mediabus pixel format codes have become a part of the user- space API, at which time their values also have been changed from contiguous numbers, running from 0 to sparse numbers with values around 0x1000, 0x2000, 0x3000... This made them unsuitable for the use as array indices. This patch switches soc-camera internal format look-ups to not depend on values of those macros. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/soc_mediabus.c93
1 files changed, 69 insertions, 24 deletions
diff --git a/drivers/media/video/soc_mediabus.c b/drivers/media/video/soc_mediabus.c
index 13e86df78e5..1b0018a5880 100644
--- a/drivers/media/video/soc_mediabus.c
+++ b/drivers/media/video/soc_mediabus.c
@@ -15,128 +15,161 @@
15#include <media/v4l2-mediabus.h> 15#include <media/v4l2-mediabus.h>
16#include <media/soc_mediabus.h> 16#include <media/soc_mediabus.h>
17 17
18#define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1) 18static const struct soc_mbus_lookup mbus_fmt[] = {
19 19{
20static const struct soc_mbus_pixelfmt mbus_fmt[] = { 20 .code = V4L2_MBUS_FMT_YUYV8_2X8,
21 [MBUS_IDX(YUYV8_2X8)] = { 21 .fmt = {
22 .fourcc = V4L2_PIX_FMT_YUYV, 22 .fourcc = V4L2_PIX_FMT_YUYV,
23 .name = "YUYV", 23 .name = "YUYV",
24 .bits_per_sample = 8, 24 .bits_per_sample = 8,
25 .packing = SOC_MBUS_PACKING_2X8_PADHI, 25 .packing = SOC_MBUS_PACKING_2X8_PADHI,
26 .order = SOC_MBUS_ORDER_LE, 26 .order = SOC_MBUS_ORDER_LE,
27 }, 27 },
28 [MBUS_IDX(YVYU8_2X8)] = { 28}, {
29 .code = V4L2_MBUS_FMT_YVYU8_2X8,
30 .fmt = {
29 .fourcc = V4L2_PIX_FMT_YVYU, 31 .fourcc = V4L2_PIX_FMT_YVYU,
30 .name = "YVYU", 32 .name = "YVYU",
31 .bits_per_sample = 8, 33 .bits_per_sample = 8,
32 .packing = SOC_MBUS_PACKING_2X8_PADHI, 34 .packing = SOC_MBUS_PACKING_2X8_PADHI,
33 .order = SOC_MBUS_ORDER_LE, 35 .order = SOC_MBUS_ORDER_LE,
34 }, 36 },
35 [MBUS_IDX(UYVY8_2X8)] = { 37}, {
38 .code = V4L2_MBUS_FMT_UYVY8_2X8,
39 .fmt = {
36 .fourcc = V4L2_PIX_FMT_UYVY, 40 .fourcc = V4L2_PIX_FMT_UYVY,
37 .name = "UYVY", 41 .name = "UYVY",
38 .bits_per_sample = 8, 42 .bits_per_sample = 8,
39 .packing = SOC_MBUS_PACKING_2X8_PADHI, 43 .packing = SOC_MBUS_PACKING_2X8_PADHI,
40 .order = SOC_MBUS_ORDER_LE, 44 .order = SOC_MBUS_ORDER_LE,
41 }, 45 },
42 [MBUS_IDX(VYUY8_2X8)] = { 46}, {
47 .code = V4L2_MBUS_FMT_VYUY8_2X8,
48 .fmt = {
43 .fourcc = V4L2_PIX_FMT_VYUY, 49 .fourcc = V4L2_PIX_FMT_VYUY,
44 .name = "VYUY", 50 .name = "VYUY",
45 .bits_per_sample = 8, 51 .bits_per_sample = 8,
46 .packing = SOC_MBUS_PACKING_2X8_PADHI, 52 .packing = SOC_MBUS_PACKING_2X8_PADHI,
47 .order = SOC_MBUS_ORDER_LE, 53 .order = SOC_MBUS_ORDER_LE,
48 }, 54 },
49 [MBUS_IDX(RGB555_2X8_PADHI_LE)] = { 55}, {
56 .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
57 .fmt = {
50 .fourcc = V4L2_PIX_FMT_RGB555, 58 .fourcc = V4L2_PIX_FMT_RGB555,
51 .name = "RGB555", 59 .name = "RGB555",
52 .bits_per_sample = 8, 60 .bits_per_sample = 8,
53 .packing = SOC_MBUS_PACKING_2X8_PADHI, 61 .packing = SOC_MBUS_PACKING_2X8_PADHI,
54 .order = SOC_MBUS_ORDER_LE, 62 .order = SOC_MBUS_ORDER_LE,
55 }, 63 },
56 [MBUS_IDX(RGB555_2X8_PADHI_BE)] = { 64}, {
65 .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE,
66 .fmt = {
57 .fourcc = V4L2_PIX_FMT_RGB555X, 67 .fourcc = V4L2_PIX_FMT_RGB555X,
58 .name = "RGB555X", 68 .name = "RGB555X",
59 .bits_per_sample = 8, 69 .bits_per_sample = 8,
60 .packing = SOC_MBUS_PACKING_2X8_PADHI, 70 .packing = SOC_MBUS_PACKING_2X8_PADHI,
61 .order = SOC_MBUS_ORDER_LE, 71 .order = SOC_MBUS_ORDER_LE,
62 }, 72 },
63 [MBUS_IDX(RGB565_2X8_LE)] = { 73}, {
74 .code = V4L2_MBUS_FMT_RGB565_2X8_LE,
75 .fmt = {
64 .fourcc = V4L2_PIX_FMT_RGB565, 76 .fourcc = V4L2_PIX_FMT_RGB565,
65 .name = "RGB565", 77 .name = "RGB565",
66 .bits_per_sample = 8, 78 .bits_per_sample = 8,
67 .packing = SOC_MBUS_PACKING_2X8_PADHI, 79 .packing = SOC_MBUS_PACKING_2X8_PADHI,
68 .order = SOC_MBUS_ORDER_LE, 80 .order = SOC_MBUS_ORDER_LE,
69 }, 81 },
70 [MBUS_IDX(RGB565_2X8_BE)] = { 82}, {
83 .code = V4L2_MBUS_FMT_RGB565_2X8_BE,
84 .fmt = {
71 .fourcc = V4L2_PIX_FMT_RGB565X, 85 .fourcc = V4L2_PIX_FMT_RGB565X,
72 .name = "RGB565X", 86 .name = "RGB565X",
73 .bits_per_sample = 8, 87 .bits_per_sample = 8,
74 .packing = SOC_MBUS_PACKING_2X8_PADHI, 88 .packing = SOC_MBUS_PACKING_2X8_PADHI,
75 .order = SOC_MBUS_ORDER_LE, 89 .order = SOC_MBUS_ORDER_LE,
76 }, 90 },
77 [MBUS_IDX(SBGGR8_1X8)] = { 91}, {
92 .code = V4L2_MBUS_FMT_SBGGR8_1X8,
93 .fmt = {
78 .fourcc = V4L2_PIX_FMT_SBGGR8, 94 .fourcc = V4L2_PIX_FMT_SBGGR8,
79 .name = "Bayer 8 BGGR", 95 .name = "Bayer 8 BGGR",
80 .bits_per_sample = 8, 96 .bits_per_sample = 8,
81 .packing = SOC_MBUS_PACKING_NONE, 97 .packing = SOC_MBUS_PACKING_NONE,
82 .order = SOC_MBUS_ORDER_LE, 98 .order = SOC_MBUS_ORDER_LE,
83 }, 99 },
84 [MBUS_IDX(SBGGR10_1X10)] = { 100}, {
101 .code = V4L2_MBUS_FMT_SBGGR10_1X10,
102 .fmt = {
85 .fourcc = V4L2_PIX_FMT_SBGGR10, 103 .fourcc = V4L2_PIX_FMT_SBGGR10,
86 .name = "Bayer 10 BGGR", 104 .name = "Bayer 10 BGGR",
87 .bits_per_sample = 10, 105 .bits_per_sample = 10,
88 .packing = SOC_MBUS_PACKING_EXTEND16, 106 .packing = SOC_MBUS_PACKING_EXTEND16,
89 .order = SOC_MBUS_ORDER_LE, 107 .order = SOC_MBUS_ORDER_LE,
90 }, 108 },
91 [MBUS_IDX(Y8_1X8)] = { 109}, {
110 .code = V4L2_MBUS_FMT_Y8_1X8,
111 .fmt = {
92 .fourcc = V4L2_PIX_FMT_GREY, 112 .fourcc = V4L2_PIX_FMT_GREY,
93 .name = "Grey", 113 .name = "Grey",
94 .bits_per_sample = 8, 114 .bits_per_sample = 8,
95 .packing = SOC_MBUS_PACKING_NONE, 115 .packing = SOC_MBUS_PACKING_NONE,
96 .order = SOC_MBUS_ORDER_LE, 116 .order = SOC_MBUS_ORDER_LE,
97 }, 117 },
98 [MBUS_IDX(Y10_1X10)] = { 118}, {
119 .code = V4L2_MBUS_FMT_Y10_1X10,
120 .fmt = {
99 .fourcc = V4L2_PIX_FMT_Y10, 121 .fourcc = V4L2_PIX_FMT_Y10,
100 .name = "Grey 10bit", 122 .name = "Grey 10bit",
101 .bits_per_sample = 10, 123 .bits_per_sample = 10,
102 .packing = SOC_MBUS_PACKING_EXTEND16, 124 .packing = SOC_MBUS_PACKING_EXTEND16,
103 .order = SOC_MBUS_ORDER_LE, 125 .order = SOC_MBUS_ORDER_LE,
104 }, 126 },
105 [MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = { 127}, {
128 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE,
129 .fmt = {
106 .fourcc = V4L2_PIX_FMT_SBGGR10, 130 .fourcc = V4L2_PIX_FMT_SBGGR10,
107 .name = "Bayer 10 BGGR", 131 .name = "Bayer 10 BGGR",
108 .bits_per_sample = 8, 132 .bits_per_sample = 8,
109 .packing = SOC_MBUS_PACKING_2X8_PADHI, 133 .packing = SOC_MBUS_PACKING_2X8_PADHI,
110 .order = SOC_MBUS_ORDER_LE, 134 .order = SOC_MBUS_ORDER_LE,
111 }, 135 },
112 [MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = { 136}, {
137 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE,
138 .fmt = {
113 .fourcc = V4L2_PIX_FMT_SBGGR10, 139 .fourcc = V4L2_PIX_FMT_SBGGR10,
114 .name = "Bayer 10 BGGR", 140 .name = "Bayer 10 BGGR",
115 .bits_per_sample = 8, 141 .bits_per_sample = 8,
116 .packing = SOC_MBUS_PACKING_2X8_PADLO, 142 .packing = SOC_MBUS_PACKING_2X8_PADLO,
117 .order = SOC_MBUS_ORDER_LE, 143 .order = SOC_MBUS_ORDER_LE,
118 }, 144 },
119 [MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = { 145}, {
146 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE,
147 .fmt = {
120 .fourcc = V4L2_PIX_FMT_SBGGR10, 148 .fourcc = V4L2_PIX_FMT_SBGGR10,
121 .name = "Bayer 10 BGGR", 149 .name = "Bayer 10 BGGR",
122 .bits_per_sample = 8, 150 .bits_per_sample = 8,
123 .packing = SOC_MBUS_PACKING_2X8_PADHI, 151 .packing = SOC_MBUS_PACKING_2X8_PADHI,
124 .order = SOC_MBUS_ORDER_BE, 152 .order = SOC_MBUS_ORDER_BE,
125 }, 153 },
126 [MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = { 154}, {
155 .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE,
156 .fmt = {
127 .fourcc = V4L2_PIX_FMT_SBGGR10, 157 .fourcc = V4L2_PIX_FMT_SBGGR10,
128 .name = "Bayer 10 BGGR", 158 .name = "Bayer 10 BGGR",
129 .bits_per_sample = 8, 159 .bits_per_sample = 8,
130 .packing = SOC_MBUS_PACKING_2X8_PADLO, 160 .packing = SOC_MBUS_PACKING_2X8_PADLO,
131 .order = SOC_MBUS_ORDER_BE, 161 .order = SOC_MBUS_ORDER_BE,
132 }, 162 },
133 [MBUS_IDX(JPEG_1X8)] = { 163}, {
164 .code = V4L2_MBUS_FMT_JPEG_1X8,
165 .fmt = {
134 .fourcc = V4L2_PIX_FMT_JPEG, 166 .fourcc = V4L2_PIX_FMT_JPEG,
135 .name = "JPEG", 167 .name = "JPEG",
136 .bits_per_sample = 8, 168 .bits_per_sample = 8,
137 .packing = SOC_MBUS_PACKING_VARIABLE, 169 .packing = SOC_MBUS_PACKING_VARIABLE,
138 .order = SOC_MBUS_ORDER_LE, 170 .order = SOC_MBUS_ORDER_LE,
139 }, 171 },
172},
140}; 173};
141 174
142int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf) 175int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf)
@@ -171,13 +204,25 @@ s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
171} 204}
172EXPORT_SYMBOL(soc_mbus_bytes_per_line); 205EXPORT_SYMBOL(soc_mbus_bytes_per_line);
173 206
207const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
208 enum v4l2_mbus_pixelcode code,
209 const struct soc_mbus_lookup *lookup,
210 int n)
211{
212 int i;
213
214 for (i = 0; i < n; i++)
215 if (lookup[i].code == code)
216 return &lookup[i].fmt;
217
218 return NULL;
219}
220EXPORT_SYMBOL(soc_mbus_find_fmtdesc);
221
174const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( 222const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
175 enum v4l2_mbus_pixelcode code) 223 enum v4l2_mbus_pixelcode code)
176{ 224{
177 if (code - V4L2_MBUS_FMT_FIXED > ARRAY_SIZE(mbus_fmt) || 225 return soc_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt));
178 code <= V4L2_MBUS_FMT_FIXED)
179 return NULL;
180 return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1;
181} 226}
182EXPORT_SYMBOL(soc_mbus_get_fmtdesc); 227EXPORT_SYMBOL(soc_mbus_get_fmtdesc);
183 228