mmc: sdhci-pci: Respect PM flags when enabling card detect GPIO IRQ wakeup
Commit 03dbaa04a2
("mmc: slot-gpio: Add support to enable irq wake on
cd_irq") enabled wakeup at initialization. However, users also want to
control it from sysfs power/wakeup attribute. That means the driver needs
to check the PM flags before enabling it in the suspend callback. Add
support for that in sdhci-pci, which is the only driver presently using the
MMC_CAP_CD_WAKE flag, and remove the enabling in mmc_gpiod_request_cd_irq()
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
36f1d7e817
commit
d56ee1ff30
|
@ -149,8 +149,6 @@ void mmc_gpiod_request_cd_irq(struct mmc_host *host)
|
|||
|
||||
if (irq < 0)
|
||||
host->caps |= MMC_CAP_NEEDS_POLL;
|
||||
else if ((host->caps & MMC_CAP_CD_WAKE) && !enable_irq_wake(irq))
|
||||
host->slot.cd_wake_enabled = true;
|
||||
}
|
||||
EXPORT_SYMBOL(mmc_gpiod_request_cd_irq);
|
||||
|
||||
|
|
|
@ -41,18 +41,25 @@ static void sdhci_pci_hw_reset(struct sdhci_host *host);
|
|||
static int sdhci_pci_init_wakeup(struct sdhci_pci_chip *chip)
|
||||
{
|
||||
mmc_pm_flag_t pm_flags = 0;
|
||||
bool cap_cd_wake = false;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < chip->num_slots; i++) {
|
||||
struct sdhci_pci_slot *slot = chip->slots[i];
|
||||
|
||||
if (slot)
|
||||
if (slot) {
|
||||
pm_flags |= slot->host->mmc->pm_flags;
|
||||
if (slot->host->mmc->caps & MMC_CAP_CD_WAKE)
|
||||
cap_cd_wake = true;
|
||||
}
|
||||
}
|
||||
|
||||
return device_set_wakeup_enable(&chip->pdev->dev,
|
||||
(pm_flags & MMC_PM_KEEP_POWER) &&
|
||||
(pm_flags & MMC_PM_WAKE_SDIO_IRQ));
|
||||
if ((pm_flags & MMC_PM_KEEP_POWER) && (pm_flags & MMC_PM_WAKE_SDIO_IRQ))
|
||||
return device_wakeup_enable(&chip->pdev->dev);
|
||||
else if (!cap_cd_wake)
|
||||
return device_wakeup_disable(&chip->pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sdhci_pci_suspend_host(struct sdhci_pci_chip *chip)
|
||||
|
@ -76,6 +83,9 @@ static int sdhci_pci_suspend_host(struct sdhci_pci_chip *chip)
|
|||
ret = sdhci_suspend_host(host);
|
||||
if (ret)
|
||||
goto err_pci_suspend;
|
||||
|
||||
if (device_may_wakeup(&chip->pdev->dev))
|
||||
mmc_gpio_set_cd_wake(host->mmc, true);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -99,6 +109,8 @@ int sdhci_pci_resume_host(struct sdhci_pci_chip *chip)
|
|||
ret = sdhci_resume_host(slot->host);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mmc_gpio_set_cd_wake(slot->host->mmc, false);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1698,6 +1710,9 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
|
|||
if (device_can_wakeup(&pdev->dev))
|
||||
host->mmc->pm_caps |= MMC_PM_WAKE_SDIO_IRQ;
|
||||
|
||||
if (host->mmc->caps & MMC_CAP_CD_WAKE)
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
if (slot->cd_idx >= 0) {
|
||||
ret = mmc_gpiod_request_cd(host->mmc, NULL, slot->cd_idx,
|
||||
slot->cd_override_level, 0, NULL);
|
||||
|
|
Loading…
Reference in New Issue