aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2014-01-13 02:49:16 -0500
committerChris Ball <chris@printf.net>2014-01-20 10:31:08 -0500
commit77a0122e0838663795651aa0beb2325156f98c09 (patch)
treeaa2aff1bfb5d0788226231f3fde022cec8ede1df
parent3e1a6892481034193b2502725f787465ebf39818 (diff)
mmc: sdhci-pci: Fix BYT sd card getting stuck in runtime suspend
A host controller for a SD card may need a GPIO for card detect in order to wake up from runtime suspend when a card is inserted. If that GPIO is not configured, then the host controller will not wake up. Fix that for the affected devices by not enabling runtime PM unless the GPIO is successfully set up. This affects BYT sd card host controller which had runtime PM enabled from v3.11. For completeness, the MFD sd card host controller is flagged also. The original patch before rebasing (see link below) was tested on v3.11.10 and v3.12.4 although the patch applied with some offsets and fuzz. The original patch is here: http://marc.info/?l=linux-mmc&m=138676702327057 Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: stable <stable@vger.kernel.org> # 3.11+ Signed-off-by: Chris Ball <chris@printf.net>
-rw-r--r--drivers/mmc/host/sdhci-pci.c10
-rw-r--r--drivers/mmc/host/sdhci-pci.h1
2 files changed, 11 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c
index f46b84ce4ec8..92e6e81b4de2 100644
--- a/drivers/mmc/host/sdhci-pci.c
+++ b/drivers/mmc/host/sdhci-pci.c
@@ -225,6 +225,7 @@ static const struct sdhci_pci_fixes sdhci_intel_mrst_hc1_hc2 = {
225static const struct sdhci_pci_fixes sdhci_intel_mfd_sd = { 225static const struct sdhci_pci_fixes sdhci_intel_mfd_sd = {
226 .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC, 226 .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
227 .allow_runtime_pm = true, 227 .allow_runtime_pm = true,
228 .own_cd_for_runtime_pm = true,
228}; 229};
229 230
230static const struct sdhci_pci_fixes sdhci_intel_mfd_sdio = { 231static const struct sdhci_pci_fixes sdhci_intel_mfd_sdio = {
@@ -289,6 +290,7 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = {
289static const struct sdhci_pci_fixes sdhci_intel_byt_sd = { 290static const struct sdhci_pci_fixes sdhci_intel_byt_sd = {
290 .quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON, 291 .quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON,
291 .allow_runtime_pm = true, 292 .allow_runtime_pm = true,
293 .own_cd_for_runtime_pm = true,
292}; 294};
293 295
294/* Define Host controllers for Intel Merrifield platform */ 296/* Define Host controllers for Intel Merrifield platform */
@@ -1371,6 +1373,14 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
1371 1373
1372 sdhci_pci_add_own_cd(slot); 1374 sdhci_pci_add_own_cd(slot);
1373 1375
1376 /*
1377 * Check if the chip needs a separate GPIO for card detect to wake up
1378 * from runtime suspend. If it is not there, don't allow runtime PM.
1379 * Note sdhci_pci_add_own_cd() sets slot->cd_gpio to -EINVAL on failure.
1380 */
1381 if (chip->fixes->own_cd_for_runtime_pm && !gpio_is_valid(slot->cd_gpio))
1382 chip->allow_runtime_pm = false;
1383
1374 return slot; 1384 return slot;
1375 1385
1376remove: 1386remove:
diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h
index 0347804eda80..6d718719659e 100644
--- a/drivers/mmc/host/sdhci-pci.h
+++ b/drivers/mmc/host/sdhci-pci.h
@@ -39,6 +39,7 @@ struct sdhci_pci_fixes {
39 unsigned int quirks; 39 unsigned int quirks;
40 unsigned int quirks2; 40 unsigned int quirks2;
41 bool allow_runtime_pm; 41 bool allow_runtime_pm;
42 bool own_cd_for_runtime_pm;
42 43
43 int (*probe) (struct sdhci_pci_chip *); 44 int (*probe) (struct sdhci_pci_chip *);
44 45