arm: tegra: cardhu: add support for PM315
[linux-2.6.git] / arch / arm / mach-tegra / board-cardhu-pinmux.c
index 1b736a4..9050ff5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/arm/mach-tegra/board-cardhu-pinmux.c
  *
- * Copyright (C) 2010-2011 NVIDIA Corporation
+ * Copyright (C) 2011-2012, NVIDIA Corporation
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
 
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/gpio.h>
 #include <mach/pinmux.h>
+#include <mach/pinmux-tegra30.h>
+#include <mach/gpio-tegra.h>
 #include "board.h"
 #include "board-cardhu.h"
+#include "devices.h"
 #include "gpio-names.h"
 
 #define DEFAULT_DRIVE(_name)                                   \
@@ -66,6 +70,7 @@ static __initdata struct tegra_drive_pingroup_config cardhu_drive_pinmux[] = {
        /* DEFAULT_DRIVE(<pin_group>), */
        /* SET_DRIVE(ATA, DISABLE, DISABLE, DIV_1, 31, 31, FAST, FAST) */
        SET_DRIVE(DAP2,         DISABLE, ENABLE, DIV_1, 31, 31, FASTEST, FASTEST),
+       SET_DRIVE(DAP1,         DISABLE, ENABLE, DIV_1, 31, 31, FASTEST, FASTEST),
 
        /* All I2C pins are driven to maximum drive strength */
        /* GEN1 I2C */
@@ -135,6 +140,17 @@ static __initdata struct tegra_drive_pingroup_config cardhu_drive_pinmux[] = {
                .od             = TEGRA_PIN_OD_DEFAULT,         \
                .ioreset        = TEGRA_PIN_IO_RESET_##_ioreset \
        }
+#define CEC_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _od) \
+       {                                                       \
+               .pingroup       = TEGRA_PINGROUP_##_pingroup,   \
+                       .func           = TEGRA_MUX_##_mux,             \
+                       .pupd           = TEGRA_PUPD_##_pupd,           \
+                       .tristate       = TEGRA_TRI_##_tri,             \
+                       .io             = TEGRA_PIN_##_io,              \
+                       .lock           = TEGRA_PIN_LOCK_##_lock,       \
+                       .od             = TEGRA_PIN_OD_##_od,           \
+                       .ioreset        = TEGRA_PIN_IO_RESET_DEFAULT,   \
+       }
 
 static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        /* SDMMC1 pinmux */
@@ -188,6 +204,9 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        I2C_PINMUX(PWR_I2C_SCL,         I2CPWR,         NORMAL, NORMAL, INPUT,  DISABLE,        ENABLE),
        I2C_PINMUX(PWR_I2C_SDA,         I2CPWR,         NORMAL, NORMAL, INPUT,  DISABLE,        ENABLE),
 
+       /* HDMI-CEC  pinmux */
+       CEC_PINMUX(HDMI_CEC,    CEC,    NORMAL,        NORMAL, INPUT,  DISABLE,        ENABLE),
+
        DEFAULT_PINMUX(ULPI_DATA0,      UARTA,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(ULPI_DATA1,      UARTA,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(ULPI_DATA2,      UARTA,           NORMAL,    NORMAL,     INPUT),
@@ -204,7 +223,7 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(DAP3_DIN,        I2S2,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP3_DOUT,       I2S2,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP3_SCLK,       I2S2,            NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(GPIO_PV2,        OWR,             NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(GPIO_PV2,        RSVD1,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GPIO_PV3,        RSVD1,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(CLK2_OUT,        EXTPERIPH2,      NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(CLK2_REQ,        DAP,             NORMAL,    NORMAL,     INPUT),
@@ -268,7 +287,7 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(GPIO_PU1,        RSVD1,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GPIO_PU2,        RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PU3,        RSVD1,           NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(GPIO_PU4,        PWM1,            NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(GPIO_PU4,        RSVD1,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GPIO_PU5,        PWM2,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PU6,        RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP4_FS,         I2S3,            NORMAL,    NORMAL,     INPUT),
@@ -422,6 +441,13 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_e118x[] = {
        DEFAULT_PINMUX(GMI_AD15,        NAND,            PULL_UP,   TRISTATE,   INPUT),
 };
 
+static __initdata struct tegra_pingroup_config cardhu_pinmux_pm311[] = {
+       /* Power rails GPIO */
+       DEFAULT_PINMUX(SPI2_SCK,        SPI2,            NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(PEX_L2_RST_N,    PCIE,            PULL_UP,   TRISTATE,   INPUT),
+       DEFAULT_PINMUX(PEX_L2_CLKREQ_N, PCIE,            PULL_UP,   TRISTATE,   INPUT),
+};
+
 static __initdata struct tegra_pingroup_config cardhu_pinmux_cardhu[] = {
        DEFAULT_PINMUX(LCD_CS0_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_SCK,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
@@ -434,13 +460,15 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_cardhu[] = {
 
        /* Power rails GPIO */
        DEFAULT_PINMUX(GMI_CS2_N,       NAND,            NORMAL,    NORMAL,     OUTPUT),
-       DEFAULT_PINMUX(GMI_RST_N,       RSVD3,           PULL_UP,   TRISTATE,   INPUT),
-       DEFAULT_PINMUX(GMI_AD15,        NAND,            PULL_UP,   TRISTATE,   INPUT),
+       DEFAULT_PINMUX(GMI_RST_N,       RSVD3,           PULL_UP,   NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_AD15,        NAND,            PULL_UP,   NORMAL,     INPUT),
 
        DEFAULT_PINMUX(GMI_CS0_N,       GMI,             PULL_UP,   NORMAL,     INPUT),
        DEFAULT_PINMUX(GMI_CS1_N,       GMI,             PULL_UP,   TRISTATE,   INPUT),
        /*TP_IRQ*/
        DEFAULT_PINMUX(GMI_CS4_N,       GMI,             PULL_UP,   NORMAL,     INPUT),
+       /*PCIE dock detect*/
+       DEFAULT_PINMUX(GPIO_PU4,        RSVD1,           PULL_UP,   NORMAL,     INPUT),
 };
 
 static __initdata struct tegra_pingroup_config cardhu_pinmux_cardhu_a03[] = {
@@ -456,16 +484,35 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_cardhu_a03[] = {
        /* Power rails GPIO */
        DEFAULT_PINMUX(PEX_L0_PRSNT_N,  PCIE,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(PEX_L0_CLKREQ_N, PCIE,            NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(PEX_L1_CLKREQ_N, RSVD3,           PULL_UP,   TRISTATE,   INPUT),
-       DEFAULT_PINMUX(PEX_L1_PRSNT_N,  RSVD3,           PULL_UP,   TRISTATE,   INPUT),
+       DEFAULT_PINMUX(PEX_L1_CLKREQ_N, RSVD3,           PULL_UP,   NORMAL,     INPUT),
+       DEFAULT_PINMUX(PEX_L1_PRSNT_N,  RSVD3,           PULL_UP,   NORMAL,     INPUT),
+
+       /*PCIE dock detect*/
+       DEFAULT_PINMUX(GPIO_PU4,        RSVD1,           PULL_UP,   NORMAL,     INPUT),
 };
 
 static __initdata struct tegra_pingroup_config cardhu_pinmux_e1291_a04[] = {
        DEFAULT_PINMUX(GMI_AD15,        NAND,            PULL_DOWN,   NORMAL,   OUTPUT),
-       DEFAULT_PINMUX(ULPI_DATA5,      UARTA,           PULL_UP,   NORMAL,     INPUT),
        DEFAULT_PINMUX(ULPI_DATA6,      UARTA,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(SPI2_MOSI,       SPI6,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP3_SCLK,       RSVD1,           NORMAL,    NORMAL,     OUTPUT),
+
+       /*PCIE dock detect*/
+       DEFAULT_PINMUX(GPIO_PU4,        RSVD1,           PULL_UP,   NORMAL,     INPUT),
+};
+
+static __initdata struct tegra_pingroup_config cardhu_pinmux_pm315[] = {
+       DEFAULT_PINMUX(GMI_AD15,        NAND,            PULL_DOWN,   NORMAL,   OUTPUT),
+       DEFAULT_PINMUX(ULPI_DATA6,      UARTA,           NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(SPI2_MOSI,       SPI6,            NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(DAP3_SCLK,       RSVD1,           NORMAL,    NORMAL,     OUTPUT),
+       /* PCIE dock detect */
+       DEFAULT_PINMUX(GPIO_PU4,        RSVD1,           PULL_UP,   NORMAL,     INPUT),
+       /* CDC enable for realtek RTL5640 */
+       DEFAULT_PINMUX(SPI2_SCK,        SPI2,            NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(SPI2_CS1_N,      SPI2,            NORMAL,    NORMAL,     INPUT),
+       /* Power up for USB1, USB3 */
+       DEFAULT_PINMUX(GMI_AD13,        NAND,            PULL_UP,    NORMAL,    INPUT),
 };
 
 static __initdata struct tegra_pingroup_config cardhu_pinmux_e1198[] = {
@@ -486,6 +533,11 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_e1198[] = {
        DEFAULT_PINMUX(SPI2_CS2_N,      SPI2,            PULL_UP,    NORMAL,     INPUT),
 };
 
+static __initdata struct tegra_pingroup_config cardhu_pinmux_pm269_e1506[] = {
+       DEFAULT_PINMUX(LCD_M1,          DISPLAYA,        NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(LCD_DC1,         DISPLAYA,        NORMAL,    NORMAL,     OUTPUT),
+};
+
 static __initdata struct tegra_pingroup_config unused_pins_lowpower[] = {
        DEFAULT_PINMUX(GMI_WAIT,        NAND,           PULL_UP,    TRISTATE,     OUTPUT),
        DEFAULT_PINMUX(GMI_ADV_N,       NAND,           NORMAL,     TRISTATE,     OUTPUT),
@@ -501,7 +553,6 @@ static __initdata struct tegra_pingroup_config unused_pins_lowpower[] = {
        DEFAULT_PINMUX(GMI_AD5,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
        DEFAULT_PINMUX(GMI_AD6,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
        DEFAULT_PINMUX(GMI_AD7,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD9,         PWM1,           NORMAL,     NORMAL,       OUTPUT),
        DEFAULT_PINMUX(GMI_AD11,        NAND,           NORMAL,     NORMAL,       OUTPUT),
        DEFAULT_PINMUX(GMI_AD13,        NAND,           PULL_UP,    NORMAL,       INPUT),
        DEFAULT_PINMUX(GMI_WR_N,        NAND,           NORMAL,     TRISTATE,     OUTPUT),
@@ -509,6 +560,48 @@ static __initdata struct tegra_pingroup_config unused_pins_lowpower[] = {
        DEFAULT_PINMUX(GMI_DQS,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
 };
 
+static __initdata struct tegra_pingroup_config unused_pins_lowpower_e1506[] = {
+       DEFAULT_PINMUX(LCD_D0,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D1,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D2,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D3,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D4,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D5,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D6,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D7,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D8,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D9,          DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D10,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D11,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D12,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D13,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D14,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D15,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D16,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D17,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D18,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D19,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D20,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D21,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D22,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_D23,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+
+       DEFAULT_PINMUX(LCD_DC0,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_PWR0,        DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_PWR1,        DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_PWR2,        DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_CS0_N,       DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_CS1_N,       DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+
+       DEFAULT_PINMUX(LCD_PCLK,        DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_WR_N,        DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_HSYNC,       DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_VSYNC,       DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_SCK,         DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_SDOUT,       DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+       DEFAULT_PINMUX(LCD_SDIN,        DISPLAYA,        PULL_DOWN,    TRISTATE,  OUTPUT),
+};
+
 static __initdata struct tegra_pingroup_config gmi_pins_269[] = {
        /* Continuation of table unused_pins_lowpower only for PM269 */
        DEFAULT_PINMUX(GMI_CS0_N,       NAND,           PULL_UP,    NORMAL,       OUTPUT),
@@ -519,7 +612,6 @@ static __initdata struct tegra_pingroup_config gmi_pins_269[] = {
        DEFAULT_PINMUX(GMI_CS6_N,       SATA,           NORMAL,     TRISTATE,     OUTPUT),
        DEFAULT_PINMUX(GMI_CS7_N,       NAND,           PULL_UP,    NORMAL,       INPUT),
        DEFAULT_PINMUX(GMI_AD8,         PWM0,           NORMAL,     NORMAL,       OUTPUT),
-       DEFAULT_PINMUX(GMI_AD9,         PWM1,           NORMAL,     NORMAL,       OUTPUT),
        DEFAULT_PINMUX(GMI_AD10,        NAND,           NORMAL,     NORMAL,       OUTPUT),
        DEFAULT_PINMUX(GMI_AD11,        NAND,           NORMAL,     NORMAL,       OUTPUT),
        DEFAULT_PINMUX(GMI_AD13,        NAND,           PULL_UP,    TRISTATE,     OUTPUT),
@@ -532,13 +624,34 @@ static __initdata struct tegra_pingroup_config gmi_pins_269[] = {
        DEFAULT_PINMUX(GMI_WP_N,        NAND,           NORMAL,     NORMAL,       INPUT),
 };
 
-static void __init cardhu_pinmux_audio_init(void)
+static void __init cardhu_wm8903_audio_init(void)
 {
-       tegra_gpio_enable(TEGRA_GPIO_CDC_IRQ);
-       gpio_request(TEGRA_GPIO_CDC_IRQ, "wm8903");
-       gpio_direction_input(TEGRA_GPIO_CDC_IRQ);
+       int ret = gpio_request(TEGRA_GPIO_CDC_IRQ, "wm8903");
+       if (ret < 0) {
+               pr_err("%s() Error in gpio_request() for gpio %d\n",
+                                       __func__, ret);
+       }
+       ret = gpio_direction_input(TEGRA_GPIO_CDC_IRQ);
+       if (ret < 0) {
+               pr_err("%s() Error in setting gpio %d to in/out\n",
+                                       __func__, ret);
+               gpio_free(TEGRA_GPIO_CDC_IRQ);
+       }
+}
+
+static void __init beaver_rt5640_audio_init(void)
+{
+       int ret = gpio_request(TEGRA_GPIO_RTL_CDC_IRQ, "rt5640");
+       if (ret < 0)
+               pr_err("%s() Error in gpio_request() for gpio %d\n",
+                                       __func__, ret);
+       ret = gpio_direction_input(TEGRA_GPIO_RTL_CDC_IRQ);
+       if (ret < 0) {
+               pr_err("%s() Error in setting gpio %d to in/out\n",
+                                       __func__, ret);
+               gpio_free(TEGRA_GPIO_RTL_CDC_IRQ);
+       }
 
-       tegra_gpio_enable(TEGRA_GPIO_HP_DET);
 }
 
 #define GPIO_INIT_PIN_MODE(_gpio, _is_input, _value)   \
@@ -568,6 +681,13 @@ static struct gpio_init_pin_info init_gpio_mode_e1291_a04[] = {
        GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR2, false, 0),
 };
 
+static struct gpio_init_pin_info init_gpio_mode_pm315[] = {
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PDD6, false, 0),
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PDD4, false, 0),
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH5, false, 1),
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR2, false, 0),
+};
+
 static void __init cardhu_gpio_init_configure(void)
 {
        struct board_info board_info;
@@ -599,6 +719,10 @@ static void __init cardhu_gpio_init_configure(void)
                        pins_info = init_gpio_mode_e1291_a04;
                }
                break;
+       case BOARD_PM315:
+               len = ARRAY_SIZE(init_gpio_mode_pm315);
+               pins_info = init_gpio_mode_pm315;
+               break;
        default:
                return;
        }
@@ -610,17 +734,33 @@ static void __init cardhu_gpio_init_configure(void)
        }
 }
 
-int __init cardhu_pinmux_init(void)
+int __init cardhu_gpio_init(void)
 {
        struct board_info board_info;
 
+       tegra_get_board_info(&board_info);
        cardhu_gpio_init_configure();
+       if (board_info.board_id == BOARD_PM315)
+               beaver_rt5640_audio_init();
+       else
+               cardhu_wm8903_audio_init();
+
+       return 0;
+}
+
+int __init cardhu_pinmux_init(void)
+{
+       struct board_info board_info;
+       struct board_info display_board_info;
+
+       tegra30_default_pinmux();
 
        tegra_pinmux_config_table(cardhu_pinmux_common, ARRAY_SIZE(cardhu_pinmux_common));
        tegra_drive_pinmux_config_table(cardhu_drive_pinmux,
                                        ARRAY_SIZE(cardhu_drive_pinmux));
 
        tegra_get_board_info(&board_info);
+       tegra_get_display_board_info(&display_board_info);
        switch (board_info.board_id) {
        case BOARD_E1198:
                tegra_pinmux_config_table(cardhu_pinmux_e1198,
@@ -645,13 +785,31 @@ int __init cardhu_pinmux_init(void)
                        tegra_pinmux_config_table(cardhu_pinmux_e1291_a04,
                                        ARRAY_SIZE(cardhu_pinmux_e1291_a04));
                break;
-
+       case BOARD_PM315:
+               tegra_pinmux_config_table(cardhu_pinmux_cardhu_a03,
+                               ARRAY_SIZE(cardhu_pinmux_cardhu_a03));
+               tegra_pinmux_config_table(cardhu_pinmux_pm315,
+                               ARRAY_SIZE(cardhu_pinmux_pm315));
+               break;
        case BOARD_PM269:
        case BOARD_PM305:
        case BOARD_PM311:
        case BOARD_E1257:
-               tegra_pinmux_config_table(cardhu_pinmux_e118x,
+               if (board_info.board_id == BOARD_PM311 || board_info.board_id == BOARD_PM305) {
+                       tegra_pinmux_config_table(cardhu_pinmux_pm311,
+                                       ARRAY_SIZE(cardhu_pinmux_pm311));
+               } else {
+                       tegra_pinmux_config_table(cardhu_pinmux_e118x,
                                        ARRAY_SIZE(cardhu_pinmux_e118x));
+               }
+
+               if (display_board_info.board_id == BOARD_DISPLAY_E1506) {
+                       tegra_pinmux_config_table(cardhu_pinmux_pm269_e1506,
+                                       ARRAY_SIZE(cardhu_pinmux_pm269_e1506));
+                       tegra_pinmux_config_table(unused_pins_lowpower_e1506,
+                                       ARRAY_SIZE(unused_pins_lowpower_e1506));
+               }
+
                tegra_pinmux_config_table(unused_pins_lowpower,
                                        ARRAY_SIZE(unused_pins_lowpower));
                tegra_pinmux_config_table(gmi_pins_269,
@@ -663,8 +821,6 @@ int __init cardhu_pinmux_init(void)
                break;
        }
 
-       cardhu_pinmux_audio_init();
-
        return 0;
 }
 
@@ -688,7 +844,6 @@ struct gpio_init_pin_info pin_lpm_cardhu_common[] = {
 
 /* E1198 without PM313 display board */
 struct gpio_init_pin_info pin_lpm_cardhu_common_wo_pm313[] = {
-       PIN_GPIO_LPM("GMI_AD9",   TEGRA_GPIO_PH1, 0, 0),
        PIN_GPIO_LPM("GMI_AD11",  TEGRA_GPIO_PH3, 0, 0),
 };
 
@@ -708,7 +863,51 @@ struct gpio_init_pin_info vddio_gmi_pins_pm269[] = {
 /* PM269 without PM313 display board */
 struct gpio_init_pin_info vddio_gmi_pins_pm269_wo_pm313[] = {
        PIN_GPIO_LPM("GMI_CS2",   TEGRA_GPIO_PK3, 1, 0),
-       PIN_GPIO_LPM("GMI_AD9",   TEGRA_GPIO_PH1, 0, 0),
+};
+
+struct gpio_init_pin_info vddio_gmi_pins_pm269_e1506[] = {
+       PIN_GPIO_LPM("GMI_CS2",   TEGRA_GPIO_PK3, 1, 0),
+};
+
+static struct gpio_init_pin_info cardhu_unused_gpio_pins_e1506[] = {
+       PIN_GPIO_LPM("LCD_D0",     TEGRA_GPIO_PE0,  0, 0),
+       PIN_GPIO_LPM("LCD_D1",     TEGRA_GPIO_PE1,  0, 0),
+       PIN_GPIO_LPM("LCD_D2",     TEGRA_GPIO_PE2,  0, 0),
+       PIN_GPIO_LPM("LCD_D3",     TEGRA_GPIO_PE3,  0, 0),
+       PIN_GPIO_LPM("LCD_D4",     TEGRA_GPIO_PE4,  0, 0),
+       PIN_GPIO_LPM("LCD_D5",     TEGRA_GPIO_PE5,  0, 0),
+       PIN_GPIO_LPM("LCD_D6",     TEGRA_GPIO_PE6,  0, 0),
+       PIN_GPIO_LPM("LCD_D7",     TEGRA_GPIO_PE7,  0, 0),
+       PIN_GPIO_LPM("LCD_D8",     TEGRA_GPIO_PF0,  0, 0),
+       PIN_GPIO_LPM("LCD_D9",     TEGRA_GPIO_PF1,  0, 0),
+       PIN_GPIO_LPM("LCD_D10",    TEGRA_GPIO_PF2,  0, 0),
+       PIN_GPIO_LPM("LCD_D11",    TEGRA_GPIO_PF3,  0, 0),
+       PIN_GPIO_LPM("LCD_D12",    TEGRA_GPIO_PF4,  0, 0),
+       PIN_GPIO_LPM("LCD_D13",    TEGRA_GPIO_PF5,  0, 0),
+       PIN_GPIO_LPM("LCD_D14",    TEGRA_GPIO_PF6,  0, 0),
+       PIN_GPIO_LPM("LCD_D15",    TEGRA_GPIO_PF7,  0, 0),
+       PIN_GPIO_LPM("LCD_D16",    TEGRA_GPIO_PM0,  0, 0),
+       PIN_GPIO_LPM("LCD_D17",    TEGRA_GPIO_PM1,  0, 0),
+       PIN_GPIO_LPM("LCD_D18",    TEGRA_GPIO_PM2,  0, 0),
+       PIN_GPIO_LPM("LCD_D19",    TEGRA_GPIO_PM3,  0, 0),
+       PIN_GPIO_LPM("LCD_D20",    TEGRA_GPIO_PM4,  0, 0),
+       PIN_GPIO_LPM("LCD_D21",    TEGRA_GPIO_PM5,  0, 0),
+       PIN_GPIO_LPM("LCD_D22",    TEGRA_GPIO_PM6,  0, 0),
+       PIN_GPIO_LPM("LCD_D23",    TEGRA_GPIO_PM7,  0, 0),
+
+       PIN_GPIO_LPM("LCD_DC0",     TEGRA_GPIO_PN6,  0, 0),
+       PIN_GPIO_LPM("LCD_PWR0",    TEGRA_GPIO_PB2,  0, 0),
+       PIN_GPIO_LPM("LCD_PWR1",    TEGRA_GPIO_PC1,  0, 0),
+       PIN_GPIO_LPM("LCD_PWR2",    TEGRA_GPIO_PC6,  0, 0),
+       PIN_GPIO_LPM("LCD_CS0_N",   TEGRA_GPIO_PN4,  0, 0),
+       PIN_GPIO_LPM("LCD_CS1_N",   TEGRA_GPIO_PW0,  0, 0),
+       PIN_GPIO_LPM("LCD_PCLK",    TEGRA_GPIO_PB3,  0, 0),
+       PIN_GPIO_LPM("LCD_WR_N",    TEGRA_GPIO_PZ3,  0, 0),
+       PIN_GPIO_LPM("LCD_HSYNC",   TEGRA_GPIO_PJ3,  0, 0),
+       PIN_GPIO_LPM("LCD_VSYNC",   TEGRA_GPIO_PJ4,  0, 0),
+       PIN_GPIO_LPM("LCD_SCK",     TEGRA_GPIO_PZ4,  0, 0),
+       PIN_GPIO_LPM("LCD_SDOUT",   TEGRA_GPIO_PN5,  0, 0),
+       PIN_GPIO_LPM("LCD_SDIN",    TEGRA_GPIO_PZ2,  0, 0),
 };
 
 static void set_unused_pin_gpio(struct gpio_init_pin_info *lpm_pin_info,
@@ -740,7 +939,6 @@ static void set_unused_pin_gpio(struct gpio_init_pin_info *lpm_pin_info,
                        gpio_free(pin_info->gpio_nr);
                        continue;
                }
-               tegra_gpio_enable(pin_info->gpio_nr);
        }
 }
 
@@ -771,7 +969,12 @@ int __init cardhu_pins_state_init(void)
                        set_unused_pin_gpio(&vddio_gmi_pins_pm269[0],
                                ARRAY_SIZE(vddio_gmi_pins_pm269));
 
-                       if (display_board_info.board_id != BOARD_DISPLAY_PM313) {
+                       if (display_board_info.board_id == BOARD_DISPLAY_E1506) {
+                               set_unused_pin_gpio(&vddio_gmi_pins_pm269_e1506[0],
+                                               ARRAY_SIZE(vddio_gmi_pins_pm269_e1506));
+                               set_unused_pin_gpio(cardhu_unused_gpio_pins_e1506,
+                                               ARRAY_SIZE(cardhu_unused_gpio_pins_e1506));
+                       } else if (display_board_info.board_id != BOARD_DISPLAY_PM313) {
                                set_unused_pin_gpio(&vddio_gmi_pins_pm269_wo_pm313[0],
                                                ARRAY_SIZE(vddio_gmi_pins_pm269_wo_pm313));
                        }