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);
 
                        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;
                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;
        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;
        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;
 
 #define  SDHCI_INT_CARD_INSERT 0x00000040
 #define  SDHCI_INT_CARD_REMOVE 0x00000080
 #define  SDHCI_INT_CARD_INT    0x00000100
+#define  SDHCI_INT_RETUNE      0x00001000
 #define  SDHCI_INT_ERROR       0x00008000
 #define  SDHCI_INT_TIMEOUT     0x00010000
 #define  SDHCI_INT_CRC         0x00020000
        unsigned int            tuning_count;   /* Timer count for re-tuning */
        unsigned int            tuning_mode;    /* Re-tuning mode supported by host */
 #define SDHCI_TUNING_MODE_1    0
+#define SDHCI_TUNING_MODE_2    1
+#define SDHCI_TUNING_MODE_3    2
 
        unsigned long private[0] ____cacheline_aligned;
 };