]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
mmc: tegra: Disable SD_CLK before calibration start
authorR Raj Kumar <rrajk@nvidia.com>
Mon, 10 Aug 2015 09:27:09 +0000 (14:57 +0530)
committermobile promotions <svcmobile_promotions@nvidia.com>
Wed, 14 Oct 2015 08:54:47 +0000 (01:54 -0700)
Disabled SD_CLK before auto-calibration start and
enabled it after completion of auto-calibration

Bug 1670647

Change-Id: I3e0d2dd757430cb6f29c1dfeabcf55c96f0a29f5
Reviewed-on: http://git-master/r/781006
(cherry picked from commit fea4877b2bd8e63a3de1e40fb5507933e4d7455a)

Signed-off-by: R Raj Kumar <rrajk@nvidia.com>
Change-Id: Ia4fdfd3e446b1d61410cd41814c996d292d697f5
Reviewed-on: http://git-master/r/814445
GVS: Gerrit_Virtual_Submit
Tested-by: Anubhav Jain <anubhavj@nvidia.com>
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
Reviewed-by: Naveen Kumar Arepalli <naveenk@nvidia.com>
drivers/mmc/host/sdhci-tegra.c

index 60324b2acd62f9a9fee91f1eb2c30fee0c521030..7a7db0ea8277cee43e48c74ad855db8cbb7997f2 100644 (file)
@@ -2011,6 +2011,8 @@ static void tegra_sdhci_do_calibration(struct sdhci_host *sdhci,
        unsigned int pulldown_code;
        unsigned int pullup_code;
        unsigned long pin_config;
+       u16 clk;
+       bool card_clk_enabled;
        int err;
 
        /* No Calibration for sdmmc4 */
@@ -2020,6 +2022,13 @@ static void tegra_sdhci_do_calibration(struct sdhci_host *sdhci,
        if (unlikely(soc_data->nvquirks & NVQUIRK_DISABLE_AUTO_CALIBRATION))
                return;
 
+       clk = sdhci_readw(sdhci, SDHCI_CLOCK_CONTROL);
+       card_clk_enabled = clk & SDHCI_CLOCK_CARD_EN;
+       if (card_clk_enabled) {
+               clk &= ~SDHCI_CLOCK_CARD_EN;
+               sdhci_writew(sdhci, clk, SDHCI_CLOCK_CONTROL);
+       }
+
        val = sdhci_readl(sdhci, SDMMC_SDMEMCOMPPADCTRL);
        val &= ~SDMMC_SDMEMCOMPPADCTRL_VREF_SEL_MASK;
        if (soc_data->nvquirks & NVQUIRK_SET_PAD_E_INPUT_OR_E_PWRD)
@@ -2089,6 +2098,11 @@ static void tegra_sdhci_do_calibration(struct sdhci_host *sdhci,
        if (soc_data->nvquirks & NVQUIRK_SET_PAD_E_INPUT_OR_E_PWRD)
                tegra_sdhci_configure_e_input(sdhci, false);
 
+       if (card_clk_enabled) {
+               clk |= SDHCI_CLOCK_CARD_EN;
+               sdhci_writew(sdhci, clk, SDHCI_CLOCK_CONTROL);
+       }
+
        if (unlikely(soc_data->nvquirks & NVQUIRK_SET_DRIVE_STRENGTH)) {
                /* Disable Auto calibration */
                val = sdhci_readl(sdhci, SDMMC_AUTO_CAL_CONFIG);
@@ -2124,6 +2138,7 @@ static void tegra_sdhci_do_calibration(struct sdhci_host *sdhci,
                                pullup_code, err);
                }
        }
+
        if (tegra_host->plat->en_periodic_calib) {
                tegra_host->timestamp = ktime_get();
                sdhci->timestamp = ktime_get();