summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavan Kunapuli <pkunapuli@nvidia.com>2012-04-18 19:02:38 +0530
committerSimone Willett <swillett@nvidia.com>2012-04-19 16:18:41 -0700
commitb31946b34507209f26c6d709e23fd1c0cedd25f8 (patch)
treee4be99bbeada6bb162854980e93c4359dc941a8d
parent3c4ca18e7e31b875cbe2e18677260c090ccd542c (diff)
mmc: host: Disable SDIO card clock when idle
Disable SDIO card clock when there are no commands/ data transfers on the SD bus. Bug 958954 Bug 955742 Bug 952344 Change-Id: I7390be0406f7e46c0eb88ede2ae6f904b2181306 Signed-off-by: Pavan Kunapuli <pkunapuli@nvidia.com> Reviewed-on: http://git-master/r/95390 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com>
-rw-r--r--drivers/mmc/host/sdhci.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index e0eeb3484960..6c6045879022 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1849,14 +1849,21 @@ static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable)
int sdhci_enable(struct mmc_host *mmc)
{
struct sdhci_host *host = mmc_priv(mmc);
+ u16 clk;
- if (!mmc->card || mmc->card->type == MMC_TYPE_SDIO)
+ if (!mmc->card)
return 0;
if (mmc->ios.clock) {
- if (host->ops->set_clock)
- host->ops->set_clock(host, mmc->ios.clock);
- sdhci_set_clock(host, mmc->ios.clock);
+ if (mmc->card->type != MMC_TYPE_SDIO) {
+ if (host->ops->set_clock)
+ host->ops->set_clock(host, mmc->ios.clock);
+ sdhci_set_clock(host, mmc->ios.clock);
+ } else {
+ clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
+ clk |= SDHCI_CLOCK_CARD_EN;
+ sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
+ }
}
return 0;
@@ -1865,13 +1872,21 @@ int sdhci_enable(struct mmc_host *mmc)
int sdhci_disable(struct mmc_host *mmc, int lazy)
{
struct sdhci_host *host = mmc_priv(mmc);
+ u16 clk;
- if (!mmc->card || mmc->card->type == MMC_TYPE_SDIO)
+ if (!mmc->card)
return 0;
- sdhci_set_clock(host, 0);
- if (host->ops->set_clock)
- host->ops->set_clock(host, 0);
+ /* For SDIO cards, only disable the card clock. */
+ if (mmc->card->type != MMC_TYPE_SDIO) {
+ sdhci_set_clock(host, 0);
+ if (host->ops->set_clock)
+ host->ops->set_clock(host, 0);
+ } else {
+ clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
+ clk &= ~SDHCI_CLOCK_CARD_EN;
+ sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
+ }
return 0;
}