mmc: tegra: Add post resume support
Pavan Kunapuli [Mon, 17 Dec 2012 14:27:05 +0000 (19:27 +0530)]
Adding post resume support to take care
of any platform specific requirements like
turning OFF clocks when device not present etc.

Reading card detect gpio value in resume to
get the proper card present status.

Bug 1188788
Bug 1161783

Change-Id: Ida5a7af031aafd3956198cede9ce12da03fa137b
Signed-off-by: Pavan Kunapuli <pkunapuli@nvidia.com>
Reviewed-on: http://git-master/r/171959
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>

drivers/mmc/host/sdhci-tegra.c

index ab285a0..300b319 100644 (file)
@@ -1089,6 +1089,10 @@ static int tegra_sdhci_resume(struct sdhci_host *sdhci)
 
        pdev = to_platform_device(mmc_dev(sdhci->mmc));
        plat = pdev->dev.platform_data;
+
+       if (gpio_is_valid(plat->cd_gpio))
+               tegra_host->card_present = (gpio_get_value(plat->cd_gpio) == 0);
+
        /* Enable the power rails if any */
        if (tegra_host->card_present) {
                if (!tegra_host->is_rail_enabled) {
@@ -1107,6 +1111,7 @@ static int tegra_sdhci_resume(struct sdhci_host *sdhci)
                        tegra_host->is_rail_enabled = 1;
                }
        }
+
        /* Setting the min identification clock of freq 400KHz */
        tegra_sdhci_set_clock(sdhci, 400000);
 
@@ -1120,6 +1125,16 @@ static int tegra_sdhci_resume(struct sdhci_host *sdhci)
        return 0;
 }
 
+static void tegra_sdhci_post_resume(struct sdhci_host *sdhci)
+{
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
+       struct sdhci_tegra *tegra_host = pltfm_host->priv;
+
+       /* Turn OFF the clocks if the card is not present */
+       if (!(tegra_host->card_present) && tegra_host->clk_enabled)
+               tegra_sdhci_set_clock(sdhci, 0);
+}
+
 static struct sdhci_ops tegra_sdhci_ops = {
 #ifndef CONFIG_ARCH_TEGRA_11x_SOC
        .get_ro     = tegra_sdhci_get_ro,
@@ -1132,6 +1147,7 @@ static struct sdhci_ops tegra_sdhci_ops = {
        .set_clock              = tegra_sdhci_set_clock,
        .suspend                = tegra_sdhci_suspend,
        .resume                 = tegra_sdhci_resume,
+       .platform_resume        = tegra_sdhci_post_resume,
        .platform_reset_exit    = tegra_sdhci_reset_exit,
        .set_uhs_signaling      = tegra_sdhci_set_uhs_signaling,
        .switch_signal_voltage  = tegra_sdhci_signal_voltage_switch,