diff options
author | Bitan Biswas <bbiswas@nvidia.com> | 2014-02-25 17:11:19 +0530 |
---|---|---|
committer | Bitan Biswas <bbiswas@nvidia.com> | 2014-03-10 10:17:42 -0700 |
commit | 5431ad3ab3834ef97eea9c3c0fc989084942d411 (patch) | |
tree | 9b5a9d8e25e38980b7d2b608b288042fba7a7980 /drivers/mmc | |
parent | fc1b1b900e51881bdfcb83857a540a32e7e4655a (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.c | 13 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 26 |
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; } |