aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMagnus Damm <damm@igel.co.jp>2008-07-28 05:51:01 -0400
committerPaul Mundt <lethal@linux-sh.org>2008-07-28 05:51:07 -0400
commit1765534c23596794385f309609c09642f33846e4 (patch)
tree88f855fa6a6bb96f4edab807d7f20d7d15765dd6 /arch
parent8b1285f1c192e7e84ba28cc25eb0e9bcf2dadb17 (diff)
sh: Add SuperH Mobile CEU platform data for Migo-R
Add Migo-R specific platform data for on-chip sh7722 CEU and ov772x camera. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/sh/boards/renesas/migor/setup.c173
1 files changed, 172 insertions, 1 deletions
diff --git a/arch/sh/boards/renesas/migor/setup.c b/arch/sh/boards/renesas/migor/setup.c
index 28f7ab489c46..7bd365ad2d06 100644
--- a/arch/sh/boards/renesas/migor/setup.c
+++ b/arch/sh/boards/renesas/migor/setup.c
@@ -15,6 +15,10 @@
15#include <linux/mtd/nand.h> 15#include <linux/mtd/nand.h>
16#include <linux/i2c.h> 16#include <linux/i2c.h>
17#include <linux/smc91x.h> 17#include <linux/smc91x.h>
18#include <linux/delay.h>
19#include <linux/clk.h>
20#include <media/soc_camera_platform.h>
21#include <media/sh_mobile_ceu.h>
18#include <asm/clock.h> 22#include <asm/clock.h>
19#include <asm/machvec.h> 23#include <asm/machvec.h>
20#include <asm/io.h> 24#include <asm/io.h>
@@ -270,15 +274,167 @@ static struct platform_device migor_lcdc_device = {
270 }, 274 },
271}; 275};
272 276
277static struct clk *camera_clk;
278
279static void camera_power_on(void)
280{
281 unsigned char value;
282
283 camera_clk = clk_get(NULL, "video_clk");
284 clk_set_rate(camera_clk, 24000000);
285 clk_enable(camera_clk); /* start VIO_CKO */
286
287 mdelay(10);
288 value = ctrl_inb(PORT_PTDR);
289 value &= ~0x09;
290#ifndef CONFIG_SH_MIGOR_RTA_WVGA
291 value |= 0x01;
292#endif
293 ctrl_outb(value, PORT_PTDR);
294 mdelay(10);
295
296 ctrl_outb(value | 8, PORT_PTDR);
297}
298
299static void camera_power_off(void)
300{
301 clk_disable(camera_clk); /* stop VIO_CKO */
302 clk_put(camera_clk);
303
304 ctrl_outb(ctrl_inb(PORT_PTDR) & ~0x08, PORT_PTDR);
305}
306
307static unsigned char camera_ov772x_magic[] =
308{
309 0x09, 0x01, 0x0c, 0x10, 0x0d, 0x41, 0x0e, 0x01,
310 0x12, 0x00, 0x13, 0x8F, 0x14, 0x4A, 0x15, 0x00,
311 0x16, 0x00, 0x17, 0x23, 0x18, 0xa0, 0x19, 0x07,
312 0x1a, 0xf0, 0x1b, 0x40, 0x1f, 0x00, 0x20, 0x10,
313 0x22, 0xff, 0x23, 0x01, 0x28, 0x00, 0x29, 0xa0,
314 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0xf0, 0x2d, 0x00,
315 0x2e, 0x00, 0x30, 0x80, 0x31, 0x60, 0x32, 0x00,
316 0x33, 0x00, 0x34, 0x00, 0x3d, 0x80, 0x3e, 0xe2,
317 0x3f, 0x1f, 0x42, 0x80, 0x43, 0x80, 0x44, 0x80,
318 0x45, 0x80, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00,
319 0x49, 0x50, 0x4a, 0x30, 0x4b, 0x50, 0x4c, 0x50,
320 0x4d, 0x00, 0x4e, 0xef, 0x4f, 0x10, 0x50, 0x60,
321 0x51, 0x00, 0x52, 0x00, 0x53, 0x24, 0x54, 0x7a,
322 0x55, 0xfc, 0x62, 0xff, 0x63, 0xf0, 0x64, 0x1f,
323 0x65, 0x00, 0x66, 0x10, 0x67, 0x00, 0x68, 0x00,
324 0x69, 0x5c, 0x6a, 0x11, 0x6b, 0xa2, 0x6c, 0x01,
325 0x6d, 0x50, 0x6e, 0x80, 0x6f, 0x80, 0x70, 0x0f,
326 0x71, 0x00, 0x72, 0x00, 0x73, 0x0f, 0x74, 0x0f,
327 0x75, 0xff, 0x78, 0x10, 0x79, 0x70, 0x7a, 0x70,
328 0x7b, 0xf0, 0x7c, 0xf0, 0x7d, 0xf0, 0x7e, 0x0e,
329 0x7f, 0x1a, 0x80, 0x31, 0x81, 0x5a, 0x82, 0x69,
330 0x83, 0x75, 0x84, 0x7e, 0x85, 0x88, 0x86, 0x8f,
331 0x87, 0x96, 0x88, 0xa3, 0x89, 0xaf, 0x8a, 0xc4,
332 0x8b, 0xd7, 0x8c, 0xe8, 0x8d, 0x20, 0x8e, 0x00,
333 0x8f, 0x00, 0x90, 0x08, 0x91, 0x10, 0x92, 0x1f,
334 0x93, 0x01, 0x94, 0x2c, 0x95, 0x24, 0x96, 0x08,
335 0x97, 0x14, 0x98, 0x24, 0x99, 0x38, 0x9a, 0x9e,
336 0x9b, 0x00, 0x9c, 0x40, 0x9e, 0x11, 0x9f, 0x02,
337 0xa0, 0x00, 0xa1, 0x40, 0xa2, 0x40, 0xa3, 0x06,
338 0xa4, 0x00, 0xa6, 0x00, 0xa7, 0x40, 0xa8, 0x40,
339 0xa9, 0x80, 0xaa, 0x80, 0xab, 0x06, 0xac, 0xff,
340 0x12, 0x06, 0x64, 0x3f, 0x12, 0x46, 0x17, 0x3f,
341 0x18, 0x50, 0x19, 0x03, 0x1a, 0x78, 0x29, 0x50,
342 0x2c, 0x78,
343};
344
345static int ov772x_set_capture(struct soc_camera_platform_info *info,
346 int enable)
347{
348 struct i2c_adapter *a = i2c_get_adapter(0);
349 struct i2c_msg msg;
350 int ret = 0;
351 int i;
352
353 if (!enable)
354 return 0; /* camera_power_off() is enough */
355
356 for (i = 0; i < ARRAY_SIZE(camera_ov772x_magic); i += 2) {
357 u_int8_t buf[8];
358
359 msg.addr = 0x21;
360 msg.buf = buf;
361 msg.len = 2;
362 msg.flags = 0;
363
364 buf[0] = camera_ov772x_magic[i];
365 buf[1] = camera_ov772x_magic[i + 1];
366
367 ret = (ret < 0) ? ret : i2c_transfer(a, &msg, 1);
368 }
369
370 return ret;
371}
372
373static struct soc_camera_platform_info ov772x_info = {
374 .iface = 0,
375 .format_name = "RGB565",
376 .format_depth = 16,
377 .format = {
378 .pixelformat = V4L2_PIX_FMT_RGB565,
379 .colorspace = V4L2_COLORSPACE_SRGB,
380 .width = 320,
381 .height = 240,
382 },
383 .bus_param = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH |
384 SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8,
385 .set_capture = ov772x_set_capture,
386};
387
388static struct platform_device migor_camera_device = {
389 .name = "soc_camera_platform",
390 .dev = {
391 .platform_data = &ov772x_info,
392 },
393};
394
395static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
396 .flags = SOCAM_MASTER | SOCAM_DATAWIDTH_8 | SOCAM_PCLK_SAMPLE_RISING \
397 | SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH,
398 .enable_camera = camera_power_on,
399 .disable_camera = camera_power_off,
400};
401
402static struct resource migor_ceu_resources[] = {
403 [0] = {
404 .name = "CEU",
405 .start = 0xfe910000,
406 .end = 0xfe91009f,
407 .flags = IORESOURCE_MEM,
408 },
409 [1] = {
410 .start = 52,
411 .flags = IORESOURCE_IRQ,
412 },
413 [2] = {
414 /* place holder for contiguous memory */
415 },
416};
417
418static struct platform_device migor_ceu_device = {
419 .name = "sh_mobile_ceu",
420 .num_resources = ARRAY_SIZE(migor_ceu_resources),
421 .resource = migor_ceu_resources,
422 .dev = {
423 .platform_data = &sh_mobile_ceu_info,
424 },
425};
426
273static struct platform_device *migor_devices[] __initdata = { 427static struct platform_device *migor_devices[] __initdata = {
274 &smc91x_eth_device, 428 &smc91x_eth_device,
275 &sh_keysc_device, 429 &sh_keysc_device,
276 &migor_lcdc_device, 430 &migor_lcdc_device,
431 &migor_ceu_device,
432 &migor_camera_device,
277 &migor_nor_flash_device, 433 &migor_nor_flash_device,
278 &migor_nand_flash_device, 434 &migor_nand_flash_device,
279}; 435};
280 436
281static struct i2c_board_info __initdata migor_i2c_devices[] = { 437static struct i2c_board_info migor_i2c_devices[] = {
282 { 438 {
283 I2C_BOARD_INFO("rs5c372b", 0x32), 439 I2C_BOARD_INFO("rs5c372b", 0x32),
284 }, 440 },
@@ -292,6 +448,9 @@ static int __init migor_devices_setup(void)
292{ 448{
293 clk_always_enable("mstp214"); /* KEYSC */ 449 clk_always_enable("mstp214"); /* KEYSC */
294 clk_always_enable("mstp200"); /* LCDC */ 450 clk_always_enable("mstp200"); /* LCDC */
451 clk_always_enable("mstp203"); /* CEU */
452
453 platform_resource_setup_memory(&migor_ceu_device, "ceu", 4 << 20);
295 454
296 i2c_register_board_info(0, migor_i2c_devices, 455 i2c_register_board_info(0, migor_i2c_devices,
297 ARRAY_SIZE(migor_i2c_devices)); 456 ARRAY_SIZE(migor_i2c_devices));
@@ -344,6 +503,18 @@ static void __init migor_setup(char **cmdline_p)
344 ctrl_outw(ctrl_inw(PORT_MSELCRB) | 0x0100, PORT_MSELCRB); 503 ctrl_outw(ctrl_inw(PORT_MSELCRB) | 0x0100, PORT_MSELCRB);
345 ctrl_outw(ctrl_inw(PORT_HIZCRA) & ~0x01e0, PORT_HIZCRA); 504 ctrl_outw(ctrl_inw(PORT_HIZCRA) & ~0x01e0, PORT_HIZCRA);
346#endif 505#endif
506
507 /* CEU */
508 ctrl_outw((ctrl_inw(PORT_PTCR) & ~0x03c3) | 0x0051, PORT_PTCR);
509 ctrl_outw(ctrl_inw(PORT_PUCR) & ~0x03ff, PORT_PUCR);
510 ctrl_outw(ctrl_inw(PORT_PVCR) & ~0x03ff, PORT_PVCR);
511 ctrl_outw(ctrl_inw(PORT_PWCR) & ~0x3c00, PORT_PWCR);
512 ctrl_outw(ctrl_inw(PORT_PSELC) | 0x0001, PORT_PSELC);
513 ctrl_outw(ctrl_inw(PORT_PSELD) & ~0x2000, PORT_PSELD);
514 ctrl_outw(ctrl_inw(PORT_PSELE) | 0x000f, PORT_PSELE);
515 ctrl_outw(ctrl_inw(PORT_MSELCRB) | 0x2200, PORT_MSELCRB);
516 ctrl_outw(ctrl_inw(PORT_HIZCRA) & ~0x0a00, PORT_HIZCRA);
517 ctrl_outw(ctrl_inw(PORT_HIZCRB) & ~0x0003, PORT_HIZCRB);
347} 518}
348 519
349static struct sh_machine_vector mv_migor __initmv = { 520static struct sh_machine_vector mv_migor __initmv = {