]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
mmc: sdhci: reduce SDIO delayed clk gate timeout
authorBitan Biswas <bbiswas@nvidia.com>
Tue, 25 Feb 2014 11:41:19 +0000 (17:11 +0530)
committerBitan Biswas <bbiswas@nvidia.com>
Mon, 10 Mar 2014 17:17:42 +0000 (10:17 -0700)
Delayed clock gate timeout for SDIO reduced
from 20msec to 1msec
 - debugfs node added to change delayed
   clock gate timeout

bug 1414742
bug 1453205

Change-Id: I875b6651aa739b5601cfed1bbe90c327a14a7bda
Signed-off-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-on: http://git-master/r/374156
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
drivers/mmc/host/sdhci-tegra.c
drivers/mmc/host/sdhci.c
include/linux/mmc/sdhci.h

index 9d9c9209ebdb218234f9ca5e736246be805248b7..1587e00146fd9ac54c49c0e991d3279260355a95 100644 (file)
                  SDHCI_QUIRK2_NO_CALC_MAX_DISCARD_TO | \
                  SDHCI_QUIRK2_REG_ACCESS_REQ_HOST_CLK)
 
+#define IS_QUIRKS2_DELAYED_CLK_GATE(host) \
+               (host->quirks2 & SDHCI_QUIRK2_DELAYED_CLK_GATE)
+
 /* Interface voltages */
 #define SDHOST_1V8_OCR_MASK    0x8
 #define SDHOST_HIGH_VOLT_MIN   2700000
@@ -3578,6 +3581,16 @@ static void sdhci_tegra_error_stats_debugfs(struct sdhci_host *host)
                saved_line = __LINE__;
                goto err_node;
        }
+       if (IS_QUIRKS2_DELAYED_CLK_GATE(host)) {
+               host->clk_gate_tmout_ticks = -1;
+               if (!debugfs_create_u32("clk_gate_tmout_ticks",
+                       S_IRUGO | S_IWUSR,
+                       root, (u32 *)&host->clk_gate_tmout_ticks)) {
+                       saved_line = __LINE__;
+                       goto err_node;
+               }
+       }
+
        return;
 
 err_node:
index 4ffb4eb589bb05f22d92dd9fda8f2ce5f33217f0..1b29947a4395a195aa6ca7d72f4a75fe2e8427cb 100644 (file)
 
 #define MAX_TUNING_LOOP 40
 
-#define SDIO_CLK_GATING_TICK_TMOUT (HZ / 50)
+#define SDIO_CLK_GATING_TICK_TMOUT (HZ / 1000) /* 1msec timeout */
+#define EMMC_CLK_GATING_TICK_TMOUT (HZ / 50) /* 20msec timeout */
+
+#define IS_SDIO_CARD(host) \
+               (host->mmc->card && \
+               (host->mmc->card->type == MMC_TYPE_SDIO))
+
+#define IS_EMMC_CARD(host) \
+               (host->mmc->card && \
+               (host->mmc->card->type == MMC_TYPE_MMC))
 
 #define IS_SDIO_CARD_OR_EMMC(host) \
                (host->mmc->card && \
@@ -2499,9 +2508,18 @@ int sdhci_disable(struct mmc_host *mmc)
                return 0;
 
        if (IS_DELAYED_CLK_GATE(host)) {
-               if (host->is_clk_on)
-                       schedule_delayed_work(&host->delayed_clk_gate_wrk,
-                               SDIO_CLK_GATING_TICK_TMOUT);
+               if (host->is_clk_on) {
+                       if (IS_SDIO_CARD(host))
+                               host->clk_gate_tmout_ticks =
+                                       SDIO_CLK_GATING_TICK_TMOUT;
+                       else if (IS_EMMC_CARD(host))
+                               host->clk_gate_tmout_ticks =
+                                       EMMC_CLK_GATING_TICK_TMOUT;
+                       if (host->clk_gate_tmout_ticks > 0)
+                               schedule_delayed_work(
+                                       &host->delayed_clk_gate_wrk,
+                                       host->clk_gate_tmout_ticks);
+               }
                return 0;
        }
 
index 08cc2d93532631d4ef7505db49b2e25228a9bf47..ebd40bcfa1cfa930f9d0e52e62296aedd183063c 100644 (file)
@@ -240,6 +240,7 @@ struct sdhci_host {
 #ifdef CONFIG_DEBUG_FS
        bool                    enable_sdhci_perf_stats;
 #endif
+       int                     clk_gate_tmout_ticks;
 
        unsigned long private[0] ____cacheline_aligned;
 };