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