summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2011-06-09 17:48:27 -0700
committerColin Cross <ccross@android.com>2011-06-09 17:48:27 -0700
commit321fc8e64a54be22308bee68eaafd81672eb6c45 (patch)
tree070804e3ba717fadc814fefcd7bb98141e201997 /drivers/mmc
parent1dfd911585f4376e4859db0fbb26b8fb39cf0951 (diff)
parent461b3c034b82dff7d7ced336aeed61dd0064bf07 (diff)
Merge branch 'android-2.6.36' into android-tegra-2.6.36
Conflicts: drivers/mmc/host/sdhci.c Change-Id: I9a048b52a7f82631caf222c5f273265bb9927675
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/sdhci.c32
-rw-r--r--drivers/mmc/host/sdhci.h2
2 files changed, 34 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 7577da76fbb2..ba32a2ef93a1 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1229,6 +1229,31 @@ static int sdhci_get_ro(struct mmc_host *mmc)
return present;
}
+static int sdhci_enable(struct mmc_host *mmc)
+{
+ struct sdhci_host *host = mmc_priv(mmc);
+
+ if (!mmc->card || mmc->card->type == MMC_TYPE_SDIO)
+ return 0;
+
+ if (mmc->ios.clock)
+ sdhci_set_clock(host, mmc->ios.clock);
+
+ return 0;
+}
+
+static int sdhci_disable(struct mmc_host *mmc, int lazy)
+{
+ struct sdhci_host *host = mmc_priv(mmc);
+
+ if (!mmc->card || mmc->card->type == MMC_TYPE_SDIO)
+ return 0;
+
+ sdhci_set_clock(host, 0);
+
+ return 0;
+}
+
static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
{
struct sdhci_host *host;
@@ -1265,6 +1290,8 @@ static const struct mmc_host_ops sdhci_ops = {
.request = sdhci_request,
.set_ios = sdhci_set_ios,
.get_ro = sdhci_get_ro,
+ .enable = sdhci_enable,
+ .disable = sdhci_disable,
.enable_sdio_irq = sdhci_enable_sdio_irq,
};
@@ -1871,6 +1898,11 @@ int sdhci_add_host(struct sdhci_host *host)
if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
mmc->caps |= MMC_CAP_NEEDS_POLL;
+ if (host->quirks & SDHCI_QUIRK_RUNTIME_DISABLE) {
+ mmc->caps |= MMC_CAP_DISABLE;
+ mmc_set_disable_delay(mmc, 50);
+ }
+
mmc->caps |= MMC_CAP_ERASE;
mmc->ocr_avail = 0;
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 4a425440845a..cfa3e70ccffa 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -264,6 +264,8 @@ struct sdhci_host {
#define SDHCI_QUIRK_NO_SDIO_IRQ (1LL<<36)
/* Controller should only use high-speed mode */
#define SDHCI_QUIRK_FORCE_HIGH_SPEED_MODE (1LL<<37)
+/* Controller allows runtime enable / disable */
+#define SDHCI_QUIRK_RUNTIME_DISABLE (1LL<<38)
int irq; /* Device IRQ */
void __iomem * ioaddr; /* Mapped address */