/* * Copyright (C) ST-Ericsson SA 2010 * * License terms: GNU General Public License (GPL) version 2 */ #include #include #include #include #include #include #include #include #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; } }