/* * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved. */ /* * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html */ #include #include #include #include #include #include #include #include #include #include "iomux.h" /*! * @file mx37_3stack_gpio.c * * @brief This file contains all the GPIO setup functions for the board. * * @ingroup GPIO */ void gpio_activate_audio_ports(void); /*! * Setup GPIO for a UART port to be active * * @param port a UART port * @param no_irda indicates if the port is used for SIR */ void gpio_uart_active(int port, int no_irda) { /* * Configure the IOMUX control registers for the UART signals * and enable the UART transceivers */ switch (port) { /* UART 1 IOMUX Configs */ case 0: mxc_request_iomux(MX37_PIN_UART1_RXD, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_UART1_RXD, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); mxc_iomux_set_input(MUX_IN_UART1_UART_RXD_MUX, INPUT_CTL_PATH4); mxc_request_iomux(MX37_PIN_UART1_TXD, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_UART1_TXD, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); mxc_request_iomux(MX37_PIN_UART1_RTS, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_UART1_RTS, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH); mxc_iomux_set_input(MUX_IN_UART1_UART_RTS_B, INPUT_CTL_PATH4); mxc_request_iomux(MX37_PIN_UART1_CTS, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_UART1_CTS, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH); break; case 1: mxc_request_iomux(MX37_PIN_UART1_DCD, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_UART1_DCD, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); mxc_iomux_set_input(MUX_IN_UART2_UART_RXD_MUX, INPUT_CTL_PATH1); mxc_request_iomux(MX37_PIN_UART1_RI, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_UART1_RI, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); mxc_request_iomux(MX37_PIN_UART1_DSR, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_UART1_DSR, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH); mxc_iomux_set_input(MUX_IN_UART2_UART_RTS_B, INPUT_CTL_PATH1); mxc_request_iomux(MX37_PIN_UART1_DTR, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_UART1_DTR, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH); break; case 2: mxc_request_iomux(MX37_PIN_AUD3_BB_TXD, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_AUD3_BB_TXD, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); mxc_iomux_set_input(MUX_IN_UART3_UART_RXD_MUX, INPUT_CTL_PATH0); mxc_request_iomux(MX37_PIN_AUD3_BB_RXD, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_AUD3_BB_RXD, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST); mxc_request_iomux(MX37_PIN_AUD3_BB_CK, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_AUD3_BB_CK, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH); mxc_iomux_set_input(MUX_IN_UART3_UART_RTS_B, INPUT_CTL_PATH0); mxc_request_iomux(MX37_PIN_AUD3_BB_FS, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_AUD3_BB_FS, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH); break; default: break; } } /*! * Setup GPIO for a UART port to be inactive * * @param port a UART port * @param no_irda indicates if the port is used for SIR */ void gpio_uart_inactive(int port, int no_irda) { /* * Configure the IOMUX control registers for the UART signals * and disable the UART transceivers */ switch (port) { case 0: mxc_request_iomux(MX37_PIN_UART1_RXD, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_UART1_TXD, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_UART1_RTS, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_UART1_CTS, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_RXD, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_TXD, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_RTS, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_CTS, IOMUX_CONFIG_GPIO); break; case 1: mxc_request_iomux(MX37_PIN_UART1_DCD, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_UART1_RI, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_UART1_DSR, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_UART1_DTR, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_DCD, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_RI, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_DSR, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_UART1_DTR, IOMUX_CONFIG_GPIO); break; /* UART 3 IOMUX Configs */ case 2: mxc_request_iomux(MX37_PIN_AUD3_BB_TXD, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_AUD3_BB_TXD, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_AUD3_BB_RXD, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_AUD3_BB_RXD, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_AUD3_BB_CK, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_AUD3_BB_CK, IOMUX_CONFIG_GPIO); mxc_request_iomux(MX37_PIN_AUD3_BB_FS, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_AUD3_BB_FS, IOMUX_CONFIG_GPIO); break; default: break; } } /*! * Configure the IOMUX GPR register to receive shared SDMA UART events * * @param port a UART port */ void config_uartdma_event(int port) { } EXPORT_SYMBOL(gpio_uart_active); EXPORT_SYMBOL(gpio_uart_inactive); EXPORT_SYMBOL(config_uartdma_event); /*! * Setup GPIO for a CSPI device to be active * * @param cspi_mod an CSPI device */ void gpio_spi_active(int cspi_mod) { switch (cspi_mod) { case 0: break; case 1: /* SPI2 */ mxc_request_iomux(MX37_PIN_CSPI2_MISO, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_CSPI2_MISO, PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_GRP_H9, PAD_CTL_HYS_ENABLE); mxc_request_iomux(MX37_PIN_CSPI2_MOSI, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_CSPI2_MOSI, PAD_CTL_SRE_FAST); mxc_request_iomux(MX37_PIN_UART1_CTS, IOMUX_CONFIG_ALT3); mxc_iomux_set_pad(MX37_PIN_UART1_CTS, PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE); mxc_request_iomux(MX37_PIN_CSPI2_SCLK, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_CSPI2_SCLK, PAD_CTL_HYS_ENABLE | PAD_CTL_SRE_FAST); mxc_request_iomux(MX37_PIN_CSPI2_SS1, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_CSPI2_SS1, PAD_CTL_SRE_FAST); mxc_request_iomux(MX37_PIN_CSPI2_SS0, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_CSPI2_SS0, PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_GRP_H10, PAD_CTL_HYS_ENABLE); break; case 2: break; default: break; } } /*! * Setup GPIO for a CSPI device to be inactive * * @param cspi_mod a CSPI device */ void gpio_spi_inactive(int cspi_mod) { } /*! * Setup 1-Wire to be active */ void gpio_owire_active(void) { /*TODO*/} /*! * Setup 1-Wire to be active */ void gpio_owire_inactive(void) { /*TODO*/} EXPORT_SYMBOL(gpio_owire_active); EXPORT_SYMBOL(gpio_owire_inactive); /*! * Setup GPIO for an I2C device to be active * * @param i2c_num an I2C device */ void gpio_i2c_active(int i2c_num) { iomux_pad_config_t regval = 0; switch (i2c_num) { case 0: /* Touch */ /* select I2C1_SCK as daisy chain input */ mxc_request_iomux(MX37_PIN_I2C1_CLK, IOMUX_CONFIG_ALT0); mxc_iomux_set_input(MUX_IN_I2C1_SCL, INPUT_CTL_PATH1); /* OpenDrain enabled, 100k PU enabled */ regval = PAD_CTL_ODE_OPENDRAIN_ENABLE | PAD_CTL_100K_PU | PAD_CTL_PKE_ENABLE; mxc_iomux_set_pad(MX37_PIN_I2C1_CLK, regval); /*select I2C1_SDA as daisy chain input */ mxc_request_iomux(MX37_PIN_I2C1_DAT, IOMUX_CONFIG_ALT0); mxc_iomux_set_input(MUX_IN_I2C1_SDA, INPUT_CTL_PATH1); mxc_iomux_set_pad(MX37_PIN_I2C1_DAT, regval); mxc_iomux_set_pad(MX37_PIN_GRP_H3, PAD_CTL_HYS_ENABLE); break; case 1: /* PMIC */ /*select I2C2_SCL as daisy chain input */ mxc_iomux_set_input(MUX_IN_I2C2_SCL, INPUT_CTL_PATH1); regval = PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_ENABLE | PAD_CTL_DRV_HIGH; mxc_iomux_set_pad(MX37_PIN_GPIO1_0, regval); mxc_request_iomux(MX37_PIN_GPIO1_0, (IOMUX_CONFIG_SION | IOMUX_CONFIG_ALT2)); /*select I2C2_SDA as daisy chain input */ mxc_iomux_set_input(MUX_IN_I2C2_SDA, INPUT_CTL_PATH1); mxc_iomux_set_pad(MX37_PIN_GPIO1_1, regval); mxc_request_iomux(MX37_PIN_GPIO1_1, (IOMUX_CONFIG_SION | IOMUX_CONFIG_ALT2)); break; case 2: break; default: break; } } /*! * Setup GPIO for an I2C device to be inactive * * @param i2c_num an I2C device */ void gpio_i2c_inactive(int i2c_num) { /*TODO*/} /*! * This function activates DAM ports 4 & 5 to enable * audio I/O. */ void gpio_activate_audio_ports(void) { unsigned int pad_val; /* AUD4_TXD */ mxc_request_iomux(MX37_PIN_DISP1_DAT20, IOMUX_CONFIG_ALT5); /* AUD4_RXD */ mxc_request_iomux(MX37_PIN_DISP1_DAT21, IOMUX_CONFIG_ALT5); /* AUD4_TXC */ mxc_request_iomux(MX37_PIN_DISP1_DAT22, IOMUX_CONFIG_ALT5); /* AUD4_TXFS */ mxc_request_iomux(MX37_PIN_DISP1_DAT23, IOMUX_CONFIG_ALT5); pad_val = PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST; mxc_iomux_set_pad(MX37_PIN_AUD5_WB_CK, PAD_CTL_100K_PU | pad_val); mxc_request_iomux(MX37_PIN_AUD5_WB_CK, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_AUD5_WB_RXD, pad_val); mxc_request_iomux(MX37_PIN_AUD5_WB_RXD, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_AUD5_WB_TXD, pad_val); mxc_request_iomux(MX37_PIN_AUD5_WB_TXD, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_AUD5_WB_FS, PAD_CTL_100K_PU | pad_val); mxc_request_iomux(MX37_PIN_AUD5_WB_FS, IOMUX_CONFIG_ALT0); /* Enable hysteresis for AUD5_WB_CK, AUD5_WB_RXD, AUD5_WB_TXD, AUD5_WB_FS */ mxc_iomux_set_pad(MX37_PIN_GRP_H5, PAD_CTL_HYS_ENABLE); } EXPORT_SYMBOL(gpio_activate_audio_ports); /*! * Setup GPIO for SDHC to be active * * @param module SDHC module number */ void gpio_sdhc_active(int module) { switch (module) { case 0: mxc_request_iomux(MX37_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD1_DATA0, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD1_DATA1, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD1_DATA2, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD1_DATA3, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_iomux_set_pad(MX37_PIN_SD1_CMD, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD1_CLK, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD1_DATA0, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD1_DATA1, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD1_DATA2, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD1_DATA3, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); /* Write Protected Pin */ mxc_request_iomux(MX37_PIN_CSPI1_SS0, IOMUX_CONFIG_SION | IOMUX_CONFIG_ALT4); mxc_iomux_set_pad(MX37_PIN_CSPI1_SS0, PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_SRE_FAST); /* * SW workaround for the eSDHC1 Write Protected feature * The PSR of CSPI1_SS0 (GPIO3_2) should be read. */ gpio_request(IOMUX_TO_GPIO(MX37_PIN_CSPI1_SS0), "cspi1_ss0"); gpio_direction_output(IOMUX_TO_GPIO(MX37_PIN_CSPI1_SS0), 0); gpio_set_value(IOMUX_TO_GPIO(MX37_PIN_CSPI1_SS0), 1); break; case 1: mxc_request_iomux(MX37_PIN_SD2_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD2_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD2_DATA0, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD2_DATA1, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD2_DATA2, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_request_iomux(MX37_PIN_SD2_DATA3, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_iomux_set_pad(MX37_PIN_SD2_CMD, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD2_CLK, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD2_DATA0, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD2_DATA1, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD2_DATA2, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); mxc_iomux_set_pad(MX37_PIN_SD2_DATA3, PAD_CTL_DRV_MAX | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_PULL | PAD_CTL_47K_PU | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); break; default: break; } } EXPORT_SYMBOL(gpio_sdhc_active); /*! * Setup GPIO for SDHC1 to be inactive * * @param module SDHC module number */ void gpio_sdhc_inactive(int module) { switch (module) { case 0: mxc_free_iomux(MX37_PIN_SD1_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD1_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD1_DATA0, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD1_DATA1, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD1_DATA2, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD1_DATA3, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_iomux_set_pad(MX37_PIN_SD1_CLK, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD1_CMD, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD1_DATA0, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD1_DATA1, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD1_DATA2, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD1_DATA3, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); /* Free Write Protected Pin */ mxc_free_iomux(MX37_PIN_CSPI1_SS0, IOMUX_CONFIG_SION | IOMUX_CONFIG_ALT4); mxc_iomux_set_pad(MX37_PIN_CSPI1_SS0, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); break; case 1: mxc_free_iomux(MX37_PIN_SD2_CLK, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD2_CMD, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD2_DATA0, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD2_DATA1, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD2_DATA2, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_free_iomux(MX37_PIN_SD2_DATA3, IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION); mxc_iomux_set_pad(MX37_PIN_SD2_CLK, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD2_CMD, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD2_DATA0, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD2_DATA1, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD2_DATA2, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); mxc_iomux_set_pad(MX37_PIN_SD2_DATA3, (PAD_CTL_DRV_LOW | PAD_CTL_SRE_SLOW)); break; default: break; } } EXPORT_SYMBOL(gpio_sdhc_inactive); /* * Probe for the card. If present the GPIO data would be set. */ int sdhc_get_card_det_status(struct device *dev) { int ret; u32 gpio = IOMUX_TO_GPIO(MX37_PIN_OWIRE_LINE); if (to_platform_device(dev)->id == 0) { if (board_is_rev(BOARD_REV_2)) ret = gpio_get_value(IOMUX_TO_GPIO(MX37_PIN_GPIO1_4)); else ret = gpio_get_value(gpio); return ret; } else { /* config the det pin for SDHC2 */ return 0; } } EXPORT_SYMBOL(sdhc_get_card_det_status); /* * Return the card detect pin. */ int sdhc_init_card_det(int id) { u32 gpio; if (id == 0) { if (board_is_rev(BOARD_REV_2)) { gpio = IOMUX_TO_GPIO(MX37_PIN_GPIO1_4); mxc_request_iomux(MX37_PIN_GPIO1_4, IOMUX_CONFIG_ALT0); mxc_iomux_set_pad(MX37_PIN_GPIO1_4, PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_NONE | PAD_CTL_SRE_FAST); gpio_request(gpio, "gpio1_4"); gpio_direction_input(gpio); return IOMUX_TO_IRQ(MX37_PIN_GPIO1_4); } else { gpio = IOMUX_TO_GPIO(MX37_PIN_OWIRE_LINE); mxc_request_iomux(MX37_PIN_OWIRE_LINE, IOMUX_CONFIG_ALT4); mxc_iomux_set_pad(MX37_PIN_OWIRE_LINE, PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_NONE | PAD_CTL_SRE_FAST); gpio_request(gpio, "owire_line"); gpio_direction_input(gpio); return IOMUX_TO_IRQ(MX37_PIN_OWIRE_LINE); } } else { /* config the det pin for SDHC2 */ return 0; } } EXPORT_SYMBOL(sdhc_init_card_det); /*! * Get CSPI1_SS0 pin value to detect write protection */ int sdhc_write_protect(struct device *dev) { unsigned short rc = 0; rc = gpio_get_value(IOMUX_TO_GPIO(MX37_PIN_CSPI1_SS0)); if (rc > 0) return 1; else return 0; } EXPORT_SYMBOL(sdhc_write_protect); /*! * Setup GPIO for LCD to be active * */ void gpio_lcd_active(void) { mxc_request_iomux(MX37_PIN_DI1_PIN2, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_PAD_DI1_PIN3, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_DISP_CLK, IOMUX_CONFIG_ALT0); } /*! * Setup GPIO for LCD to be inactive * */ void gpio_lcd_inactive(void) { /*TODO*/} /*! * Setup pins for SLCD to be active * */ void slcd_gpio_config(void) { /*TODO*/} /*! * Switch to the specified sensor - MX33 ADS has two * */ void gpio_sensor_select(int sensor) { /*TODO*/} /*! * Setup GPIO for sensor to be active * */ void gpio_sensor_active(void) { /*TODO*/} EXPORT_SYMBOL(gpio_sensor_active); /*! * Setup GPIO for sensor to be inactive * */ void gpio_sensor_inactive(void) { /*TODO*/} EXPORT_SYMBOL(gpio_sensor_inactive); /*! * Setup GPIO for ATA interface * */ void gpio_ata_active(void) { /*IOMUX Settings */ /*PATA_DMARQ_B */ mxc_request_iomux(MX37_PIN_NANDF_RE_B, IOMUX_CONFIG_ALT1); /*PATA_DIOR */ mxc_request_iomux(MX37_PIN_NANDF_ALE, IOMUX_CONFIG_ALT1); /*PATA_DIOW */ mxc_request_iomux(MX37_PIN_NANDF_CLE, IOMUX_CONFIG_ALT1); /*PATA_DMACK */ mxc_request_iomux(MX37_PIN_NANDF_WP_B, IOMUX_CONFIG_ALT1); /*PATA_RESET_B */ mxc_request_iomux(MX37_PIN_NANDF_RB, IOMUX_CONFIG_ALT1); /*PATA_IORDY */ mxc_request_iomux(MX37_PIN_NANDF_CS0, IOMUX_CONFIG_ALT1); /*PATA_INTRQ_B */ mxc_request_iomux(MX37_PIN_NANDF_CS1, IOMUX_CONFIG_ALT1); /*PATA_CS_0 */ mxc_request_iomux(MX37_PIN_NANDF_CS2, IOMUX_CONFIG_ALT1); /*PATA_CS_1 */ mxc_request_iomux(MX37_PIN_NANDF_CS3, IOMUX_CONFIG_ALT1); /*PATA_D0 */ mxc_request_iomux(MX37_PIN_EIM_D0, IOMUX_CONFIG_ALT1); /*PATA_D1 */ mxc_request_iomux(MX37_PIN_EIM_D1, IOMUX_CONFIG_ALT1); /*PATA_D2 */ mxc_request_iomux(MX37_PIN_EIM_D2, IOMUX_CONFIG_ALT1); /*PATA_D3 */ mxc_request_iomux(MX37_PIN_EIM_D3, IOMUX_CONFIG_ALT1); /*PATA_D4 */ mxc_request_iomux(MX37_PIN_EIM_D4, IOMUX_CONFIG_ALT1); /*PATA_D5 */ mxc_request_iomux(MX37_PIN_EIM_D5, IOMUX_CONFIG_ALT1); /*PATA_D6 */ mxc_request_iomux(MX37_PIN_EIM_D6, IOMUX_CONFIG_ALT1); /*PATA_D7 */ mxc_request_iomux(MX37_PIN_EIM_D7, IOMUX_CONFIG_ALT1); /*PATA_D8 */ mxc_request_iomux(MX37_PIN_EIM_D8, IOMUX_CONFIG_ALT1); /*PATA_D9 */ mxc_request_iomux(MX37_PIN_EIM_D9, IOMUX_CONFIG_ALT1); /*PATA_D10 */ mxc_request_iomux(MX37_PIN_EIM_D10, IOMUX_CONFIG_ALT1); /*PATA_D11 */ mxc_request_iomux(MX37_PIN_EIM_D11, IOMUX_CONFIG_ALT1); /*PATA_D12 */ mxc_request_iomux(MX37_PIN_EIM_D12, IOMUX_CONFIG_ALT1); /*PATA_D13 */ mxc_request_iomux(MX37_PIN_EIM_D13, IOMUX_CONFIG_ALT1); /*PATA_D14 */ mxc_request_iomux(MX37_PIN_EIM_D14, IOMUX_CONFIG_ALT1); /*PATA_D15 */ mxc_request_iomux(MX37_PIN_EIM_D15, IOMUX_CONFIG_ALT1); /*PATA_DA0 */ mxc_request_iomux(MX37_PIN_SD2_DATA3, IOMUX_CONFIG_ALT1); /*PATA_DA1 */ mxc_request_iomux(MX37_PIN_SD2_DATA2, IOMUX_CONFIG_ALT1); /*PATA_DA2 */ mxc_request_iomux(MX37_PIN_SD2_DATA1, IOMUX_CONFIG_ALT1); /* BUFFER_ENABLE - HDD_ENABLE_B */ mxc_request_iomux(MX37_PIN_NANDF_WE_B, IOMUX_CONFIG_ALT1); /* IOMUX Pad Settings */ mxc_iomux_set_pad(MX37_PIN_EIM_D0, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D1, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D2, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D3, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D4, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D5, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D6, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D7, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D8, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D9, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D10, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D11, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D12, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D13, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D14, 0xc0); mxc_iomux_set_pad(MX37_PIN_EIM_D15, 0xc0); mxc_iomux_set_pad(MX37_PIN_NANDF_RE_B, 0x0080); mxc_iomux_set_pad(MX37_PIN_NANDF_CS1, 0x0020); mxc_iomux_set_pad(MX37_PIN_SD2_DATA3, 0x00); mxc_iomux_set_pad(MX37_PIN_SD2_DATA2, 0x00); mxc_iomux_set_pad(MX37_PIN_SD2_DATA1, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_ALE, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_CS2, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_CS3, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_WE_B, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_CLE, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_WP_B, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_RB, 0x00); mxc_iomux_set_pad(MX37_PIN_NANDF_CS0, 0x0020); } EXPORT_SYMBOL(gpio_ata_active); /*! * Restore ATA interface pins to reset values * */ void gpio_ata_inactive(void) { /*Turn off the IOMUX for ATA group B signals */ mxc_request_iomux(MX37_PIN_EIM_D0, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D1, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D2, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D3, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D4, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D5, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D6, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D7, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D8, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D9, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D10, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D11, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D12, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D13, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D14, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_EIM_D15, IOMUX_CONFIG_ALT0); /* Config the multiplex pin of ATA interface DIR, DA0-2, INTRQ, DMARQ */ mxc_request_iomux(MX37_PIN_NANDF_RE_B, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_CS1, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_SD2_DATA3, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_SD2_DATA2, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_SD2_DATA1, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_ALE, IOMUX_CONFIG_ALT0); /* HDD_BUFF_EN (H:A->B, L:B->A) and HDD_ENABLE_B(H:Disable,L:Enable) */ mxc_free_iomux(MX37_PIN_NANDF_WE_B, IOMUX_CONFIG_ALT0); /* These ATA pins are common to Group A and Group B */ mxc_request_iomux(MX37_PIN_NANDF_CS2, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_CS3, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_ALE, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_CLE, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_WP_B, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_RB, IOMUX_CONFIG_ALT0); mxc_request_iomux(MX37_PIN_NANDF_CS0, IOMUX_CONFIG_ALT0); } EXPORT_SYMBOL(gpio_ata_inactive); /*! * Setup GPIO for Keypad to be active * */ void gpio_keypad_active(void) { int pad_val; /* * Configure the IOMUX control register for keypad signals. */ /*KEY_INT */ mxc_request_iomux(MX37_PIN_GPIO1_3, IOMUX_CONFIG_ALT0); /*KEY_WAKE */ mxc_request_iomux(MX37_PIN_DISP1_DAT18, IOMUX_CONFIG_ALT4); /* fast slew rate */ pad_val = (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_22K_PU | \ PAD_CTL_ODE_OPENDRAIN_ENABLE | PAD_CTL_HYS_NONE | \ PAD_CTL_DDR_INPUT_CMOS | PAD_CTL_DRV_VOT_LOW); /*KEY_INT */ mxc_iomux_set_pad(MX37_PIN_GPIO1_3, pad_val); /* fast slew rate */ pad_val = (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | \ PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_HYS_NONE | \ PAD_CTL_DDR_INPUT_CMOS | PAD_CTL_DRV_VOT_LOW); /*KEY_WAKE */ mxc_iomux_set_pad(MX37_PIN_DISP1_DAT18, pad_val); gpio_request(IOMUX_TO_GPIO(MX37_PIN_DISP1_DAT18), "disp1_dat18"); gpio_direction_output(IOMUX_TO_GPIO(MX37_PIN_DISP1_DAT18), 0); gpio_request(IOMUX_TO_GPIO(MX37_PIN_GPIO1_3), "gpio1_3"); gpio_direction_input(IOMUX_TO_GPIO(MX37_PIN_GPIO1_3)); /* drive initial value */ gpio_set_value(IOMUX_TO_GPIO(MX37_PIN_DISP1_DAT18), 1); } EXPORT_SYMBOL(gpio_keypad_active); /*! * Setup GPIO for Keypad to be inactive * */ void gpio_keypad_inactive(void) { /*KEY_INT */ mxc_request_iomux(MX37_PIN_GPIO1_3, IOMUX_CONFIG_ALT0); /*KEY_WAKE */ mxc_request_iomux(MX37_PIN_DISP1_DAT18, IOMUX_CONFIG_ALT0); } EXPORT_SYMBOL(gpio_keypad_inactive); /* * USB OTG HS port */ int gpio_usbotg_hs_active(void) { /*TODO*/ return 0; } EXPORT_SYMBOL(gpio_usbotg_hs_active); void gpio_usbotg_hs_inactive(void) { /*TODO*/} EXPORT_SYMBOL(gpio_usbotg_hs_inactive); /*! * Setup GPIO for PCMCIA interface * */ void gpio_pcmcia_active(void) { /*TODO*/} EXPORT_SYMBOL(gpio_pcmcia_active); /*! * Setup GPIO for pcmcia to be inactive */ void gpio_pcmcia_inactive(void) { /*TODO*/} EXPORT_SYMBOL(gpio_pcmcia_inactive); /*! * Setup GPIO for fec to be active */ void gpio_fec_active(void) { /*TODO*/} EXPORT_SYMBOL(gpio_fec_active); /*! * Setup GPIO for fec to be inactive */ void gpio_fec_inactive(void) { /*TODO*/} EXPORT_SYMBOL(gpio_fec_inactive); void gpio_spdif_active(void) { iomux_pad_config_t regval = 0; regval = PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU; mxc_iomux_set_pad(MX37_PIN_AUD3_BB_RXD, regval); mxc_request_iomux(MX37_PIN_AUD3_BB_RXD, IOMUX_CONFIG_ALT1); } EXPORT_SYMBOL(gpio_spdif_active); void gpio_spdif_inactive(void) { mxc_free_iomux(MX37_PIN_AUD3_BB_RXD, IOMUX_CONFIG_ALT1); } EXPORT_SYMBOL(gpio_spdif_inactive); void gpio_pmic_active(void) { mxc_request_iomux(MX37_PIN_OWIRE_LINE, IOMUX_CONFIG_GPIO); mxc_iomux_set_pad(MX37_PIN_OWIRE_LINE, PAD_CTL_SRE_SLOW | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_DRV_MEDIUM | PAD_CTL_100K_PU | PAD_CTL_HYS_ENABLE | PAD_CTL_DRV_VOT_HIGH | PAD_CTL_DDR_INPUT_CMOS); gpio_request(IOMUX_TO_GPIO(MX37_PIN_OWIRE_LINE), "owire_line"); gpio_direction_input(IOMUX_TO_GPIO(MX37_PIN_OWIRE_LINE)); } EXPORT_SYMBOL(gpio_pmic_active); void gpio_gps_active(void) { /* PWR_EN */ mxc_request_iomux(MX37_PIN_EIM_OE, IOMUX_CONFIG_GPIO); mxc_iomux_set_pad(MX37_PIN_EIM_OE, PAD_CTL_100K_PU | PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); gpio_request(IOMUX_TO_GPIO(MX37_PIN_EIM_OE), "eim_oe"); gpio_direction_output(IOMUX_TO_GPIO(MX37_PIN_EIM_OE), 0); /* RESET */ mxc_request_iomux(MX37_PIN_EIM_BCLK, IOMUX_CONFIG_GPIO); mxc_iomux_set_pad(MX37_PIN_EIM_BCLK, PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_ODE_OPENDRAIN_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST); gpio_request(IOMUX_TO_GPIO(MX37_PIN_EIM_BCLK), "eim_bclk"); gpio_direction_output(IOMUX_TO_GPIO(MX37_PIN_EIM_BCLK), 0); gpio_set_value(IOMUX_TO_GPIO(MX37_PIN_EIM_OE), 0); gpio_set_value(IOMUX_TO_GPIO(MX37_PIN_EIM_BCLK), 0); msleep(5); gpio_set_value(IOMUX_TO_GPIO(MX37_PIN_EIM_BCLK), 1); msleep(5); } EXPORT_SYMBOL(gpio_gps_active); int gpio_gps_access(int para) { iomux_pin_name_t pin; pin = (para & 0x1) ? MX37_PIN_EIM_OE : MX37_PIN_EIM_BCLK; if (para & 0x4) return gpio_get_value(IOMUX_TO_GPIO(pin)); else if (para & 0x2) gpio_set_value(IOMUX_TO_GPIO(pin), 1); else gpio_set_value(IOMUX_TO_GPIO(pin), 0); return 0; } EXPORT_SYMBOL(gpio_gps_access); void gpio_gps_inactive(void) { mxc_free_iomux(MX37_PIN_EIM_BCLK, IOMUX_CONFIG_GPIO); mxc_free_iomux(MX37_PIN_EIM_OE, IOMUX_CONFIG_GPIO); } EXPORT_SYMBOL(gpio_gps_inactive); int headphone_det_status(void) { return gpio_get_value(IOMUX_TO_GPIO(MX37_PIN_AUD5_RXFS)); } EXPORT_SYMBOL(headphone_det_status);