|
@@ -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);
|