Skip to content

Commit

Permalink
mmc: sdhci-pci: Fix BYT sd card getting stuck in runtime suspend
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Adrian Hunter authored and Chris Ball committed Jan 20, 2014
1 parent 3e1a689 commit 77a0122
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/mmc/host/sdhci-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ static const struct sdhci_pci_fixes sdhci_intel_mrst_hc1_hc2 = {
static const struct sdhci_pci_fixes sdhci_intel_mfd_sd = {
.quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
.allow_runtime_pm = true,
.own_cd_for_runtime_pm = true,
};

static const struct sdhci_pci_fixes sdhci_intel_mfd_sdio = {
Expand Down Expand Up @@ -289,6 +290,7 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = {
static const struct sdhci_pci_fixes sdhci_intel_byt_sd = {
.quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON,
.allow_runtime_pm = true,
.own_cd_for_runtime_pm = true,
};

/* Define Host controllers for Intel Merrifield platform */
Expand Down Expand Up @@ -1371,6 +1373,14 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(

sdhci_pci_add_own_cd(slot);

/*
* Check if the chip needs a separate GPIO for card detect to wake up
* from runtime suspend. If it is not there, don't allow runtime PM.
* Note sdhci_pci_add_own_cd() sets slot->cd_gpio to -EINVAL on failure.
*/
if (chip->fixes->own_cd_for_runtime_pm && !gpio_is_valid(slot->cd_gpio))
chip->allow_runtime_pm = false;

return slot;

remove:
Expand Down
1 change: 1 addition & 0 deletions drivers/mmc/host/sdhci-pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ struct sdhci_pci_fixes {
unsigned int quirks;
unsigned int quirks2;
bool allow_runtime_pm;
bool own_cd_for_runtime_pm;

int (*probe) (struct sdhci_pci_chip *);

Expand Down

0 comments on commit 77a0122

Please sign in to comment.