Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[pandora-kernel.git] / arch / arm / mach-shmobile / board-ap4evb.c
1 /*
2  * AP4EVB board support
3  *
4  * Copyright (C) 2010  Magnus Damm
5  * Copyright (C) 2008  Yoshihiro Shimoda
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; version 2 of the License.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 #include <linux/clk.h>
21 #include <linux/kernel.h>
22 #include <linux/init.h>
23 #include <linux/interrupt.h>
24 #include <linux/irq.h>
25 #include <linux/platform_device.h>
26 #include <linux/delay.h>
27 #include <linux/mfd/sh_mobile_sdhi.h>
28 #include <linux/mfd/tmio.h>
29 #include <linux/mmc/host.h>
30 #include <linux/mtd/mtd.h>
31 #include <linux/mtd/partitions.h>
32 #include <linux/mtd/physmap.h>
33 #include <linux/mmc/host.h>
34 #include <linux/mmc/sh_mmcif.h>
35 #include <linux/i2c.h>
36 #include <linux/i2c/tsc2007.h>
37 #include <linux/io.h>
38 #include <linux/smsc911x.h>
39 #include <linux/sh_intc.h>
40 #include <linux/sh_clk.h>
41 #include <linux/gpio.h>
42 #include <linux/input.h>
43 #include <linux/leds.h>
44 #include <linux/input/sh_keysc.h>
45 #include <linux/usb/r8a66597.h>
46
47 #include <sound/sh_fsi.h>
48
49 #include <video/sh_mobile_hdmi.h>
50 #include <video/sh_mobile_lcdc.h>
51 #include <video/sh_mipi_dsi.h>
52
53 #include <mach/common.h>
54 #include <mach/irqs.h>
55 #include <mach/sh7372.h>
56
57 #include <asm/mach-types.h>
58 #include <asm/mach/arch.h>
59 #include <asm/mach/map.h>
60 #include <asm/mach/time.h>
61
62 /*
63  * Address      Interface               BusWidth        note
64  * ------------------------------------------------------------------
65  * 0x0000_0000  NOR Flash ROM (MCP)     16bit           SW7 : bit1 = ON
66  * 0x0800_0000  user area               -
67  * 0x1000_0000  NOR Flash ROM (MCP)     16bit           SW7 : bit1 = OFF
68  * 0x1400_0000  Ether (LAN9220)         16bit
69  * 0x1600_0000  user area               -               cannot use with NAND
70  * 0x1800_0000  user area               -
71  * 0x1A00_0000  -
72  * 0x4000_0000  LPDDR2-SDRAM (POP)      32bit
73  */
74
75 /*
76  * NOR Flash ROM
77  *
78  *  SW1  |     SW2    | SW7  | NOR Flash ROM
79  *  bit1 | bit1  bit2 | bit1 | Memory allocation
80  * ------+------------+------+------------------
81  *  OFF  | ON     OFF | ON   |    Area 0
82  *  OFF  | ON     OFF | OFF  |    Area 4
83  */
84
85 /*
86  * NAND Flash ROM
87  *
88  *  SW1  |     SW2    | SW7  | NAND Flash ROM
89  *  bit1 | bit1  bit2 | bit2 | Memory allocation
90  * ------+------------+------+------------------
91  *  OFF  | ON     OFF | ON   |    FCE 0
92  *  OFF  | ON     OFF | OFF  |    FCE 1
93  */
94
95 /*
96  * SMSC 9220
97  *
98  *  SW1         SMSC 9220
99  * -----------------------
100  *  ON          access disable
101  *  OFF         access enable
102  */
103
104 /*
105  * LCD / IRQ / KEYSC / IrDA
106  *
107  * IRQ = IRQ26 (TS), IRQ27 (VIO), IRQ28 (QHD-TouchScreen)
108  * LCD = 2nd LCDC (WVGA)
109  *
110  *              |               SW43                    |
111  * SW3          |       ON              |       OFF     |
112  * -------------+-----------------------+---------------+
113  * ON           | KEY / IrDA            | LCD           |
114  * OFF          | KEY / IrDA / IRQ      | IRQ           |
115  *
116  *
117  * QHD / WVGA display
118  *
119  * You can choice display type on menuconfig.
120  * Then, check above dip-switch.
121  */
122
123 /*
124  * USB
125  *
126  * J7 : 1-2  MAX3355E VBUS
127  *      2-3  DC 5.0V
128  *
129  * S39: bit2: off
130  */
131
132 /*
133  * FSI/FSMI
134  *
135  * SW41 :  ON : SH-Mobile AP4 Audio Mode
136  *      : OFF : Bluetooth Audio Mode
137  */
138
139 /*
140  * MMC0/SDHI1 (CN7)
141  *
142  * J22 : select card voltage
143  *       1-2 pin : 1.8v
144  *       2-3 pin : 3.3v
145  *
146  *        SW1  |             SW33
147  *             | bit1 | bit2 | bit3 | bit4
148  * ------------+------+------+------+-------
149  * MMC0   OFF  |  OFF |  ON  |  ON  |  X
150  * SDHI1  OFF  |  ON  |   X  |  OFF | ON
151  *
152  * voltage lebel
153  * CN7 : 1.8v
154  * CN12: 3.3v
155  */
156
157 /* MTD */
158 static struct mtd_partition nor_flash_partitions[] = {
159         {
160                 .name           = "loader",
161                 .offset         = 0x00000000,
162                 .size           = 512 * 1024,
163         },
164         {
165                 .name           = "bootenv",
166                 .offset         = MTDPART_OFS_APPEND,
167                 .size           = 512 * 1024,
168         },
169         {
170                 .name           = "kernel_ro",
171                 .offset         = MTDPART_OFS_APPEND,
172                 .size           = 8 * 1024 * 1024,
173                 .mask_flags     = MTD_WRITEABLE,
174         },
175         {
176                 .name           = "kernel",
177                 .offset         = MTDPART_OFS_APPEND,
178                 .size           = 8 * 1024 * 1024,
179         },
180         {
181                 .name           = "data",
182                 .offset         = MTDPART_OFS_APPEND,
183                 .size           = MTDPART_SIZ_FULL,
184         },
185 };
186
187 static struct physmap_flash_data nor_flash_data = {
188         .width          = 2,
189         .parts          = nor_flash_partitions,
190         .nr_parts       = ARRAY_SIZE(nor_flash_partitions),
191 };
192
193 static struct resource nor_flash_resources[] = {
194         [0]     = {
195                 .start  = 0x00000000,
196                 .end    = 0x08000000 - 1,
197                 .flags  = IORESOURCE_MEM,
198         }
199 };
200
201 static struct platform_device nor_flash_device = {
202         .name           = "physmap-flash",
203         .dev            = {
204                 .platform_data  = &nor_flash_data,
205         },
206         .num_resources  = ARRAY_SIZE(nor_flash_resources),
207         .resource       = nor_flash_resources,
208 };
209
210 /* SMSC 9220 */
211 static struct resource smc911x_resources[] = {
212         {
213                 .start  = 0x14000000,
214                 .end    = 0x16000000 - 1,
215                 .flags  = IORESOURCE_MEM,
216         }, {
217                 .start  = evt2irq(0x02c0) /* IRQ6A */,
218                 .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
219         },
220 };
221
222 static struct smsc911x_platform_config smsc911x_info = {
223         .flags          = SMSC911X_USE_16BIT | SMSC911X_SAVE_MAC_ADDRESS,
224         .irq_polarity   = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
225         .irq_type       = SMSC911X_IRQ_TYPE_PUSH_PULL,
226 };
227
228 static struct platform_device smc911x_device = {
229         .name           = "smsc911x",
230         .id             = -1,
231         .num_resources  = ARRAY_SIZE(smc911x_resources),
232         .resource       = smc911x_resources,
233         .dev            = {
234                 .platform_data = &smsc911x_info,
235         },
236 };
237
238 /*
239  * The card detect pin of the top SD/MMC slot (CN7) is active low and is
240  * connected to GPIO A22 of SH7372 (GPIO_PORT41).
241  */
242 static int slot_cn7_get_cd(struct platform_device *pdev)
243 {
244         if (gpio_is_valid(GPIO_PORT41))
245                 return !gpio_get_value(GPIO_PORT41);
246         else
247                 return -ENXIO;
248 }
249
250 /* SH_MMCIF */
251 static struct resource sh_mmcif_resources[] = {
252         [0] = {
253                 .name   = "SH_MMCIF",
254                 .start  = 0xE6BD0000,
255                 .end    = 0xE6BD00FF,
256                 .flags  = IORESOURCE_MEM,
257         },
258         [1] = {
259                 /* MMC ERR */
260                 .start  = evt2irq(0x1ac0),
261                 .flags  = IORESOURCE_IRQ,
262         },
263         [2] = {
264                 /* MMC NOR */
265                 .start  = evt2irq(0x1ae0),
266                 .flags  = IORESOURCE_IRQ,
267         },
268 };
269
270 static struct sh_mmcif_plat_data sh_mmcif_plat = {
271         .sup_pclk       = 0,
272         .ocr            = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
273         .caps           = MMC_CAP_4_BIT_DATA |
274                           MMC_CAP_8_BIT_DATA |
275                           MMC_CAP_NEEDS_POLL,
276         .get_cd         = slot_cn7_get_cd,
277 };
278
279 static struct platform_device sh_mmcif_device = {
280         .name           = "sh_mmcif",
281         .id             = 0,
282         .dev            = {
283                 .dma_mask               = NULL,
284                 .coherent_dma_mask      = 0xffffffff,
285                 .platform_data          = &sh_mmcif_plat,
286         },
287         .num_resources  = ARRAY_SIZE(sh_mmcif_resources),
288         .resource       = sh_mmcif_resources,
289 };
290
291 /* SDHI0 */
292 static struct sh_mobile_sdhi_info sdhi0_info = {
293         .dma_slave_tx   = SHDMA_SLAVE_SDHI0_TX,
294         .dma_slave_rx   = SHDMA_SLAVE_SDHI0_RX,
295 };
296
297 static struct resource sdhi0_resources[] = {
298         [0] = {
299                 .name   = "SDHI0",
300                 .start  = 0xe6850000,
301                 .end    = 0xe68501ff,
302                 .flags  = IORESOURCE_MEM,
303         },
304         [1] = {
305                 .start  = evt2irq(0x0e00) /* SDHI0 */,
306                 .flags  = IORESOURCE_IRQ,
307         },
308 };
309
310 static struct platform_device sdhi0_device = {
311         .name           = "sh_mobile_sdhi",
312         .num_resources  = ARRAY_SIZE(sdhi0_resources),
313         .resource       = sdhi0_resources,
314         .id             = 0,
315         .dev    = {
316                 .platform_data  = &sdhi0_info,
317         },
318 };
319
320 /* SDHI1 */
321 static struct sh_mobile_sdhi_info sdhi1_info = {
322         .dma_slave_tx   = SHDMA_SLAVE_SDHI1_TX,
323         .dma_slave_rx   = SHDMA_SLAVE_SDHI1_RX,
324         .tmio_ocr_mask  = MMC_VDD_165_195,
325         .tmio_flags     = TMIO_MMC_WRPROTECT_DISABLE,
326         .tmio_caps      = MMC_CAP_NEEDS_POLL,
327         .get_cd         = slot_cn7_get_cd,
328 };
329
330 static struct resource sdhi1_resources[] = {
331         [0] = {
332                 .name   = "SDHI1",
333                 .start  = 0xe6860000,
334                 .end    = 0xe68601ff,
335                 .flags  = IORESOURCE_MEM,
336         },
337         [1] = {
338                 .start  = evt2irq(0x0e80),
339                 .flags  = IORESOURCE_IRQ,
340         },
341 };
342
343 static struct platform_device sdhi1_device = {
344         .name           = "sh_mobile_sdhi",
345         .num_resources  = ARRAY_SIZE(sdhi1_resources),
346         .resource       = sdhi1_resources,
347         .id             = 1,
348         .dev    = {
349                 .platform_data  = &sdhi1_info,
350         },
351 };
352
353 /* USB1 */
354 static void usb1_host_port_power(int port, int power)
355 {
356         if (!power) /* only power-on supported for now */
357                 return;
358
359         /* set VBOUT/PWEN and EXTLP1 in DVSTCTR */
360         __raw_writew(__raw_readw(0xE68B0008) | 0x600, 0xE68B0008);
361 }
362
363 static struct r8a66597_platdata usb1_host_data = {
364         .on_chip        = 1,
365         .port_power     = usb1_host_port_power,
366 };
367
368 static struct resource usb1_host_resources[] = {
369         [0] = {
370                 .name   = "USBHS",
371                 .start  = 0xE68B0000,
372                 .end    = 0xE68B00E6 - 1,
373                 .flags  = IORESOURCE_MEM,
374         },
375         [1] = {
376                 .start  = evt2irq(0x1ce0) /* USB1_USB1I0 */,
377                 .flags  = IORESOURCE_IRQ,
378         },
379 };
380
381 static struct platform_device usb1_host_device = {
382         .name   = "r8a66597_hcd",
383         .id     = 1,
384         .dev = {
385                 .dma_mask               = NULL,         /*  not use dma */
386                 .coherent_dma_mask      = 0xffffffff,
387                 .platform_data          = &usb1_host_data,
388         },
389         .num_resources  = ARRAY_SIZE(usb1_host_resources),
390         .resource       = usb1_host_resources,
391 };
392
393 static struct sh_mobile_lcdc_info lcdc_info = {
394         .ch[0] = {
395                 .chan = LCDC_CHAN_MAINLCD,
396                 .bpp = 16,
397         }
398 };
399
400 static struct resource lcdc_resources[] = {
401         [0] = {
402                 .name   = "LCDC",
403                 .start  = 0xfe940000, /* P4-only space */
404                 .end    = 0xfe943fff,
405                 .flags  = IORESOURCE_MEM,
406         },
407         [1] = {
408                 .start  = intcs_evt2irq(0x580),
409                 .flags  = IORESOURCE_IRQ,
410         },
411 };
412
413 static struct platform_device lcdc_device = {
414         .name           = "sh_mobile_lcdc_fb",
415         .num_resources  = ARRAY_SIZE(lcdc_resources),
416         .resource       = lcdc_resources,
417         .dev    = {
418                 .platform_data  = &lcdc_info,
419                 .coherent_dma_mask = ~0,
420         },
421 };
422
423 /*
424  * QHD display
425  */
426 #ifdef CONFIG_AP4EVB_QHD
427
428 /* KEYSC (Needs SW43 set to ON) */
429 static struct sh_keysc_info keysc_info = {
430         .mode           = SH_KEYSC_MODE_1,
431         .scan_timing    = 3,
432         .delay          = 2500,
433         .keycodes = {
434                 KEY_0, KEY_1, KEY_2, KEY_3, KEY_4,
435                 KEY_5, KEY_6, KEY_7, KEY_8, KEY_9,
436                 KEY_A, KEY_B, KEY_C, KEY_D, KEY_E,
437                 KEY_F, KEY_G, KEY_H, KEY_I, KEY_J,
438                 KEY_K, KEY_L, KEY_M, KEY_N, KEY_O,
439         },
440 };
441
442 static struct resource keysc_resources[] = {
443         [0] = {
444                 .name   = "KEYSC",
445                 .start  = 0xe61b0000,
446                 .end    = 0xe61b0063,
447                 .flags  = IORESOURCE_MEM,
448         },
449         [1] = {
450                 .start  = evt2irq(0x0be0), /* KEYSC_KEY */
451                 .flags  = IORESOURCE_IRQ,
452         },
453 };
454
455 static struct platform_device keysc_device = {
456         .name           = "sh_keysc",
457         .id             = 0, /* "keysc0" clock */
458         .num_resources  = ARRAY_SIZE(keysc_resources),
459         .resource       = keysc_resources,
460         .dev    = {
461                 .platform_data  = &keysc_info,
462         },
463 };
464
465 /* MIPI-DSI */
466 static struct resource mipidsi0_resources[] = {
467         [0] = {
468                 .start  = 0xffc60000,
469                 .end    = 0xffc68fff,
470                 .flags  = IORESOURCE_MEM,
471         },
472 };
473
474 static struct sh_mipi_dsi_info mipidsi0_info = {
475         .data_format    = MIPI_RGB888,
476         .lcd_chan       = &lcdc_info.ch[0],
477 };
478
479 static struct platform_device mipidsi0_device = {
480         .name           = "sh-mipi-dsi",
481         .num_resources  = ARRAY_SIZE(mipidsi0_resources),
482         .resource       = mipidsi0_resources,
483         .id             = 0,
484         .dev    = {
485                 .platform_data  = &mipidsi0_info,
486         },
487 };
488
489 /* This function will disappear when we switch to (runtime) PM */
490 static int __init ap4evb_init_display_clk(void)
491 {
492         struct clk *lcdc_clk;
493         struct clk *dsitx_clk;
494         int ret;
495
496         lcdc_clk = clk_get(&lcdc_device.dev, "sh_mobile_lcdc_fb.0");
497         if (IS_ERR(lcdc_clk))
498                 return PTR_ERR(lcdc_clk);
499
500         dsitx_clk = clk_get(&mipidsi0_device.dev, "sh-mipi-dsi.0");
501         if (IS_ERR(dsitx_clk)) {
502                 ret = PTR_ERR(dsitx_clk);
503                 goto eclkdsitxget;
504         }
505
506         ret = clk_enable(lcdc_clk);
507         if (ret < 0)
508                 goto eclklcdcon;
509
510         ret = clk_enable(dsitx_clk);
511         if (ret < 0)
512                 goto eclkdsitxon;
513
514         return 0;
515
516 eclkdsitxon:
517         clk_disable(lcdc_clk);
518 eclklcdcon:
519         clk_put(dsitx_clk);
520 eclkdsitxget:
521         clk_put(lcdc_clk);
522
523         return ret;
524 }
525 device_initcall(ap4evb_init_display_clk);
526
527 static struct platform_device *qhd_devices[] __initdata = {
528         &mipidsi0_device,
529         &keysc_device,
530 };
531 #endif /* CONFIG_AP4EVB_QHD */
532
533 /* FSI */
534 #define IRQ_FSI         evt2irq(0x1840)
535 #define FSIACKCR        0xE6150018
536 static void fsiackcr_init(struct clk *clk)
537 {
538         u32 status = __raw_readl(clk->enable_reg);
539
540         /* use external clock */
541         status &= ~0x000000ff;
542         status |= 0x00000080;
543         __raw_writel(status, clk->enable_reg);
544 }
545
546 static struct clk_ops fsiackcr_clk_ops = {
547         .init = fsiackcr_init,
548 };
549
550 static struct clk fsiackcr_clk = {
551         .ops            = &fsiackcr_clk_ops,
552         .enable_reg     = (void __iomem *)FSIACKCR,
553         .rate           = 0, /* unknown */
554 };
555
556 static struct sh_fsi_platform_info fsi_info = {
557         .porta_flags = SH_FSI_BRS_INV |
558                        SH_FSI_OUT_SLAVE_MODE |
559                        SH_FSI_IN_SLAVE_MODE |
560                        SH_FSI_OFMT(PCM) |
561                        SH_FSI_IFMT(PCM),
562 };
563
564 static struct resource fsi_resources[] = {
565         [0] = {
566                 .name   = "FSI",
567                 .start  = 0xFE3C0000,
568                 .end    = 0xFE3C0400 - 1,
569                 .flags  = IORESOURCE_MEM,
570         },
571         [1] = {
572                 .start  = IRQ_FSI,
573                 .flags  = IORESOURCE_IRQ,
574         },
575 };
576
577 static struct platform_device fsi_device = {
578         .name           = "sh_fsi2",
579         .id             = -1,
580         .num_resources  = ARRAY_SIZE(fsi_resources),
581         .resource       = fsi_resources,
582         .dev    = {
583                 .platform_data  = &fsi_info,
584         },
585 };
586
587 static struct sh_mobile_lcdc_info sh_mobile_lcdc1_info = {
588         .clock_source = LCDC_CLK_EXTERNAL,
589         .ch[0] = {
590                 .chan = LCDC_CHAN_MAINLCD,
591                 .bpp = 16,
592                 .interface_type = RGB24,
593                 .clock_divider = 1,
594                 .flags = LCDC_FLAGS_DWPOL,
595                 .lcd_cfg = {
596                         .name = "HDMI",
597                         /* So far only 720p is supported */
598                         .xres = 1280,
599                         .yres = 720,
600                         /*
601                          * If left and right margins are not multiples of 8,
602                          * LDHAJR will be adjusted accordingly by the LCDC
603                          * driver. Until we start using EDID, these values
604                          * might have to be adjusted for different monitors.
605                          */
606                         .left_margin = 200,
607                         .right_margin = 88,
608                         .hsync_len = 48,
609                         .upper_margin = 20,
610                         .lower_margin = 5,
611                         .vsync_len = 5,
612                         .pixclock = 13468,
613                         .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,
614                 },
615         }
616 };
617
618 static struct resource lcdc1_resources[] = {
619         [0] = {
620                 .name   = "LCDC1",
621                 .start  = 0xfe944000,
622                 .end    = 0xfe947fff,
623                 .flags  = IORESOURCE_MEM,
624         },
625         [1] = {
626                 .start  = intcs_evt2irq(0x17a0),
627                 .flags  = IORESOURCE_IRQ,
628         },
629 };
630
631 static struct platform_device lcdc1_device = {
632         .name           = "sh_mobile_lcdc_fb",
633         .num_resources  = ARRAY_SIZE(lcdc1_resources),
634         .resource       = lcdc1_resources,
635         .id             = 1,
636         .dev    = {
637                 .platform_data  = &sh_mobile_lcdc1_info,
638                 .coherent_dma_mask = ~0,
639         },
640 };
641
642 static struct sh_mobile_hdmi_info hdmi_info = {
643         .lcd_chan = &sh_mobile_lcdc1_info.ch[0],
644         .lcd_dev = &lcdc1_device.dev,
645 };
646
647 static struct resource hdmi_resources[] = {
648         [0] = {
649                 .name   = "HDMI",
650                 .start  = 0xe6be0000,
651                 .end    = 0xe6be00ff,
652                 .flags  = IORESOURCE_MEM,
653         },
654         [1] = {
655                 /* There's also an HDMI interrupt on INTCS @ 0x18e0 */
656                 .start  = evt2irq(0x17e0),
657                 .flags  = IORESOURCE_IRQ,
658         },
659 };
660
661 static struct platform_device hdmi_device = {
662         .name           = "sh-mobile-hdmi",
663         .num_resources  = ARRAY_SIZE(hdmi_resources),
664         .resource       = hdmi_resources,
665         .id             = -1,
666         .dev    = {
667                 .platform_data  = &hdmi_info,
668         },
669 };
670
671 static struct gpio_led ap4evb_leds[] = {
672         {
673                 .name                   = "led4",
674                 .gpio                   = GPIO_PORT185,
675                 .default_state  = LEDS_GPIO_DEFSTATE_ON,
676         },
677         {
678                 .name                   = "led2",
679                 .gpio                   = GPIO_PORT186,
680                 .default_state  = LEDS_GPIO_DEFSTATE_ON,
681         },
682         {
683                 .name                   = "led3",
684                 .gpio                   = GPIO_PORT187,
685                 .default_state  = LEDS_GPIO_DEFSTATE_ON,
686         },
687         {
688                 .name                   = "led1",
689                 .gpio                   = GPIO_PORT188,
690                 .default_state  = LEDS_GPIO_DEFSTATE_ON,
691         }
692 };
693
694 static struct gpio_led_platform_data ap4evb_leds_pdata = {
695         .num_leds = ARRAY_SIZE(ap4evb_leds),
696         .leds = ap4evb_leds,
697 };
698
699 static struct platform_device leds_device = {
700         .name = "leds-gpio",
701         .id = 0,
702         .dev = {
703                 .platform_data  = &ap4evb_leds_pdata,
704         },
705 };
706
707 static struct platform_device *ap4evb_devices[] __initdata = {
708         &leds_device,
709         &nor_flash_device,
710         &smc911x_device,
711         &sdhi0_device,
712         &sdhi1_device,
713         &usb1_host_device,
714         &fsi_device,
715         &sh_mmcif_device,
716         &lcdc1_device,
717         &lcdc_device,
718         &hdmi_device,
719 };
720
721 static int __init hdmi_init_pm_clock(void)
722 {
723         struct clk *hdmi_ick = clk_get(&hdmi_device.dev, "ick");
724         int ret;
725         long rate;
726
727         if (IS_ERR(hdmi_ick)) {
728                 ret = PTR_ERR(hdmi_ick);
729                 pr_err("Cannot get HDMI ICK: %d\n", ret);
730                 goto out;
731         }
732
733         ret = clk_set_parent(&pllc2_clk, &dv_clki_div2_clk);
734         if (ret < 0) {
735                 pr_err("Cannot set PLLC2 parent: %d, %d users\n", ret, pllc2_clk.usecount);
736                 goto out;
737         }
738
739         pr_debug("PLLC2 initial frequency %lu\n", clk_get_rate(&pllc2_clk));
740
741         rate = clk_round_rate(&pllc2_clk, 594000000);
742         if (rate < 0) {
743                 pr_err("Cannot get suitable rate: %ld\n", rate);
744                 ret = rate;
745                 goto out;
746         }
747
748         ret = clk_set_rate(&pllc2_clk, rate);
749         if (ret < 0) {
750                 pr_err("Cannot set rate %ld: %d\n", rate, ret);
751                 goto out;
752         }
753
754         pr_debug("PLLC2 set frequency %lu\n", rate);
755
756         ret = clk_set_parent(hdmi_ick, &pllc2_clk);
757         if (ret < 0) {
758                 pr_err("Cannot set HDMI parent: %d\n", ret);
759                 goto out;
760         }
761
762 out:
763         if (!IS_ERR(hdmi_ick))
764                 clk_put(hdmi_ick);
765         return ret;
766 }
767
768 device_initcall(hdmi_init_pm_clock);
769
770 /*
771  * FIXME !!
772  *
773  * gpio_no_direction
774  * gpio_pull_up
775  * are quick_hack.
776  *
777  * current gpio frame work doesn't have
778  * the method to control only pull up/down/free.
779  * this function should be replaced by correct gpio function
780  */
781 static void __init gpio_no_direction(u32 addr)
782 {
783         __raw_writeb(0x00, addr);
784 }
785
786 static void __init gpio_pull_up(u32 addr)
787 {
788         u8 data = __raw_readb(addr);
789
790         data &= 0x0F;
791         data |= 0xC0;
792         __raw_writeb(data, addr);
793 }
794
795 /* TouchScreen */
796 #define IRQ28   evt2irq(0x3380) /* IRQ28A */
797 #define IRQ7    evt2irq(0x02e0) /* IRQ7A */
798 static int ts_get_pendown_state(void)
799 {
800         int val1, val2;
801
802         gpio_free(GPIO_FN_IRQ28_123);
803         gpio_free(GPIO_FN_IRQ7_40);
804
805         gpio_request(GPIO_PORT123, NULL);
806         gpio_request(GPIO_PORT40, NULL);
807
808         gpio_direction_input(GPIO_PORT123);
809         gpio_direction_input(GPIO_PORT40);
810
811         val1 = gpio_get_value(GPIO_PORT123);
812         val2 = gpio_get_value(GPIO_PORT40);
813
814         gpio_request(GPIO_FN_IRQ28_123, NULL);  /* for QHD */
815         gpio_request(GPIO_FN_IRQ7_40, NULL);    /* for WVGA */
816
817         return val1 ^ val2;
818 }
819
820 #define PORT40CR        0xE6051028
821 #define PORT123CR       0xE605007B
822 static int ts_init(void)
823 {
824         gpio_request(GPIO_FN_IRQ28_123, NULL);  /* for QHD */
825         gpio_request(GPIO_FN_IRQ7_40, NULL);    /* for WVGA */
826
827         gpio_pull_up(PORT40CR);
828         gpio_pull_up(PORT123CR);
829
830         return 0;
831 }
832
833 static struct tsc2007_platform_data tsc2007_info = {
834         .model                  = 2007,
835         .x_plate_ohms           = 180,
836         .get_pendown_state      = ts_get_pendown_state,
837         .init_platform_hw       = ts_init,
838 };
839
840 static struct i2c_board_info tsc_device = {
841         I2C_BOARD_INFO("tsc2007", 0x48),
842         .type           = "tsc2007",
843         .platform_data  = &tsc2007_info,
844         /*.irq is selected on ap4evb_init */
845 };
846
847 /* I2C */
848 static struct i2c_board_info i2c0_devices[] = {
849         {
850                 I2C_BOARD_INFO("ak4643", 0x13),
851         },
852 };
853
854 static struct i2c_board_info i2c1_devices[] = {
855         {
856                 I2C_BOARD_INFO("r2025sd", 0x32),
857         },
858 };
859
860 static struct map_desc ap4evb_io_desc[] __initdata = {
861         /* create a 1:1 entity map for 0xe6xxxxxx
862          * used by CPGA, INTC and PFC.
863          */
864         {
865                 .virtual        = 0xe6000000,
866                 .pfn            = __phys_to_pfn(0xe6000000),
867                 .length         = 256 << 20,
868                 .type           = MT_DEVICE_NONSHARED
869         },
870 };
871
872 static void __init ap4evb_map_io(void)
873 {
874         iotable_init(ap4evb_io_desc, ARRAY_SIZE(ap4evb_io_desc));
875
876         /* setup early devices and console here as well */
877         sh7372_add_early_devices();
878         shmobile_setup_console();
879 }
880
881 #define GPIO_PORT9CR    0xE6051009
882 #define GPIO_PORT10CR   0xE605100A
883 static void __init ap4evb_init(void)
884 {
885         u32 srcr4;
886         struct clk *clk;
887
888         sh7372_pinmux_init();
889
890         /* enable SCIFA0 */
891         gpio_request(GPIO_FN_SCIFA0_TXD, NULL);
892         gpio_request(GPIO_FN_SCIFA0_RXD, NULL);
893
894         /* enable SMSC911X */
895         gpio_request(GPIO_FN_CS5A,      NULL);
896         gpio_request(GPIO_FN_IRQ6_39,   NULL);
897
898         /* enable Debug switch (S6) */
899         gpio_request(GPIO_PORT32, NULL);
900         gpio_request(GPIO_PORT33, NULL);
901         gpio_request(GPIO_PORT34, NULL);
902         gpio_request(GPIO_PORT35, NULL);
903         gpio_direction_input(GPIO_PORT32);
904         gpio_direction_input(GPIO_PORT33);
905         gpio_direction_input(GPIO_PORT34);
906         gpio_direction_input(GPIO_PORT35);
907         gpio_export(GPIO_PORT32, 0);
908         gpio_export(GPIO_PORT33, 0);
909         gpio_export(GPIO_PORT34, 0);
910         gpio_export(GPIO_PORT35, 0);
911
912         /* SDHI0 */
913         gpio_request(GPIO_FN_SDHICD0, NULL);
914         gpio_request(GPIO_FN_SDHIWP0, NULL);
915         gpio_request(GPIO_FN_SDHICMD0, NULL);
916         gpio_request(GPIO_FN_SDHICLK0, NULL);
917         gpio_request(GPIO_FN_SDHID0_3, NULL);
918         gpio_request(GPIO_FN_SDHID0_2, NULL);
919         gpio_request(GPIO_FN_SDHID0_1, NULL);
920         gpio_request(GPIO_FN_SDHID0_0, NULL);
921
922         /* SDHI1 */
923         gpio_request(GPIO_FN_SDHICMD1, NULL);
924         gpio_request(GPIO_FN_SDHICLK1, NULL);
925         gpio_request(GPIO_FN_SDHID1_3, NULL);
926         gpio_request(GPIO_FN_SDHID1_2, NULL);
927         gpio_request(GPIO_FN_SDHID1_1, NULL);
928         gpio_request(GPIO_FN_SDHID1_0, NULL);
929
930         /* MMCIF */
931         gpio_request(GPIO_FN_MMCD0_0, NULL);
932         gpio_request(GPIO_FN_MMCD0_1, NULL);
933         gpio_request(GPIO_FN_MMCD0_2, NULL);
934         gpio_request(GPIO_FN_MMCD0_3, NULL);
935         gpio_request(GPIO_FN_MMCD0_4, NULL);
936         gpio_request(GPIO_FN_MMCD0_5, NULL);
937         gpio_request(GPIO_FN_MMCD0_6, NULL);
938         gpio_request(GPIO_FN_MMCD0_7, NULL);
939         gpio_request(GPIO_FN_MMCCMD0, NULL);
940         gpio_request(GPIO_FN_MMCCLK0, NULL);
941
942         /* USB enable */
943         gpio_request(GPIO_FN_VBUS0_1,    NULL);
944         gpio_request(GPIO_FN_IDIN_1_18,  NULL);
945         gpio_request(GPIO_FN_PWEN_1_115, NULL);
946         gpio_request(GPIO_FN_OVCN_1_114, NULL);
947         gpio_request(GPIO_FN_EXTLP_1,    NULL);
948         gpio_request(GPIO_FN_OVCN2_1,    NULL);
949
950         /* setup USB phy */
951         __raw_writew(0x8a0a, 0xE6058130);       /* USBCR2 */
952
953         /* enable FSI2 */
954         gpio_request(GPIO_FN_FSIAIBT,   NULL);
955         gpio_request(GPIO_FN_FSIAILR,   NULL);
956         gpio_request(GPIO_FN_FSIAISLD,  NULL);
957         gpio_request(GPIO_FN_FSIAOSLD,  NULL);
958         gpio_request(GPIO_PORT161,      NULL);
959         gpio_direction_output(GPIO_PORT161, 0); /* slave */
960
961         gpio_request(GPIO_PORT9, NULL);
962         gpio_request(GPIO_PORT10, NULL);
963         gpio_no_direction(GPIO_PORT9CR);  /* FSIAOBT needs no direction */
964         gpio_no_direction(GPIO_PORT10CR); /* FSIAOLR needs no direction */
965
966         /* card detect pin for MMC slot (CN7) */
967         gpio_request(GPIO_PORT41, NULL);
968         gpio_direction_input(GPIO_PORT41);
969
970         /* set SPU2 clock to 119.6 MHz */
971         clk = clk_get(NULL, "spu_clk");
972         if (!IS_ERR(clk)) {
973                 clk_set_rate(clk, clk_round_rate(clk, 119600000));
974                 clk_put(clk);
975         }
976
977         /* change parent of FSI A */
978         clk = clk_get(NULL, "fsia_clk");
979         if (!IS_ERR(clk)) {
980                 clk_register(&fsiackcr_clk);
981                 clk_set_parent(clk, &fsiackcr_clk);
982                 clk_put(clk);
983         }
984
985         /*
986          * set irq priority, to avoid sound chopping
987          * when NFS rootfs is used
988          *  FSI(3) > SMSC911X(2)
989          */
990         intc_set_priority(IRQ_FSI, 3);
991
992         i2c_register_board_info(0, i2c0_devices,
993                                 ARRAY_SIZE(i2c0_devices));
994
995         i2c_register_board_info(1, i2c1_devices,
996                                 ARRAY_SIZE(i2c1_devices));
997
998 #ifdef CONFIG_AP4EVB_QHD
999         /*
1000          * QHD
1001          */
1002
1003         /* enable KEYSC */
1004         gpio_request(GPIO_FN_KEYOUT0, NULL);
1005         gpio_request(GPIO_FN_KEYOUT1, NULL);
1006         gpio_request(GPIO_FN_KEYOUT2, NULL);
1007         gpio_request(GPIO_FN_KEYOUT3, NULL);
1008         gpio_request(GPIO_FN_KEYOUT4, NULL);
1009         gpio_request(GPIO_FN_KEYIN0_136, NULL);
1010         gpio_request(GPIO_FN_KEYIN1_135, NULL);
1011         gpio_request(GPIO_FN_KEYIN2_134, NULL);
1012         gpio_request(GPIO_FN_KEYIN3_133, NULL);
1013         gpio_request(GPIO_FN_KEYIN4,     NULL);
1014
1015         /* enable TouchScreen */
1016         set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW);
1017
1018         tsc_device.irq = IRQ28;
1019         i2c_register_board_info(1, &tsc_device, 1);
1020
1021         /* LCDC0 */
1022         lcdc_info.clock_source                  = LCDC_CLK_PERIPHERAL;
1023         lcdc_info.ch[0].interface_type          = RGB24;
1024         lcdc_info.ch[0].clock_divider           = 1;
1025         lcdc_info.ch[0].flags                   = LCDC_FLAGS_DWPOL;
1026         lcdc_info.ch[0].lcd_cfg.name            = "R63302(QHD)";
1027         lcdc_info.ch[0].lcd_cfg.xres            = 544;
1028         lcdc_info.ch[0].lcd_cfg.yres            = 961;
1029         lcdc_info.ch[0].lcd_cfg.left_margin     = 72;
1030         lcdc_info.ch[0].lcd_cfg.right_margin    = 600;
1031         lcdc_info.ch[0].lcd_cfg.hsync_len       = 16;
1032         lcdc_info.ch[0].lcd_cfg.upper_margin    = 8;
1033         lcdc_info.ch[0].lcd_cfg.lower_margin    = 8;
1034         lcdc_info.ch[0].lcd_cfg.vsync_len       = 2;
1035         lcdc_info.ch[0].lcd_cfg.sync            = FB_SYNC_VERT_HIGH_ACT |
1036                                                   FB_SYNC_HOR_HIGH_ACT;
1037         lcdc_info.ch[0].lcd_size_cfg.width      = 44;
1038         lcdc_info.ch[0].lcd_size_cfg.height     = 79;
1039
1040         platform_add_devices(qhd_devices, ARRAY_SIZE(qhd_devices));
1041
1042 #else
1043         /*
1044          * WVGA
1045          */
1046         gpio_request(GPIO_FN_LCDD17,   NULL);
1047         gpio_request(GPIO_FN_LCDD16,   NULL);
1048         gpio_request(GPIO_FN_LCDD15,   NULL);
1049         gpio_request(GPIO_FN_LCDD14,   NULL);
1050         gpio_request(GPIO_FN_LCDD13,   NULL);
1051         gpio_request(GPIO_FN_LCDD12,   NULL);
1052         gpio_request(GPIO_FN_LCDD11,   NULL);
1053         gpio_request(GPIO_FN_LCDD10,   NULL);
1054         gpio_request(GPIO_FN_LCDD9,    NULL);
1055         gpio_request(GPIO_FN_LCDD8,    NULL);
1056         gpio_request(GPIO_FN_LCDD7,    NULL);
1057         gpio_request(GPIO_FN_LCDD6,    NULL);
1058         gpio_request(GPIO_FN_LCDD5,    NULL);
1059         gpio_request(GPIO_FN_LCDD4,    NULL);
1060         gpio_request(GPIO_FN_LCDD3,    NULL);
1061         gpio_request(GPIO_FN_LCDD2,    NULL);
1062         gpio_request(GPIO_FN_LCDD1,    NULL);
1063         gpio_request(GPIO_FN_LCDD0,    NULL);
1064         gpio_request(GPIO_FN_LCDDISP,  NULL);
1065         gpio_request(GPIO_FN_LCDDCK,   NULL);
1066
1067         gpio_request(GPIO_PORT189, NULL); /* backlight */
1068         gpio_direction_output(GPIO_PORT189, 1);
1069
1070         gpio_request(GPIO_PORT151, NULL); /* LCDDON */
1071         gpio_direction_output(GPIO_PORT151, 1);
1072
1073         lcdc_info.clock_source                  = LCDC_CLK_BUS;
1074         lcdc_info.ch[0].interface_type          = RGB18;
1075         lcdc_info.ch[0].clock_divider           = 2;
1076         lcdc_info.ch[0].flags                   = 0;
1077         lcdc_info.ch[0].lcd_cfg.name            = "WVGA Panel";
1078         lcdc_info.ch[0].lcd_cfg.xres            = 800;
1079         lcdc_info.ch[0].lcd_cfg.yres            = 480;
1080         lcdc_info.ch[0].lcd_cfg.left_margin     = 220;
1081         lcdc_info.ch[0].lcd_cfg.right_margin    = 110;
1082         lcdc_info.ch[0].lcd_cfg.hsync_len       = 70;
1083         lcdc_info.ch[0].lcd_cfg.upper_margin    = 20;
1084         lcdc_info.ch[0].lcd_cfg.lower_margin    = 5;
1085         lcdc_info.ch[0].lcd_cfg.vsync_len       = 5;
1086         lcdc_info.ch[0].lcd_cfg.sync            = 0;
1087         lcdc_info.ch[0].lcd_size_cfg.width      = 152;
1088         lcdc_info.ch[0].lcd_size_cfg.height     = 91;
1089
1090         /* enable TouchScreen */
1091         set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW);
1092
1093         tsc_device.irq = IRQ7;
1094         i2c_register_board_info(0, &tsc_device, 1);
1095 #endif /* CONFIG_AP4EVB_QHD */
1096
1097         sh7372_add_standard_devices();
1098
1099         /* HDMI */
1100         gpio_request(GPIO_FN_HDMI_HPD, NULL);
1101         gpio_request(GPIO_FN_HDMI_CEC, NULL);
1102
1103         /* Reset HDMI, must be held at least one EXTALR (32768Hz) period */
1104 #define SRCR4 0xe61580bc
1105         srcr4 = __raw_readl(SRCR4);
1106         __raw_writel(srcr4 | (1 << 13), SRCR4);
1107         udelay(50);
1108         __raw_writel(srcr4 & ~(1 << 13), SRCR4);
1109
1110         platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices));
1111 }
1112
1113 static void __init ap4evb_timer_init(void)
1114 {
1115         sh7372_clock_init();
1116         shmobile_timer.init();
1117
1118         /* External clock source */
1119         clk_set_rate(&dv_clki_clk, 27000000);
1120 }
1121
1122 static struct sys_timer ap4evb_timer = {
1123         .init           = ap4evb_timer_init,
1124 };
1125
1126 MACHINE_START(AP4EVB, "ap4evb")
1127         .map_io         = ap4evb_map_io,
1128         .init_irq       = sh7372_init_irq,
1129         .init_machine   = ap4evb_init,
1130         .timer          = &ap4evb_timer,
1131 MACHINE_END