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#include <linux/i2c/pxa-i2c.h> 26 27#include <linux/platform_data/mtd-nand-pxa3xx.h> 28 29#include <linux/platform_data/video-pxafb.h> 30#include <linux/platform_data/mmc-pxamci.h> 31#include <linux/platform_data/usb-ohci-pxa27x.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 41External device stuff - Leave unconfigured for now... 42--------------------- 43GPIO0 - DREQ (External DMA Request) 44GPIO3 - nGCS2 (External Chip Select) Where is nGCS0; nGCS1; nGCS4; nGCS5 ? 45GPIO4 - nGCS3 46GPIO15 - EXT_GPIO1 47GPIO16 - EXT_GPIO2 48GPIO17 - EXT_GPIO3 49GPIO24 - EXT_GPIO4 50GPIO25 - EXT_GPIO5 51GPIO26 - EXT_GPIO6 52GPIO27 - EXT_GPIO7 53GPIO28 - EXT_GPIO8 54GPIO29 - EXT_GPIO9 55GPIO30 - EXT_GPIO10 56GPIO31 - EXT_GPIO11 57GPIO57 - EXT_GPIO12 58GPIO74 - EXT_IRQ1 59GPIO75 - EXT_IRQ2 60GPIO76 - EXT_IRQ3 61GPIO77 - EXT_IRQ4 62GPIO78 - EXT_IRQ5 63GPIO79 - EXT_IRQ6 64GPIO80 - EXT_IRQ7 65GPIO81 - EXT_IRQ8 66GPIO87 - VCCIO_PWREN (External Device PWREN) 67 68Dallas 1-Wire - Leave unconfigured for now... 69------------- 70GPIO0_2 - DS - 1Wire 71 72Ethernet 73-------- 74GPIO1 - DM9000 PWR 75GPIO9 - DM9K_nIRQ 76GPIO36 - DM9K_RESET 77 78Keypad - Leave unconfigured by for now... 79------ 80GPIO1_2 - KP_DKIN0 81GPIO5_2 - KP_MKOUT7 82GPIO82 - KP_DKIN1 83GPIO85 - KP_DKIN2 84GPIO86 - KP_DKIN3 85GPIO113 - KP_MKIN0 86GPIO114 - KP_MKIN1 87GPIO115 - KP_MKIN2 88GPIO116 - KP_MKIN3 89GPIO117 - KP_MKIN4 90GPIO118 - KP_MKIN5 91GPIO119 - KP_MKIN6 92GPIO120 - KP_MKIN7 93GPIO121 - KP_MKOUT0 94GPIO122 - KP_MKOUT1 95GPIO122 - KP_MKOUT2 96GPIO123 - KP_MKOUT3 97GPIO124 - KP_MKOUT4 98GPIO125 - KP_MKOUT5 99GPIO127 - KP_MKOUT6 100 101Data Bus - Leave unconfigured for now... 102-------- 103GPIO2 - nWait (Data Bus) 104 105USB Device 106---------- 107GPIO4_2 - USBD_PULLUP 108GPIO10 - UTM_CLK (USB Device UTM Clk) 109GPIO49 - USB 2.0 Device UTM_DATA0 110GPIO50 - USB 2.0 Device UTM_DATA1 111GPIO51 - USB 2.0 Device UTM_DATA2 112GPIO52 - USB 2.0 Device UTM_DATA3 113GPIO53 - USB 2.0 Device UTM_DATA4 114GPIO54 - USB 2.0 Device UTM_DATA5 115GPIO55 - USB 2.0 Device UTM_DATA6 116GPIO56 - USB 2.0 Device UTM_DATA7 117GPIO58 - UTM_RXVALID (USB 2.0 Device) 118GPIO59 - UTM_RXACTIVE (USB 2.0 Device) 119GPIO60 - UTM_RXERROR 120GPIO61 - UTM_OPMODE0 121GPIO62 - UTM_OPMODE1 122GPIO71 - USBD_INT (USB Device?) 123GPIO73 - UTM_TXREADY (USB 2.0 Device) 124GPIO83 - UTM_TXVALID (USB 2.0 Device) 125GPIO98 - UTM_RESET (USB 2.0 device) 126GPIO99 - UTM_XCVR_SELECT 127GPIO100 - UTM_TERM_SELECT 128GPIO101 - UTM_SUSPENDM_X 129GPIO102 - UTM_LINESTATE0 130GPIO103 - UTM_LINESTATE1 131 132Card-Bus Interface - Leave unconfigured for now... 133------------------ 134GPIO5 - nPIOR (I/O space output enable) 135GPIO6 - nPIOW (I/O space write enable) 136GPIO7 - nIOS16 (Input from I/O space telling size of data bus) 137GPIO8 - nPWAIT (Input for inserting wait states) 138 139LCD 140--- 141GPIO6_2 - LDD0 142GPIO7_2 - LDD1 143GPIO8_2 - LDD2 144GPIO9_2 - LDD3 145GPIO11_2 - LDD5 146GPIO12_2 - LDD6 147GPIO13_2 - LDD7 148GPIO14_2 - VSYNC 149GPIO15_2 - HSYNC 150GPIO16_2 - VCLK 151GPIO17_2 - HCLK 152GPIO18_2 - VDEN 153GPIO63 - LDD8 (CPU LCD) 154GPIO64 - LDD9 (CPU LCD) 155GPIO65 - LDD10 (CPU LCD) 156GPIO66 - LDD11 (CPU LCD) 157GPIO67 - LDD12 (CPU LCD) 158GPIO68 - LDD13 (CPU LCD) 159GPIO69 - LDD14 (CPU LCD) 160GPIO70 - LDD15 (CPU LCD) 161GPIO88 - VCCLCD_PWREN (LCD Panel PWREN) 162GPIO97 - BACKLIGHT_EN 163GPIO104 - LCD_PWREN 164 165PWM - Leave unconfigured for now... 166--- 167GPIO11 - PWM0 168GPIO12 - PWM1 169GPIO13 - PWM2 170GPIO14 - PWM3 171 172SD-CARD 173------- 174GPIO18 - SDDATA0 175GPIO19 - SDDATA1 176GPIO20 - SDDATA2 177GPIO21 - SDDATA3 178GPIO22 - SDCLK 179GPIO23 - SDCMD 180GPIO72 - SD_WP 181GPIO84 - SD_nIRQ_CD (SD-Card) 182 183I2C 184--- 185GPIO32 - I2CSCL 186GPIO33 - I2CSDA 187 188AC97 189---- 190GPIO35 - AC97_SDATA_IN 191GPIO37 - AC97_SDATA_OUT 192GPIO38 - AC97_SYNC 193GPIO39 - AC97_BITCLK 194GPIO40 - AC97_nRESET 195 196UART1 197----- 198GPIO41 - UART_RXD1 199GPIO42 - UART_TXD1 200GPIO43 - UART_CTS1 201GPIO44 - UART_DCD1 202GPIO45 - UART_DSR1 203GPIO46 - UART_nRI1 204GPIO47 - UART_DTR1 205GPIO48 - UART_RTS1 206 207UART2 208----- 209GPIO109 - RTS2 210GPIO110 - RXD2 211GPIO111 - TXD2 212GPIO112 - nCTS2 213 214UART3 215----- 216GPIO105 - nCTS3 217GPIO106 - nRTS3 218GPIO107 - TXD3 219GPIO108 - RXD3 220 221SSP3 - Leave unconfigured for now... 222---- 223GPIO89 - SSP3_CLK 224GPIO90 - SSP3_SFRM 225GPIO91 - SSP3_TXD 226GPIO92 - SSP3_RXD 227 228SSP4 229GPIO93 - SSP4_CLK 230GPIO94 - SSP4_SFRM 231GPIO95 - SSP4_TXD 232GPIO96 - SSP4_RXD 233*/ 234 235static 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) 326static 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 334void __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 Controller Interface */ 341static struct pxaohci_platform_data mxm_8x10_ohci_platform_data = { 342 .port_mode = PMM_NPS_MODE, 343 .flags = ENABLE_PORT_ALL 344}; 345 346void __init mxm_8x10_usb_host_init(void) 347{ 348 pxa_set_ohci_info(&mxm_8x10_ohci_platform_data); 349} 350 351/* AC97 Sound Support */ 352static struct platform_device mxm_8x10_ac97_device = { 353 .name = "pxa2xx-ac97" 354}; 355 356void __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)) 365static 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 391static struct pxa3xx_nand_platform_data mxm_8x10_nand_info = { 392 .enable_arbiter = 1, 393 .keep_config = 1, 394 .num_cs = 1, 395 .parts[0] = mxm_8x10_nand_partitions, 396 .nr_parts[0] = ARRAY_SIZE(mxm_8x10_nand_partitions) 397}; 398 399static void __init mxm_8x10_nand_init(void) 400{ 401 pxa3xx_set_nand_info(&mxm_8x10_nand_info); 402} 403#else 404static inline void mxm_8x10_nand_init(void) {} 405#endif /* CONFIG_MTD_NAND_PXA3xx || CONFIG_MTD_NAND_PXA3xx_MODULE */ 406 407/* Ethernet support: Davicom DM9000 */ 408static struct resource dm9k_resources[] = { 409 [0] = { 410 .start = MXM_8X10_ETH_PHYS + 0x300, 411 .end = MXM_8X10_ETH_PHYS + 0x300, 412 .flags = IORESOURCE_MEM 413 }, 414 [1] = { 415 .start = MXM_8X10_ETH_PHYS + 0x308, 416 .end = MXM_8X10_ETH_PHYS + 0x308, 417 .flags = IORESOURCE_MEM 418 }, 419 [2] = { 420 .start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)), 421 .end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)), 422 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE 423 } 424}; 425 426static struct dm9000_plat_data dm9k_plat_data = { 427 .flags = DM9000_PLATF_16BITONLY 428}; 429 430static struct platform_device dm9k_device = { 431 .name = "dm9000", 432 .id = 0, 433 .num_resources = ARRAY_SIZE(dm9k_resources), 434 .resource = dm9k_resources, 435 .dev = { 436 .platform_data = &dm9k_plat_data 437 } 438}; 439 440static void __init mxm_8x10_ethernet_init(void) 441{ 442 platform_device_register(&dm9k_device); 443} 444 445/* PXA UARTs */ 446static void __init mxm_8x10_uarts_init(void) 447{ 448 pxa_set_ffuart_info(NULL); 449 pxa_set_btuart_info(NULL); 450 pxa_set_stuart_info(NULL); 451} 452 453/* I2C and Real Time Clock */ 454static struct i2c_board_info __initdata mxm_8x10_i2c_devices[] = { 455 { 456 I2C_BOARD_INFO("ds1337", 0x68) 457 } 458}; 459 460static void __init mxm_8x10_i2c_init(void) 461{ 462 i2c_register_board_info(0, mxm_8x10_i2c_devices, 463 ARRAY_SIZE(mxm_8x10_i2c_devices)); 464 pxa_set_i2c_info(NULL); 465} 466 467void __init mxm_8x10_barebones_init(void) 468{ 469 pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_cfg)); 470 471 mxm_8x10_uarts_init(); 472 mxm_8x10_nand_init(); 473 mxm_8x10_i2c_init(); 474 mxm_8x10_ethernet_init(); 475} 476