alistair23-linux/arch/arm/mach-ux500/board-mop500-pins.c
Linus Walleij 1baa57434a ARM: ux500: update pin handling
This updates the Ux500 pin handling to take much more care when
applying pin settings for different platforms and peripherals.
This is an accumulation of a longer history of updates to the
MOP500 family pin file.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2012-04-24 09:36:06 +02:00

508 lines
13 KiB
C

/*
* Copyright (C) ST-Ericsson SA 2010
*
* License terms: GNU General Public License (GPL) version 2
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/bug.h>
#include <linux/string.h>
#include <asm/mach-types.h>
#include <plat/pincfg.h>
#include <plat/gpio-nomadik.h>
#include <mach/hardware.h>
#include "pins-db8500.h"
#include "pins.h"
#include "board-mop500.h"
enum custom_pin_cfg_t {
PINS_FOR_DEFAULT,
PINS_FOR_U9500,
};
static enum custom_pin_cfg_t pinsfor;
static pin_cfg_t mop500_pins_common[] = {
/* uMSP0 */
GPIO12_MSP0_TXD,
GPIO13_MSP0_TFS,
GPIO14_MSP0_TCK,
GPIO15_MSP0_RXD,
/* MSP2: HDMI */
GPIO193_MSP2_TXD | PIN_INPUT_PULLDOWN,
GPIO194_MSP2_TCK | PIN_INPUT_PULLDOWN,
GPIO195_MSP2_TFS | PIN_INPUT_PULLDOWN,
GPIO196_MSP2_RXD | PIN_OUTPUT_LOW,
/* LCD TE0 */
GPIO68_LCD_VSI0 | PIN_INPUT_PULLUP,
/* Touch screen INTERFACE */
GPIO84_GPIO | PIN_INPUT_PULLUP, /* TOUCH_INT1 */
/* STMPE1601/tc35893 keypad IRQ */
GPIO218_GPIO | PIN_INPUT_PULLUP,
/* UART */
/* uart-0 pins gpio configuration should be
* kept intact to prevent glitch in tx line
* when tty dev is opened. Later these pins
* are configured to uart mop500_pins_uart0
*
* It will be replaced with uart configuration
* once the issue is solved.
*/
GPIO0_GPIO | PIN_INPUT_PULLUP,
GPIO1_GPIO | PIN_OUTPUT_HIGH,
GPIO2_GPIO | PIN_INPUT_PULLUP,
GPIO3_GPIO | PIN_OUTPUT_HIGH,
GPIO29_U2_RXD | PIN_INPUT_PULLUP,
GPIO30_U2_TXD | PIN_OUTPUT_HIGH,
GPIO31_U2_CTSn | PIN_INPUT_PULLUP,
GPIO32_U2_RTSn | PIN_OUTPUT_HIGH,
};
static pin_cfg_t mop500_pins_default[] = {
/* SSP0 */
GPIO143_SSP0_CLK,
GPIO144_SSP0_FRM,
GPIO145_SSP0_RXD | PIN_PULL_DOWN,
GPIO146_SSP0_TXD,
/* XENON Flashgun INTERFACE */
GPIO6_IP_GPIO0 | PIN_INPUT_PULLUP,/* XENON_FLASH_ID */
GPIO7_IP_GPIO1 | PIN_INPUT_PULLUP,/* XENON_READY */
GPIO217_GPIO | PIN_INPUT_PULLUP, /* TC35892 IRQ */
/* sdi0 (removable MMC/SD/SDIO cards) not handled by pm_runtime */
GPIO21_MC0_DAT31DIR | PIN_OUTPUT_HIGH,
/* UART */
GPIO4_U1_RXD | PIN_INPUT_PULLUP,
GPIO5_U1_TXD | PIN_OUTPUT_HIGH,
GPIO6_U1_CTSn | PIN_INPUT_PULLUP,
GPIO7_U1_RTSn | PIN_OUTPUT_HIGH,
};
static pin_cfg_t hrefv60_pins[] = {
/* WLAN */
GPIO85_GPIO | PIN_OUTPUT_LOW,/* WLAN_ENA */
/* XENON Flashgun INTERFACE */
GPIO6_IP_GPIO0 | PIN_INPUT_PULLUP,/* XENON_FLASH_ID */
GPIO7_IP_GPIO1 | PIN_INPUT_PULLUP,/* XENON_READY */
/* Assistant LED INTERFACE */
GPIO21_GPIO | PIN_OUTPUT_LOW, /* XENON_EN1 */
GPIO64_IP_GPIO4 | PIN_OUTPUT_LOW, /* XENON_EN2 */
/* Magnetometer */
GPIO31_GPIO | PIN_INPUT_PULLUP, /* magnetometer_INT */
GPIO32_GPIO | PIN_INPUT_PULLDOWN, /* Magnetometer DRDY */
/* Display Interface */
GPIO65_GPIO | PIN_OUTPUT_HIGH, /* DISP1 NO RST */
GPIO66_GPIO | PIN_OUTPUT_LOW, /* DISP2 RST */
/* Touch screen INTERFACE */
GPIO143_GPIO | PIN_OUTPUT_LOW,/*TOUCH_RST1 */
/* Touch screen INTERFACE 2 */
GPIO67_GPIO | PIN_INPUT_PULLUP, /* TOUCH_INT2 */
GPIO146_GPIO | PIN_OUTPUT_LOW,/*TOUCH_RST2 */
/* ETM_PTM_TRACE INTERFACE */
GPIO70_GPIO | PIN_OUTPUT_LOW,/* ETM_PTM_DATA23 */
GPIO71_GPIO | PIN_OUTPUT_LOW,/* ETM_PTM_DATA22 */
GPIO72_GPIO | PIN_OUTPUT_LOW,/* ETM_PTM_DATA21 */
GPIO73_GPIO | PIN_OUTPUT_LOW,/* ETM_PTM_DATA20 */
GPIO74_GPIO | PIN_OUTPUT_LOW,/* ETM_PTM_DATA19 */
/* NAHJ INTERFACE */
GPIO76_GPIO | PIN_OUTPUT_LOW,/* NAHJ_CTRL */
GPIO216_GPIO | PIN_OUTPUT_HIGH,/* NAHJ_CTRL_INV */
/* NFC INTERFACE */
GPIO77_GPIO | PIN_OUTPUT_LOW, /* NFC_ENA */
GPIO144_GPIO | PIN_INPUT_PULLDOWN, /* NFC_IRQ */
GPIO142_GPIO | PIN_OUTPUT_LOW, /* NFC_RESET */
/* Keyboard MATRIX INTERFACE */
GPIO90_MC5_CMD | PIN_OUTPUT_LOW, /* KP_O_1 */
GPIO87_MC5_DAT1 | PIN_OUTPUT_LOW, /* KP_O_2 */
GPIO86_MC5_DAT0 | PIN_OUTPUT_LOW, /* KP_O_3 */
GPIO96_KP_O6 | PIN_OUTPUT_LOW, /* KP_O_6 */
GPIO94_KP_O7 | PIN_OUTPUT_LOW, /* KP_O_7 */
GPIO93_MC5_DAT4 | PIN_INPUT_PULLUP, /* KP_I_0 */
GPIO89_MC5_DAT3 | PIN_INPUT_PULLUP, /* KP_I_2 */
GPIO88_MC5_DAT2 | PIN_INPUT_PULLUP, /* KP_I_3 */
GPIO91_GPIO | PIN_INPUT_PULLUP, /* FORCE_SENSING_INT */
GPIO92_GPIO | PIN_OUTPUT_LOW, /* FORCE_SENSING_RST */
GPIO97_GPIO | PIN_OUTPUT_LOW, /* FORCE_SENSING_WU */
/* DiPro Sensor Interface */
GPIO139_GPIO | PIN_INPUT_PULLUP, /* DIPRO_INT */
/* Audio Amplifier Interface */
GPIO149_GPIO | PIN_OUTPUT_HIGH, /* VAUDIO_HF_EN, enable MAX8968 */
/* GBF INTERFACE */
GPIO171_GPIO | PIN_OUTPUT_LOW, /* GBF_ENA_RESET */
/* MSP : HDTV INTERFACE */
GPIO192_GPIO | PIN_INPUT_PULLDOWN,
/* ACCELEROMETER_INTERFACE */
GPIO82_GPIO | PIN_INPUT_PULLUP, /* ACC_INT1 */
GPIO83_GPIO | PIN_INPUT_PULLUP, /* ACC_INT2 */
/* SD card detect */
GPIO95_GPIO | PIN_INPUT_PULLUP,
};
static pin_cfg_t u9500_pins[] = {
GPIO4_U1_RXD | PIN_INPUT_PULLUP,
GPIO5_U1_TXD | PIN_OUTPUT_HIGH,
GPIO144_GPIO | PIN_INPUT_PULLUP,/* WLAN_IRQ */
/* HSI */
GPIO219_HSIR_FLA0 | PIN_INPUT_PULLDOWN,
GPIO220_HSIR_DAT0 | PIN_INPUT_PULLDOWN,
GPIO221_HSIR_RDY0 | PIN_OUTPUT_LOW,
GPIO222_HSIT_FLA0 | PIN_OUTPUT_LOW,
GPIO223_HSIT_DAT0 | PIN_OUTPUT_LOW,
GPIO224_HSIT_RDY0 | PIN_INPUT_PULLDOWN,
GPIO225_HSIT_CAWAKE0 | PIN_INPUT_PULLDOWN, /* CA_WAKE0 */
GPIO226_GPIO | PIN_OUTPUT_HIGH, /* AC_WAKE0 */
};
static pin_cfg_t u8500_pins[] = {
GPIO226_GPIO | PIN_OUTPUT_LOW, /* WLAN_PMU_EN */
GPIO4_GPIO | PIN_INPUT_PULLUP,/* WLAN_IRQ */
};
static pin_cfg_t snowball_pins[] = {
/* SSP0, to AB8500 */
GPIO143_SSP0_CLK,
GPIO144_SSP0_FRM,
GPIO145_SSP0_RXD | PIN_PULL_DOWN,
GPIO146_SSP0_TXD,
/* MMC0: MicroSD card */
GPIO21_MC0_DAT31DIR | PIN_OUTPUT_HIGH,
/* MMC2: LAN */
GPIO86_SM_ADQ0,
GPIO87_SM_ADQ1,
GPIO88_SM_ADQ2,
GPIO89_SM_ADQ3,
GPIO90_SM_ADQ4,
GPIO91_SM_ADQ5,
GPIO92_SM_ADQ6,
GPIO93_SM_ADQ7,
GPIO94_SM_ADVn,
GPIO95_SM_CS0n,
GPIO96_SM_OEn,
GPIO97_SM_WEn,
GPIO128_SM_CKO,
GPIO130_SM_FBCLK,
GPIO131_SM_ADQ8,
GPIO132_SM_ADQ9,
GPIO133_SM_ADQ10,
GPIO134_SM_ADQ11,
GPIO135_SM_ADQ12,
GPIO136_SM_ADQ13,
GPIO137_SM_ADQ14,
GPIO138_SM_ADQ15,
/* RSTn_LAN */
GPIO141_GPIO | PIN_OUTPUT_HIGH,
/* Accelerometer/Magnetometer */
GPIO163_GPIO | PIN_INPUT_PULLUP, /* ACCEL_IRQ1 */
GPIO164_GPIO | PIN_INPUT_PULLUP, /* ACCEL_IRQ2 */
GPIO165_GPIO | PIN_INPUT_PULLUP, /* MAG_DRDY */
/* WLAN/GBF */
GPIO161_GPIO | PIN_OUTPUT_LOW, /* WLAN_PMU_EN */
GPIO171_GPIO | PIN_OUTPUT_HIGH,/* GBF_ENA */
GPIO215_GPIO | PIN_OUTPUT_LOW,/* WLAN_ENA */
GPIO216_GPIO | PIN_INPUT_PULLUP,/* WLAN_IRQ */
};
/*
* I2C
*/
static UX500_PINS(mop500_pins_i2c0,
GPIO147_I2C0_SCL |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
GPIO148_I2C0_SDA |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
);
static UX500_PINS(mop500_pins_i2c1,
GPIO16_I2C1_SCL |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
GPIO17_I2C1_SDA |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
);
static UX500_PINS(mop500_pins_i2c2,
GPIO10_I2C2_SDA |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
GPIO11_I2C2_SCL |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
);
static UX500_PINS(mop500_pins_i2c3,
GPIO229_I2C3_SDA |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
GPIO230_I2C3_SCL |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
);
static UX500_PINS(mop500_pins_mcde_tvout,
GPIO78_LCD_D8,
GPIO79_LCD_D9,
GPIO80_LCD_D10,
GPIO81_LCD_D11,
GPIO150_LCDA_CLK,
);
static UX500_PINS(mop500_pins_mcde_hdmi,
GPIO69_LCD_VSI1 | PIN_INPUT_PULLUP,
);
static UX500_PINS(mop500_pins_ske,
GPIO153_KP_I7 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO154_KP_I6 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO155_KP_I5 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO156_KP_I4 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO161_KP_I3 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO162_KP_I2 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO163_KP_I1 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO164_KP_I0 | PIN_INPUT_PULLDOWN | PIN_SLPM_INPUT_PULLUP,
GPIO157_KP_O7 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
GPIO158_KP_O6 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
GPIO159_KP_O5 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
GPIO160_KP_O4 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
GPIO165_KP_O3 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
GPIO166_KP_O2 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
GPIO167_KP_O1 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
GPIO168_KP_O0 | PIN_INPUT_PULLUP | PIN_SLPM_OUTPUT_LOW,
);
/* sdi0 (removable MMC/SD/SDIO cards) */
static UX500_PINS(mop500_pins_sdi0,
GPIO18_MC0_CMDDIR | PIN_OUTPUT_HIGH,
GPIO19_MC0_DAT0DIR | PIN_OUTPUT_HIGH,
GPIO20_MC0_DAT2DIR | PIN_OUTPUT_HIGH,
GPIO22_MC0_FBCLK | PIN_INPUT_NOPULL,
GPIO23_MC0_CLK | PIN_OUTPUT_LOW,
GPIO24_MC0_CMD | PIN_INPUT_PULLUP,
GPIO25_MC0_DAT0 | PIN_INPUT_PULLUP,
GPIO26_MC0_DAT1 | PIN_INPUT_PULLUP,
GPIO27_MC0_DAT2 | PIN_INPUT_PULLUP,
GPIO28_MC0_DAT3 | PIN_INPUT_PULLUP,
);
/* sdi1 (WLAN CW1200) */
static UX500_PINS(mop500_pins_sdi1,
GPIO208_MC1_CLK | PIN_OUTPUT_LOW,
GPIO209_MC1_FBCLK | PIN_INPUT_NOPULL,
GPIO210_MC1_CMD | PIN_INPUT_PULLUP,
GPIO211_MC1_DAT0 | PIN_INPUT_PULLUP,
GPIO212_MC1_DAT1 | PIN_INPUT_PULLUP,
GPIO213_MC1_DAT2 | PIN_INPUT_PULLUP,
GPIO214_MC1_DAT3 | PIN_INPUT_PULLUP,
);
/* sdi2 (POP eMMC) */
static UX500_PINS(mop500_pins_sdi2,
GPIO128_MC2_CLK | PIN_OUTPUT_LOW,
GPIO129_MC2_CMD | PIN_INPUT_PULLUP,
GPIO130_MC2_FBCLK | PIN_INPUT_NOPULL,
GPIO131_MC2_DAT0 | PIN_INPUT_PULLUP,
GPIO132_MC2_DAT1 | PIN_INPUT_PULLUP,
GPIO133_MC2_DAT2 | PIN_INPUT_PULLUP,
GPIO134_MC2_DAT3 | PIN_INPUT_PULLUP,
GPIO135_MC2_DAT4 | PIN_INPUT_PULLUP,
GPIO136_MC2_DAT5 | PIN_INPUT_PULLUP,
GPIO137_MC2_DAT6 | PIN_INPUT_PULLUP,
GPIO138_MC2_DAT7 | PIN_INPUT_PULLUP,
);
/* sdi4 (PCB eMMC) */
static UX500_PINS(mop500_pins_sdi4,
GPIO197_MC4_DAT3 | PIN_INPUT_PULLUP,
GPIO198_MC4_DAT2 | PIN_INPUT_PULLUP,
GPIO199_MC4_DAT1 | PIN_INPUT_PULLUP,
GPIO200_MC4_DAT0 | PIN_INPUT_PULLUP,
GPIO201_MC4_CMD | PIN_INPUT_PULLUP,
GPIO202_MC4_FBCLK | PIN_INPUT_NOPULL,
GPIO203_MC4_CLK | PIN_OUTPUT_LOW,
GPIO204_MC4_DAT7 | PIN_INPUT_PULLUP,
GPIO205_MC4_DAT6 | PIN_INPUT_PULLUP,
GPIO206_MC4_DAT5 | PIN_INPUT_PULLUP,
GPIO207_MC4_DAT4 | PIN_INPUT_PULLUP,
);
/* USB */
static UX500_PINS(mop500_pins_usb,
GPIO256_USB_NXT,
GPIO257_USB_STP | PIN_OUTPUT_HIGH,
GPIO258_USB_XCLK,
GPIO259_USB_DIR,
GPIO260_USB_DAT7,
GPIO261_USB_DAT6,
GPIO262_USB_DAT5,
GPIO263_USB_DAT4,
GPIO264_USB_DAT3,
GPIO265_USB_DAT2,
GPIO266_USB_DAT1,
GPIO267_USB_DAT0,
);
/* SPI2 */
static UX500_PINS(mop500_pins_spi2,
GPIO216_GPIO | PIN_OUTPUT_HIGH,
GPIO218_SPI2_RXD | PIN_INPUT_PULLDOWN,
GPIO215_SPI2_TXD | PIN_OUTPUT_LOW,
GPIO217_SPI2_CLK | PIN_OUTPUT_LOW,
);
static UX500_PINS(mop500_pins_sensors1p_v60,
GPIO217_GPIO| PIN_INPUT_PULLUP |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
GPIO145_GPIO | PIN_INPUT_PULLDOWN |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
GPIO139_GPIO | PIN_INPUT_PULLUP |
PIN_SLPM_GPIO | PIN_SLPM_INPUT_NOPULL,
);
static UX500_PINS(mop500_pins_sensors1p,
PIN_CFG_INPUT(GPIO_PROX_SENSOR, GPIO, NOPULL),
PIN_CFG_INPUT(GPIO_HAL_SENSOR, GPIO, NOPULL),
);
static struct ux500_pin_lookup mop500_runtime_pins[] = {
PIN_LOOKUP("mcde-tvout", &mop500_pins_mcde_tvout),
PIN_LOOKUP("av8100-hdmi", &mop500_pins_mcde_hdmi),
PIN_LOOKUP("nmk-i2c.0", &mop500_pins_i2c0),
PIN_LOOKUP("nmk-i2c.1", &mop500_pins_i2c1),
PIN_LOOKUP("nmk-i2c.2", &mop500_pins_i2c2),
PIN_LOOKUP("nmk-i2c.3", &mop500_pins_i2c3),
PIN_LOOKUP("sdi0", &mop500_pins_sdi0),
PIN_LOOKUP("sdi1", &mop500_pins_sdi1),
PIN_LOOKUP("sdi2", &mop500_pins_sdi2),
PIN_LOOKUP("sdi4", &mop500_pins_sdi4),
PIN_LOOKUP("musb-ux500.0", &mop500_pins_usb),
PIN_LOOKUP("spi2", &mop500_pins_spi2),
};
static struct ux500_pin_lookup mop500_runtime_pins_v60[] = {
PIN_LOOKUP("ske", &mop500_pins_ske),
PIN_LOOKUP("gpio-keys.0", &mop500_pins_sensors1p_v60),
};
static struct ux500_pin_lookup mop500_runtime_pins_pre_v60[] = {
PIN_LOOKUP("ske", &mop500_pins_ske),
PIN_LOOKUP("gpio-keys.0", &mop500_pins_sensors1p),
};
/*
* passing "pinsfor=" in kernel cmdline allows for custom
* configuration of GPIOs on u8500 derived boards.
*/
static int __init early_pinsfor(char *p)
{
pinsfor = PINS_FOR_DEFAULT;
if (strcmp(p, "u9500-21") == 0)
pinsfor = PINS_FOR_U9500;
return 0;
}
early_param("pinsfor", early_pinsfor);
int pins_for_u9500(void)
{
if (pinsfor == PINS_FOR_U9500)
return 1;
return 0;
}
void __init mop500_pins_init(void)
{
nmk_config_pins(mop500_pins_common,
ARRAY_SIZE(mop500_pins_common));
ux500_pins_add(mop500_runtime_pins, ARRAY_SIZE(mop500_runtime_pins));
ux500_pins_add(mop500_runtime_pins_pre_v60,
ARRAY_SIZE(mop500_runtime_pins_pre_v60));
switch (pinsfor) {
case PINS_FOR_U9500:
nmk_config_pins(u9500_pins, ARRAY_SIZE(u9500_pins));
break;
case PINS_FOR_DEFAULT:
nmk_config_pins(u8500_pins, ARRAY_SIZE(u8500_pins));
default:
break;
}
nmk_config_pins(mop500_pins_default,
ARRAY_SIZE(mop500_pins_default));
}
void __init snowball_pins_init(void)
{
nmk_config_pins(mop500_pins_common,
ARRAY_SIZE(mop500_pins_common));
ux500_pins_add(mop500_runtime_pins, ARRAY_SIZE(mop500_runtime_pins));
nmk_config_pins(u8500_pins, ARRAY_SIZE(u8500_pins));
nmk_config_pins(snowball_pins, ARRAY_SIZE(snowball_pins));
}
void __init hrefv60_pins_init(void)
{
nmk_config_pins(mop500_pins_common,
ARRAY_SIZE(mop500_pins_common));
ux500_pins_add(mop500_runtime_pins, ARRAY_SIZE(mop500_runtime_pins));
ux500_pins_add(mop500_runtime_pins_v60,
ARRAY_SIZE(mop500_runtime_pins_v60));
nmk_config_pins(hrefv60_pins,
ARRAY_SIZE(hrefv60_pins));
switch (pinsfor) {
case PINS_FOR_U9500:
nmk_config_pins(u9500_pins, ARRAY_SIZE(u9500_pins));
break;
case PINS_FOR_DEFAULT:
nmk_config_pins(u8500_pins, ARRAY_SIZE(u8500_pins));
default:
break;
}
}