Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * linux/arch/arm/mach-pxa/mxm8x10.c
0004  *
0005  * Support for the Embedian MXM-8x10 Computer on Module
0006  *
0007  * Copyright (C) 2006 Marvell International Ltd.
0008  * Copyright (C) 2009 Embedian Inc.
0009  * Copyright (C) 2009 TMT Services & Supplies (Pty) Ltd.
0010  *
0011  * 2007-09-04: eric miao <eric.y.miao@gmail.com>
0012  *             rewrite to align with latest kernel
0013  *
0014  * 2010-01-09: Edwin Peer <epeer@tmtservices.co.za>
0015  *         Hennie van der Merwe <hvdmerwe@tmtservices.co.za>
0016  *             rework for upstream merge
0017  */
0018 
0019 #include <linux/serial_8250.h>
0020 #include <linux/dm9000.h>
0021 #include <linux/gpio/machine.h>
0022 #include <linux/platform_data/i2c-pxa.h>
0023 
0024 #include <linux/platform_data/mtd-nand-pxa3xx.h>
0025 
0026 #include <linux/platform_data/video-pxafb.h>
0027 #include <linux/platform_data/mmc-pxamci.h>
0028 #include <linux/platform_data/usb-ohci-pxa27x.h>
0029 #include <linux/platform_data/asoc-pxa.h>
0030 #include "pxa320.h"
0031 
0032 #include "mxm8x10.h"
0033 
0034 #include "devices.h"
0035 #include "generic.h"
0036 
0037 /* GPIO pin definition
0038 
0039 External device stuff   - Leave unconfigured for now...
0040 ---------------------
0041 GPIO0   -   DREQ    (External DMA Request)
0042 GPIO3   -   nGCS2   (External Chip Select) Where is nGCS0; nGCS1; nGCS4; nGCS5 ?
0043 GPIO4   -   nGCS3
0044 GPIO15  -   EXT_GPIO1
0045 GPIO16  -   EXT_GPIO2
0046 GPIO17  -   EXT_GPIO3
0047 GPIO24  -   EXT_GPIO4
0048 GPIO25  -   EXT_GPIO5
0049 GPIO26  -   EXT_GPIO6
0050 GPIO27  -   EXT_GPIO7
0051 GPIO28  -   EXT_GPIO8
0052 GPIO29  -   EXT_GPIO9
0053 GPIO30  -   EXT_GPIO10
0054 GPIO31  -   EXT_GPIO11
0055 GPIO57  -   EXT_GPIO12
0056 GPIO74  -   EXT_IRQ1
0057 GPIO75  -   EXT_IRQ2
0058 GPIO76  -   EXT_IRQ3
0059 GPIO77  -   EXT_IRQ4
0060 GPIO78  -   EXT_IRQ5
0061 GPIO79  -   EXT_IRQ6
0062 GPIO80  -   EXT_IRQ7
0063 GPIO81  -   EXT_IRQ8
0064 GPIO87  -   VCCIO_PWREN (External Device PWREN)
0065 
0066 Dallas 1-Wire   - Leave unconfigured for now...
0067 -------------
0068 GPIO0_2 -   DS - 1Wire
0069 
0070 Ethernet
0071 --------
0072 GPIO1   -   DM9000 PWR
0073 GPIO9   -   DM9K_nIRQ
0074 GPIO36  -   DM9K_RESET
0075 
0076 Keypad  - Leave unconfigured by for now...
0077 ------
0078 GPIO1_2 -   KP_DKIN0
0079 GPIO5_2 -   KP_MKOUT7
0080 GPIO82  -   KP_DKIN1
0081 GPIO85  -   KP_DKIN2
0082 GPIO86  -   KP_DKIN3
0083 GPIO113 -   KP_MKIN0
0084 GPIO114 -   KP_MKIN1
0085 GPIO115 -   KP_MKIN2
0086 GPIO116 -   KP_MKIN3
0087 GPIO117 -   KP_MKIN4
0088 GPIO118 -   KP_MKIN5
0089 GPIO119 -   KP_MKIN6
0090 GPIO120 -   KP_MKIN7
0091 GPIO121 -   KP_MKOUT0
0092 GPIO122 -   KP_MKOUT1
0093 GPIO122 -   KP_MKOUT2
0094 GPIO123 -   KP_MKOUT3
0095 GPIO124 -   KP_MKOUT4
0096 GPIO125 -   KP_MKOUT5
0097 GPIO127 -   KP_MKOUT6
0098 
0099 Data Bus    - Leave unconfigured for now...
0100 --------
0101 GPIO2   -   nWait (Data Bus)
0102 
0103 USB Device
0104 ----------
0105 GPIO4_2 -   USBD_PULLUP
0106 GPIO10  -   UTM_CLK (USB Device UTM Clk)
0107 GPIO49  -   USB 2.0 Device UTM_DATA0
0108 GPIO50  -   USB 2.0 Device UTM_DATA1
0109 GPIO51  -   USB 2.0 Device UTM_DATA2
0110 GPIO52  -   USB 2.0 Device UTM_DATA3
0111 GPIO53  -   USB 2.0 Device UTM_DATA4
0112 GPIO54  -   USB 2.0 Device UTM_DATA5
0113 GPIO55  -   USB 2.0 Device UTM_DATA6
0114 GPIO56  -   USB 2.0 Device UTM_DATA7
0115 GPIO58  -   UTM_RXVALID (USB 2.0 Device)
0116 GPIO59  -   UTM_RXACTIVE (USB 2.0 Device)
0117 GPIO60  -   UTM_RXERROR
0118 GPIO61  -   UTM_OPMODE0
0119 GPIO62  -   UTM_OPMODE1
0120 GPIO71  -   USBD_INT    (USB Device?)
0121 GPIO73  -   UTM_TXREADY (USB 2.0 Device)
0122 GPIO83  -   UTM_TXVALID (USB 2.0 Device)
0123 GPIO98  -   UTM_RESET   (USB 2.0 device)
0124 GPIO99  -   UTM_XCVR_SELECT
0125 GPIO100 -   UTM_TERM_SELECT
0126 GPIO101 -   UTM_SUSPENDM_X
0127 GPIO102 -   UTM_LINESTATE0
0128 GPIO103 -   UTM_LINESTATE1
0129 
0130 Card-Bus Interface  - Leave unconfigured for now...
0131 ------------------
0132 GPIO5   -   nPIOR (I/O space output enable)
0133 GPIO6   -   nPIOW (I/O space write enable)
0134 GPIO7   -   nIOS16 (Input from I/O space telling size of data bus)
0135 GPIO8   -   nPWAIT (Input for inserting wait states)
0136 
0137 LCD
0138 ---
0139 GPIO6_2     -   LDD0
0140 GPIO7_2     -   LDD1
0141 GPIO8_2     -   LDD2
0142 GPIO9_2     -   LDD3
0143 GPIO11_2    -   LDD5
0144 GPIO12_2    -   LDD6
0145 GPIO13_2    -   LDD7
0146 GPIO14_2    -   VSYNC
0147 GPIO15_2    -   HSYNC
0148 GPIO16_2    -   VCLK
0149 GPIO17_2    -   HCLK
0150 GPIO18_2    -   VDEN
0151 GPIO63      -   LDD8    (CPU LCD)
0152 GPIO64      -   LDD9    (CPU LCD)
0153 GPIO65      -   LDD10   (CPU LCD)
0154 GPIO66      -   LDD11   (CPU LCD)
0155 GPIO67      -   LDD12   (CPU LCD)
0156 GPIO68      -   LDD13   (CPU LCD)
0157 GPIO69      -   LDD14   (CPU LCD)
0158 GPIO70      -   LDD15   (CPU LCD)
0159 GPIO88      -   VCCLCD_PWREN (LCD Panel PWREN)
0160 GPIO97      -   BACKLIGHT_EN
0161 GPIO104     -   LCD_PWREN
0162 
0163 PWM   - Leave unconfigured for now...
0164 ---
0165 GPIO11  -   PWM0
0166 GPIO12  -   PWM1
0167 GPIO13  -   PWM2
0168 GPIO14  -   PWM3
0169 
0170 SD-CARD
0171 -------
0172 GPIO18  -   SDDATA0
0173 GPIO19  -   SDDATA1
0174 GPIO20  -   SDDATA2
0175 GPIO21  -   SDDATA3
0176 GPIO22  -   SDCLK
0177 GPIO23  -   SDCMD
0178 GPIO72  -   SD_WP
0179 GPIO84  -   SD_nIRQ_CD  (SD-Card)
0180 
0181 I2C
0182 ---
0183 GPIO32  -   I2CSCL
0184 GPIO33  -   I2CSDA
0185 
0186 AC97
0187 ----
0188 GPIO35  -   AC97_SDATA_IN
0189 GPIO37  -   AC97_SDATA_OUT
0190 GPIO38  -   AC97_SYNC
0191 GPIO39  -   AC97_BITCLK
0192 GPIO40  -   AC97_nRESET
0193 
0194 UART1
0195 -----
0196 GPIO41  -   UART_RXD1
0197 GPIO42  -   UART_TXD1
0198 GPIO43  -   UART_CTS1
0199 GPIO44  -   UART_DCD1
0200 GPIO45  -   UART_DSR1
0201 GPIO46  -   UART_nRI1
0202 GPIO47  -   UART_DTR1
0203 GPIO48  -   UART_RTS1
0204 
0205 UART2
0206 -----
0207 GPIO109 -   RTS2
0208 GPIO110 -   RXD2
0209 GPIO111 -   TXD2
0210 GPIO112 -   nCTS2
0211 
0212 UART3
0213 -----
0214 GPIO105 -   nCTS3
0215 GPIO106 -   nRTS3
0216 GPIO107 -   TXD3
0217 GPIO108 -   RXD3
0218 
0219 SSP3    - Leave unconfigured for now...
0220 ----
0221 GPIO89  -   SSP3_CLK
0222 GPIO90  -   SSP3_SFRM
0223 GPIO91  -   SSP3_TXD
0224 GPIO92  -   SSP3_RXD
0225 
0226 SSP4
0227 GPIO93  -   SSP4_CLK
0228 GPIO94  -   SSP4_SFRM
0229 GPIO95  -   SSP4_TXD
0230 GPIO96  -   SSP4_RXD
0231 */
0232 
0233 static mfp_cfg_t mfp_cfg[] __initdata = {
0234     /* USB */
0235     GPIO10_UTM_CLK,
0236     GPIO49_U2D_PHYDATA_0,
0237     GPIO50_U2D_PHYDATA_1,
0238     GPIO51_U2D_PHYDATA_2,
0239     GPIO52_U2D_PHYDATA_3,
0240     GPIO53_U2D_PHYDATA_4,
0241     GPIO54_U2D_PHYDATA_5,
0242     GPIO55_U2D_PHYDATA_6,
0243     GPIO56_U2D_PHYDATA_7,
0244     GPIO58_UTM_RXVALID,
0245     GPIO59_UTM_RXACTIVE,
0246     GPIO60_U2D_RXERROR,
0247     GPIO61_U2D_OPMODE0,
0248     GPIO62_U2D_OPMODE1,
0249     GPIO71_GPIO, /* USBD_INT */
0250     GPIO73_UTM_TXREADY,
0251     GPIO83_U2D_TXVALID,
0252     GPIO98_U2D_RESET,
0253     GPIO99_U2D_XCVR_SEL,
0254     GPIO100_U2D_TERM_SEL,
0255     GPIO101_U2D_SUSPEND,
0256     GPIO102_UTM_LINESTATE_0,
0257     GPIO103_UTM_LINESTATE_1,
0258     GPIO4_2_GPIO | MFP_PULL_HIGH, /* UTM_PULLUP */
0259 
0260     /* DM9000 */
0261     GPIO1_GPIO,
0262     GPIO9_GPIO,
0263     GPIO36_GPIO,
0264 
0265     /* AC97 */
0266     GPIO35_AC97_SDATA_IN_0,
0267     GPIO37_AC97_SDATA_OUT,
0268     GPIO38_AC97_SYNC,
0269     GPIO39_AC97_BITCLK,
0270     GPIO40_AC97_nACRESET,
0271 
0272     /* UARTS */
0273     GPIO41_UART1_RXD,
0274     GPIO42_UART1_TXD,
0275     GPIO43_UART1_CTS,
0276     GPIO44_UART1_DCD,
0277     GPIO45_UART1_DSR,
0278     GPIO46_UART1_RI,
0279     GPIO47_UART1_DTR,
0280     GPIO48_UART1_RTS,
0281 
0282     GPIO109_UART2_RTS,
0283     GPIO110_UART2_RXD,
0284     GPIO111_UART2_TXD,
0285     GPIO112_UART2_CTS,
0286 
0287     GPIO105_UART3_CTS,
0288     GPIO106_UART3_RTS,
0289     GPIO107_UART3_TXD,
0290     GPIO108_UART3_RXD,
0291 
0292     GPIO78_GPIO,
0293     GPIO79_GPIO,
0294     GPIO80_GPIO,
0295     GPIO81_GPIO,
0296 
0297     /* I2C */
0298     GPIO32_I2C_SCL,
0299     GPIO33_I2C_SDA,
0300 
0301     /* MMC */
0302     GPIO18_MMC1_DAT0,
0303     GPIO19_MMC1_DAT1,
0304     GPIO20_MMC1_DAT2,
0305     GPIO21_MMC1_DAT3,
0306     GPIO22_MMC1_CLK,
0307     GPIO23_MMC1_CMD,
0308     GPIO72_GPIO | MFP_PULL_HIGH, /* Card Detect */
0309     GPIO84_GPIO | MFP_PULL_LOW, /* Write Protect */
0310 
0311     /* IRQ */
0312     GPIO74_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ1 */
0313     GPIO75_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ2 */
0314     GPIO76_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ3 */
0315     GPIO77_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ4 */
0316     GPIO78_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ5 */
0317     GPIO79_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ6 */
0318     GPIO80_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ7 */
0319     GPIO81_GPIO | MFP_LPM_EDGE_RISE  /* EXT_IRQ8 */
0320 };
0321 
0322 /* MMC/MCI Support */
0323 #if defined(CONFIG_MMC)
0324 static struct pxamci_platform_data mxm_8x10_mci_platform_data = {
0325     .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
0326     .detect_delay_ms = 10,
0327 };
0328 
0329 static struct gpiod_lookup_table mxm_8x10_mci_gpio_table = {
0330     .dev_id = "pxa2xx-mci.0",
0331     .table = {
0332         /* Card detect on GPIO 72 */
0333         GPIO_LOOKUP("gpio-pxa", MXM_8X10_SD_nCD,
0334                 "cd", GPIO_ACTIVE_LOW),
0335         /* Write protect on GPIO 84 */
0336         GPIO_LOOKUP("gpio-pxa", MXM_8X10_SD_WP,
0337                 "wp", GPIO_ACTIVE_LOW),
0338         { },
0339     },
0340 };
0341 
0342 void __init mxm_8x10_mmc_init(void)
0343 {
0344     gpiod_add_lookup_table(&mxm_8x10_mci_gpio_table);
0345     pxa_set_mci_info(&mxm_8x10_mci_platform_data);
0346 }
0347 #endif
0348 
0349 /* USB Open Host Controller Interface */
0350 static struct pxaohci_platform_data mxm_8x10_ohci_platform_data = {
0351     .port_mode = PMM_NPS_MODE,
0352     .flags = ENABLE_PORT_ALL
0353 };
0354 
0355 void __init mxm_8x10_usb_host_init(void)
0356 {
0357     pxa_set_ohci_info(&mxm_8x10_ohci_platform_data);
0358 }
0359 
0360 void __init mxm_8x10_ac97_init(void)
0361 {
0362     pxa_set_ac97_info(NULL);
0363 }
0364 
0365 /* NAND flash Support */
0366 #if IS_ENABLED(CONFIG_MTD_NAND_MARVELL)
0367 #define NAND_BLOCK_SIZE SZ_128K
0368 #define NB(x)           (NAND_BLOCK_SIZE * (x))
0369 static struct mtd_partition mxm_8x10_nand_partitions[] = {
0370     [0] = {
0371            .name = "boot",
0372            .size = NB(0x002),
0373            .offset = NB(0x000),
0374            .mask_flags = MTD_WRITEABLE
0375     },
0376     [1] = {
0377            .name = "kernel",
0378            .size = NB(0x010),
0379            .offset = NB(0x002),
0380            .mask_flags = MTD_WRITEABLE
0381     },
0382     [2] = {
0383            .name = "root",
0384            .size = NB(0x36c),
0385            .offset = NB(0x012)
0386     },
0387     [3] = {
0388            .name = "bbt",
0389            .size = NB(0x082),
0390            .offset = NB(0x37e),
0391            .mask_flags = MTD_WRITEABLE
0392     }
0393 };
0394 
0395 static struct pxa3xx_nand_platform_data mxm_8x10_nand_info = {
0396     .keep_config    = 1,
0397     .parts      = mxm_8x10_nand_partitions,
0398     .nr_parts   = ARRAY_SIZE(mxm_8x10_nand_partitions)
0399 };
0400 
0401 static void __init mxm_8x10_nand_init(void)
0402 {
0403     pxa3xx_set_nand_info(&mxm_8x10_nand_info);
0404 }
0405 #else
0406 static inline void mxm_8x10_nand_init(void) {}
0407 #endif /* IS_ENABLED(CONFIG_MTD_NAND_MARVELL) */
0408 
0409 /* Ethernet support: Davicom DM9000 */
0410 static struct resource dm9k_resources[] = {
0411     [0] = {
0412            .start = MXM_8X10_ETH_PHYS + 0x300,
0413            .end = MXM_8X10_ETH_PHYS + 0x300,
0414            .flags = IORESOURCE_MEM
0415     },
0416     [1] = {
0417            .start = MXM_8X10_ETH_PHYS + 0x308,
0418            .end = MXM_8X10_ETH_PHYS + 0x308,
0419            .flags = IORESOURCE_MEM
0420     },
0421     [2] = {
0422            .start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)),
0423            .end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)),
0424            .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE
0425     }
0426 };
0427 
0428 static struct dm9000_plat_data dm9k_plat_data = {
0429     .flags = DM9000_PLATF_16BITONLY
0430 };
0431 
0432 static struct platform_device dm9k_device = {
0433     .name = "dm9000",
0434     .id = 0,
0435     .num_resources = ARRAY_SIZE(dm9k_resources),
0436     .resource = dm9k_resources,
0437     .dev = {
0438         .platform_data = &dm9k_plat_data
0439     }
0440 };
0441 
0442 static void __init mxm_8x10_ethernet_init(void)
0443 {
0444     platform_device_register(&dm9k_device);
0445 }
0446 
0447 /* PXA UARTs */
0448 static void __init mxm_8x10_uarts_init(void)
0449 {
0450     pxa_set_ffuart_info(NULL);
0451     pxa_set_btuart_info(NULL);
0452     pxa_set_stuart_info(NULL);
0453 }
0454 
0455 /* I2C and Real Time Clock */
0456 static struct i2c_board_info __initdata mxm_8x10_i2c_devices[] = {
0457     {
0458         I2C_BOARD_INFO("ds1337", 0x68)
0459     }
0460 };
0461 
0462 static void __init mxm_8x10_i2c_init(void)
0463 {
0464     i2c_register_board_info(0, mxm_8x10_i2c_devices,
0465                 ARRAY_SIZE(mxm_8x10_i2c_devices));
0466     pxa_set_i2c_info(NULL);
0467 }
0468 
0469 void __init mxm_8x10_barebones_init(void)
0470 {
0471     pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_cfg));
0472 
0473     mxm_8x10_uarts_init();
0474     mxm_8x10_nand_init();
0475     mxm_8x10_i2c_init();
0476     mxm_8x10_ethernet_init();
0477 }