diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2012-09-17 04:45:10 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2012-09-19 04:29:45 -0400 |
commit | bec9d4e5939987053169a9bb48fc58b6a2d3e237 (patch) | |
tree | e5a018e18cc34cebe2248c4b169988ebaaa33890 | |
parent | 5413da811fbb11bc0482c92cbb8415073591d462 (diff) |
mmc: sdhci: Test cd-gpio instead of SDHCI presence when probing
Previously to this patch, an SDHCI platform that uses a GPIO for
card detection instead of the internal SDHCI_CARD_PRESENT bit on
the presence register would fail to detect a new card.
Some drivers worked around this in various ways: esdhc-imx defines
an IO accessor to fake the presence bit being true, s3c turns on
polling (which stops the SDHCI driver from checking the bit) after
a card's inserted. But none of this should be necessary; the real
fix is to check whether we're using a GPIO and avoid relying on
the presence bit if so, as this patch implements.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r-- | drivers/mmc/host/sdhci.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index d98b1992d778..0e15c79014fb 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/mmc/mmc.h> | 28 | #include <linux/mmc/mmc.h> |
29 | #include <linux/mmc/host.h> | 29 | #include <linux/mmc/host.h> |
30 | #include <linux/mmc/card.h> | 30 | #include <linux/mmc/card.h> |
31 | #include <linux/mmc/slot-gpio.h> | ||
31 | 32 | ||
32 | #include "sdhci.h" | 33 | #include "sdhci.h" |
33 | 34 | ||
@@ -1293,6 +1294,13 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
1293 | present = sdhci_readl(host, SDHCI_PRESENT_STATE) & | 1294 | present = sdhci_readl(host, SDHCI_PRESENT_STATE) & |
1294 | SDHCI_CARD_PRESENT; | 1295 | SDHCI_CARD_PRESENT; |
1295 | 1296 | ||
1297 | /* If we're using a cd-gpio, testing the presence bit might fail. */ | ||
1298 | if (!present) { | ||
1299 | int ret = mmc_gpio_get_cd(host->mmc); | ||
1300 | if (ret > 0) | ||
1301 | present = true; | ||
1302 | } | ||
1303 | |||
1296 | if (!present || host->flags & SDHCI_DEVICE_DEAD) { | 1304 | if (!present || host->flags & SDHCI_DEVICE_DEAD) { |
1297 | host->mrq->cmd->error = -ENOMEDIUM; | 1305 | host->mrq->cmd->error = -ENOMEDIUM; |
1298 | tasklet_schedule(&host->finish_tasklet); | 1306 | tasklet_schedule(&host->finish_tasklet); |