sdhci-tegra:Enable Hotplugin and wp support for sd card.
Pavan Kunapuli [Mon, 7 Feb 2011 08:10:30 +0000 (00:10 -0800)]
Enabling hot plugin/plugout support for sd card using
a gpio.
Enabling write protect detection support for sd card
using a gpio.
Enabling SDHCI_QUIRK_BROKEN_CARD_DETECTION quirk for
sdmmc on T30.

Bug 784133
Bug 786261

Original-Change-Id: Ie9a49472f4b2337a7e2b0eb52c2cb346b021f768
Reviewed-on: http://git-master/r/18438
Tested-by: Pavan Kunapuli <pkunapuli@nvidia.com>
Reviewed-by: Venkata Nageswara Penumarty <vpenumarty@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Original-Change-Id: I5b41730281aa360b2ec29fd94c7644d008e8be28

Rebase-Id: R49ff50b7948a07a4d4faef5dc5678889093d2950

arch/arm/mach-tegra/board-cardhu-pinmux.c
arch/arm/mach-tegra/board-cardhu-sdhci.c

index c3936bc..5db9c38 100644 (file)
@@ -375,10 +375,10 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux[] = {
        DEFAULT_PINMUX(HDMI_INT,        RSVD0,           NORMAL,    TRISTATE,   INPUT),
 
        /* Gpios */
-       /* SDMMC1 WP gpio */
-       DEFAULT_PINMUX(VI_D11,          RSVD1,           NORMAL,    NORMAL,     INPUT),
        /* SDMMC1 CD gpio */
-       DEFAULT_PINMUX(GMI_IORDY,       RSVD1,           NORMAL,    NORMAL,     INPUT),
+       DEFAULT_PINMUX(GMI_IORDY,       RSVD1,           PULL_UP,    NORMAL,     INPUT),
+       /* SDMMC1 WP gpio */
+       DEFAULT_PINMUX(VI_D11,          RSVD1,           PULL_UP,    NORMAL,     INPUT),
 
 
        /* Power rails GPIO */
index 31c2bef..52ae10f 100644 (file)
@@ -30,6 +30,9 @@
 #include "gpio-names.h"
 #include "board.h"
 
+#define CARDHU_SD_CD TEGRA_GPIO_PI5
+#define CARDHU_SD_WP TEGRA_GPIO_PT3
+
 static struct resource sdhci_resource0[] = {
        [0] = {
                .start  = INT_SDMMC1,
@@ -143,15 +146,19 @@ static int cardhu_sd_cd_gpio_init(void)
 {
        unsigned int rc = 0;
 
-       rc = gpio_request(TEGRA_GPIO_PI5, "card_detect");
-       if (rc)
+       rc = gpio_request(CARDHU_SD_CD, "card_detect");
+       if (rc) {
+               pr_err("Card detect gpio request failed:%d\n", rc);
                return rc;
+       }
 
-       tegra_gpio_enable(TEGRA_GPIO_PI5);
+       tegra_gpio_enable(CARDHU_SD_CD);
 
-       rc = gpio_direction_input(TEGRA_GPIO_PI5);
-       if (rc)
+       rc = gpio_direction_input(CARDHU_SD_CD);
+       if (rc) {
+               pr_err("Unable to configure direction for card detect gpio:%d\n", rc);
                return rc;
+       }
 
        return 0;
 }
@@ -160,15 +167,19 @@ static int cardhu_sd_wp_gpio_init(void)
 {
        unsigned int rc = 0;
 
-       rc = gpio_request(TEGRA_GPIO_PT3, "write_protect");
-       if (rc)
+       rc = gpio_request(CARDHU_SD_WP, "write_protect");
+       if (rc) {
+               pr_err("Write protect gpio request failed:%d\n", rc);
                return rc;
+       }
 
-       tegra_gpio_enable(TEGRA_GPIO_PT3);
+       tegra_gpio_enable(CARDHU_SD_WP);
 
-       rc = gpio_direction_input(TEGRA_GPIO_PT3);
-       if (rc)
+       rc = gpio_direction_input(CARDHU_SD_WP);
+       if (rc) {
+               pr_err("Unable to configure direction for write protect gpio:%d\n", rc);
                return rc;
+       }
 
        return 0;
 }
@@ -179,16 +190,18 @@ int __init cardhu_sdhci_init(void)
        platform_device_register(&tegra_sdhci_device3);
        platform_device_register(&tegra_sdhci_device2);
 
-#if 0
        /* Fix ME: The gpios have to enabled for hot plug support */
        rc = cardhu_sd_cd_gpio_init();
-       if (!rc)
-               tegra_sdhci_platform_data0.cd_gpio = TEGRA_GPIO_PI5;
-
+       if (!rc) {
+               tegra_sdhci_platform_data0.cd_gpio = CARDHU_SD_CD;
+               tegra_sdhci_platform_data0.cd_gpio_polarity = 0;
+       }
        rc = cardhu_sd_wp_gpio_init();
-       if (!rc)
-               tegra_sdhci_platform_data0.cd_gpio = TEGRA_GPIO_PT3;
-#endif
+       if (!rc) {
+               tegra_sdhci_platform_data0.wp_gpio = CARDHU_SD_WP;
+               tegra_sdhci_platform_data0.wp_gpio_polarity = 1;
+       }
+
        platform_device_register(&tegra_sdhci_device0);
        return 0;
 }