xref: /openbmc/linux/arch/sh/boards/mach-migor/setup.c (revision 8569c914)
1 /*
2  * Renesas System Solutions Asia Pte. Ltd - Migo-R
3  *
4  * Copyright (C) 2008 Magnus Damm
5  *
6  * This file is subject to the terms and conditions of the GNU General Public
7  * License.  See the file "COPYING" in the main directory of this archive
8  * for more details.
9  */
10 #include <linux/init.h>
11 #include <linux/platform_device.h>
12 #include <linux/interrupt.h>
13 #include <linux/input.h>
14 #include <linux/mtd/physmap.h>
15 #include <linux/mtd/nand.h>
16 #include <linux/i2c.h>
17 #include <linux/smc91x.h>
18 #include <linux/delay.h>
19 #include <linux/clk.h>
20 #include <linux/gpio.h>
21 #include <media/soc_camera_platform.h>
22 #include <media/sh_mobile_ceu.h>
23 #include <video/sh_mobile_lcdc.h>
24 #include <asm/clock.h>
25 #include <asm/machvec.h>
26 #include <asm/io.h>
27 #include <asm/sh_keysc.h>
28 #include <mach/migor.h>
29 #include <cpu/sh7722.h>
30 
31 /* Address     IRQ  Size  Bus  Description
32  * 0x00000000       64MB  16   NOR Flash (SP29PL256N)
33  * 0x0c000000       64MB  64   SDRAM (2xK4M563233G)
34  * 0x10000000  IRQ0       16   Ethernet (SMC91C111)
35  * 0x14000000  IRQ4       16   USB 2.0 Host Controller (M66596)
36  * 0x18000000       8GB    8   NAND Flash (K9K8G08U0A)
37  */
38 
39 static struct smc91x_platdata smc91x_info = {
40 	.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
41 };
42 
43 static struct resource smc91x_eth_resources[] = {
44 	[0] = {
45 		.name   = "SMC91C111" ,
46 		.start  = 0x10000300,
47 		.end    = 0x1000030f,
48 		.flags  = IORESOURCE_MEM,
49 	},
50 	[1] = {
51 		.start  = 32, /* IRQ0 */
52 		.flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
53 	},
54 };
55 
56 static struct platform_device smc91x_eth_device = {
57 	.name           = "smc91x",
58 	.num_resources  = ARRAY_SIZE(smc91x_eth_resources),
59 	.resource       = smc91x_eth_resources,
60 	.dev	= {
61 		.platform_data	= &smc91x_info,
62 	},
63 };
64 
65 static struct sh_keysc_info sh_keysc_info = {
66 	.mode = SH_KEYSC_MODE_2, /* KEYOUT0->4, KEYIN1->5 */
67 	.scan_timing = 3,
68 	.delay = 5,
69 	.keycodes = {
70 		0, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_ENTER,
71 		0, KEY_F, KEY_C, KEY_D,	KEY_H, KEY_1,
72 		0, KEY_2, KEY_3, KEY_4,	KEY_5, KEY_6,
73 		0, KEY_7, KEY_8, KEY_9, KEY_S, KEY_0,
74 		0, KEY_P, KEY_STOP, KEY_REWIND, KEY_PLAY, KEY_FASTFORWARD,
75 	},
76 };
77 
78 static struct resource sh_keysc_resources[] = {
79 	[0] = {
80 		.start  = 0x044b0000,
81 		.end    = 0x044b000f,
82 		.flags  = IORESOURCE_MEM,
83 	},
84 	[1] = {
85 		.start  = 79,
86 		.flags  = IORESOURCE_IRQ,
87 	},
88 };
89 
90 static struct platform_device sh_keysc_device = {
91 	.name           = "sh_keysc",
92 	.num_resources  = ARRAY_SIZE(sh_keysc_resources),
93 	.resource       = sh_keysc_resources,
94 	.dev	= {
95 		.platform_data	= &sh_keysc_info,
96 	},
97 };
98 
99 static struct mtd_partition migor_nor_flash_partitions[] =
100 {
101 	{
102 		.name = "uboot",
103 		.offset = 0,
104 		.size = (1 * 1024 * 1024),
105 		.mask_flags = MTD_WRITEABLE,	/* Read-only */
106 	},
107 	{
108 		.name = "rootfs",
109 		.offset = MTDPART_OFS_APPEND,
110 		.size = (15 * 1024 * 1024),
111 	},
112 	{
113 		.name = "other",
114 		.offset = MTDPART_OFS_APPEND,
115 		.size = MTDPART_SIZ_FULL,
116 	},
117 };
118 
119 static struct physmap_flash_data migor_nor_flash_data = {
120 	.width		= 2,
121 	.parts		= migor_nor_flash_partitions,
122 	.nr_parts	= ARRAY_SIZE(migor_nor_flash_partitions),
123 };
124 
125 static struct resource migor_nor_flash_resources[] = {
126 	[0] = {
127 		.name		= "NOR Flash",
128 		.start		= 0x00000000,
129 		.end		= 0x03ffffff,
130 		.flags		= IORESOURCE_MEM,
131 	}
132 };
133 
134 static struct platform_device migor_nor_flash_device = {
135 	.name		= "physmap-flash",
136 	.resource	= migor_nor_flash_resources,
137 	.num_resources	= ARRAY_SIZE(migor_nor_flash_resources),
138 	.dev		= {
139 		.platform_data = &migor_nor_flash_data,
140 	},
141 };
142 
143 static struct mtd_partition migor_nand_flash_partitions[] = {
144 	{
145 		.name		= "nanddata1",
146 		.offset		= 0x0,
147 		.size		= 512 * 1024 * 1024,
148 	},
149 	{
150 		.name		= "nanddata2",
151 		.offset		= MTDPART_OFS_APPEND,
152 		.size		= 512 * 1024 * 1024,
153 	},
154 };
155 
156 static void migor_nand_flash_cmd_ctl(struct mtd_info *mtd, int cmd,
157 				     unsigned int ctrl)
158 {
159 	struct nand_chip *chip = mtd->priv;
160 
161 	if (cmd == NAND_CMD_NONE)
162 		return;
163 
164 	if (ctrl & NAND_CLE)
165 		writeb(cmd, chip->IO_ADDR_W + 0x00400000);
166 	else if (ctrl & NAND_ALE)
167 		writeb(cmd, chip->IO_ADDR_W + 0x00800000);
168 	else
169 		writeb(cmd, chip->IO_ADDR_W);
170 }
171 
172 static int migor_nand_flash_ready(struct mtd_info *mtd)
173 {
174 	return gpio_get_value(GPIO_PTA1); /* NAND_RBn */
175 }
176 
177 struct platform_nand_data migor_nand_flash_data = {
178 	.chip = {
179 		.nr_chips = 1,
180 		.partitions = migor_nand_flash_partitions,
181 		.nr_partitions = ARRAY_SIZE(migor_nand_flash_partitions),
182 		.chip_delay = 20,
183 		.part_probe_types = (const char *[]) { "cmdlinepart", NULL },
184 	},
185 	.ctrl = {
186 		.dev_ready = migor_nand_flash_ready,
187 		.cmd_ctrl = migor_nand_flash_cmd_ctl,
188 	},
189 };
190 
191 static struct resource migor_nand_flash_resources[] = {
192 	[0] = {
193 		.name		= "NAND Flash",
194 		.start		= 0x18000000,
195 		.end		= 0x18ffffff,
196 		.flags		= IORESOURCE_MEM,
197 	},
198 };
199 
200 static struct platform_device migor_nand_flash_device = {
201 	.name		= "gen_nand",
202 	.resource	= migor_nand_flash_resources,
203 	.num_resources	= ARRAY_SIZE(migor_nand_flash_resources),
204 	.dev		= {
205 		.platform_data = &migor_nand_flash_data,
206 	}
207 };
208 
209 static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
210 #ifdef CONFIG_SH_MIGOR_RTA_WVGA
211 	.clock_source = LCDC_CLK_BUS,
212 	.ch[0] = {
213 		.chan = LCDC_CHAN_MAINLCD,
214 		.bpp = 16,
215 		.interface_type = RGB16,
216 		.clock_divider = 2,
217 		.lcd_cfg = {
218 			.name = "LB070WV1",
219 			.xres = 800,
220 			.yres = 480,
221 			.left_margin = 64,
222 			.right_margin = 16,
223 			.hsync_len = 120,
224 			.upper_margin = 1,
225 			.lower_margin = 17,
226 			.vsync_len = 2,
227 			.sync = 0,
228 		},
229 		.lcd_size_cfg = { /* 7.0 inch */
230 			.width = 152,
231 			.height = 91,
232 		},
233 	}
234 #endif
235 #ifdef CONFIG_SH_MIGOR_QVGA
236 	.clock_source = LCDC_CLK_PERIPHERAL,
237 	.ch[0] = {
238 		.chan = LCDC_CHAN_MAINLCD,
239 		.bpp = 16,
240 		.interface_type = SYS16A,
241 		.clock_divider = 10,
242 		.lcd_cfg = {
243 			.name = "PH240320T",
244 			.xres = 320,
245 			.yres = 240,
246 			.left_margin = 0,
247 			.right_margin = 16,
248 			.hsync_len = 8,
249 			.upper_margin = 1,
250 			.lower_margin = 17,
251 			.vsync_len = 2,
252 			.sync = FB_SYNC_HOR_HIGH_ACT,
253 		},
254 		.lcd_size_cfg = { /* 2.4 inch */
255 			.width = 49,
256 			.height = 37,
257 		},
258 		.board_cfg = {
259 			.setup_sys = migor_lcd_qvga_setup,
260 		},
261 		.sys_bus_cfg = {
262 			.ldmt2r = 0x06000a09,
263 			.ldmt3r = 0x180e3418,
264 		},
265 	}
266 #endif
267 };
268 
269 static struct resource migor_lcdc_resources[] = {
270 	[0] = {
271 		.name	= "LCDC",
272 		.start	= 0xfe940000, /* P4-only space */
273 		.end	= 0xfe941fff,
274 		.flags	= IORESOURCE_MEM,
275 	},
276 };
277 
278 static struct platform_device migor_lcdc_device = {
279 	.name		= "sh_mobile_lcdc_fb",
280 	.num_resources	= ARRAY_SIZE(migor_lcdc_resources),
281 	.resource	= migor_lcdc_resources,
282 	.dev	= {
283 		.platform_data	= &sh_mobile_lcdc_info,
284 	},
285 };
286 
287 static struct clk *camera_clk;
288 
289 static void camera_power_on(void)
290 {
291 	camera_clk = clk_get(NULL, "video_clk");
292 	clk_set_rate(camera_clk, 24000000);
293 	clk_enable(camera_clk);	/* start VIO_CKO */
294 
295 	/* use VIO_RST to take camera out of reset */
296 	mdelay(10);
297 	gpio_set_value(GPIO_PTT3, 0);
298 	mdelay(10);
299 	gpio_set_value(GPIO_PTT3, 1);
300 }
301 
302 static void camera_power_off(void)
303 {
304 	clk_disable(camera_clk); /* stop VIO_CKO */
305 	clk_put(camera_clk);
306 
307 	gpio_set_value(GPIO_PTT3, 0);
308 }
309 
310 #ifdef CONFIG_I2C
311 static unsigned char camera_ov772x_magic[] =
312 {
313 	0x09, 0x01, 0x0c, 0x10, 0x0d, 0x41, 0x0e, 0x01,
314 	0x12, 0x00, 0x13, 0x8F, 0x14, 0x4A, 0x15, 0x00,
315 	0x16, 0x00, 0x17, 0x23, 0x18, 0xa0, 0x19, 0x07,
316 	0x1a, 0xf0, 0x1b, 0x40, 0x1f, 0x00, 0x20, 0x10,
317 	0x22, 0xff, 0x23, 0x01, 0x28, 0x00, 0x29, 0xa0,
318 	0x2a, 0x00, 0x2b, 0x00, 0x2c, 0xf0, 0x2d, 0x00,
319 	0x2e, 0x00, 0x30, 0x80, 0x31, 0x60, 0x32, 0x00,
320 	0x33, 0x00, 0x34, 0x00, 0x3d, 0x80, 0x3e, 0xe2,
321 	0x3f, 0x1f, 0x42, 0x80, 0x43, 0x80, 0x44, 0x80,
322 	0x45, 0x80, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00,
323 	0x49, 0x50, 0x4a, 0x30, 0x4b, 0x50, 0x4c, 0x50,
324 	0x4d, 0x00, 0x4e, 0xef, 0x4f, 0x10, 0x50, 0x60,
325 	0x51, 0x00, 0x52, 0x00, 0x53, 0x24, 0x54, 0x7a,
326 	0x55, 0xfc, 0x62, 0xff, 0x63, 0xf0, 0x64, 0x1f,
327 	0x65, 0x00, 0x66, 0x10, 0x67, 0x00, 0x68, 0x00,
328 	0x69, 0x5c, 0x6a, 0x11, 0x6b, 0xa2, 0x6c, 0x01,
329 	0x6d, 0x50, 0x6e, 0x80, 0x6f, 0x80, 0x70, 0x0f,
330 	0x71, 0x00, 0x72, 0x00, 0x73, 0x0f, 0x74, 0x0f,
331 	0x75, 0xff, 0x78, 0x10, 0x79, 0x70, 0x7a, 0x70,
332 	0x7b, 0xf0, 0x7c, 0xf0, 0x7d, 0xf0, 0x7e, 0x0e,
333 	0x7f, 0x1a, 0x80, 0x31, 0x81, 0x5a, 0x82, 0x69,
334 	0x83, 0x75, 0x84, 0x7e, 0x85, 0x88, 0x86, 0x8f,
335 	0x87, 0x96, 0x88, 0xa3, 0x89, 0xaf, 0x8a, 0xc4,
336 	0x8b, 0xd7, 0x8c, 0xe8, 0x8d, 0x20, 0x8e, 0x00,
337 	0x8f, 0x00, 0x90, 0x08, 0x91, 0x10, 0x92, 0x1f,
338 	0x93, 0x01, 0x94, 0x2c, 0x95, 0x24, 0x96, 0x08,
339 	0x97, 0x14, 0x98, 0x24, 0x99, 0x38, 0x9a, 0x9e,
340 	0x9b, 0x00, 0x9c, 0x40, 0x9e, 0x11, 0x9f, 0x02,
341 	0xa0, 0x00, 0xa1, 0x40, 0xa2, 0x40, 0xa3, 0x06,
342 	0xa4, 0x00, 0xa6, 0x00, 0xa7, 0x40, 0xa8, 0x40,
343 	0xa9, 0x80, 0xaa, 0x80, 0xab, 0x06, 0xac, 0xff,
344 	0x12, 0x06, 0x64, 0x3f, 0x12, 0x46, 0x17, 0x3f,
345 	0x18, 0x50, 0x19, 0x03, 0x1a, 0x78, 0x29, 0x50,
346 	0x2c, 0x78,
347 };
348 
349 static int ov772x_set_capture(struct soc_camera_platform_info *info,
350 			      int enable)
351 {
352 	struct i2c_adapter *a = i2c_get_adapter(0);
353 	struct i2c_msg msg;
354 	int ret = 0;
355 	int i;
356 
357 	if (!enable)
358 		return 0; /* camera_power_off() is enough */
359 
360 	for (i = 0; i < ARRAY_SIZE(camera_ov772x_magic); i += 2) {
361 		u_int8_t buf[8];
362 
363 		msg.addr = 0x21;
364 		msg.buf = buf;
365 		msg.len = 2;
366 		msg.flags = 0;
367 
368 		buf[0] = camera_ov772x_magic[i];
369 		buf[1] = camera_ov772x_magic[i + 1];
370 
371 		ret = (ret < 0) ? ret : i2c_transfer(a, &msg, 1);
372 	}
373 
374 	return ret;
375 }
376 
377 static struct soc_camera_platform_info ov772x_info = {
378 	.iface = 0,
379 	.format_name = "RGB565",
380 	.format_depth = 16,
381 	.format = {
382 		.pixelformat = V4L2_PIX_FMT_RGB565,
383 		.colorspace = V4L2_COLORSPACE_SRGB,
384 		.width = 320,
385 		.height = 240,
386 	},
387 	.bus_param =  SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH |
388 	SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8,
389 	.set_capture = ov772x_set_capture,
390 };
391 
392 static struct platform_device migor_camera_device = {
393 	.name		= "soc_camera_platform",
394 	.dev	= {
395 		.platform_data	= &ov772x_info,
396 	},
397 };
398 #endif /* CONFIG_I2C */
399 
400 static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
401 	.flags = SOCAM_MASTER | SOCAM_DATAWIDTH_8 | SOCAM_PCLK_SAMPLE_RISING \
402 	| SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH,
403 	.enable_camera = camera_power_on,
404 	.disable_camera = camera_power_off,
405 };
406 
407 static struct resource migor_ceu_resources[] = {
408 	[0] = {
409 		.name	= "CEU",
410 		.start	= 0xfe910000,
411 		.end	= 0xfe91009f,
412 		.flags	= IORESOURCE_MEM,
413 	},
414 	[1] = {
415 		.start  = 52,
416 		.flags  = IORESOURCE_IRQ,
417 	},
418 	[2] = {
419 		/* place holder for contiguous memory */
420 	},
421 };
422 
423 static struct platform_device migor_ceu_device = {
424 	.name		= "sh_mobile_ceu",
425 	.num_resources	= ARRAY_SIZE(migor_ceu_resources),
426 	.resource	= migor_ceu_resources,
427 	.dev	= {
428 		.platform_data	= &sh_mobile_ceu_info,
429 	},
430 };
431 
432 static struct platform_device *migor_devices[] __initdata = {
433 	&smc91x_eth_device,
434 	&sh_keysc_device,
435 	&migor_lcdc_device,
436 	&migor_ceu_device,
437 #ifdef CONFIG_I2C
438 	&migor_camera_device,
439 #endif
440 	&migor_nor_flash_device,
441 	&migor_nand_flash_device,
442 };
443 
444 static struct i2c_board_info migor_i2c_devices[] = {
445 	{
446 		I2C_BOARD_INFO("rs5c372b", 0x32),
447 	},
448 	{
449 		I2C_BOARD_INFO("migor_ts", 0x51),
450 		.irq = 38, /* IRQ6 */
451 	},
452 };
453 
454 static int __init migor_devices_setup(void)
455 {
456 	/* Lit D11 LED */
457 	gpio_request(GPIO_PTJ7, NULL);
458 	gpio_direction_output(GPIO_PTJ7, 1);
459 	gpio_export(GPIO_PTJ7, 0);
460 
461 	/* Lit D12 LED */
462 	gpio_request(GPIO_PTJ5, NULL);
463 	gpio_direction_output(GPIO_PTJ5, 1);
464 	gpio_export(GPIO_PTJ5, 0);
465 
466 	/* SMC91C111 - Enable IRQ0, Setup CS4 for 16-bit fast access */
467 	gpio_request(GPIO_FN_IRQ0, NULL);
468 	ctrl_outl(0x00003400, BSC_CS4BCR);
469 	ctrl_outl(0x00110080, BSC_CS4WCR);
470 
471 	/* KEYSC */
472 	clk_always_enable("mstp214"); /* KEYSC */
473 	gpio_request(GPIO_FN_KEYOUT0, NULL);
474 	gpio_request(GPIO_FN_KEYOUT1, NULL);
475 	gpio_request(GPIO_FN_KEYOUT2, NULL);
476 	gpio_request(GPIO_FN_KEYOUT3, NULL);
477 	gpio_request(GPIO_FN_KEYOUT4_IN6, NULL);
478 	gpio_request(GPIO_FN_KEYIN1, NULL);
479 	gpio_request(GPIO_FN_KEYIN2, NULL);
480 	gpio_request(GPIO_FN_KEYIN3, NULL);
481 	gpio_request(GPIO_FN_KEYIN4, NULL);
482 	gpio_request(GPIO_FN_KEYOUT5_IN5, NULL);
483 
484 	/* NAND Flash */
485 	gpio_request(GPIO_FN_CS6A_CE2B, NULL);
486 	ctrl_outl((ctrl_inl(BSC_CS6ABCR) & ~0x0600) | 0x0200, BSC_CS6ABCR);
487 	gpio_request(GPIO_PTA1, NULL);
488 	gpio_direction_input(GPIO_PTA1);
489 
490 	/* Touch Panel */
491 	gpio_request(GPIO_FN_IRQ6, NULL);
492 
493 	/* LCD Panel */
494 	clk_always_enable("mstp200"); /* LCDC */
495 #ifdef CONFIG_SH_MIGOR_QVGA /* LCDC - QVGA - Enable SYS Interface signals */
496 	gpio_request(GPIO_FN_LCDD17, NULL);
497 	gpio_request(GPIO_FN_LCDD16, NULL);
498 	gpio_request(GPIO_FN_LCDD15, NULL);
499 	gpio_request(GPIO_FN_LCDD14, NULL);
500 	gpio_request(GPIO_FN_LCDD13, NULL);
501 	gpio_request(GPIO_FN_LCDD12, NULL);
502 	gpio_request(GPIO_FN_LCDD11, NULL);
503 	gpio_request(GPIO_FN_LCDD10, NULL);
504 	gpio_request(GPIO_FN_LCDD8, NULL);
505 	gpio_request(GPIO_FN_LCDD7, NULL);
506 	gpio_request(GPIO_FN_LCDD6, NULL);
507 	gpio_request(GPIO_FN_LCDD5, NULL);
508 	gpio_request(GPIO_FN_LCDD4, NULL);
509 	gpio_request(GPIO_FN_LCDD3, NULL);
510 	gpio_request(GPIO_FN_LCDD2, NULL);
511 	gpio_request(GPIO_FN_LCDD1, NULL);
512 	gpio_request(GPIO_FN_LCDRS, NULL);
513 	gpio_request(GPIO_FN_LCDCS, NULL);
514 	gpio_request(GPIO_FN_LCDRD, NULL);
515 	gpio_request(GPIO_FN_LCDWR, NULL);
516 	gpio_request(GPIO_PTH2, NULL); /* LCD_DON */
517 	gpio_direction_output(GPIO_PTH2, 1);
518 #endif
519 #ifdef CONFIG_SH_MIGOR_RTA_WVGA /* LCDC - WVGA - Enable RGB Interface signals */
520 	gpio_request(GPIO_FN_LCDD15, NULL);
521 	gpio_request(GPIO_FN_LCDD14, NULL);
522 	gpio_request(GPIO_FN_LCDD13, NULL);
523 	gpio_request(GPIO_FN_LCDD12, NULL);
524 	gpio_request(GPIO_FN_LCDD11, NULL);
525 	gpio_request(GPIO_FN_LCDD10, NULL);
526 	gpio_request(GPIO_FN_LCDD9, NULL);
527 	gpio_request(GPIO_FN_LCDD8, NULL);
528 	gpio_request(GPIO_FN_LCDD7, NULL);
529 	gpio_request(GPIO_FN_LCDD6, NULL);
530 	gpio_request(GPIO_FN_LCDD5, NULL);
531 	gpio_request(GPIO_FN_LCDD4, NULL);
532 	gpio_request(GPIO_FN_LCDD3, NULL);
533 	gpio_request(GPIO_FN_LCDD2, NULL);
534 	gpio_request(GPIO_FN_LCDD1, NULL);
535 	gpio_request(GPIO_FN_LCDD0, NULL);
536 	gpio_request(GPIO_FN_LCDLCLK, NULL);
537 	gpio_request(GPIO_FN_LCDDCK, NULL);
538 	gpio_request(GPIO_FN_LCDVEPWC, NULL);
539 	gpio_request(GPIO_FN_LCDVCPWC, NULL);
540 	gpio_request(GPIO_FN_LCDVSYN, NULL);
541 	gpio_request(GPIO_FN_LCDHSYN, NULL);
542 	gpio_request(GPIO_FN_LCDDISP, NULL);
543 	gpio_request(GPIO_FN_LCDDON, NULL);
544 #endif
545 
546 	/* CEU */
547 	clk_always_enable("mstp203"); /* CEU */
548 	gpio_request(GPIO_FN_VIO_CLK2, NULL);
549 	gpio_request(GPIO_FN_VIO_VD2, NULL);
550 	gpio_request(GPIO_FN_VIO_HD2, NULL);
551 	gpio_request(GPIO_FN_VIO_FLD, NULL);
552 	gpio_request(GPIO_FN_VIO_CKO, NULL);
553 	gpio_request(GPIO_FN_VIO_D15, NULL);
554 	gpio_request(GPIO_FN_VIO_D14, NULL);
555 	gpio_request(GPIO_FN_VIO_D13, NULL);
556 	gpio_request(GPIO_FN_VIO_D12, NULL);
557 	gpio_request(GPIO_FN_VIO_D11, NULL);
558 	gpio_request(GPIO_FN_VIO_D10, NULL);
559 	gpio_request(GPIO_FN_VIO_D9, NULL);
560 	gpio_request(GPIO_FN_VIO_D8, NULL);
561 
562 	gpio_request(GPIO_PTT3, NULL); /* VIO_RST */
563 	gpio_direction_output(GPIO_PTT3, 0);
564 	gpio_request(GPIO_PTT2, NULL); /* TV_IN_EN */
565 	gpio_direction_output(GPIO_PTT2, 1);
566 	gpio_request(GPIO_PTT0, NULL); /* CAM_EN */
567 #ifdef CONFIG_SH_MIGOR_RTA_WVGA
568 	gpio_direction_output(GPIO_PTT0, 0);
569 #else
570 	gpio_direction_output(GPIO_PTT0, 1);
571 #endif
572 	ctrl_outw(ctrl_inw(PORT_MSELCRB) | 0x2000, PORT_MSELCRB); /* D15->D8 */
573 
574 	platform_resource_setup_memory(&migor_ceu_device, "ceu", 4 << 20);
575 
576 	i2c_register_board_info(0, migor_i2c_devices,
577 				ARRAY_SIZE(migor_i2c_devices));
578 
579 	return platform_add_devices(migor_devices, ARRAY_SIZE(migor_devices));
580 }
581 __initcall(migor_devices_setup);
582 
583 static void __init migor_setup(char **cmdline_p)
584 {
585 }
586 
587 static struct sh_machine_vector mv_migor __initmv = {
588 	.mv_name		= "Migo-R",
589 	.mv_setup		= migor_setup,
590 };
591