|
@@ -1711,24 +1711,14 @@ static int sdhci_get_ro(struct mmc_host *mmc)
|
|
|
|
|
|
static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable)
|
|
|
{
|
|
|
- if (host->flags & SDHCI_DEVICE_DEAD)
|
|
|
- goto out;
|
|
|
-
|
|
|
- if (enable)
|
|
|
- host->flags |= SDHCI_SDIO_IRQ_ENABLED;
|
|
|
- else
|
|
|
- host->flags &= ~SDHCI_SDIO_IRQ_ENABLED;
|
|
|
-
|
|
|
/* SDIO IRQ will be enabled as appropriate in runtime resume */
|
|
|
- if (host->runtime_suspended)
|
|
|
- goto out;
|
|
|
-
|
|
|
- if (enable)
|
|
|
- sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT);
|
|
|
- else
|
|
|
- sdhci_mask_irqs(host, SDHCI_INT_CARD_INT);
|
|
|
-out:
|
|
|
- mmiowb();
|
|
|
+ if (!(host->flags & SDHCI_DEVICE_DEAD) || host->runtime_suspended) {
|
|
|
+ if (enable)
|
|
|
+ sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT);
|
|
|
+ else
|
|
|
+ sdhci_mask_irqs(host, SDHCI_INT_CARD_INT);
|
|
|
+ mmiowb();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
|
@@ -1736,9 +1726,18 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
|
|
struct sdhci_host *host = mmc_priv(mmc);
|
|
|
unsigned long flags;
|
|
|
|
|
|
+ sdhci_runtime_pm_get(host);
|
|
|
+
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
+ if (enable)
|
|
|
+ host->flags |= SDHCI_SDIO_IRQ_ENABLED;
|
|
|
+ else
|
|
|
+ host->flags &= ~SDHCI_SDIO_IRQ_ENABLED;
|
|
|
+
|
|
|
sdhci_enable_sdio_irq_nolock(host, enable);
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
|
+
|
|
|
+ sdhci_runtime_pm_put(host);
|
|
|
}
|
|
|
|
|
|
static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host,
|
|
@@ -2726,7 +2725,7 @@ int sdhci_runtime_resume_host(struct sdhci_host *host)
|
|
|
host->runtime_suspended = false;
|
|
|
|
|
|
/* Enable SDIO IRQ */
|
|
|
- if ((host->flags & SDHCI_SDIO_IRQ_ENABLED))
|
|
|
+ if (host->flags & SDHCI_SDIO_IRQ_ENABLED)
|
|
|
sdhci_enable_sdio_irq_nolock(host, true);
|
|
|
|
|
|
/* Enable Card Detection */
|