aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh
diff options
context:
space:
mode:
authorMagnus Damm <damm@igel.co.jp>2008-07-28 06:14:35 -0400
committerPaul Mundt <lethal@linux-sh.org>2008-07-28 06:15:39 -0400
commit8b2224dc6a5b46cfa1d54ab1fe82107351c66443 (patch)
tree90769ab5e317659877adc60da0ff8e9d542d7fe0 /arch/sh
parent4875ea224af0215635f18c2c1b060fb023c7602f (diff)
sh: SuperH Mobile CEU and camera platform data for AP325RXA
Add AP325RXA specific platform data for on-chip sh7723 CEU and ncm03j camera. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh')
-rw-r--r--arch/sh/boards/renesas/ap325rxa/setup.c119
1 files changed, 118 insertions, 1 deletions
diff --git a/arch/sh/boards/renesas/ap325rxa/setup.c b/arch/sh/boards/renesas/ap325rxa/setup.c
index f8b7859bbdce..7fa74462bd9f 100644
--- a/arch/sh/boards/renesas/ap325rxa/setup.c
+++ b/arch/sh/boards/renesas/ap325rxa/setup.c
@@ -19,6 +19,8 @@
19#include <linux/i2c.h> 19#include <linux/i2c.h>
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/smc911x.h> 21#include <linux/smc911x.h>
22#include <media/soc_camera_platform.h>
23#include <media/sh_mobile_ceu.h>
22#include <asm/sh_mobile_lcdc.h> 24#include <asm/sh_mobile_lcdc.h>
23#include <asm/io.h> 25#include <asm/io.h>
24#include <asm/clock.h> 26#include <asm/clock.h>
@@ -99,9 +101,13 @@ static struct platform_device ap325rxa_nor_flash_device = {
99#define PORT_PLCR 0xA4050114 101#define PORT_PLCR 0xA4050114
100#define PORT_PMCR 0xA4050116 102#define PORT_PMCR 0xA4050116
101#define PORT_PRCR 0xA405011C 103#define PORT_PRCR 0xA405011C
102#define PORT_HIZCRA 0xA4050158
103#define PORT_PSCR 0xA405011E 104#define PORT_PSCR 0xA405011E
105#define PORT_PZCR 0xA405014C
106#define PORT_HIZCRA 0xA4050158
107#define PORT_MSELCRB 0xA4050182
104#define PORT_PSDR 0xA405013E 108#define PORT_PSDR 0xA405013E
109#define PORT_PZDR 0xA405016C
110#define PORT_PSELD 0xA4050154
105 111
106static void ap320_wvga_power_on(void *board_data) 112static void ap320_wvga_power_on(void *board_data)
107{ 113{
@@ -159,10 +165,112 @@ static struct platform_device lcdc_device = {
159 }, 165 },
160}; 166};
161 167
168static unsigned char camera_ncm03j_magic[] =
169{
170 0x87, 0x00, 0x88, 0x08, 0x89, 0x01, 0x8A, 0xE8,
171 0x1D, 0x00, 0x1E, 0x8A, 0x21, 0x00, 0x33, 0x36,
172 0x36, 0x60, 0x37, 0x08, 0x3B, 0x31, 0x44, 0x0F,
173 0x46, 0xF0, 0x4B, 0x28, 0x4C, 0x21, 0x4D, 0x55,
174 0x4E, 0x1B, 0x4F, 0xC7, 0x50, 0xFC, 0x51, 0x12,
175 0x58, 0x02, 0x66, 0xC0, 0x67, 0x46, 0x6B, 0xA0,
176 0x6C, 0x34, 0x7E, 0x25, 0x7F, 0x25, 0x8D, 0x0F,
177 0x92, 0x40, 0x93, 0x04, 0x94, 0x26, 0x95, 0x0A,
178 0x99, 0x03, 0x9A, 0xF0, 0x9B, 0x14, 0x9D, 0x7A,
179 0xC5, 0x02, 0xD6, 0x07, 0x59, 0x00, 0x5A, 0x1A,
180 0x5B, 0x2A, 0x5C, 0x37, 0x5D, 0x42, 0x5E, 0x56,
181 0xC8, 0x00, 0xC9, 0x1A, 0xCA, 0x2A, 0xCB, 0x37,
182 0xCC, 0x42, 0xCD, 0x56, 0xCE, 0x00, 0xCF, 0x1A,
183 0xD0, 0x2A, 0xD1, 0x37, 0xD2, 0x42, 0xD3, 0x56,
184 0x5F, 0x68, 0x60, 0x87, 0x61, 0xA3, 0x62, 0xBC,
185 0x63, 0xD4, 0x64, 0xEA, 0xD6, 0x0F,
186};
187
188static int camera_set_capture(struct soc_camera_platform_info *info,
189 int enable)
190{
191 struct i2c_adapter *a = i2c_get_adapter(0);
192 struct i2c_msg msg;
193 int ret = 0;
194 int i;
195
196 if (!enable)
197 return 0; /* no disable for now */
198
199 for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) {
200 u_int8_t buf[8];
201
202 msg.addr = 0x6e;
203 msg.buf = buf;
204 msg.len = 2;
205 msg.flags = 0;
206
207 buf[0] = camera_ncm03j_magic[i];
208 buf[1] = camera_ncm03j_magic[i + 1];
209
210 ret = (ret < 0) ? ret : i2c_transfer(a, &msg, 1);
211 }
212
213 return ret;
214}
215
216static struct soc_camera_platform_info camera_info = {
217 .iface = 0,
218 .format_name = "UYVY",
219 .format_depth = 16,
220 .format = {
221 .pixelformat = V4L2_PIX_FMT_UYVY,
222 .colorspace = V4L2_COLORSPACE_SMPTE170M,
223 .width = 640,
224 .height = 480,
225 },
226 .bus_param = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH |
227 SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8,
228 .set_capture = camera_set_capture,
229};
230
231static struct platform_device camera_device = {
232 .name = "soc_camera_platform",
233 .dev = {
234 .platform_data = &camera_info,
235 },
236};
237
238static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
239 .flags = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH |
240 SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8,
241};
242
243static struct resource ceu_resources[] = {
244 [0] = {
245 .name = "CEU",
246 .start = 0xfe910000,
247 .end = 0xfe91009f,
248 .flags = IORESOURCE_MEM,
249 },
250 [1] = {
251 .start = 52,
252 .flags = IORESOURCE_IRQ,
253 },
254 [2] = {
255 /* place holder for contiguous memory */
256 },
257};
258
259static struct platform_device ceu_device = {
260 .name = "sh_mobile_ceu",
261 .num_resources = ARRAY_SIZE(ceu_resources),
262 .resource = ceu_resources,
263 .dev = {
264 .platform_data = &sh_mobile_ceu_info,
265 },
266};
267
162static struct platform_device *ap325rxa_devices[] __initdata = { 268static struct platform_device *ap325rxa_devices[] __initdata = {
163 &smc9118_device, 269 &smc9118_device,
164 &ap325rxa_nor_flash_device, 270 &ap325rxa_nor_flash_device,
165 &lcdc_device, 271 &lcdc_device,
272 &ceu_device,
273 &camera_device,
166}; 274};
167 275
168static struct i2c_board_info __initdata ap325rxa_i2c_devices[] = { 276static struct i2c_board_info __initdata ap325rxa_i2c_devices[] = {
@@ -171,6 +279,9 @@ static struct i2c_board_info __initdata ap325rxa_i2c_devices[] = {
171static int __init ap325rxa_devices_setup(void) 279static int __init ap325rxa_devices_setup(void)
172{ 280{
173 clk_always_enable("mstp200"); /* LCDC */ 281 clk_always_enable("mstp200"); /* LCDC */
282 clk_always_enable("mstp203"); /* CEU */
283
284 platform_resource_setup_memory(&ceu_device, "ceu", 4 << 20);
174 285
175 i2c_register_board_info(0, ap325rxa_i2c_devices, 286 i2c_register_board_info(0, ap325rxa_i2c_devices,
176 ARRAY_SIZE(ap325rxa_i2c_devices)); 287 ARRAY_SIZE(ap325rxa_i2c_devices));
@@ -188,6 +299,12 @@ static void __init ap325rxa_setup(char **cmdline_p)
188 ctrl_outw(ctrl_inw(PORT_PMCR) & ~0xffff, PORT_PMCR); 299 ctrl_outw(ctrl_inw(PORT_PMCR) & ~0xffff, PORT_PMCR);
189 ctrl_outw(ctrl_inw(PORT_PRCR) & ~0x03ff, PORT_PRCR); 300 ctrl_outw(ctrl_inw(PORT_PRCR) & ~0x03ff, PORT_PRCR);
190 ctrl_outw(ctrl_inw(PORT_HIZCRA) & ~0x01C0, PORT_HIZCRA); 301 ctrl_outw(ctrl_inw(PORT_HIZCRA) & ~0x01C0, PORT_HIZCRA);
302
303 /* CEU */
304 ctrl_outw(ctrl_inw(PORT_MSELCRB) & ~0x0001, PORT_MSELCRB);
305 ctrl_outw(ctrl_inw(PORT_PSELD) & ~0x0003, PORT_PSELD);
306 ctrl_outw((ctrl_inw(PORT_PZCR) & ~0xff00) | 0x5500, PORT_PZCR);
307 ctrl_outb((ctrl_inb(PORT_PZDR) & ~0xf0) | 0x20, PORT_PZDR);
191} 308}
192 309
193static struct sh_machine_vector mv_ap325rxa __initmv = { 310static struct sh_machine_vector mv_ap325rxa __initmv = {