arm: tegra: cardhu/enterprise: Remove pinmux conflicts
[linux-2.6.git] / arch / arm / mach-tegra / board-cardhu-pinmux.c
index c59d75f..820b62e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/arm/mach-tegra/board-cardhu-pinmux.c
  *
- * Copyright (C) 2010 NVIDIA Corporation
+ * Copyright (C) 2011 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
@@ -82,6 +82,22 @@ static __initdata struct tegra_drive_pingroup_config cardhu_drive_pinmux[] = {
 
        /* PWR_I2C */
        SET_DRIVE(AO1,          DISABLE, ENABLE, DIV_1, 31, 31, FASTEST, FASTEST),
+
+       /* UART3 */
+       SET_DRIVE(UART3,        DISABLE, ENABLE, DIV_1, 31, 31, FASTEST, FASTEST),
+
+       /* SDMMC1 */
+       SET_DRIVE(SDIO1,        DISABLE, DISABLE, DIV_1, 46, 42, FAST, FAST),
+
+       /* SDMMC3 */
+       SET_DRIVE(SDIO3,        DISABLE, DISABLE, DIV_1, 46, 42, FAST, FAST),
+
+       /* SDMMC4 */
+       SET_DRIVE(GMA,          DISABLE, DISABLE, DIV_1, 9, 9, SLOWEST, SLOWEST),
+       SET_DRIVE(GMB,          DISABLE, DISABLE, DIV_1, 9, 9, SLOWEST, SLOWEST),
+       SET_DRIVE(GMC,          DISABLE, DISABLE, DIV_1, 9, 9, SLOWEST, SLOWEST),
+       SET_DRIVE(GMD,          DISABLE, DISABLE, DIV_1, 9, 9, SLOWEST, SLOWEST),
+
 };
 
 #define DEFAULT_PINMUX(_pingroup, _mux, _pupd, _tri, _io)      \
