summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorBitan Biswas <bbiswas@nvidia.com>2014-02-25 17:11:19 +0530
committerBitan Biswas <bbiswas@nvidia.com>2014-03-10 10:17:42 -0700
commit5431ad3ab3834ef97eea9c3c0fc989084942d411 (patch)
tree9b5a9d8e25e38980b7d2b608b288042fba7a7980 /drivers/mmc
parentfc1b1b900e51881bdfcb83857a540a32e7e4655a (diff)
mmc: sdhci: reduce SDIO delayed clk gate timeout
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>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/sdhci-tegra.c13
-rw-r--r--drivers/mmc/host/sdhci.c26
2 files changed, 35 insertions, 4 deletions
diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c
index 9d9c9209ebdb..1587e00146fd 100644
--- a/drivers/mmc/host/sdhci-tegra.c
+++ b/drivers/mmc/host/sdhci-tegra.c
@@ -172,6 +172,9 @@
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:
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 4ffb4eb589bb..1b29947a4395 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -55,7 +55,16 @@
#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;
}