Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / media / video / 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
18#define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1)
19
20static const struct soc_mbus_pixelfmt mbus_fmt[] = {
ace6e979 21 [MBUS_IDX(YUYV8_2X8)] = {
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,
81355e40 27 },
ace6e979 28 [MBUS_IDX(YVYU8_2X8)] = {
9a74251d
GL
29 .fourcc = V4L2_PIX_FMT_YVYU,
30 .name = "YVYU",
31 .bits_per_sample = 8,
32 .packing = SOC_MBUS_PACKING_2X8_PADHI,
33 .order = SOC_MBUS_ORDER_LE,
81355e40 34 },
ace6e979 35 [MBUS_IDX(UYVY8_2X8)] = {
9a74251d
GL
36 .fourcc = V4L2_PIX_FMT_UYVY,
37 .name = "UYVY",
38 .bits_per_sample = 8,
39 .packing = SOC_MBUS_PACKING_2X8_PADHI,
40 .order = SOC_MBUS_ORDER_LE,
81355e40 41 },
ace6e979 42 [MBUS_IDX(VYUY8_2X8)] = {
9a74251d
GL
43 .fourcc = V4L2_PIX_FMT_VYUY,
44 .name = "VYUY",
45 .bits_per_sample = 8,
46 .packing = SOC_MBUS_PACKING_2X8_PADHI,
47 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
48 },
49 [MBUS_IDX(RGB555_2X8_PADHI_LE)] = {
9a74251d
GL
50 .fourcc = V4L2_PIX_FMT_RGB555,
51 .name = "RGB555",
52 .bits_per_sample = 8,
53 .packing = SOC_MBUS_PACKING_2X8_PADHI,
54 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
55 },
56 [MBUS_IDX(RGB555_2X8_PADHI_BE)] = {
9a74251d
GL
57 .fourcc = V4L2_PIX_FMT_RGB555X,
58 .name = "RGB555X",
59 .bits_per_sample = 8,
60 .packing = SOC_MBUS_PACKING_2X8_PADHI,
61 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
62 },
63 [MBUS_IDX(RGB565_2X8_LE)] = {
9a74251d
GL
64 .fourcc = V4L2_PIX_FMT_RGB565,
65 .name = "RGB565",
66 .bits_per_sample = 8,
67 .packing = SOC_MBUS_PACKING_2X8_PADHI,
68 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
69 },
70 [MBUS_IDX(RGB565_2X8_BE)] = {
9a74251d
GL
71 .fourcc = V4L2_PIX_FMT_RGB565X,
72 .name = "RGB565X",
73 .bits_per_sample = 8,
74 .packing = SOC_MBUS_PACKING_2X8_PADHI,
75 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
76 },
77 [MBUS_IDX(SBGGR8_1X8)] = {
9a74251d
GL
78 .fourcc = V4L2_PIX_FMT_SBGGR8,
79 .name = "Bayer 8 BGGR",
80 .bits_per_sample = 8,
81 .packing = SOC_MBUS_PACKING_NONE,
82 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
83 },
84 [MBUS_IDX(SBGGR10_1X10)] = {
9a74251d
GL
85 .fourcc = V4L2_PIX_FMT_SBGGR10,
86 .name = "Bayer 10 BGGR",
87 .bits_per_sample = 10,
88 .packing = SOC_MBUS_PACKING_EXTEND16,
89 .order = SOC_MBUS_ORDER_LE,
81355e40 90 },
07670433 91 [MBUS_IDX(Y8_1X8)] = {
9a74251d
GL
92 .fourcc = V4L2_PIX_FMT_GREY,
93 .name = "Grey",
94 .bits_per_sample = 8,
95 .packing = SOC_MBUS_PACKING_NONE,
96 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
97 },
98 [MBUS_IDX(Y10_1X10)] = {
9a74251d
GL
99 .fourcc = V4L2_PIX_FMT_Y10,
100 .name = "Grey 10bit",
101 .bits_per_sample = 10,
102 .packing = SOC_MBUS_PACKING_EXTEND16,
103 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
104 },
105 [MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = {
9a74251d
GL
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_LE,
81355e40
GL
111 },
112 [MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = {
9a74251d
GL
113 .fourcc = V4L2_PIX_FMT_SBGGR10,
114 .name = "Bayer 10 BGGR",
115 .bits_per_sample = 8,
116 .packing = SOC_MBUS_PACKING_2X8_PADLO,
117 .order = SOC_MBUS_ORDER_LE,
81355e40
GL
118 },
119 [MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = {
9a74251d
GL
120 .fourcc = V4L2_PIX_FMT_SBGGR10,
121 .name = "Bayer 10 BGGR",
122 .bits_per_sample = 8,
123 .packing = SOC_MBUS_PACKING_2X8_PADHI,
124 .order = SOC_MBUS_ORDER_BE,
81355e40
GL
125 },
126 [MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = {
9a74251d
GL
127 .fourcc = V4L2_PIX_FMT_SBGGR10,
128 .name = "Bayer 10 BGGR",
129 .bits_per_sample = 8,
130 .packing = SOC_MBUS_PACKING_2X8_PADLO,
131 .order = SOC_MBUS_ORDER_BE,
132 },
133};
134
48a3c773
AP
135int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf)
136{
137 switch (mf->packing) {
138 case SOC_MBUS_PACKING_NONE:
139 case SOC_MBUS_PACKING_EXTEND16:
140 return 1;
141 case SOC_MBUS_PACKING_2X8_PADHI:
142 case SOC_MBUS_PACKING_2X8_PADLO:
143 return 2;
144 }
145 return -EINVAL;
146}
147EXPORT_SYMBOL(soc_mbus_samples_per_pixel);
148
9a74251d
GL
149s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
150{
151 switch (mf->packing) {
152 case SOC_MBUS_PACKING_NONE:
153 return width * mf->bits_per_sample / 8;
154 case SOC_MBUS_PACKING_2X8_PADHI:
155 case SOC_MBUS_PACKING_2X8_PADLO:
156 case SOC_MBUS_PACKING_EXTEND16:
157 return width * 2;
158 }
159 return -EINVAL;
160}
161EXPORT_SYMBOL(soc_mbus_bytes_per_line);
162
163const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
164 enum v4l2_mbus_pixelcode code)
165{
84f3751d
BS
166 if (code - V4L2_MBUS_FMT_FIXED > ARRAY_SIZE(mbus_fmt) ||
167 code <= V4L2_MBUS_FMT_FIXED)
9a74251d
GL
168 return NULL;
169 return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1;
170}
171EXPORT_SYMBOL(soc_mbus_get_fmtdesc);
172
173static int __init soc_mbus_init(void)
174{
175 return 0;
176}
177
178static void __exit soc_mbus_exit(void)
179{
180}
181
182module_init(soc_mbus_init);
183module_exit(soc_mbus_exit);
184
185MODULE_DESCRIPTION("soc-camera media bus interface");
186MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
187MODULE_LICENSE("GPL v2");