|
@@ -229,6 +229,10 @@ static void sdhci_init(struct sdhci_host *host, int soft)
|
|
|
SDHCI_INT_TIMEOUT | SDHCI_INT_DATA_END |
|
|
|
SDHCI_INT_RESPONSE;
|
|
|
|
|
|
+ if (host->tuning_mode == SDHCI_TUNING_MODE_2 ||
|
|
|
+ host->tuning_mode == SDHCI_TUNING_MODE_3)
|
|
|
+ host->ier |= SDHCI_INT_RETUNE;
|
|
|
+
|
|
|
sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);
|
|
|
sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
|
|
|
|
|
@@ -2673,6 +2677,9 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
|
|
|
pr_err("%s: Card is consuming too much power!\n",
|
|
|
mmc_hostname(host->mmc));
|
|
|
|
|
|
+ if (intmask & SDHCI_INT_RETUNE)
|
|
|
+ mmc_retune_needed(host->mmc);
|
|
|
+
|
|
|
if (intmask & SDHCI_INT_CARD_INT) {
|
|
|
sdhci_enable_sdio_irq_nolock(host, false);
|
|
|
host->thread_isr |= SDHCI_INT_CARD_INT;
|
|
@@ -2682,7 +2689,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
|
|
|
intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE |
|
|
|
SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK |
|
|
|
SDHCI_INT_ERROR | SDHCI_INT_BUS_POWER |
|
|
|
- SDHCI_INT_CARD_INT);
|
|
|
+ SDHCI_INT_RETUNE | SDHCI_INT_CARD_INT);
|
|
|
|
|
|
if (intmask) {
|
|
|
unexpected |= intmask;
|
|
@@ -2787,7 +2794,8 @@ int sdhci_suspend_host(struct sdhci_host *host)
|
|
|
sdhci_disable_card_detection(host);
|
|
|
|
|
|
mmc_retune_timer_stop(host->mmc);
|
|
|
- mmc_retune_needed(host->mmc);
|
|
|
+ if (host->tuning_mode != SDHCI_TUNING_MODE_3)
|
|
|
+ mmc_retune_needed(host->mmc);
|
|
|
|
|
|
if (!device_may_wakeup(mmc_dev(host->mmc))) {
|
|
|
host->ier = 0;
|
|
@@ -2848,7 +2856,8 @@ int sdhci_runtime_suspend_host(struct sdhci_host *host)
|
|
|
unsigned long flags;
|
|
|
|
|
|
mmc_retune_timer_stop(host->mmc);
|
|
|
- mmc_retune_needed(host->mmc);
|
|
|
+ if (host->tuning_mode != SDHCI_TUNING_MODE_3)
|
|
|
+ mmc_retune_needed(host->mmc);
|
|
|
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
host->ier &= SDHCI_INT_CARD_INT;
|