diff options
author | Pavan Kunapuli <pkunapuli@nvidia.com> | 2012-04-18 19:02:38 +0530 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-04-19 16:18:41 -0700 |
commit | b31946b34507209f26c6d709e23fd1c0cedd25f8 (patch) | |
tree | e4be99bbeada6bb162854980e93c4359dc941a8d /drivers/mmc | |
parent | 3c4ca18e7e31b875cbe2e18677260c090ccd542c (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>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/sdhci.c | 31 |
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; } |