Commit | Line | Data |
---|---|---|
e7d16514 MD |
1 | /* |
2 | * KFR2R09 board support code | |
3 | * | |
4 | * Copyright (C) 2009 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> | |
a366aa64 | 13 | #include <linux/mtd/physmap.h> |
33893d7a | 14 | #include <linux/mtd/onenand.h> |
e7d16514 MD |
15 | #include <linux/delay.h> |
16 | #include <linux/clk.h> | |
17 | #include <linux/gpio.h> | |
39a6bf14 | 18 | #include <linux/input.h> |
fc1d003d | 19 | #include <linux/input/sh_keysc.h> |
5a1c4cb5 MD |
20 | #include <linux/i2c.h> |
21 | #include <linux/usb/r8a66597.h> | |
a6b5f200 | 22 | #include <media/rj54n1cb0c.h> |
a469f627 GL |
23 | #include <media/soc_camera.h> |
24 | #include <media/sh_mobile_ceu.h> | |
9f26e659 | 25 | #include <video/sh_mobile_lcdc.h> |
67e522d0 | 26 | #include <asm/suspend.h> |
e7d16514 MD |
27 | #include <asm/clock.h> |
28 | #include <asm/machvec.h> | |
29 | #include <asm/io.h> | |
30 | #include <cpu/sh7724.h> | |
9f26e659 | 31 | #include <mach/kfr2r09.h> |
e7d16514 | 32 | |
a366aa64 MD |
33 | static struct mtd_partition kfr2r09_nor_flash_partitions[] = |
34 | { | |
35 | { | |
36 | .name = "boot", | |
37 | .offset = 0, | |
38 | .size = (4 * 1024 * 1024), | |
39 | .mask_flags = MTD_WRITEABLE, /* Read-only */ | |
40 | }, | |
41 | { | |
42 | .name = "other", | |
43 | .offset = MTDPART_OFS_APPEND, | |
44 | .size = MTDPART_SIZ_FULL, | |
45 | }, | |
46 | }; | |
47 | ||
48 | static struct physmap_flash_data kfr2r09_nor_flash_data = { | |
49 | .width = 2, | |
50 | .parts = kfr2r09_nor_flash_partitions, | |
51 | .nr_parts = ARRAY_SIZE(kfr2r09_nor_flash_partitions), | |
52 | }; | |
53 | ||
54 | static struct resource kfr2r09_nor_flash_resources[] = { | |
55 | [0] = { | |
56 | .name = "NOR Flash", | |
57 | .start = 0x00000000, | |
58 | .end = 0x03ffffff, | |
59 | .flags = IORESOURCE_MEM, | |
60 | } | |
61 | }; | |
62 | ||
63 | static struct platform_device kfr2r09_nor_flash_device = { | |
64 | .name = "physmap-flash", | |
65 | .resource = kfr2r09_nor_flash_resources, | |
66 | .num_resources = ARRAY_SIZE(kfr2r09_nor_flash_resources), | |
67 | .dev = { | |
68 | .platform_data = &kfr2r09_nor_flash_data, | |
69 | }, | |
70 | }; | |
71 | ||
33893d7a MD |
72 | static struct resource kfr2r09_nand_flash_resources[] = { |
73 | [0] = { | |
74 | .name = "NAND Flash", | |
75 | .start = 0x10000000, | |
76 | .end = 0x1001ffff, | |
77 | .flags = IORESOURCE_MEM, | |
78 | } | |
79 | }; | |
80 | ||
81 | static struct platform_device kfr2r09_nand_flash_device = { | |
82 | .name = "onenand-flash", | |
83 | .resource = kfr2r09_nand_flash_resources, | |
84 | .num_resources = ARRAY_SIZE(kfr2r09_nand_flash_resources), | |
85 | }; | |
86 | ||
39a6bf14 MD |
87 | static struct sh_keysc_info kfr2r09_sh_keysc_info = { |
88 | .mode = SH_KEYSC_MODE_1, /* KEYOUT0->4, KEYIN0->4 */ | |
89 | .scan_timing = 3, | |
90 | .delay = 10, | |
91 | .keycodes = { | |
92 | KEY_PHONE, KEY_CLEAR, KEY_MAIL, KEY_WWW, KEY_ENTER, | |
93 | KEY_1, KEY_2, KEY_3, 0, KEY_UP, | |
94 | KEY_4, KEY_5, KEY_6, 0, KEY_LEFT, | |
95 | KEY_7, KEY_8, KEY_9, KEY_PROG1, KEY_RIGHT, | |
96 | KEY_S, KEY_0, KEY_P, KEY_PROG2, KEY_DOWN, | |
97 | 0, 0, 0, 0, 0 | |
98 | }, | |
99 | }; | |
100 | ||
101 | static struct resource kfr2r09_sh_keysc_resources[] = { | |
102 | [0] = { | |
103 | .name = "KEYSC", | |
104 | .start = 0x044b0000, | |
105 | .end = 0x044b000f, | |
106 | .flags = IORESOURCE_MEM, | |
107 | }, | |
108 | [1] = { | |
109 | .start = 79, | |
110 | .flags = IORESOURCE_IRQ, | |
111 | }, | |
112 | }; | |
113 | ||
114 | static struct platform_device kfr2r09_sh_keysc_device = { | |
115 | .name = "sh_keysc", | |
116 | .id = 0, /* "keysc0" clock */ | |
117 | .num_resources = ARRAY_SIZE(kfr2r09_sh_keysc_resources), | |
118 | .resource = kfr2r09_sh_keysc_resources, | |
119 | .dev = { | |
120 | .platform_data = &kfr2r09_sh_keysc_info, | |
121 | }, | |
442c3753 MD |
122 | .archdata = { |
123 | .hwblk_id = HWBLK_KEYSC, | |
124 | }, | |
39a6bf14 MD |
125 | }; |
126 | ||
9f26e659 MD |
127 | static struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = { |
128 | .clock_source = LCDC_CLK_BUS, | |
129 | .ch[0] = { | |
130 | .chan = LCDC_CHAN_MAINLCD, | |
131 | .bpp = 16, | |
132 | .interface_type = SYS18, | |
133 | .clock_divider = 6, | |
134 | .flags = LCDC_FLAGS_DWPOL, | |
135 | .lcd_cfg = { | |
136 | .name = "TX07D34VM0AAA", | |
137 | .xres = 240, | |
138 | .yres = 400, | |
139 | .left_margin = 0, | |
140 | .right_margin = 16, | |
141 | .hsync_len = 8, | |
142 | .upper_margin = 0, | |
143 | .lower_margin = 1, | |
144 | .vsync_len = 1, | |
145 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | |
146 | }, | |
147 | .lcd_size_cfg = { | |
148 | .width = 35, | |
149 | .height = 58, | |
150 | }, | |
151 | .board_cfg = { | |
152 | .setup_sys = kfr2r09_lcd_setup, | |
153 | .display_on = kfr2r09_lcd_on, | |
154 | .display_off = kfr2r09_lcd_off, | |
155 | }, | |
156 | .sys_bus_cfg = { | |
157 | .ldmt2r = 0x07010904, | |
158 | .ldmt3r = 0x14012914, | |
159 | /* set 1s delay to encourage fsync() */ | |
160 | .deferred_io_msec = 1000, | |
161 | }, | |
162 | } | |
163 | }; | |
164 | ||
165 | static struct resource kfr2r09_sh_lcdc_resources[] = { | |
166 | [0] = { | |
167 | .name = "LCDC", | |
168 | .start = 0xfe940000, /* P4-only space */ | |
a6f15ade | 169 | .end = 0xfe942fff, |
9f26e659 MD |
170 | .flags = IORESOURCE_MEM, |
171 | }, | |
172 | [1] = { | |
173 | .start = 106, | |
174 | .flags = IORESOURCE_IRQ, | |
175 | }, | |
176 | }; | |
177 | ||
178 | static struct platform_device kfr2r09_sh_lcdc_device = { | |
179 | .name = "sh_mobile_lcdc_fb", | |
180 | .num_resources = ARRAY_SIZE(kfr2r09_sh_lcdc_resources), | |
181 | .resource = kfr2r09_sh_lcdc_resources, | |
182 | .dev = { | |
183 | .platform_data = &kfr2r09_sh_lcdc_info, | |
184 | }, | |
963e04ca MD |
185 | .archdata = { |
186 | .hwblk_id = HWBLK_LCDC, | |
187 | }, | |
9f26e659 MD |
188 | }; |
189 | ||
5a1c4cb5 MD |
190 | static struct r8a66597_platdata kfr2r09_usb0_gadget_data = { |
191 | .on_chip = 1, | |
192 | }; | |
193 | ||
194 | static struct resource kfr2r09_usb0_gadget_resources[] = { | |
195 | [0] = { | |
196 | .start = 0x04d80000, | |
197 | .end = 0x04d80123, | |
198 | .flags = IORESOURCE_MEM, | |
199 | }, | |
200 | [1] = { | |
201 | .start = 65, | |
202 | .end = 65, | |
203 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, | |
204 | }, | |
205 | }; | |
206 | ||
207 | static struct platform_device kfr2r09_usb0_gadget_device = { | |
208 | .name = "r8a66597_udc", | |
209 | .id = 0, | |
210 | .dev = { | |
211 | .dma_mask = NULL, /* not use dma */ | |
212 | .coherent_dma_mask = 0xffffffff, | |
213 | .platform_data = &kfr2r09_usb0_gadget_data, | |
214 | }, | |
215 | .num_resources = ARRAY_SIZE(kfr2r09_usb0_gadget_resources), | |
216 | .resource = kfr2r09_usb0_gadget_resources, | |
217 | }; | |
218 | ||
a469f627 GL |
219 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { |
220 | .flags = SH_CEU_FLAG_USE_8BIT_BUS, | |
221 | }; | |
222 | ||
223 | static struct resource kfr2r09_ceu_resources[] = { | |
224 | [0] = { | |
225 | .name = "CEU", | |
226 | .start = 0xfe910000, | |
227 | .end = 0xfe91009f, | |
228 | .flags = IORESOURCE_MEM, | |
229 | }, | |
230 | [1] = { | |
231 | .start = 52, | |
232 | .end = 52, | |
233 | .flags = IORESOURCE_IRQ, | |
234 | }, | |
235 | [2] = { | |
236 | /* place holder for contiguous memory */ | |
237 | }, | |
238 | }; | |
239 | ||
240 | static struct platform_device kfr2r09_ceu_device = { | |
241 | .name = "sh_mobile_ceu", | |
242 | .id = 0, /* "ceu0" clock */ | |
243 | .num_resources = ARRAY_SIZE(kfr2r09_ceu_resources), | |
244 | .resource = kfr2r09_ceu_resources, | |
245 | .dev = { | |
246 | .platform_data = &sh_mobile_ceu_info, | |
247 | }, | |
248 | .archdata = { | |
249 | .hwblk_id = HWBLK_CEU0, | |
250 | }, | |
251 | }; | |
252 | ||
253 | static struct i2c_board_info kfr2r09_i2c_camera = { | |
254 | I2C_BOARD_INFO("rj54n1cb0c", 0x50), | |
255 | }; | |
256 | ||
257 | static struct clk *camera_clk; | |
258 | ||
a6b5f200 GL |
259 | /* set VIO_CKO clock to 25MHz */ |
260 | #define CEU_MCLK_FREQ 25000000 | |
261 | ||
a469f627 GL |
262 | #define DRVCRB 0xA405018C |
263 | static int camera_power(struct device *dev, int mode) | |
264 | { | |
265 | int ret; | |
266 | ||
267 | if (mode) { | |
268 | long rate; | |
269 | ||
270 | camera_clk = clk_get(NULL, "video_clk"); | |
271 | if (IS_ERR(camera_clk)) | |
272 | return PTR_ERR(camera_clk); | |
273 | ||
a6b5f200 | 274 | rate = clk_round_rate(camera_clk, CEU_MCLK_FREQ); |
a469f627 GL |
275 | ret = clk_set_rate(camera_clk, rate); |
276 | if (ret < 0) | |
277 | goto eclkrate; | |
278 | ||
279 | /* set DRVCRB | |
280 | * | |
281 | * use 1.8 V for VccQ_VIO | |
282 | * use 2.85V for VccQ_SR | |
283 | */ | |
284 | ctrl_outw((ctrl_inw(DRVCRB) & ~0x0003) | 0x0001, DRVCRB); | |
285 | ||
286 | /* reset clear */ | |
287 | ret = gpio_request(GPIO_PTB4, NULL); | |
288 | if (ret < 0) | |
289 | goto eptb4; | |
290 | ret = gpio_request(GPIO_PTB7, NULL); | |
291 | if (ret < 0) | |
292 | goto eptb7; | |
293 | ||
294 | ret = gpio_direction_output(GPIO_PTB4, 1); | |
295 | if (!ret) | |
296 | ret = gpio_direction_output(GPIO_PTB7, 1); | |
297 | if (ret < 0) | |
298 | goto egpioout; | |
299 | msleep(1); | |
300 | ||
301 | ret = clk_enable(camera_clk); /* start VIO_CKO */ | |
302 | if (ret < 0) | |
303 | goto eclkon; | |
304 | ||
305 | return 0; | |
306 | } | |
307 | ||
308 | ret = 0; | |
309 | ||
310 | clk_disable(camera_clk); | |
311 | eclkon: | |
312 | gpio_set_value(GPIO_PTB7, 0); | |
313 | egpioout: | |
314 | gpio_set_value(GPIO_PTB4, 0); | |
315 | gpio_free(GPIO_PTB7); | |
316 | eptb7: | |
317 | gpio_free(GPIO_PTB4); | |
318 | eptb4: | |
319 | eclkrate: | |
320 | clk_put(camera_clk); | |
321 | return ret; | |
322 | } | |
323 | ||
a6b5f200 GL |
324 | static struct rj54n1_pdata rj54n1_priv = { |
325 | .mclk_freq = CEU_MCLK_FREQ, | |
326 | .ioctl_high = false, | |
327 | }; | |
328 | ||
a469f627 GL |
329 | static struct soc_camera_link rj54n1_link = { |
330 | .power = camera_power, | |
331 | .board_info = &kfr2r09_i2c_camera, | |
332 | .i2c_adapter_id = 1, | |
333 | .module_name = "rj54n1cb0c", | |
a6b5f200 | 334 | .priv = &rj54n1_priv, |
a469f627 GL |
335 | }; |
336 | ||
337 | static struct platform_device kfr2r09_camera = { | |
338 | .name = "soc-camera-pdrv", | |
339 | .id = 0, | |
340 | .dev = { | |
341 | .platform_data = &rj54n1_link, | |
342 | }, | |
343 | }; | |
344 | ||
d2a2fb97 MD |
345 | static struct resource kfr2r09_sh_sdhi0_resources[] = { |
346 | [0] = { | |
347 | .name = "SDHI0", | |
348 | .start = 0x04ce0000, | |
349 | .end = 0x04ce01ff, | |
350 | .flags = IORESOURCE_MEM, | |
351 | }, | |
352 | [1] = { | |
353 | .start = 101, | |
354 | .flags = IORESOURCE_IRQ, | |
355 | }, | |
356 | }; | |
357 | ||
358 | static struct platform_device kfr2r09_sh_sdhi0_device = { | |
359 | .name = "sh_mobile_sdhi", | |
360 | .num_resources = ARRAY_SIZE(kfr2r09_sh_sdhi0_resources), | |
361 | .resource = kfr2r09_sh_sdhi0_resources, | |
362 | .archdata = { | |
363 | .hwblk_id = HWBLK_SDHI0, | |
364 | }, | |
365 | }; | |
366 | ||
a366aa64 MD |
367 | static struct platform_device *kfr2r09_devices[] __initdata = { |
368 | &kfr2r09_nor_flash_device, | |
33893d7a | 369 | &kfr2r09_nand_flash_device, |
39a6bf14 | 370 | &kfr2r09_sh_keysc_device, |
9f26e659 | 371 | &kfr2r09_sh_lcdc_device, |
a469f627 GL |
372 | &kfr2r09_ceu_device, |
373 | &kfr2r09_camera, | |
d2a2fb97 | 374 | &kfr2r09_sh_sdhi0_device, |
a366aa64 MD |
375 | }; |
376 | ||
377 | #define BSC_CS0BCR 0xfec10004 | |
378 | #define BSC_CS0WCR 0xfec10024 | |
33893d7a MD |
379 | #define BSC_CS4BCR 0xfec10010 |
380 | #define BSC_CS4WCR 0xfec10030 | |
5a1c4cb5 MD |
381 | #define PORT_MSELCRB 0xa4050182 |
382 | ||
045a4b7e | 383 | #ifdef CONFIG_I2C |
5a1c4cb5 MD |
384 | static int kfr2r09_usb0_gadget_i2c_setup(void) |
385 | { | |
386 | struct i2c_adapter *a; | |
387 | struct i2c_msg msg; | |
388 | unsigned char buf[2]; | |
389 | int ret; | |
390 | ||
391 | a = i2c_get_adapter(0); | |
392 | if (!a) | |
393 | return -ENODEV; | |
394 | ||
395 | /* set bit 1 (the second bit) of chip at 0x09, register 0x13 */ | |
396 | buf[0] = 0x13; | |
397 | msg.addr = 0x09; | |
398 | msg.buf = buf; | |
399 | msg.len = 1; | |
400 | msg.flags = 0; | |
401 | ret = i2c_transfer(a, &msg, 1); | |
402 | if (ret != 1) | |
403 | return -ENODEV; | |
404 | ||
405 | buf[0] = 0; | |
406 | msg.addr = 0x09; | |
407 | msg.buf = buf; | |
408 | msg.len = 1; | |
409 | msg.flags = I2C_M_RD; | |
410 | ret = i2c_transfer(a, &msg, 1); | |
411 | if (ret != 1) | |
412 | return -ENODEV; | |
413 | ||
414 | buf[1] = buf[0] | (1 << 1); | |
415 | buf[0] = 0x13; | |
416 | msg.addr = 0x09; | |
417 | msg.buf = buf; | |
418 | msg.len = 2; | |
419 | msg.flags = 0; | |
420 | ret = i2c_transfer(a, &msg, 1); | |
421 | if (ret != 1) | |
422 | return -ENODEV; | |
423 | ||
424 | return 0; | |
425 | } | |
e6d8460a MD |
426 | |
427 | static int kfr2r09_serial_i2c_setup(void) | |
428 | { | |
429 | struct i2c_adapter *a; | |
430 | struct i2c_msg msg; | |
431 | unsigned char buf[2]; | |
432 | int ret; | |
433 | ||
434 | a = i2c_get_adapter(0); | |
435 | if (!a) | |
436 | return -ENODEV; | |
437 | ||
438 | /* set bit 6 (the 7th bit) of chip at 0x09, register 0x13 */ | |
439 | buf[0] = 0x13; | |
440 | msg.addr = 0x09; | |
441 | msg.buf = buf; | |
442 | msg.len = 1; | |
443 | msg.flags = 0; | |
444 | ret = i2c_transfer(a, &msg, 1); | |
445 | if (ret != 1) | |
446 | return -ENODEV; | |
447 | ||
448 | buf[0] = 0; | |
449 | msg.addr = 0x09; | |
450 | msg.buf = buf; | |
451 | msg.len = 1; | |
452 | msg.flags = I2C_M_RD; | |
453 | ret = i2c_transfer(a, &msg, 1); | |
454 | if (ret != 1) | |
455 | return -ENODEV; | |
456 | ||
457 | buf[1] = buf[0] | (1 << 6); | |
458 | buf[0] = 0x13; | |
459 | msg.addr = 0x09; | |
460 | msg.buf = buf; | |
461 | msg.len = 2; | |
462 | msg.flags = 0; | |
463 | ret = i2c_transfer(a, &msg, 1); | |
464 | if (ret != 1) | |
465 | return -ENODEV; | |
466 | ||
467 | return 0; | |
468 | } | |
045a4b7e MD |
469 | #else |
470 | static int kfr2r09_usb0_gadget_i2c_setup(void) | |
471 | { | |
472 | return -ENODEV; | |
473 | } | |
e6d8460a MD |
474 | |
475 | static int kfr2r09_serial_i2c_setup(void) | |
476 | { | |
477 | return -ENODEV; | |
478 | } | |
045a4b7e | 479 | #endif |
5a1c4cb5 MD |
480 | |
481 | static int kfr2r09_usb0_gadget_setup(void) | |
482 | { | |
483 | int plugged_in; | |
484 | ||
485 | gpio_request(GPIO_PTN4, NULL); /* USB_DET */ | |
486 | gpio_direction_input(GPIO_PTN4); | |
487 | plugged_in = gpio_get_value(GPIO_PTN4); | |
488 | if (!plugged_in) | |
489 | return -ENODEV; /* no cable plugged in */ | |
490 | ||
491 | if (kfr2r09_usb0_gadget_i2c_setup() != 0) | |
492 | return -ENODEV; /* unable to configure using i2c */ | |
493 | ||
494 | ctrl_outw((ctrl_inw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); | |
495 | gpio_request(GPIO_FN_PDSTATUS, NULL); /* R-standby disables USB clock */ | |
496 | gpio_request(GPIO_PTV6, NULL); /* USBCLK_ON */ | |
497 | gpio_direction_output(GPIO_PTV6, 1); /* USBCLK_ON = H */ | |
498 | msleep(20); /* wait 20ms to let the clock settle */ | |
499 | clk_enable(clk_get(NULL, "usb0")); | |
500 | ctrl_outw(0x0600, 0xa40501d4); | |
501 | ||
502 | return 0; | |
503 | } | |
a366aa64 | 504 | |
67e522d0 MD |
505 | extern char kfr2r09_sdram_enter_start; |
506 | extern char kfr2r09_sdram_enter_end; | |
507 | extern char kfr2r09_sdram_leave_start; | |
508 | extern char kfr2r09_sdram_leave_end; | |
509 | ||
e7d16514 MD |
510 | static int __init kfr2r09_devices_setup(void) |
511 | { | |
67e522d0 | 512 | /* register board specific self-refresh code */ |
58ee987e MD |
513 | sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | |
514 | SUSP_SH_RSTANDBY, | |
67e522d0 MD |
515 | &kfr2r09_sdram_enter_start, |
516 | &kfr2r09_sdram_enter_end, | |
517 | &kfr2r09_sdram_leave_start, | |
518 | &kfr2r09_sdram_leave_end); | |
519 | ||
e7d16514 MD |
520 | /* enable SCIF1 serial port for YC401 console support */ |
521 | gpio_request(GPIO_FN_SCIF1_RXD, NULL); | |
522 | gpio_request(GPIO_FN_SCIF1_TXD, NULL); | |
e6d8460a MD |
523 | kfr2r09_serial_i2c_setup(); /* ECONTMSK(bit6=L10ONEN) set 1 */ |
524 | gpio_request(GPIO_PTG3, NULL); /* HPON_ON */ | |
525 | gpio_direction_output(GPIO_PTG3, 1); /* HPON_ON = H */ | |
e7d16514 | 526 | |
a366aa64 MD |
527 | /* setup NOR flash at CS0 */ |
528 | ctrl_outl(0x36db0400, BSC_CS0BCR); | |
529 | ctrl_outl(0x00000500, BSC_CS0WCR); | |
530 | ||
33893d7a MD |
531 | /* setup NAND flash at CS4 */ |
532 | ctrl_outl(0x36db0400, BSC_CS4BCR); | |
533 | ctrl_outl(0x00000500, BSC_CS4WCR); | |
534 | ||
39a6bf14 MD |
535 | /* setup KEYSC pins */ |
536 | gpio_request(GPIO_FN_KEYOUT0, NULL); | |
537 | gpio_request(GPIO_FN_KEYOUT1, NULL); | |
538 | gpio_request(GPIO_FN_KEYOUT2, NULL); | |
539 | gpio_request(GPIO_FN_KEYOUT3, NULL); | |
540 | gpio_request(GPIO_FN_KEYOUT4_IN6, NULL); | |
541 | gpio_request(GPIO_FN_KEYIN0, NULL); | |
542 | gpio_request(GPIO_FN_KEYIN1, NULL); | |
543 | gpio_request(GPIO_FN_KEYIN2, NULL); | |
544 | gpio_request(GPIO_FN_KEYIN3, NULL); | |
545 | gpio_request(GPIO_FN_KEYIN4, NULL); | |
546 | gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); | |
547 | ||
9f26e659 MD |
548 | /* setup LCDC pins for SYS panel */ |
549 | gpio_request(GPIO_FN_LCDD17, NULL); | |
550 | gpio_request(GPIO_FN_LCDD16, NULL); | |
551 | gpio_request(GPIO_FN_LCDD15, NULL); | |
552 | gpio_request(GPIO_FN_LCDD14, NULL); | |
553 | gpio_request(GPIO_FN_LCDD13, NULL); | |
554 | gpio_request(GPIO_FN_LCDD12, NULL); | |
555 | gpio_request(GPIO_FN_LCDD11, NULL); | |
556 | gpio_request(GPIO_FN_LCDD10, NULL); | |
557 | gpio_request(GPIO_FN_LCDD9, NULL); | |
558 | gpio_request(GPIO_FN_LCDD8, NULL); | |
559 | gpio_request(GPIO_FN_LCDD7, NULL); | |
560 | gpio_request(GPIO_FN_LCDD6, NULL); | |
561 | gpio_request(GPIO_FN_LCDD5, NULL); | |
562 | gpio_request(GPIO_FN_LCDD4, NULL); | |
563 | gpio_request(GPIO_FN_LCDD3, NULL); | |
564 | gpio_request(GPIO_FN_LCDD2, NULL); | |
565 | gpio_request(GPIO_FN_LCDD1, NULL); | |
566 | gpio_request(GPIO_FN_LCDD0, NULL); | |
567 | gpio_request(GPIO_FN_LCDRS, NULL); /* LCD_RS */ | |
568 | gpio_request(GPIO_FN_LCDCS, NULL); /* LCD_CS/ */ | |
569 | gpio_request(GPIO_FN_LCDRD, NULL); /* LCD_RD/ */ | |
570 | gpio_request(GPIO_FN_LCDWR, NULL); /* LCD_WR/ */ | |
571 | gpio_request(GPIO_FN_LCDVSYN, NULL); /* LCD_VSYNC */ | |
572 | gpio_request(GPIO_PTE4, NULL); /* LCD_RST/ */ | |
573 | gpio_direction_output(GPIO_PTE4, 1); | |
574 | gpio_request(GPIO_PTF4, NULL); /* PROTECT/ */ | |
575 | gpio_direction_output(GPIO_PTF4, 1); | |
576 | gpio_request(GPIO_PTU0, NULL); /* LEDSTDBY/ */ | |
577 | gpio_direction_output(GPIO_PTU0, 1); | |
578 | ||
5a1c4cb5 MD |
579 | /* setup USB function */ |
580 | if (kfr2r09_usb0_gadget_setup() == 0) | |
581 | platform_device_register(&kfr2r09_usb0_gadget_device); | |
582 | ||
a469f627 GL |
583 | /* CEU */ |
584 | gpio_request(GPIO_FN_VIO_CKO, NULL); | |
585 | gpio_request(GPIO_FN_VIO0_CLK, NULL); | |
586 | gpio_request(GPIO_FN_VIO0_VD, NULL); | |
587 | gpio_request(GPIO_FN_VIO0_HD, NULL); | |
588 | gpio_request(GPIO_FN_VIO0_FLD, NULL); | |
589 | gpio_request(GPIO_FN_VIO0_D7, NULL); | |
590 | gpio_request(GPIO_FN_VIO0_D6, NULL); | |
591 | gpio_request(GPIO_FN_VIO0_D5, NULL); | |
592 | gpio_request(GPIO_FN_VIO0_D4, NULL); | |
593 | gpio_request(GPIO_FN_VIO0_D3, NULL); | |
594 | gpio_request(GPIO_FN_VIO0_D2, NULL); | |
595 | gpio_request(GPIO_FN_VIO0_D1, NULL); | |
596 | gpio_request(GPIO_FN_VIO0_D0, NULL); | |
597 | ||
598 | platform_resource_setup_memory(&kfr2r09_ceu_device, "ceu", 4 << 20); | |
599 | ||
d2a2fb97 MD |
600 | /* SDHI0 connected to yc304 */ |
601 | gpio_request(GPIO_FN_SDHI0CD, NULL); | |
d2a2fb97 MD |
602 | gpio_request(GPIO_FN_SDHI0D3, NULL); |
603 | gpio_request(GPIO_FN_SDHI0D2, NULL); | |
604 | gpio_request(GPIO_FN_SDHI0D1, NULL); | |
605 | gpio_request(GPIO_FN_SDHI0D0, NULL); | |
606 | gpio_request(GPIO_FN_SDHI0CMD, NULL); | |
607 | gpio_request(GPIO_FN_SDHI0CLK, NULL); | |
608 | ||
a366aa64 MD |
609 | return platform_add_devices(kfr2r09_devices, |
610 | ARRAY_SIZE(kfr2r09_devices)); | |
e7d16514 MD |
611 | } |
612 | device_initcall(kfr2r09_devices_setup); | |
613 | ||
614 | /* Return the board specific boot mode pin configuration */ | |
615 | static int kfr2r09_mode_pins(void) | |
616 | { | |
617 | /* MD0=1, MD1=1, MD2=0: Clock Mode 3 | |
618 | * MD3=0: 16-bit Area0 Bus Width | |
619 | * MD5=1: Little Endian | |
620 | * MD8=1: Test Mode Disabled | |
621 | */ | |
622 | return MODE_PIN0 | MODE_PIN1 | MODE_PIN5 | MODE_PIN8; | |
623 | } | |
624 | ||
625 | /* | |
626 | * The Machine Vector | |
627 | */ | |
628 | static struct sh_machine_vector mv_kfr2r09 __initmv = { | |
629 | .mv_name = "kfr2r09", | |
630 | .mv_mode_pins = kfr2r09_mode_pins, | |
631 | }; |