forked from luck/tmp_suning_uos_patched
f54005b508
After converting the PXA driver to use GPIO descriptors for card detect and write protect it is relatively simple to convert it to also use a descriptor for getting the optional power control GPIO. The polarity inversion flag can also go away from the platform data since this is indicated in the GPIO machine descriptor table. Cc: Daniel Mack <daniel@zonque.org> Cc: Robert Jarzmik <robert.jarzmik@free.fr> Cc: Bartosz Golaszewski <brgl@bgdev.pl> Cc: Andrea Adami <andrea.adami@gmail.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
485 lines
11 KiB
C
485 lines
11 KiB
C
/*
|
|
* linux/arch/arm/mach-pxa/mxm8x10.c
|
|
*
|
|
* Support for the Embedian MXM-8x10 Computer on Module
|
|
*
|
|
* Copyright (C) 2006 Marvell International Ltd.
|
|
* Copyright (C) 2009 Embedian Inc.
|
|
* Copyright (C) 2009 TMT Services & Supplies (Pty) Ltd.
|
|
*
|
|
* 2007-09-04: eric miao <eric.y.miao@gmail.com>
|
|
* rewrite to align with latest kernel
|
|
*
|
|
* 2010-01-09: Edwin Peer <epeer@tmtservices.co.za>
|
|
* Hennie van der Merwe <hvdmerwe@tmtservices.co.za>
|
|
* rework for upstream merge
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/serial_8250.h>
|
|
#include <linux/dm9000.h>
|
|
#include <linux/gpio/machine.h>
|
|
#include <linux/platform_data/i2c-pxa.h>
|
|
|
|
#include <linux/platform_data/mtd-nand-pxa3xx.h>
|
|
|
|
#include <linux/platform_data/video-pxafb.h>
|
|
#include <linux/platform_data/mmc-pxamci.h>
|
|
#include <linux/platform_data/usb-ohci-pxa27x.h>
|
|
#include "pxa320.h"
|
|
|
|
#include "mxm8x10.h"
|
|
|
|
#include "devices.h"
|
|
#include "generic.h"
|
|
|
|
/* GPIO pin definition
|
|
|
|
External device stuff - Leave unconfigured for now...
|
|
---------------------
|
|
GPIO0 - DREQ (External DMA Request)
|
|
GPIO3 - nGCS2 (External Chip Select) Where is nGCS0; nGCS1; nGCS4; nGCS5 ?
|
|
GPIO4 - nGCS3
|
|
GPIO15 - EXT_GPIO1
|
|
GPIO16 - EXT_GPIO2
|
|
GPIO17 - EXT_GPIO3
|
|
GPIO24 - EXT_GPIO4
|
|
GPIO25 - EXT_GPIO5
|
|
GPIO26 - EXT_GPIO6
|
|
GPIO27 - EXT_GPIO7
|
|
GPIO28 - EXT_GPIO8
|
|
GPIO29 - EXT_GPIO9
|
|
GPIO30 - EXT_GPIO10
|
|
GPIO31 - EXT_GPIO11
|
|
GPIO57 - EXT_GPIO12
|
|
GPIO74 - EXT_IRQ1
|
|
GPIO75 - EXT_IRQ2
|
|
GPIO76 - EXT_IRQ3
|
|
GPIO77 - EXT_IRQ4
|
|
GPIO78 - EXT_IRQ5
|
|
GPIO79 - EXT_IRQ6
|
|
GPIO80 - EXT_IRQ7
|
|
GPIO81 - EXT_IRQ8
|
|
GPIO87 - VCCIO_PWREN (External Device PWREN)
|
|
|
|
Dallas 1-Wire - Leave unconfigured for now...
|
|
-------------
|
|
GPIO0_2 - DS - 1Wire
|
|
|
|
Ethernet
|
|
--------
|
|
GPIO1 - DM9000 PWR
|
|
GPIO9 - DM9K_nIRQ
|
|
GPIO36 - DM9K_RESET
|
|
|
|
Keypad - Leave unconfigured by for now...
|
|
------
|
|
GPIO1_2 - KP_DKIN0
|
|
GPIO5_2 - KP_MKOUT7
|
|
GPIO82 - KP_DKIN1
|
|
GPIO85 - KP_DKIN2
|
|
GPIO86 - KP_DKIN3
|
|
GPIO113 - KP_MKIN0
|
|
GPIO114 - KP_MKIN1
|
|
GPIO115 - KP_MKIN2
|
|
GPIO116 - KP_MKIN3
|
|
GPIO117 - KP_MKIN4
|
|
GPIO118 - KP_MKIN5
|
|
GPIO119 - KP_MKIN6
|
|
GPIO120 - KP_MKIN7
|
|
GPIO121 - KP_MKOUT0
|
|
GPIO122 - KP_MKOUT1
|
|
GPIO122 - KP_MKOUT2
|
|
GPIO123 - KP_MKOUT3
|
|
GPIO124 - KP_MKOUT4
|
|
GPIO125 - KP_MKOUT5
|
|
GPIO127 - KP_MKOUT6
|
|
|
|
Data Bus - Leave unconfigured for now...
|
|
--------
|
|
GPIO2 - nWait (Data Bus)
|
|
|
|
USB Device
|
|
----------
|
|
GPIO4_2 - USBD_PULLUP
|
|
GPIO10 - UTM_CLK (USB Device UTM Clk)
|
|
GPIO49 - USB 2.0 Device UTM_DATA0
|
|
GPIO50 - USB 2.0 Device UTM_DATA1
|
|
GPIO51 - USB 2.0 Device UTM_DATA2
|
|
GPIO52 - USB 2.0 Device UTM_DATA3
|
|
GPIO53 - USB 2.0 Device UTM_DATA4
|
|
GPIO54 - USB 2.0 Device UTM_DATA5
|
|
GPIO55 - USB 2.0 Device UTM_DATA6
|
|
GPIO56 - USB 2.0 Device UTM_DATA7
|
|
GPIO58 - UTM_RXVALID (USB 2.0 Device)
|
|
GPIO59 - UTM_RXACTIVE (USB 2.0 Device)
|
|
GPIO60 - UTM_RXERROR
|
|
GPIO61 - UTM_OPMODE0
|
|
GPIO62 - UTM_OPMODE1
|
|
GPIO71 - USBD_INT (USB Device?)
|
|
GPIO73 - UTM_TXREADY (USB 2.0 Device)
|
|
GPIO83 - UTM_TXVALID (USB 2.0 Device)
|
|
GPIO98 - UTM_RESET (USB 2.0 device)
|
|
GPIO99 - UTM_XCVR_SELECT
|
|
GPIO100 - UTM_TERM_SELECT
|
|
GPIO101 - UTM_SUSPENDM_X
|
|
GPIO102 - UTM_LINESTATE0
|
|
GPIO103 - UTM_LINESTATE1
|
|
|
|
Card-Bus Interface - Leave unconfigured for now...
|
|
------------------
|
|
GPIO5 - nPIOR (I/O space output enable)
|
|
GPIO6 - nPIOW (I/O space write enable)
|
|
GPIO7 - nIOS16 (Input from I/O space telling size of data bus)
|
|
GPIO8 - nPWAIT (Input for inserting wait states)
|
|
|
|
LCD
|
|
---
|
|
GPIO6_2 - LDD0
|
|
GPIO7_2 - LDD1
|
|
GPIO8_2 - LDD2
|
|
GPIO9_2 - LDD3
|
|
GPIO11_2 - LDD5
|
|
GPIO12_2 - LDD6
|
|
GPIO13_2 - LDD7
|
|
GPIO14_2 - VSYNC
|
|
GPIO15_2 - HSYNC
|
|
GPIO16_2 - VCLK
|
|
GPIO17_2 - HCLK
|
|
GPIO18_2 - VDEN
|
|
GPIO63 - LDD8 (CPU LCD)
|
|
GPIO64 - LDD9 (CPU LCD)
|
|
GPIO65 - LDD10 (CPU LCD)
|
|
GPIO66 - LDD11 (CPU LCD)
|
|
GPIO67 - LDD12 (CPU LCD)
|
|
GPIO68 - LDD13 (CPU LCD)
|
|
GPIO69 - LDD14 (CPU LCD)
|
|
GPIO70 - LDD15 (CPU LCD)
|
|
GPIO88 - VCCLCD_PWREN (LCD Panel PWREN)
|
|
GPIO97 - BACKLIGHT_EN
|
|
GPIO104 - LCD_PWREN
|
|
|
|
PWM - Leave unconfigured for now...
|
|
---
|
|
GPIO11 - PWM0
|
|
GPIO12 - PWM1
|
|
GPIO13 - PWM2
|
|
GPIO14 - PWM3
|
|
|
|
SD-CARD
|
|
-------
|
|
GPIO18 - SDDATA0
|
|
GPIO19 - SDDATA1
|
|
GPIO20 - SDDATA2
|
|
GPIO21 - SDDATA3
|
|
GPIO22 - SDCLK
|
|
GPIO23 - SDCMD
|
|
GPIO72 - SD_WP
|
|
GPIO84 - SD_nIRQ_CD (SD-Card)
|
|
|
|
I2C
|
|
---
|
|
GPIO32 - I2CSCL
|
|
GPIO33 - I2CSDA
|
|
|
|
AC97
|
|
----
|
|
GPIO35 - AC97_SDATA_IN
|
|
GPIO37 - AC97_SDATA_OUT
|
|
GPIO38 - AC97_SYNC
|
|
GPIO39 - AC97_BITCLK
|
|
GPIO40 - AC97_nRESET
|
|
|
|
UART1
|
|
-----
|
|
GPIO41 - UART_RXD1
|
|
GPIO42 - UART_TXD1
|
|
GPIO43 - UART_CTS1
|
|
GPIO44 - UART_DCD1
|
|
GPIO45 - UART_DSR1
|
|
GPIO46 - UART_nRI1
|
|
GPIO47 - UART_DTR1
|
|
GPIO48 - UART_RTS1
|
|
|
|
UART2
|
|
-----
|
|
GPIO109 - RTS2
|
|
GPIO110 - RXD2
|
|
GPIO111 - TXD2
|
|
GPIO112 - nCTS2
|
|
|
|
UART3
|
|
-----
|
|
GPIO105 - nCTS3
|
|
GPIO106 - nRTS3
|
|
GPIO107 - TXD3
|
|
GPIO108 - RXD3
|
|
|
|
SSP3 - Leave unconfigured for now...
|
|
----
|
|
GPIO89 - SSP3_CLK
|
|
GPIO90 - SSP3_SFRM
|
|
GPIO91 - SSP3_TXD
|
|
GPIO92 - SSP3_RXD
|
|
|
|
SSP4
|
|
GPIO93 - SSP4_CLK
|
|
GPIO94 - SSP4_SFRM
|
|
GPIO95 - SSP4_TXD
|
|
GPIO96 - SSP4_RXD
|
|
*/
|
|
|
|
static mfp_cfg_t mfp_cfg[] __initdata = {
|
|
/* USB */
|
|
GPIO10_UTM_CLK,
|
|
GPIO49_U2D_PHYDATA_0,
|
|
GPIO50_U2D_PHYDATA_1,
|
|
GPIO51_U2D_PHYDATA_2,
|
|
GPIO52_U2D_PHYDATA_3,
|
|
GPIO53_U2D_PHYDATA_4,
|
|
GPIO54_U2D_PHYDATA_5,
|
|
GPIO55_U2D_PHYDATA_6,
|
|
GPIO56_U2D_PHYDATA_7,
|
|
GPIO58_UTM_RXVALID,
|
|
GPIO59_UTM_RXACTIVE,
|
|
GPIO60_U2D_RXERROR,
|
|
GPIO61_U2D_OPMODE0,
|
|
GPIO62_U2D_OPMODE1,
|
|
GPIO71_GPIO, /* USBD_INT */
|
|
GPIO73_UTM_TXREADY,
|
|
GPIO83_U2D_TXVALID,
|
|
GPIO98_U2D_RESET,
|
|
GPIO99_U2D_XCVR_SEL,
|
|
GPIO100_U2D_TERM_SEL,
|
|
GPIO101_U2D_SUSPEND,
|
|
GPIO102_UTM_LINESTATE_0,
|
|
GPIO103_UTM_LINESTATE_1,
|
|
GPIO4_2_GPIO | MFP_PULL_HIGH, /* UTM_PULLUP */
|
|
|
|
/* DM9000 */
|
|
GPIO1_GPIO,
|
|
GPIO9_GPIO,
|
|
GPIO36_GPIO,
|
|
|
|
/* AC97 */
|
|
GPIO35_AC97_SDATA_IN_0,
|
|
GPIO37_AC97_SDATA_OUT,
|
|
GPIO38_AC97_SYNC,
|
|
GPIO39_AC97_BITCLK,
|
|
GPIO40_AC97_nACRESET,
|
|
|
|
/* UARTS */
|
|
GPIO41_UART1_RXD,
|
|
GPIO42_UART1_TXD,
|
|
GPIO43_UART1_CTS,
|
|
GPIO44_UART1_DCD,
|
|
GPIO45_UART1_DSR,
|
|
GPIO46_UART1_RI,
|
|
GPIO47_UART1_DTR,
|
|
GPIO48_UART1_RTS,
|
|
|
|
GPIO109_UART2_RTS,
|
|
GPIO110_UART2_RXD,
|
|
GPIO111_UART2_TXD,
|
|
GPIO112_UART2_CTS,
|
|
|
|
GPIO105_UART3_CTS,
|
|
GPIO106_UART3_RTS,
|
|
GPIO107_UART3_TXD,
|
|
GPIO108_UART3_RXD,
|
|
|
|
GPIO78_GPIO,
|
|
GPIO79_GPIO,
|
|
GPIO80_GPIO,
|
|
GPIO81_GPIO,
|
|
|
|
/* I2C */
|
|
GPIO32_I2C_SCL,
|
|
GPIO33_I2C_SDA,
|
|
|
|
/* MMC */
|
|
GPIO18_MMC1_DAT0,
|
|
GPIO19_MMC1_DAT1,
|
|
GPIO20_MMC1_DAT2,
|
|
GPIO21_MMC1_DAT3,
|
|
GPIO22_MMC1_CLK,
|
|
GPIO23_MMC1_CMD,
|
|
GPIO72_GPIO | MFP_PULL_HIGH, /* Card Detect */
|
|
GPIO84_GPIO | MFP_PULL_LOW, /* Write Protect */
|
|
|
|
/* IRQ */
|
|
GPIO74_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ1 */
|
|
GPIO75_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ2 */
|
|
GPIO76_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ3 */
|
|
GPIO77_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ4 */
|
|
GPIO78_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ5 */
|
|
GPIO79_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ6 */
|
|
GPIO80_GPIO | MFP_LPM_EDGE_RISE, /* EXT_IRQ7 */
|
|
GPIO81_GPIO | MFP_LPM_EDGE_RISE /* EXT_IRQ8 */
|
|
};
|
|
|
|
/* MMC/MCI Support */
|
|
#if defined(CONFIG_MMC)
|
|
static struct pxamci_platform_data mxm_8x10_mci_platform_data = {
|
|
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
|
.detect_delay_ms = 10,
|
|
};
|
|
|
|
static struct gpiod_lookup_table mxm_8x10_mci_gpio_table = {
|
|
.dev_id = "pxa2xx-mci.0",
|
|
.table = {
|
|
/* Card detect on GPIO 72 */
|
|
GPIO_LOOKUP("gpio-pxa", MXM_8X10_SD_nCD,
|
|
"cd", GPIO_ACTIVE_LOW),
|
|
/* Write protect on GPIO 84 */
|
|
GPIO_LOOKUP("gpio-pxa", MXM_8X10_SD_WP,
|
|
"wp", GPIO_ACTIVE_LOW),
|
|
{ },
|
|
},
|
|
};
|
|
|
|
void __init mxm_8x10_mmc_init(void)
|
|
{
|
|
gpiod_add_lookup_table(&mxm_8x10_mci_gpio_table);
|
|
pxa_set_mci_info(&mxm_8x10_mci_platform_data);
|
|
}
|
|
#endif
|
|
|
|
/* USB Open Host Controller Interface */
|
|
static struct pxaohci_platform_data mxm_8x10_ohci_platform_data = {
|
|
.port_mode = PMM_NPS_MODE,
|
|
.flags = ENABLE_PORT_ALL
|
|
};
|
|
|
|
void __init mxm_8x10_usb_host_init(void)
|
|
{
|
|
pxa_set_ohci_info(&mxm_8x10_ohci_platform_data);
|
|
}
|
|
|
|
/* AC97 Sound Support */
|
|
static struct platform_device mxm_8x10_ac97_device = {
|
|
.name = "pxa2xx-ac97"
|
|
};
|
|
|
|
void __init mxm_8x10_ac97_init(void)
|
|
{
|
|
platform_device_register(&mxm_8x10_ac97_device);
|
|
}
|
|
|
|
/* NAND flash Support */
|
|
#if IS_ENABLED(CONFIG_MTD_NAND_MARVELL)
|
|
#define NAND_BLOCK_SIZE SZ_128K
|
|
#define NB(x) (NAND_BLOCK_SIZE * (x))
|
|
static struct mtd_partition mxm_8x10_nand_partitions[] = {
|
|
[0] = {
|
|
.name = "boot",
|
|
.size = NB(0x002),
|
|
.offset = NB(0x000),
|
|
.mask_flags = MTD_WRITEABLE
|
|
},
|
|
[1] = {
|
|
.name = "kernel",
|
|
.size = NB(0x010),
|
|
.offset = NB(0x002),
|
|
.mask_flags = MTD_WRITEABLE
|
|
},
|
|
[2] = {
|
|
.name = "root",
|
|
.size = NB(0x36c),
|
|
.offset = NB(0x012)
|
|
},
|
|
[3] = {
|
|
.name = "bbt",
|
|
.size = NB(0x082),
|
|
.offset = NB(0x37e),
|
|
.mask_flags = MTD_WRITEABLE
|
|
}
|
|
};
|
|
|
|
static struct pxa3xx_nand_platform_data mxm_8x10_nand_info = {
|
|
.keep_config = 1,
|
|
.parts = mxm_8x10_nand_partitions,
|
|
.nr_parts = ARRAY_SIZE(mxm_8x10_nand_partitions)
|
|
};
|
|
|
|
static void __init mxm_8x10_nand_init(void)
|
|
{
|
|
pxa3xx_set_nand_info(&mxm_8x10_nand_info);
|
|
}
|
|
#else
|
|
static inline void mxm_8x10_nand_init(void) {}
|
|
#endif /* IS_ENABLED(CONFIG_MTD_NAND_MARVELL) */
|
|
|
|
/* Ethernet support: Davicom DM9000 */
|
|
static struct resource dm9k_resources[] = {
|
|
[0] = {
|
|
.start = MXM_8X10_ETH_PHYS + 0x300,
|
|
.end = MXM_8X10_ETH_PHYS + 0x300,
|
|
.flags = IORESOURCE_MEM
|
|
},
|
|
[1] = {
|
|
.start = MXM_8X10_ETH_PHYS + 0x308,
|
|
.end = MXM_8X10_ETH_PHYS + 0x308,
|
|
.flags = IORESOURCE_MEM
|
|
},
|
|
[2] = {
|
|
.start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)),
|
|
.end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO9)),
|
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE
|
|
}
|
|
};
|
|
|
|
static struct dm9000_plat_data dm9k_plat_data = {
|
|
.flags = DM9000_PLATF_16BITONLY
|
|
};
|
|
|
|
static struct platform_device dm9k_device = {
|
|
.name = "dm9000",
|
|
.id = 0,
|
|
.num_resources = ARRAY_SIZE(dm9k_resources),
|
|
.resource = dm9k_resources,
|
|
.dev = {
|
|
.platform_data = &dm9k_plat_data
|
|
}
|
|
};
|
|
|
|
static void __init mxm_8x10_ethernet_init(void)
|
|
{
|
|
platform_device_register(&dm9k_device);
|
|
}
|
|
|
|
/* PXA UARTs */
|
|
static void __init mxm_8x10_uarts_init(void)
|
|
{
|
|
pxa_set_ffuart_info(NULL);
|
|
pxa_set_btuart_info(NULL);
|
|
pxa_set_stuart_info(NULL);
|
|
}
|
|
|
|
/* I2C and Real Time Clock */
|
|
static struct i2c_board_info __initdata mxm_8x10_i2c_devices[] = {
|
|
{
|
|
I2C_BOARD_INFO("ds1337", 0x68)
|
|
}
|
|
};
|
|
|
|
static void __init mxm_8x10_i2c_init(void)
|
|
{
|
|
i2c_register_board_info(0, mxm_8x10_i2c_devices,
|
|
ARRAY_SIZE(mxm_8x10_i2c_devices));
|
|
pxa_set_i2c_info(NULL);
|
|
}
|
|
|
|
void __init mxm_8x10_barebones_init(void)
|
|
{
|
|
pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_cfg));
|
|
|
|
mxm_8x10_uarts_init();
|
|
mxm_8x10_nand_init();
|
|
mxm_8x10_i2c_init();
|
|
mxm_8x10_ethernet_init();
|
|
}
|