@@ -122,7 +138,7 @@ static __initdata struct tegra_drive_pingroup_config cardhu_drive_pinmux[] = {
 
 static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        /* SDMMC1 pinmux */
-       DEFAULT_PINMUX(SDMMC1_CLK,      SDMMC1,          NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC1_CLK,      SDMMC1,          NORMAL,     NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC1_CMD,      SDMMC1,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC1_DAT3,     SDMMC1,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC1_DAT2,     SDMMC1,          PULL_UP,    NORMAL,     INPUT),
@@ -130,17 +146,17 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(SDMMC1_DAT0,     SDMMC1,          PULL_UP,    NORMAL,     INPUT),
 
        /* SDMMC3 pinmux */
-       DEFAULT_PINMUX(SDMMC3_CLK,      SDMMC3,          NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC3_CLK,      SDMMC3,          NORMAL,     NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC3_CMD,      SDMMC3,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC3_DAT0,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC3_DAT1,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC3_DAT2,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC3_DAT3,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(SDMMC3_DAT6,     RSVD1,           NORMAL,     NORMAL,     INPUT),
-       DEFAULT_PINMUX(SDMMC3_DAT7,     RSVD1,           NORMAL,     NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT6,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT7,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
 
        /* SDMMC4 pinmux */
-       DEFAULT_PINMUX(SDMMC4_CLK,      SDMMC4,          NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC4_CLK,      SDMMC4,          NORMAL,     NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC4_CMD,      SDMMC4,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC4_DAT0,     SDMMC4,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC4_DAT1,     SDMMC4,          PULL_UP,    NORMAL,     INPUT),
@@ -150,7 +166,7 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(SDMMC4_DAT5,     SDMMC4,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC4_DAT6,     SDMMC4,          PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SDMMC4_DAT7,     SDMMC4,          PULL_UP,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(SDMMC4_RST_N,    RSVD1,           PULL_DOWN,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC4_RST_N,    RSVD1,           PULL_DOWN,  NORMAL,     INPUT),
 
        /* I2C1 pinmux */
        I2C_PINMUX(GEN1_I2C_SCL,        I2C1,           NORMAL, NORMAL, INPUT,  DISABLE,        ENABLE),
@@ -175,7 +191,7 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(ULPI_DATA0,      UARTA,           NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(ULPI_DATA1,      UARTA,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(ULPI_DATA2,      UARTA,           NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(ULPI_DATA3,      UARTA,           NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(ULPI_DATA3,      UARTA,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(ULPI_DATA4,      UARTA,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(ULPI_DATA5,      UARTA,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(ULPI_DATA6,      UARTA,           NORMAL,    NORMAL,     INPUT),
@@ -188,8 +204,8 @@ 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_PV3,        CLK12,           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),
        DEFAULT_PINMUX(LCD_PWR1,        DISPLAYA,        NORMAL,    NORMAL,     INPUT),
@@ -197,9 +213,7 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(LCD_SDIN,        DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_SDOUT,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_WR_N,        DISPLAYA,        NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(LCD_CS0_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_DC0,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(LCD_SCK,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_PWR0,        DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_PCLK,        DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_DE,          DISPLAYA,        NORMAL,    NORMAL,     INPUT),
@@ -229,8 +243,6 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(LCD_D21,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_D22,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_D23,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(LCD_CS1_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(LCD_M1,          DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(LCD_DC1,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(CRT_HSYNC,       CRT,             NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(CRT_VSYNC,       CRT,             NORMAL,    NORMAL,     OUTPUT),
@@ -242,7 +254,7 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(VI_D5,           SDMMC2,          NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(VI_D7,           SDMMC2,          NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(VI_D10,          RSVD1,           NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(VI_MCLK,         VI,              PULL_UP,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(VI_MCLK,         VI,              PULL_UP,   NORMAL,     INPUT),
 
        DEFAULT_PINMUX(UART2_RXD,       IRDA,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(UART2_TXD,       IRDA,            NORMAL,    NORMAL,     OUTPUT),
@@ -256,8 +268,8 @@ 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_PU5,        PWM2,            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),
        DEFAULT_PINMUX(DAP4_DIN,        I2S3,            NORMAL,    NORMAL,     INPUT),
@@ -265,7 +277,12 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(DAP4_SCLK,       I2S3,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(CLK3_OUT,        EXTPERIPH3,      NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(CLK3_REQ,        DEV3,            NORMAL,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(GMI_WP_N,        RSVD1,           NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_WP_N,        GMI,             NORMAL,    NORMAL,     INPUT),
+
+       DEFAULT_PINMUX(KB_ROW5,         OWR,             NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(KB_ROW12,        KBC,             NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(KB_ROW14,        KBC,             NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(KB_ROW15,        KBC,             NORMAL,    NORMAL,     OUTPUT),
 
 #if 0 /* for testing on Verbier */
        DEFAULT_PINMUX(GMI_WAIT,        NAND,            NORMAL,    NORMAL,     INPUT),
@@ -297,15 +314,13 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(GMI_OE_N,        NAND,            NORMAL,    NORMAL,     OUTPUT),
        DEFAULT_PINMUX(GMI_DQS,         NAND,            NORMAL,    NORMAL,     INPUT),
 #else
-       DEFAULT_PINMUX(GMI_CS2_N,       RSVD1,           PULL_UP,   NORMAL,     INPUT), /* EN_VDD_BL1 */
        DEFAULT_PINMUX(GMI_AD8,         PWM0,            NORMAL,    NORMAL,     OUTPUT), /* LCD1_BL_PWM */
-       DEFAULT_PINMUX(GMI_AD10,        NAND,            NORMAL,    NORMAL,     OUTPUT), /* LCD1_BL_EN */
 #endif
-       DEFAULT_PINMUX(GMI_A16,         SPI4,           PULL_UP,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(GMI_A17,         SPI4,           PULL_UP,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(GMI_A18,         SPI4,           PULL_UP,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(GMI_A19,         SPI4,           PULL_UP,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(CAM_MCLK,        VI_ALT2,         PULL_UP,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_A16,         SPI4,            NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_A17,         SPI4,            NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_A18,         SPI4,            NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_A19,         SPI4,            NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(CAM_MCLK,        VI_ALT2,         PULL_UP,   NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PCC1,       RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PBB0,       RSVD1,           NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PBB3,       VGP3,            NORMAL,    NORMAL,     INPUT),
@@ -337,13 +352,13 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
        DEFAULT_PINMUX(DAP1_SCLK,       I2S0,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(CLK1_REQ,        DAP,             NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(CLK1_OUT,        EXTPERIPH1,      NORMAL,    NORMAL,     INPUT),
-#ifdef CONFIG_SND_HDA_CODEC_REALTEK
+#if 0 /* For HDA realtek Codec */
        DEFAULT_PINMUX(SPDIF_IN,        DAP2,            PULL_DOWN, NORMAL,     INPUT),
 #else
        DEFAULT_PINMUX(SPDIF_IN,        SPDIF,           NORMAL,    NORMAL,     INPUT),
 #endif
        DEFAULT_PINMUX(SPDIF_OUT,       SPDIF,           NORMAL,    NORMAL,     OUTPUT),
-#ifdef CONFIG_SND_HDA_CODEC_REALTEK
+#if 0 /* For HDA realtek Codec */
        DEFAULT_PINMUX(DAP2_FS,         HDA,             PULL_DOWN, NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP2_DIN,        HDA,             PULL_DOWN, NORMAL,     INPUT),
        DEFAULT_PINMUX(DAP2_DOUT,       HDA,             PULL_DOWN, NORMAL,     INPUT),
@@ -374,17 +389,24 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
 
        /* Gpios */
        /* SDMMC1 CD gpio */
-       DEFAULT_PINMUX(GMI_IORDY,       RSVD1,           PULL_UP,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_IORDY,       RSVD1,           PULL_UP,   NORMAL,     INPUT),
        /* SDMMC1 WP gpio */
-       DEFAULT_PINMUX(VI_D11,          RSVD1,           PULL_UP,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(VI_D11,          RSVD1,           PULL_UP,   NORMAL,     INPUT),
+       /* Touch panel GPIO */
+       /* Touch IRQ */
+       DEFAULT_PINMUX(GMI_AD12,        NAND,            PULL_UP,   NORMAL,     INPUT),
+
+       /* Touch RESET */
+       DEFAULT_PINMUX(GMI_AD14,        NAND,            NORMAL,    NORMAL,     OUTPUT),
 
 
        /* Power rails GPIO */
        DEFAULT_PINMUX(SPI2_SCK,        GMI,             NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(GPIO_PBB4,       VGP4,            NORMAL,    NORMAL,     INPUT),
        DEFAULT_PINMUX(KB_ROW8,         KBC,             PULL_UP,   NORMAL,     INPUT),
-       DEFAULT_PINMUX(SDMMC3_DAT5,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
-       DEFAULT_PINMUX(SDMMC3_DAT4,     SDMMC3,          PULL_UP,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT5,     SDMMC3,          PULL_UP,   NORMAL,     INPUT),
+       DEFAULT_PINMUX(SDMMC3_DAT4,     SDMMC3,          PULL_UP,   NORMAL,     INPUT),
+
        VI_PINMUX(VI_D6,           VI,              NORMAL,    NORMAL,     OUTPUT, DISABLE, DISABLE),
        VI_PINMUX(VI_D8,           SDMMC2,          NORMAL,    NORMAL,     INPUT,  DISABLE, DISABLE),
        VI_PINMUX(VI_D9,           SDMMC2,          NORMAL,    NORMAL,     INPUT,  DISABLE, DISABLE),
@@ -396,32 +418,75 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_common[] = {
 static __initdata struct tegra_pingroup_config cardhu_pinmux_e118x[] = {
        /* Power rails GPIO */
        DEFAULT_PINMUX(SPI2_SCK,        SPI2,            NORMAL,    NORMAL,     INPUT),
-       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),
 };
 
+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),
+       DEFAULT_PINMUX(LCD_CS1_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(LCD_M1,          DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+
+       DEFAULT_PINMUX(GMI_CS2_N,       RSVD1,           PULL_UP,   NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_AD8,         PWM0,            NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(GMI_AD10,        NAND,            NORMAL,    NORMAL,     OUTPUT),
+
        /* 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_CS0_N,       GMI,             NORMAL,    NORMAL,     OUTPUT),
-       DEFAULT_PINMUX(GMI_CS1_N,       GMI,             NORMAL,    TRISTATE,   OUTPUT),
+       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,             NORMAL,    NORMAL,     INPUT),
+       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[] = {
+       DEFAULT_PINMUX(LCD_CS0_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(LCD_SCK,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(LCD_CS1_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(LCD_M1,          DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+
+       DEFAULT_PINMUX(GMI_CS2_N,       RSVD1,           PULL_UP,   NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_AD8,         PWM0,            NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(GMI_AD10,        NAND,            NORMAL,    NORMAL,     OUTPUT),
+
        /* 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,  NAND,            PULL_UP,   TRISTATE,   INPUT),
+       DEFAULT_PINMUX(PEX_L1_PRSNT_N,  RSVD3,           PULL_UP,   TRISTATE,   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),
 };
 
 static __initdata struct tegra_pingroup_config cardhu_pinmux_e1198[] = {
+       DEFAULT_PINMUX(LCD_CS0_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(LCD_SCK,         DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(LCD_CS1_N,       DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(LCD_M1,          DISPLAYA,        NORMAL,    NORMAL,     INPUT),
+
+       DEFAULT_PINMUX(GMI_CS2_N,       RSVD1,           PULL_UP,   NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_AD8,         PWM0,            NORMAL,    NORMAL,     OUTPUT),
+       DEFAULT_PINMUX(GMI_AD10,        NAND,            NORMAL,    NORMAL,     OUTPUT),
+
        /* SPI2 */
        DEFAULT_PINMUX(SPI2_SCK,        SPI2,            PULL_UP,    NORMAL,     INPUT),
        DEFAULT_PINMUX(SPI2_MOSI,       SPI2,            PULL_UP,    NORMAL,     INPUT),
@@ -431,29 +496,135 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_e1198[] = {
 };
 
 static __initdata struct tegra_pingroup_config unused_pins_lowpower[] = {
-       DEFAULT_PINMUX(GMI_WAIT,        GMI,            PULL_UP,    TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_ADV_N,       GMI,            PULL_UP,    TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_CLK,         GMI,            PULL_DOWN,  TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_CS3_N,       GMI,            PULL_UP,    TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_CS6_N,       GMI,            PULL_UP,    TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD0,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD1,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD2,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD3,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD4,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD5,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD6,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD7,         GMI,            NORMAL,     TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD9,         GMI,            PULL_DOWN,  TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_AD11,        GMI,            PULL_DOWN,  TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_WR_N,        GMI,            PULL_UP,    TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_OE_N,        GMI,            PULL_UP,    TRISTATE,     OUTPUT),
-       DEFAULT_PINMUX(GMI_DQS,         GMI,            PULL_UP,    TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_WAIT,        NAND,           PULL_UP,    TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_ADV_N,       NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_CLK,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_CS3_N,       NAND,           NORMAL,     NORMAL,       OUTPUT),
+       DEFAULT_PINMUX(GMI_CS6_N,       SATA,           NORMAL,     NORMAL,       OUTPUT),
+       DEFAULT_PINMUX(GMI_CS7_N,       NAND,           PULL_UP,    NORMAL,       INPUT),
+       DEFAULT_PINMUX(GMI_AD0,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_AD1,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_AD2,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_AD3,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_AD4,         NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       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),
+       DEFAULT_PINMUX(GMI_OE_N,        NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_DQS,         NAND,           NORMAL,     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),
+       DEFAULT_PINMUX(GMI_CS1_N,       NAND,           PULL_UP,    TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_CS2_N,       RSVD1,          NORMAL,     NORMAL,       INPUT),
+       DEFAULT_PINMUX(GMI_CS3_N,       NAND,           NORMAL,     TRISTATE,     OUTPUT),
+       DEFAULT_PINMUX(GMI_CS4_N,       NAND,           PULL_UP,    NORMAL,       INPUT),
+       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),
+       DEFAULT_PINMUX(GMI_AD15,        NAND,           PULL_UP,    TRISTATE,     INPUT),
+       DEFAULT_PINMUX(GMI_A16,         SPI4,           NORMAL,     NORMAL,       INPUT),
+       DEFAULT_PINMUX(GMI_A17,         SPI4,           NORMAL,     NORMAL,       INPUT),
+       DEFAULT_PINMUX(GMI_A18,         SPI4,           PULL_UP,    NORMAL,       INPUT),
+       DEFAULT_PINMUX(GMI_A19,         SPI4,           NORMAL,     NORMAL,       INPUT),
+       DEFAULT_PINMUX(GMI_RST_N,       NAND,           PULL_UP,    NORMAL,       INPUT),
+       DEFAULT_PINMUX(GMI_WP_N,        NAND,           NORMAL,     NORMAL,       INPUT),
 };
 
+static void __init cardhu_pinmux_audio_init(void)
+{
+       tegra_gpio_enable(TEGRA_GPIO_CDC_IRQ);
+       gpio_request(TEGRA_GPIO_CDC_IRQ, "wm8903");
+       gpio_direction_input(TEGRA_GPIO_CDC_IRQ);
+
+       tegra_gpio_enable(TEGRA_GPIO_HP_DET);
+}
+
+#define GPIO_INIT_PIN_MODE(_gpio, _is_input, _value)   \
+       {                                       \
+               .gpio_nr        = _gpio,        \
+               .is_input       = _is_input,    \
+               .value          = _value,       \
+       }
+
+
+/* E1198-A01/E1291 specific  fab < A03 */
+static struct gpio_init_pin_info init_gpio_mode_e1291_a02[] = {
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PH7, false, 0),
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PI4, false, 0),
+};
+
+/* E1198-A02/E1291 specific  fab = A03 */
+static struct gpio_init_pin_info init_gpio_mode_e1291_a03[] = {
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PDD6, false, 0),
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PDD4, false, 0),
+};
+
+/* E1198-A02/E1291 specific  fab >= A04 */
+static struct gpio_init_pin_info init_gpio_mode_e1291_a04[] = {
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PDD6, false, 0),
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PDD4, false, 0),
+       GPIO_INIT_PIN_MODE(TEGRA_GPIO_PR2, false, 0),
+};
+
+static void __init cardhu_gpio_init_configure(void)
+{
+       struct board_info board_info;
+       int len;
+       int i;
+       struct gpio_init_pin_info *pins_info;
+
+       tegra_get_board_info(&board_info);
+
+       switch (board_info.board_id) {
+       case BOARD_E1198:
+               if (board_info.fab < BOARD_FAB_A02) {
+                       len = ARRAY_SIZE(init_gpio_mode_e1291_a02);
+                       pins_info = init_gpio_mode_e1291_a02;
+               } else {
+                       len = ARRAY_SIZE(init_gpio_mode_e1291_a03);
+                       pins_info = init_gpio_mode_e1291_a03;
+               }
+               break;
+       case BOARD_E1291:
+               if (board_info.fab < BOARD_FAB_A03) {
+                       len = ARRAY_SIZE(init_gpio_mode_e1291_a02);
+                       pins_info = init_gpio_mode_e1291_a02;
+               } else if (board_info.fab == BOARD_FAB_A03) {
+                       len = ARRAY_SIZE(init_gpio_mode_e1291_a03);
+                       pins_info = init_gpio_mode_e1291_a03;
+               } else {
+                       len = ARRAY_SIZE(init_gpio_mode_e1291_a04);
+                       pins_info = init_gpio_mode_e1291_a04;
+               }
+               break;
+       default:
+               return;
+       }
+
+       for (i = 0; i < len; ++i) {
+               tegra_gpio_init_configure(pins_info->gpio_nr,
+                       pins_info->is_input, pins_info->value);
+               pins_info++;
+       }
+}
+
 int __init cardhu_pinmux_init(void)
 {
        struct board_info board_info;
+
+       cardhu_gpio_init_configure();
+
        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));
@@ -461,15 +632,16 @@ int __init cardhu_pinmux_init(void)
        tegra_get_board_info(&board_info);
        switch (board_info.board_id) {
        case BOARD_E1198:
-               tegra_pinmux_config_table(cardhu_pinmux_cardhu,
-                                       ARRAY_SIZE(cardhu_pinmux_cardhu));
                tegra_pinmux_config_table(cardhu_pinmux_e1198,
                                        ARRAY_SIZE(cardhu_pinmux_e1198));
                tegra_pinmux_config_table(unused_pins_lowpower,
                                        ARRAY_SIZE(unused_pins_lowpower));
+               if (board_info.fab >= BOARD_FAB_A02)
+                       tegra_pinmux_config_table(cardhu_pinmux_cardhu_a03,
+                                       ARRAY_SIZE(cardhu_pinmux_cardhu_a03));
                break;
        case BOARD_E1291:
-               if (board_info.fab < 0x3) {
+               if (board_info.fab < BOARD_FAB_A03) {
                        tegra_pinmux_config_table(cardhu_pinmux_cardhu,
                                        ARRAY_SIZE(cardhu_pinmux_cardhu));
                        tegra_pinmux_config_table(unused_pins_lowpower,
@@ -478,40 +650,146 @@ int __init cardhu_pinmux_init(void)
                        tegra_pinmux_config_table(cardhu_pinmux_cardhu_a03,
                                        ARRAY_SIZE(cardhu_pinmux_cardhu_a03));
                }
+               if (board_info.fab >= BOARD_FAB_A04)
+                       tegra_pinmux_config_table(cardhu_pinmux_e1291_a04,
+                                       ARRAY_SIZE(cardhu_pinmux_e1291_a04));
+               break;
+
+       case BOARD_PM269:
+       case BOARD_PM305:
+       case BOARD_PM311:
+       case BOARD_E1257:
+               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));
+               }
+               tegra_pinmux_config_table(unused_pins_lowpower,
+                                       ARRAY_SIZE(unused_pins_lowpower));
+               tegra_pinmux_config_table(gmi_pins_269,
+                                       ARRAY_SIZE(gmi_pins_269));
                break;
        default:
                tegra_pinmux_config_table(cardhu_pinmux_e118x,
                                        ARRAY_SIZE(cardhu_pinmux_e118x));
                break;
        }
+
+       cardhu_pinmux_audio_init();
+
        return 0;
 }
 
-/* Initialize the pins to desired state as per power/asic/system-eng
- * recomendation */
-int __init cardhu_pins_state_init(void)
+#define PIN_GPIO_LPM(_name, _gpio, _is_input, _value)  \
+       {                                       \
+               .name           = _name,        \
+               .gpio_nr        = _gpio,        \
+               .is_gpio        = true,         \
+               .is_input       = _is_input,    \
+               .value          = _value,       \
+       }
+
+struct gpio_init_pin_info pin_lpm_cardhu_common[] = {
+       PIN_GPIO_LPM("GMI_CS3_N", TEGRA_GPIO_PK4, 0, 0),
+       PIN_GPIO_LPM("GMI_CS4_N", TEGRA_GPIO_PK2, 1, 0),
+       PIN_GPIO_LPM("GMI_CS7",   TEGRA_GPIO_PI6, 1, 0),
+       PIN_GPIO_LPM("GMI_CS0",   TEGRA_GPIO_PJ0, 1, 0),
+       PIN_GPIO_LPM("GMI_CS1",   TEGRA_GPIO_PJ2, 1, 0),
+       PIN_GPIO_LPM("GMI_WP_N",  TEGRA_GPIO_PC7, 1, 0),
+};
+
+/* 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),
+};
+
+struct gpio_init_pin_info vddio_gmi_pins_pm269[] = {
+       PIN_GPIO_LPM("GMI_CS3_N", TEGRA_GPIO_PK4, 0, 0),
+       PIN_GPIO_LPM("GMI_CS4_N", TEGRA_GPIO_PK2, 1, 0),
+       PIN_GPIO_LPM("GMI_CS7",   TEGRA_GPIO_PI6, 1, 0),
+       PIN_GPIO_LPM("GMI_CS0",   TEGRA_GPIO_PJ0, 1, 0),
+       PIN_GPIO_LPM("GMI_CS1",   TEGRA_GPIO_PJ2, 1, 0),
+       PIN_GPIO_LPM("GMI_WP_N",  TEGRA_GPIO_PC7, 1, 0),
+       PIN_GPIO_LPM("GMI_A16",   TEGRA_GPIO_PJ7, 0, 0),
+       PIN_GPIO_LPM("GMI_A17",   TEGRA_GPIO_PB0, 0, 0),
+       PIN_GPIO_LPM("GMI_A18",   TEGRA_GPIO_PB1, 1, 0),
+       PIN_GPIO_LPM("GMI_A19",   TEGRA_GPIO_PK7, 0, 0),
+};
+
+/* 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),
+};
+
+static void set_unused_pin_gpio(struct gpio_init_pin_info *lpm_pin_info,
+               int list_count)
 {
+       int i;
+       struct gpio_init_pin_info *pin_info;
        int ret;
-       struct board_info board_info;
 
-       tegra_get_board_info(&board_info);
-       if (board_info.board_id == BOARD_E1291) {
+       for (i = 0; i < list_count; ++i) {
+               pin_info = (struct gpio_init_pin_info *)(lpm_pin_info + i);
+               if (!pin_info->is_gpio)
+                       continue;
 
-               /* Set GMI_CS1_N Signal in GPIO Input Mode*/
-               ret = gpio_request(TEGRA_GPIO_PJ2, "GMI_CS1_N");
+               ret = gpio_request(pin_info->gpio_nr, pin_info->name);
                if (ret < 0) {
                        pr_err("%s() Error in gpio_request() for gpio %d\n",
-                                       __func__, TEGRA_GPIO_PJ2);
-                       return ret;
+                                       __func__, pin_info->gpio_nr);
+                       continue;
                }
-               ret = gpio_direction_input(TEGRA_GPIO_PJ2);
+               if (pin_info->is_input)
+                       ret = gpio_direction_input(pin_info->gpio_nr);
+               else
+                       ret = gpio_direction_output(pin_info->gpio_nr,
+                                                       pin_info->value);
                if (ret < 0) {
-                       pr_err("%s() Error in setting gpio %d to input\n",
-                               __func__, TEGRA_GPIO_PJ2);
-                       gpio_free(TEGRA_GPIO_PJ2);
-                       return ret;
+                       pr_err("%s() Error in setting gpio %d to in/out\n",
+                               __func__, pin_info->gpio_nr);
+                       gpio_free(pin_info->gpio_nr);
+                       continue;
                }
-               tegra_gpio_enable(TEGRA_GPIO_PJ2);
+               tegra_gpio_enable(pin_info->gpio_nr);
+       }
+}
+
+/* Initialize the pins to desired state as per power/asic/system-eng
+ * recomendation */
+int __init cardhu_pins_state_init(void)
+{
+       struct board_info board_info;
+       struct board_info display_board_info;
+
+       tegra_get_board_info(&board_info);
+       tegra_get_display_board_info(&display_board_info);
+       if ((board_info.board_id == BOARD_E1291) ||
+               (board_info.board_id == BOARD_E1198)) {
+                       set_unused_pin_gpio(&pin_lpm_cardhu_common[0],
+                                       ARRAY_SIZE(pin_lpm_cardhu_common));
+
+                       if (display_board_info.board_id != BOARD_DISPLAY_PM313) {
+                               set_unused_pin_gpio(&pin_lpm_cardhu_common_wo_pm313[0],
+                                               ARRAY_SIZE(pin_lpm_cardhu_common_wo_pm313));
+                       }
        }
+
+       if ((board_info.board_id == BOARD_PM269) ||
+               (board_info.board_id == BOARD_E1257) ||
+               (board_info.board_id == BOARD_PM305) ||
+               (board_info.board_id == BOARD_PM311)) {
+                       set_unused_pin_gpio(&vddio_gmi_pins_pm269[0],
+                               ARRAY_SIZE(vddio_gmi_pins_pm269));
+
+                       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));
+                       }
+       }
+
        return 0;
 }