Merge branch 'msm-core' of git://codeaurora.org/quic/kernel/dwalker/linux-msm
[pandora-kernel.git] / arch / arm / mach-pxa / mxm8x10.c
1 /*
2  * linux/arch/arm/mach-pxa/mxm8x10.c
3  *
4  * Support for the Embedian MXM-8x10 Computer on Module
5  *
6  * Copyright (C) 2006 Marvell International Ltd.
7  * Copyright (C) 2009 Embedian Inc.
8  * Copyright (C) 2009 TMT Services & Supplies (Pty) Ltd.
9  *
10  * 2007-09-04: eric miao <eric.y.miao@gmail.com>
11  *             rewrite to align with latest kernel
12  *
13  * 2010-01-09: Edwin Peer <epeer@tmtservices.co.za>
14  *             Hennie van der Merwe <hvdmerwe@tmtservices.co.za>
15  *             rework for upstream merge
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License version 2 as
19  * published by the Free Software Foundation.
20  */
21
22 #include <linux/serial_8250.h>
23 #include <linux/dm9000.h>
24 #include <linux/gpio.h>
25
26 #include <plat/i2c.h>
27 #include <plat/pxa3xx_nand.h>
28
29 #include <mach/pxafb.h>
30 #include <mach/mmc.h>
31 #include <mach/ohci.h>
32 #include <mach/pxa320.h>
33
34 #include <mach/mxm8x10.h>
35
36 #include "devices.h"
37 #include "generic.h"
38
39 /* GPIO pin definition
40
41 External device stuff   - Leave unconfigured for now...
42 ---------------------
43 GPIO0   -   DREQ    (External DMA Request)
44 GPIO3   -   nGCS2   (External Chip Select) Where is nGCS0; nGCS1; nGCS4; nGCS5 ?
45 GPIO4   -   nGCS3
46 GPIO15  -   EXT_GPIO1
47 GPIO16  -   EXT_GPIO2
48 GPIO17  -   EXT_GPIO3
49 GPIO24  -   EXT_GPIO4
50 GPIO25  -   EXT_GPIO5
51 GPIO26  -   EXT_GPIO6
52 GPIO27  -   EXT_GPIO7
53 GPIO28  -   EXT_GPIO8
54 GPIO29  -   EXT_GPIO9
55 GPIO30  -   EXT_GPIO10
56 GPIO31  -   EXT_GPIO11
57 GPIO57  -   EXT_GPIO12
58 GPIO74  -   EXT_IRQ1
59 GPIO75  -   EXT_IRQ2
60 GPIO76  -   EXT_IRQ3
61 GPIO77  -   EXT_IRQ4
62 GPIO78  -   EXT_IRQ5
63 GPIO79  -   EXT_IRQ6
64 GPIO80  -   EXT_IRQ7
65 GPIO81  -   EXT_IRQ8
66 GPIO87  -   VCCIO_PWREN (External Device PWREN)
67
68 Dallas 1-Wire   - Leave unconfigured for now...
69 -------------
70 GPIO0_2 -   DS - 1Wire
71
72 Ethernet
73 --------
74 GPIO1   -   DM9000 PWR
75 GPIO9   -   DM9K_nIRQ
76 GPIO36  -   DM9K_RESET
77
78 Keypad  - Leave unconfigured by for now...
79 ------
80 GPIO1_2 -   KP_DKIN0
81 GPIO5_2 -   KP_MKOUT7
82 GPIO82  -   KP_DKIN1
83 GPIO85  -   KP_DKIN2
84 GPIO86  -   KP_DKIN3
85 GPIO113 -   KP_MKIN0
86 GPIO114 -   KP_MKIN1
87 GPIO115 -   KP_MKIN2
88 GPIO116 -   KP_MKIN3
89 GPIO117 -   KP_MKIN4
90 GPIO118 -   KP_MKIN5
91 GPIO119 -   KP_MKIN6
92 GPIO120 -   KP_MKIN7
93 GPIO121 -   KP_MKOUT0
94 GPIO122 -   KP_MKOUT1
95 GPIO122 -   KP_MKOUT2
96 GPIO123 -   KP_MKOUT3
97 GPIO124 -   KP_MKOUT4
98 GPIO125 -   KP_MKOUT5
99 GPIO127 -   KP_MKOUT6
100
101 Data Bus    - Leave unconfigured for now...
102 --------
103 GPIO2   -   nWait (Data Bus)
104
105 USB Device
106 ----------
107 GPIO4_2 -   USBD_PULLUP
108 GPIO10  -   UTM_CLK (USB Device UTM Clk)
109 GPIO49  -   USB 2.0 Device UTM_DATA0
110 GPIO50  -   USB 2.0 Device UTM_DATA1
111 GPIO51  -   USB 2.0 Device UTM_DATA2
112 GPIO52  -   USB 2.0 Device UTM_DATA3
113 GPIO53  -   USB 2.0 Device UTM_DATA4
114 GPIO54  -   USB 2.0 Device UTM_DATA5
115 GPIO55  -   USB 2.0 Device UTM_DATA6
116 GPIO56  -   USB 2.0 Device UTM_DATA7
117 GPIO58  -   UTM_RXVALID (USB 2.0 Device)
118 GPIO59  -   UTM_RXACTIVE (USB 2.0 Device)
119 GPIO60  -   UTM_RXERROR
120 GPIO61  -   UTM_OPMODE0
121 GPIO62  -   UTM_OPMODE1
122 GPIO71  -   USBD_INT    (USB Device?)
123 GPIO73  -   UTM_TXREADY (USB 2.0 Device)
124 GPIO83  -   UTM_TXVALID (USB 2.0 Device)
125 GPIO98  -   UTM_RESET   (USB 2.0 device)
126 GPIO99  -   UTM_XCVR_SELECT
127 GPIO100 -   UTM_TERM_SELECT
128 GPIO101 -   UTM_SUSPENDM_X
129 GPIO102 -   UTM_LINESTATE0
130 GPIO103 -   UTM_LINESTATE1
131
132 Card-Bus Interface  - Leave unconfigured for now...
133 ------------------
134 GPIO5   -   nPIOR (I/O space output enable)
135 GPIO6   -   nPIOW (I/O space write enable)
136 GPIO7   -   nIOS16 (Input from I/O space telling size of data bus)
137 GPIO8   -   nPWAIT (Input for inserting wait states)
138
139 LCD
140 ---
141 GPIO6_2     -   LDD0
142 GPIO7_2     -   LDD1
143 GPIO8_2     -   LDD2
144 GPIO9_2     -   LDD3
145 GPIO11_2    -   LDD5
146 GPIO12_2    -   LDD6
147 GPIO13_2    -   LDD7
148 GPIO14_2    -   VSYNC
149 GPIO15_2    -   HSYNC
150 GPIO16_2    -   VCLK
151 GPIO17_2    -   HCLK
152 GPIO18_2    -   VDEN
153 GPIO63      -   LDD8    (CPU LCD)
154 GPIO64      -   LDD9    (CPU LCD)
155 GPIO65      -   LDD10   (CPU LCD)
156 GPIO66      -   LDD11   (CPU LCD)
157 GPIO67      -   LDD12   (CPU LCD)
158 GPIO68      -   LDD13   (CPU LCD)
159 GPIO69      -   LDD14   (CPU LCD)
160 GPIO70      -   LDD15   (CPU LCD)
161 GPIO88      -   VCCLCD_PWREN (LCD Panel PWREN)
162 GPIO97      -   BACKLIGHT_EN
163 GPIO104     -   LCD_PWREN
164
165 PWM   - Leave unconfigured for now...
166 ---
167 GPIO11  -   PWM0
168 GPIO12  -   PWM1
169 GPIO13  -   PWM2
170 GPIO14  -   PWM3
171
172 SD-CARD
173 -------
174 GPIO18  -   SDDATA0
175 GPIO19  -   SDDATA1
176 GPIO20  -   SDDATA2
177 GPIO21  -   SDDATA3
178 GPIO22  -   SDCLK
179 GPIO23  -   SDCMD
180 GPIO72  -   SD_WP
181 GPIO84  -   SD_nIRQ_CD  (SD-Card)
182
183 I2C
184 ---
185 GPIO32  -   I2CSCL
186 GPIO33  -   I2CSDA
187
188 AC97
189 ----
190 GPIO35  -   AC97_SDATA_IN
191 GPIO37  -   AC97_SDATA_OUT
192 GPIO38  -   AC97_SYNC
193 GPIO39  -   AC97_BITCLK
194 GPIO40  -   AC97_nRESET
195
196 UART1
197 -----
198 GPIO41  -   UART_RXD1
199 GPIO42  -   UART_TXD1
200 GPIO43  -   UART_CTS1
201 GPIO44  -   UART_DCD1
202 GPIO45  -   UART_DSR1
203 GPIO46  -   UART_nRI1
204 GPIO47  -   UART_DTR1
205 GPIO48  -   UART_RTS1
206
207 UART2
208 -----
209 GPIO109 -   RTS2
210 GPIO110 -   RXD2
211 GPIO111 -   TXD2
212 GPIO112 -   nCTS2
213
214 UART3
215 -----
216 GPIO105 -   nCTS3
217 GPIO106 -   nRTS3
218 GPIO107 -   TXD3
219 GPIO108 -   RXD3
220
221 SSP3    - Leave unconfigured for now...
222 ----
223 GPIO89  -   SSP3_CLK
224 GPIO90  -   SSP3_SFRM
225 GPIO91  -   SSP3_TXD
226 GPIO92  -   SSP3_RXD
227
228 SSP4
229 GPIO93  -   SSP4_CLK
230 GPIO94  -   SSP4_SFRM
231 GPIO95  -   SSP4_TXD
232 GPIO96  -   SSP4_RXD
233 */
234
235 static mfp_cfg_t mfp_cfg[] __initdata = {
236         /* USB */
237         GPIO10_UTM_CLK,
238         GPIO49_U2D_PHYDATA_0,
239         GPIO50_U2D_PHYDATA_1,
240         GPIO51_U2D_PHYDATA_2,
241         GPIO52_U2D_PHYDATA_3,
242         GPIO53_U2D_PHYDATA_4,
243         GPIO54_U2D_PHYDATA_5,
244         GPIO55_U2D_PHYDATA_6,
245         GPIO56_U2D_PHYDATA_7,
246         GPIO58_UTM_RXVALID,
247         GPIO59_UTM_RXACTIVE,
248         GPIO60_U2D_RXERROR,
249         GPIO61_U2D_OPMODE0,
250         GPIO62_U2D_OPMODE1,
251         GPIO71_GPIO, /* USBD_INT */
252         GPIO73_UTM_TXREADY,
253         GPIO83_U2D_TXVALID,
254         GPIO98_U2D_RESET,
255         GPIO99_U2D_XCVR_SEL,
256         GPIO100_U2D_TERM_SEL,
257         GPIO101_U2D_SUSPEND,
258         GPIO102_UTM_LINESTATE_0,
259         GPIO103_UTM_LINESTATE_1,
260         GPIO4_2_GPIO | MFP_PULL_HIGH, /* UTM_PULLUP */
261
262         /* DM9000 */
263         GPIO1_GPIO,
264         GPIO9_GPIO,
265         GPIO36_GPIO,
266
267         /* AC97 */
268         GPIO35_AC97_SDATA_IN_0,
269         GPIO37_AC97_SDATA_OUT,
270         GPIO38_AC97_SYNC,
271         GPIO39_AC97_BITCLK,
272         GPIO40_AC97_nACRESET,
273
274         /* UARTS */
275         GPIO41_UART1_RXD,
276         GPIO42_UART1_TXD,
277         GPIO43_UART1_CTS,
278         GPIO44_UART1_DCD,
279         GPIO45_UART1_DSR,
280         GPIO46_UART1_RI,
281         GPIO47_UART1_DTR,
282         GPIO48_UART1_RTS,
283
284         GPIO109_UART2_RTS,
285         GPIO110_UART2_RXD,
286         GPIO111_UART2_TXD,
287         GPIO112_UART2_CTS,
288
289         GPIO105_UART3_CTS,
290         GPIO106_UART3_RTS,
291         GPIO107_UART3_TXD,
292         GPIO108_UART3_RXD,
293
294         GPIO78_GPIO,
295         GPIO79_GPIO,
296         GPIO80_GPIO,
297         GPIO81_GPIO,
298
299         /* I2C */
300         GPIO32_I2C_SCL,
301         GPIO33_I2C_SDA,
302
303         /* MMC */
304         GPIO18_MMC1_DAT0,
305         GPIO19_MMC1_DAT1,
306         GPIO20_MMC1_DAT2,
307         GPIO21_MMC1_DAT3,
308         GPIO22_MMC1_CLK,
309         GPIO23_MMC1_CMD,
310         GPIO72_GPIO | MFP_PULL_HIGH, /* Card Detect */
311         GPIO84_GPIO | MFP_PULL_LOW, /* Write Protect */
312
313         /* IRQ */
314         GPIO74_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ1 */
315         GPIO75_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ2 */
316         GPIO76_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ3 */
317         GPIO77_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ4 */
318         GPIO78_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ5 */
319         GPIO79_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ6 */
320         GPIO80_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ7 */
321         GPIO81_GPIO | MFP_LPM_EDGE_RISE  /* EXT_IRQ8 */
322 };
323
324 /* MMC/MCI Support */
325 #if defined(CONFIG_MMC)
326 static struct pxamci_platform_data mxm_8x10_mci_platform_data = {
327         .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
328         .detect_delay_ms = 10,
329         .gpio_card_detect = MXM_8X10_SD_nCD,
330         .gpio_card_ro = MXM_8X10_SD_WP,
331         .gpio_power = -1
332 };
333
334 void __init mxm_8x10_mmc_init(void)
335 {
336         pxa_set_mci_info(&mxm_8x10_mci_platform_data);
337 }
338 #endif
339
340 /* USB Open Host Controler Interface */
341 static struct pxaohci_platform_data mxm_8x10_ohci_platform_data = {
342         .port_mode = PMM_NPS_MODE,
343         .flags = ENABLE_PORT_ALL
344 };
345
346 void __init mxm_8x10_usb_host_init(void)
347 {
348         pxa_set_ohci_info(&mxm_8x10_ohci_platform_data);
349 }
350
351 /* AC97 Sound Support */
352 static struct platform_device mxm_8x10_ac97_device = {
353         .name = "pxa2xx-ac97"
354 };
355
356 void __init mxm_8x10_ac97_init(void)
357 {
358         platform_device_register(&mxm_8x10_ac97_device);
359 }
360
361 /* NAND flash Support */
362 #if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE)
363 #define NAND_BLOCK_SIZE SZ_128K
364 #define NB(x)           (NAND_BLOCK_SIZE * (x))
365 static struct mtd_partition mxm_8x10_nand_partitions[] = {
366         [0] = {
367                .name = "boot",
368                .size = NB(0x002),
369                .offset = NB(0x000),
370                .mask_flags = MTD_WRITEABLE
371         },
372         [1] = {
373                .name = "kernel",
374                .size = NB(0x010),
375                .offset = NB(0x002),
376                .mask_flags = MTD_WRITEABLE
377         },
378         [2] = {
379                .name = "root",
380                .size = NB(0x36c),
381                .offset = NB(0x012)
382         },
383         [3] = {
384                .name = "bbt",
385                .size = NB(0x082),
386                .offset = NB(0x37e),
387                .mask_flags = MTD_WRITEABLE
388         }
389 };
390
391 static struct pxa3xx_nand_platform_data mxm_8x10_nand_info = {
392         .enable_arbiter = 1,
393         .keep_config = 1,
394         .parts = mxm_8x10_nand_partitions,
395         .nr_parts = ARRAY_SIZE(mxm_8x10_nand_partitions)
396 };
397
398 static void __init mxm_8x10_nand_init(void)
399 {
400         pxa3xx_set_nand_info(&mxm_8x10_nand_info);
401 }
402 #else
403 static inline void mxm_8x10_nand_init(void) {}
404 #endif /* CONFIG_MTD_NAND_PXA3xx || CONFIG_MTD_NAND_PXA3xx_MODULE */
405
406 /* Ethernet support: Davicom DM9000 */
407 static struct resource dm9k_resources[] = {
408         [0] = {
409                .start = MXM_8X10_ETH_PHYS + 0x300,
410                .end = MXM_8X10_ETH_PHYS + 0x300,
411                .flags = IORESOURCE_MEM
412         },
413         [1] = {
414                .start = MXM_8X10_ETH_PHYS + 0x308,
415                .end = MXM_8X10_ETH_PHYS + 0x308,
416                .flags = IORESOURCE_MEM
417         },
418         [2] = {
419                .start = gpio_to_irq(mfp_to_gpio(MFP_PIN_GPIO9)),
420                .end = gpio_to_irq(mfp_to_gpio(MFP_PIN_GPIO9)),
421                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE
422         }
423 };
424
425 static struct dm9000_plat_data dm9k_plat_data = {
426         .flags = DM9000_PLATF_16BITONLY
427 };
428
429 static struct platform_device dm9k_device = {
430         .name = "dm9000",
431         .id = 0,
432         .num_resources = ARRAY_SIZE(dm9k_resources),
433         .resource = dm9k_resources,
434         .dev = {
435                 .platform_data = &dm9k_plat_data
436         }
437 };
438
439 static void __init mxm_8x10_ethernet_init(void)
440 {
441         platform_device_register(&dm9k_device);
442 }
443
444 /* PXA UARTs */
445 static void __init mxm_8x10_uarts_init(void)
446 {
447         pxa_set_ffuart_info(NULL);
448         pxa_set_btuart_info(NULL);
449         pxa_set_stuart_info(NULL);
450 }
451
452 /* I2C and Real Time Clock */
453 static struct i2c_board_info __initdata mxm_8x10_i2c_devices[] = {
454         {
455                 I2C_BOARD_INFO("ds1337", 0x68)
456         }
457 };
458
459 static void __init mxm_8x10_i2c_init(void)
460 {
461         i2c_register_board_info(0, mxm_8x10_i2c_devices,
462                                 ARRAY_SIZE(mxm_8x10_i2c_devices));
463         pxa_set_i2c_info(NULL);
464 }
465
466 void __init mxm_8x10_barebones_init(void)
467 {
468         pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_cfg));
469
470         mxm_8x10_uarts_init();
471         mxm_8x10_nand_init();
472         mxm_8x10_i2c_init();
473         mxm_8x10_ethernet_init();
474 }