blob: 38c34c1f8abed6ccdcbe0e2d12b5844dbc00318f [file] [log] [blame]
Magnus Damm70f784e2008-02-07 00:38:24 +09001/*
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>
Magnus Damm92cfeb62008-03-04 15:23:45 -080013#include <linux/input.h>
Magnus Dammb8808782008-03-21 18:43:55 +090014#include <linux/mtd/physmap.h>
Magnus Damm3c803a92008-03-21 18:44:04 +090015#include <linux/mtd/nand.h>
Magnus Damm0c6111e2008-03-25 17:20:24 +090016#include <linux/i2c.h>
Magnus Damm8a3ee0f2008-04-23 20:13:59 +090017#include <linux/smc91x.h>
Magnus Damm17655342008-07-28 18:51:01 +090018#include <linux/delay.h>
19#include <linux/clk.h>
Magnus Damm91b6f3c2008-10-08 20:42:01 +090020#include <linux/gpio.h>
Magnus Damm17655342008-07-28 18:51:01 +090021#include <media/soc_camera_platform.h>
22#include <media/sh_mobile_ceu.h>
Paul Mundt225c9a82008-10-01 16:24:32 +090023#include <video/sh_mobile_lcdc.h>
Magnus Damm6c7d8262008-07-17 19:16:11 +090024#include <asm/clock.h>
Magnus Damm70f784e2008-02-07 00:38:24 +090025#include <asm/machvec.h>
26#include <asm/io.h>
Magnus Damm92cfeb62008-03-04 15:23:45 -080027#include <asm/sh_keysc.h>
Paul Mundt7639a452008-10-20 13:02:48 +090028#include <mach/migor.h>
Paul Mundtf7275652008-10-20 12:04:53 +090029#include <cpu/sh7722.h>
Magnus Damm70f784e2008-02-07 00:38:24 +090030
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
Magnus Damm8a3ee0f2008-04-23 20:13:59 +090039static struct smc91x_platdata smc91x_info = {
Magnus Damma30c89a2008-10-09 18:41:34 +090040 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
Magnus Damm8a3ee0f2008-04-23 20:13:59 +090041};
42
Magnus Damm70f784e2008-02-07 00:38:24 +090043static struct resource smc91x_eth_resources[] = {
44 [0] = {
Magnus Dammb026a232008-03-21 18:43:46 +090045 .name = "SMC91C111" ,
46 .start = 0x10000300,
47 .end = 0x1000030f,
Magnus Damm70f784e2008-02-07 00:38:24 +090048 .flags = IORESOURCE_MEM,
49 },
50 [1] = {
51 .start = 32, /* IRQ0 */
Eric Miaod280ead2008-06-06 17:13:02 +080052 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
Magnus Damm70f784e2008-02-07 00:38:24 +090053 },
54};
55
56static struct platform_device smc91x_eth_device = {
57 .name = "smc91x",
58 .num_resources = ARRAY_SIZE(smc91x_eth_resources),
59 .resource = smc91x_eth_resources,
Magnus Damm8a3ee0f2008-04-23 20:13:59 +090060 .dev = {
61 .platform_data = &smc91x_info,
62 },
Magnus Damm70f784e2008-02-07 00:38:24 +090063};
64
Magnus Damm92cfeb62008-03-04 15:23:45 -080065static 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
78static 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
90static struct platform_device sh_keysc_device = {
91 .name = "sh_keysc",
Magnus Damm090d9512008-10-31 20:21:23 +090092 .id = 0, /* "keysc0" clock */
Magnus Damm92cfeb62008-03-04 15:23:45 -080093 .num_resources = ARRAY_SIZE(sh_keysc_resources),
94 .resource = sh_keysc_resources,
95 .dev = {
96 .platform_data = &sh_keysc_info,
97 },
98};
99
Magnus Dammb8808782008-03-21 18:43:55 +0900100static struct mtd_partition migor_nor_flash_partitions[] =
101{
102 {
103 .name = "uboot",
104 .offset = 0,
105 .size = (1 * 1024 * 1024),
106 .mask_flags = MTD_WRITEABLE, /* Read-only */
107 },
108 {
109 .name = "rootfs",
110 .offset = MTDPART_OFS_APPEND,
111 .size = (15 * 1024 * 1024),
112 },
113 {
114 .name = "other",
115 .offset = MTDPART_OFS_APPEND,
116 .size = MTDPART_SIZ_FULL,
117 },
118};
119
120static struct physmap_flash_data migor_nor_flash_data = {
121 .width = 2,
122 .parts = migor_nor_flash_partitions,
123 .nr_parts = ARRAY_SIZE(migor_nor_flash_partitions),
124};
125
126static struct resource migor_nor_flash_resources[] = {
127 [0] = {
128 .name = "NOR Flash",
129 .start = 0x00000000,
130 .end = 0x03ffffff,
131 .flags = IORESOURCE_MEM,
132 }
133};
134
135static struct platform_device migor_nor_flash_device = {
136 .name = "physmap-flash",
137 .resource = migor_nor_flash_resources,
138 .num_resources = ARRAY_SIZE(migor_nor_flash_resources),
139 .dev = {
140 .platform_data = &migor_nor_flash_data,
141 },
142};
143
Magnus Damm3c803a92008-03-21 18:44:04 +0900144static struct mtd_partition migor_nand_flash_partitions[] = {
145 {
146 .name = "nanddata1",
147 .offset = 0x0,
148 .size = 512 * 1024 * 1024,
149 },
150 {
151 .name = "nanddata2",
152 .offset = MTDPART_OFS_APPEND,
153 .size = 512 * 1024 * 1024,
154 },
155};
156
157static void migor_nand_flash_cmd_ctl(struct mtd_info *mtd, int cmd,
158 unsigned int ctrl)
159{
160 struct nand_chip *chip = mtd->priv;
161
162 if (cmd == NAND_CMD_NONE)
163 return;
164
165 if (ctrl & NAND_CLE)
166 writeb(cmd, chip->IO_ADDR_W + 0x00400000);
167 else if (ctrl & NAND_ALE)
168 writeb(cmd, chip->IO_ADDR_W + 0x00800000);
169 else
170 writeb(cmd, chip->IO_ADDR_W);
171}
172
173static int migor_nand_flash_ready(struct mtd_info *mtd)
174{
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900175 return gpio_get_value(GPIO_PTA1); /* NAND_RBn */
Magnus Damm3c803a92008-03-21 18:44:04 +0900176}
177
178struct platform_nand_data migor_nand_flash_data = {
179 .chip = {
180 .nr_chips = 1,
181 .partitions = migor_nand_flash_partitions,
182 .nr_partitions = ARRAY_SIZE(migor_nand_flash_partitions),
183 .chip_delay = 20,
184 .part_probe_types = (const char *[]) { "cmdlinepart", NULL },
185 },
186 .ctrl = {
187 .dev_ready = migor_nand_flash_ready,
188 .cmd_ctrl = migor_nand_flash_cmd_ctl,
189 },
190};
191
192static struct resource migor_nand_flash_resources[] = {
193 [0] = {
194 .name = "NAND Flash",
195 .start = 0x18000000,
196 .end = 0x18ffffff,
197 .flags = IORESOURCE_MEM,
198 },
199};
200
201static struct platform_device migor_nand_flash_device = {
202 .name = "gen_nand",
203 .resource = migor_nand_flash_resources,
204 .num_resources = ARRAY_SIZE(migor_nand_flash_resources),
205 .dev = {
206 .platform_data = &migor_nand_flash_data,
207 }
208};
209
Magnus Damm8b1285f2008-07-28 18:47:30 +0900210static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
211#ifdef CONFIG_SH_MIGOR_RTA_WVGA
212 .clock_source = LCDC_CLK_BUS,
213 .ch[0] = {
214 .chan = LCDC_CHAN_MAINLCD,
215 .bpp = 16,
216 .interface_type = RGB16,
217 .clock_divider = 2,
218 .lcd_cfg = {
219 .name = "LB070WV1",
220 .xres = 800,
221 .yres = 480,
222 .left_margin = 64,
223 .right_margin = 16,
224 .hsync_len = 120,
225 .upper_margin = 1,
226 .lower_margin = 17,
227 .vsync_len = 2,
228 .sync = 0,
229 },
Magnus Dammce9c0082008-08-11 15:26:00 +0900230 .lcd_size_cfg = { /* 7.0 inch */
231 .width = 152,
232 .height = 91,
233 },
Magnus Damm8b1285f2008-07-28 18:47:30 +0900234 }
235#endif
236#ifdef CONFIG_SH_MIGOR_QVGA
237 .clock_source = LCDC_CLK_PERIPHERAL,
238 .ch[0] = {
239 .chan = LCDC_CHAN_MAINLCD,
240 .bpp = 16,
241 .interface_type = SYS16A,
242 .clock_divider = 10,
243 .lcd_cfg = {
244 .name = "PH240320T",
245 .xres = 320,
246 .yres = 240,
247 .left_margin = 0,
248 .right_margin = 16,
249 .hsync_len = 8,
250 .upper_margin = 1,
251 .lower_margin = 17,
252 .vsync_len = 2,
253 .sync = FB_SYNC_HOR_HIGH_ACT,
254 },
Magnus Dammce9c0082008-08-11 15:26:00 +0900255 .lcd_size_cfg = { /* 2.4 inch */
256 .width = 49,
257 .height = 37,
258 },
Magnus Damm8b1285f2008-07-28 18:47:30 +0900259 .board_cfg = {
260 .setup_sys = migor_lcd_qvga_setup,
261 },
262 .sys_bus_cfg = {
263 .ldmt2r = 0x06000a09,
264 .ldmt3r = 0x180e3418,
265 },
266 }
267#endif
268};
269
270static struct resource migor_lcdc_resources[] = {
271 [0] = {
272 .name = "LCDC",
273 .start = 0xfe940000, /* P4-only space */
274 .end = 0xfe941fff,
275 .flags = IORESOURCE_MEM,
276 },
277};
278
279static struct platform_device migor_lcdc_device = {
280 .name = "sh_mobile_lcdc_fb",
281 .num_resources = ARRAY_SIZE(migor_lcdc_resources),
282 .resource = migor_lcdc_resources,
283 .dev = {
284 .platform_data = &sh_mobile_lcdc_info,
285 },
286};
287
Magnus Damm17655342008-07-28 18:51:01 +0900288static struct clk *camera_clk;
289
290static void camera_power_on(void)
291{
Magnus Damm22ee3ba2008-10-22 18:25:39 +0900292 /* Use 10 MHz VIO_CKO instead of 24 MHz to work
293 * around signal quality issues on Panel Board V2.1.
294 */
Magnus Damm17655342008-07-28 18:51:01 +0900295 camera_clk = clk_get(NULL, "video_clk");
Magnus Damm22ee3ba2008-10-22 18:25:39 +0900296 clk_set_rate(camera_clk, 10000000);
Magnus Damm17655342008-07-28 18:51:01 +0900297 clk_enable(camera_clk); /* start VIO_CKO */
298
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900299 /* use VIO_RST to take camera out of reset */
Magnus Damm17655342008-07-28 18:51:01 +0900300 mdelay(10);
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900301 gpio_set_value(GPIO_PTT3, 0);
Magnus Damm17655342008-07-28 18:51:01 +0900302 mdelay(10);
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900303 gpio_set_value(GPIO_PTT3, 1);
Magnus Damm4545bfa2008-12-10 17:02:13 +0900304 mdelay(10); /* wait to let chip come out of reset */
Magnus Damm17655342008-07-28 18:51:01 +0900305}
306
307static void camera_power_off(void)
308{
309 clk_disable(camera_clk); /* stop VIO_CKO */
310 clk_put(camera_clk);
311
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900312 gpio_set_value(GPIO_PTT3, 0);
Magnus Damm17655342008-07-28 18:51:01 +0900313}
314
Guennadi Liakhovetski58419ab2008-10-21 12:44:38 +0900315static void camera_power(int mode)
316{
317 if (mode)
318 camera_power_on();
319 else
320 camera_power_off();
321}
322
Magnus Damme565b512008-07-29 20:57:38 +0900323#ifdef CONFIG_I2C
Magnus Damm17655342008-07-28 18:51:01 +0900324static unsigned char camera_ov772x_magic[] =
325{
Magnus Damm3b495512008-10-21 21:29:03 +0900326 0x09, 0x01, 0x0c, 0x20, 0x0d, 0x41, 0x0e, 0x01,
Magnus Damm17655342008-07-28 18:51:01 +0900327 0x12, 0x00, 0x13, 0x8F, 0x14, 0x4A, 0x15, 0x00,
328 0x16, 0x00, 0x17, 0x23, 0x18, 0xa0, 0x19, 0x07,
329 0x1a, 0xf0, 0x1b, 0x40, 0x1f, 0x00, 0x20, 0x10,
330 0x22, 0xff, 0x23, 0x01, 0x28, 0x00, 0x29, 0xa0,
331 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0xf0, 0x2d, 0x00,
332 0x2e, 0x00, 0x30, 0x80, 0x31, 0x60, 0x32, 0x00,
333 0x33, 0x00, 0x34, 0x00, 0x3d, 0x80, 0x3e, 0xe2,
334 0x3f, 0x1f, 0x42, 0x80, 0x43, 0x80, 0x44, 0x80,
335 0x45, 0x80, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00,
336 0x49, 0x50, 0x4a, 0x30, 0x4b, 0x50, 0x4c, 0x50,
337 0x4d, 0x00, 0x4e, 0xef, 0x4f, 0x10, 0x50, 0x60,
338 0x51, 0x00, 0x52, 0x00, 0x53, 0x24, 0x54, 0x7a,
339 0x55, 0xfc, 0x62, 0xff, 0x63, 0xf0, 0x64, 0x1f,
340 0x65, 0x00, 0x66, 0x10, 0x67, 0x00, 0x68, 0x00,
341 0x69, 0x5c, 0x6a, 0x11, 0x6b, 0xa2, 0x6c, 0x01,
342 0x6d, 0x50, 0x6e, 0x80, 0x6f, 0x80, 0x70, 0x0f,
343 0x71, 0x00, 0x72, 0x00, 0x73, 0x0f, 0x74, 0x0f,
344 0x75, 0xff, 0x78, 0x10, 0x79, 0x70, 0x7a, 0x70,
345 0x7b, 0xf0, 0x7c, 0xf0, 0x7d, 0xf0, 0x7e, 0x0e,
346 0x7f, 0x1a, 0x80, 0x31, 0x81, 0x5a, 0x82, 0x69,
347 0x83, 0x75, 0x84, 0x7e, 0x85, 0x88, 0x86, 0x8f,
348 0x87, 0x96, 0x88, 0xa3, 0x89, 0xaf, 0x8a, 0xc4,
349 0x8b, 0xd7, 0x8c, 0xe8, 0x8d, 0x20, 0x8e, 0x00,
350 0x8f, 0x00, 0x90, 0x08, 0x91, 0x10, 0x92, 0x1f,
351 0x93, 0x01, 0x94, 0x2c, 0x95, 0x24, 0x96, 0x08,
352 0x97, 0x14, 0x98, 0x24, 0x99, 0x38, 0x9a, 0x9e,
353 0x9b, 0x00, 0x9c, 0x40, 0x9e, 0x11, 0x9f, 0x02,
354 0xa0, 0x00, 0xa1, 0x40, 0xa2, 0x40, 0xa3, 0x06,
355 0xa4, 0x00, 0xa6, 0x00, 0xa7, 0x40, 0xa8, 0x40,
356 0xa9, 0x80, 0xaa, 0x80, 0xab, 0x06, 0xac, 0xff,
357 0x12, 0x06, 0x64, 0x3f, 0x12, 0x46, 0x17, 0x3f,
358 0x18, 0x50, 0x19, 0x03, 0x1a, 0x78, 0x29, 0x50,
359 0x2c, 0x78,
360};
361
362static int ov772x_set_capture(struct soc_camera_platform_info *info,
363 int enable)
364{
365 struct i2c_adapter *a = i2c_get_adapter(0);
366 struct i2c_msg msg;
367 int ret = 0;
368 int i;
369
370 if (!enable)
371 return 0; /* camera_power_off() is enough */
372
373 for (i = 0; i < ARRAY_SIZE(camera_ov772x_magic); i += 2) {
374 u_int8_t buf[8];
375
376 msg.addr = 0x21;
377 msg.buf = buf;
378 msg.len = 2;
379 msg.flags = 0;
380
381 buf[0] = camera_ov772x_magic[i];
382 buf[1] = camera_ov772x_magic[i + 1];
383
384 ret = (ret < 0) ? ret : i2c_transfer(a, &msg, 1);
385 }
386
387 return ret;
388}
389
390static struct soc_camera_platform_info ov772x_info = {
391 .iface = 0,
392 .format_name = "RGB565",
393 .format_depth = 16,
394 .format = {
395 .pixelformat = V4L2_PIX_FMT_RGB565,
396 .colorspace = V4L2_COLORSPACE_SRGB,
397 .width = 320,
398 .height = 240,
399 },
400 .bus_param = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH |
401 SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8,
Guennadi Liakhovetski58419ab2008-10-21 12:44:38 +0900402 .power = camera_power,
Magnus Damm17655342008-07-28 18:51:01 +0900403 .set_capture = ov772x_set_capture,
404};
405
406static struct platform_device migor_camera_device = {
407 .name = "soc_camera_platform",
408 .dev = {
409 .platform_data = &ov772x_info,
410 },
411};
Magnus Damme565b512008-07-29 20:57:38 +0900412#endif /* CONFIG_I2C */
Magnus Damm17655342008-07-28 18:51:01 +0900413
414static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
415 .flags = SOCAM_MASTER | SOCAM_DATAWIDTH_8 | SOCAM_PCLK_SAMPLE_RISING \
416 | SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH,
Magnus Damm17655342008-07-28 18:51:01 +0900417};
418
419static struct resource migor_ceu_resources[] = {
420 [0] = {
421 .name = "CEU",
422 .start = 0xfe910000,
423 .end = 0xfe91009f,
424 .flags = IORESOURCE_MEM,
425 },
426 [1] = {
427 .start = 52,
428 .flags = IORESOURCE_IRQ,
429 },
430 [2] = {
431 /* place holder for contiguous memory */
432 },
433};
434
435static struct platform_device migor_ceu_device = {
436 .name = "sh_mobile_ceu",
Magnus Damma42b6dd2008-10-31 20:21:44 +0900437 .id = 0, /* "ceu0" clock */
Magnus Damm17655342008-07-28 18:51:01 +0900438 .num_resources = ARRAY_SIZE(migor_ceu_resources),
439 .resource = migor_ceu_resources,
440 .dev = {
441 .platform_data = &sh_mobile_ceu_info,
442 },
443};
444
Magnus Damm70f784e2008-02-07 00:38:24 +0900445static struct platform_device *migor_devices[] __initdata = {
446 &smc91x_eth_device,
Magnus Damm92cfeb62008-03-04 15:23:45 -0800447 &sh_keysc_device,
Magnus Damm8b1285f2008-07-28 18:47:30 +0900448 &migor_lcdc_device,
Magnus Damm17655342008-07-28 18:51:01 +0900449 &migor_ceu_device,
Magnus Damme565b512008-07-29 20:57:38 +0900450#ifdef CONFIG_I2C
Magnus Damm17655342008-07-28 18:51:01 +0900451 &migor_camera_device,
Magnus Damme565b512008-07-29 20:57:38 +0900452#endif
Magnus Dammb8808782008-03-21 18:43:55 +0900453 &migor_nor_flash_device,
Magnus Damm3c803a92008-03-21 18:44:04 +0900454 &migor_nand_flash_device,
Magnus Damm70f784e2008-02-07 00:38:24 +0900455};
456
Magnus Damm17655342008-07-28 18:51:01 +0900457static struct i2c_board_info migor_i2c_devices[] = {
Magnus Damm57795862008-03-25 17:24:31 +0900458 {
Jean Delvare3760f732008-04-29 23:11:40 +0200459 I2C_BOARD_INFO("rs5c372b", 0x32),
Magnus Damm57795862008-03-25 17:24:31 +0900460 },
Magnus Damm67908ab2008-03-25 17:30:45 +0900461 {
462 I2C_BOARD_INFO("migor_ts", 0x51),
463 .irq = 38, /* IRQ6 */
464 },
Magnus Damm0c6111e2008-03-25 17:20:24 +0900465};
466
Magnus Damm70f784e2008-02-07 00:38:24 +0900467static int __init migor_devices_setup(void)
468{
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900469 /* Lit D11 LED */
470 gpio_request(GPIO_PTJ7, NULL);
471 gpio_direction_output(GPIO_PTJ7, 1);
472 gpio_export(GPIO_PTJ7, 0);
473
474 /* Lit D12 LED */
475 gpio_request(GPIO_PTJ5, NULL);
476 gpio_direction_output(GPIO_PTJ5, 1);
477 gpio_export(GPIO_PTJ5, 0);
478
Magnus Damma30c89a2008-10-09 18:41:34 +0900479 /* SMC91C111 - Enable IRQ0, Setup CS4 for 16-bit fast access */
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900480 gpio_request(GPIO_FN_IRQ0, NULL);
Magnus Damma30c89a2008-10-09 18:41:34 +0900481 ctrl_outl(0x00003400, BSC_CS4BCR);
482 ctrl_outl(0x00110080, BSC_CS4WCR);
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900483
484 /* KEYSC */
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900485 gpio_request(GPIO_FN_KEYOUT0, NULL);
486 gpio_request(GPIO_FN_KEYOUT1, NULL);
487 gpio_request(GPIO_FN_KEYOUT2, NULL);
488 gpio_request(GPIO_FN_KEYOUT3, NULL);
489 gpio_request(GPIO_FN_KEYOUT4_IN6, NULL);
490 gpio_request(GPIO_FN_KEYIN1, NULL);
491 gpio_request(GPIO_FN_KEYIN2, NULL);
492 gpio_request(GPIO_FN_KEYIN3, NULL);
493 gpio_request(GPIO_FN_KEYIN4, NULL);
494 gpio_request(GPIO_FN_KEYOUT5_IN5, NULL);
495
496 /* NAND Flash */
497 gpio_request(GPIO_FN_CS6A_CE2B, NULL);
498 ctrl_outl((ctrl_inl(BSC_CS6ABCR) & ~0x0600) | 0x0200, BSC_CS6ABCR);
499 gpio_request(GPIO_PTA1, NULL);
500 gpio_direction_input(GPIO_PTA1);
501
502 /* Touch Panel */
503 gpio_request(GPIO_FN_IRQ6, NULL);
504
505 /* LCD Panel */
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900506#ifdef CONFIG_SH_MIGOR_QVGA /* LCDC - QVGA - Enable SYS Interface signals */
507 gpio_request(GPIO_FN_LCDD17, NULL);
508 gpio_request(GPIO_FN_LCDD16, NULL);
509 gpio_request(GPIO_FN_LCDD15, NULL);
510 gpio_request(GPIO_FN_LCDD14, NULL);
511 gpio_request(GPIO_FN_LCDD13, NULL);
512 gpio_request(GPIO_FN_LCDD12, NULL);
513 gpio_request(GPIO_FN_LCDD11, NULL);
514 gpio_request(GPIO_FN_LCDD10, NULL);
515 gpio_request(GPIO_FN_LCDD8, NULL);
516 gpio_request(GPIO_FN_LCDD7, NULL);
517 gpio_request(GPIO_FN_LCDD6, NULL);
518 gpio_request(GPIO_FN_LCDD5, NULL);
519 gpio_request(GPIO_FN_LCDD4, NULL);
520 gpio_request(GPIO_FN_LCDD3, NULL);
521 gpio_request(GPIO_FN_LCDD2, NULL);
522 gpio_request(GPIO_FN_LCDD1, NULL);
523 gpio_request(GPIO_FN_LCDRS, NULL);
524 gpio_request(GPIO_FN_LCDCS, NULL);
525 gpio_request(GPIO_FN_LCDRD, NULL);
526 gpio_request(GPIO_FN_LCDWR, NULL);
527 gpio_request(GPIO_PTH2, NULL); /* LCD_DON */
528 gpio_direction_output(GPIO_PTH2, 1);
529#endif
530#ifdef CONFIG_SH_MIGOR_RTA_WVGA /* LCDC - WVGA - Enable RGB Interface signals */
531 gpio_request(GPIO_FN_LCDD15, NULL);
532 gpio_request(GPIO_FN_LCDD14, NULL);
533 gpio_request(GPIO_FN_LCDD13, NULL);
534 gpio_request(GPIO_FN_LCDD12, NULL);
535 gpio_request(GPIO_FN_LCDD11, NULL);
536 gpio_request(GPIO_FN_LCDD10, NULL);
537 gpio_request(GPIO_FN_LCDD9, NULL);
538 gpio_request(GPIO_FN_LCDD8, NULL);
539 gpio_request(GPIO_FN_LCDD7, NULL);
540 gpio_request(GPIO_FN_LCDD6, NULL);
541 gpio_request(GPIO_FN_LCDD5, NULL);
542 gpio_request(GPIO_FN_LCDD4, NULL);
543 gpio_request(GPIO_FN_LCDD3, NULL);
544 gpio_request(GPIO_FN_LCDD2, NULL);
545 gpio_request(GPIO_FN_LCDD1, NULL);
546 gpio_request(GPIO_FN_LCDD0, NULL);
547 gpio_request(GPIO_FN_LCDLCLK, NULL);
548 gpio_request(GPIO_FN_LCDDCK, NULL);
549 gpio_request(GPIO_FN_LCDVEPWC, NULL);
550 gpio_request(GPIO_FN_LCDVCPWC, NULL);
551 gpio_request(GPIO_FN_LCDVSYN, NULL);
552 gpio_request(GPIO_FN_LCDHSYN, NULL);
553 gpio_request(GPIO_FN_LCDDISP, NULL);
554 gpio_request(GPIO_FN_LCDDON, NULL);
555#endif
556
557 /* CEU */
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900558 gpio_request(GPIO_FN_VIO_CLK2, NULL);
559 gpio_request(GPIO_FN_VIO_VD2, NULL);
560 gpio_request(GPIO_FN_VIO_HD2, NULL);
561 gpio_request(GPIO_FN_VIO_FLD, NULL);
562 gpio_request(GPIO_FN_VIO_CKO, NULL);
563 gpio_request(GPIO_FN_VIO_D15, NULL);
564 gpio_request(GPIO_FN_VIO_D14, NULL);
565 gpio_request(GPIO_FN_VIO_D13, NULL);
566 gpio_request(GPIO_FN_VIO_D12, NULL);
567 gpio_request(GPIO_FN_VIO_D11, NULL);
568 gpio_request(GPIO_FN_VIO_D10, NULL);
569 gpio_request(GPIO_FN_VIO_D9, NULL);
570 gpio_request(GPIO_FN_VIO_D8, NULL);
571
572 gpio_request(GPIO_PTT3, NULL); /* VIO_RST */
573 gpio_direction_output(GPIO_PTT3, 0);
574 gpio_request(GPIO_PTT2, NULL); /* TV_IN_EN */
575 gpio_direction_output(GPIO_PTT2, 1);
576 gpio_request(GPIO_PTT0, NULL); /* CAM_EN */
577#ifdef CONFIG_SH_MIGOR_RTA_WVGA
578 gpio_direction_output(GPIO_PTT0, 0);
579#else
580 gpio_direction_output(GPIO_PTT0, 1);
581#endif
582 ctrl_outw(ctrl_inw(PORT_MSELCRB) | 0x2000, PORT_MSELCRB); /* D15->D8 */
Magnus Damm17655342008-07-28 18:51:01 +0900583
584 platform_resource_setup_memory(&migor_ceu_device, "ceu", 4 << 20);
Magnus Damm6c7d8262008-07-17 19:16:11 +0900585
Magnus Damm0c6111e2008-03-25 17:20:24 +0900586 i2c_register_board_info(0, migor_i2c_devices,
587 ARRAY_SIZE(migor_i2c_devices));
Magnus Damm91b6f3c2008-10-08 20:42:01 +0900588
Magnus Damm70f784e2008-02-07 00:38:24 +0900589 return platform_add_devices(migor_devices, ARRAY_SIZE(migor_devices));
590}
591__initcall(migor_devices_setup);
592
593static void __init migor_setup(char **cmdline_p)
594{
Magnus Damm70f784e2008-02-07 00:38:24 +0900595}
596
597static struct sh_machine_vector mv_migor __initmv = {
598 .mv_name = "Migo-R",
599 .mv_setup = migor_setup,
600};