omap_hsmmc: avoid requesting dma repeatedly
[pandora-kernel.git] / drivers / mmc / host / sdhci.c
index 6d8eea3..9f68b82 100644 (file)
@@ -1364,8 +1364,7 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios)
                if ((ios->timing == MMC_TIMING_UHS_SDR50) ||
                    (ios->timing == MMC_TIMING_UHS_SDR104) ||
                    (ios->timing == MMC_TIMING_UHS_DDR50) ||
-                   (ios->timing == MMC_TIMING_UHS_SDR25) ||
-                   (ios->timing == MMC_TIMING_UHS_SDR12))
+                   (ios->timing == MMC_TIMING_UHS_SDR25))
                        ctrl |= SDHCI_CTRL_HISPD;
 
                ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
@@ -1671,12 +1670,12 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
        int tuning_loop_counter = MAX_TUNING_LOOP;
        unsigned long timeout;
        int err = 0;
+       unsigned long flags;
 
        host = mmc_priv(mmc);
 
        sdhci_runtime_pm_get(host);
-       disable_irq(host->irq);
-       spin_lock(&host->lock);
+       spin_lock_irqsave(&host->lock, flags);
 
        ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
 
@@ -1690,8 +1689,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
            (host->flags & SDHCI_SDR50_NEEDS_TUNING)))
                ctrl |= SDHCI_CTRL_EXEC_TUNING;
        else {
-               spin_unlock(&host->lock);
-               enable_irq(host->irq);
+               spin_unlock_irqrestore(&host->lock, flags);
                sdhci_runtime_pm_put(host);
                return 0;
        }
@@ -1753,15 +1751,12 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
                host->cmd = NULL;
                host->mrq = NULL;
 
-               spin_unlock(&host->lock);
-               enable_irq(host->irq);
-
+               spin_unlock_irqrestore(&host->lock, flags);
                /* Wait for Buffer Read Ready interrupt */
                wait_event_interruptible_timeout(host->buf_ready_int,
                                        (host->tuning_done == 1),
                                        msecs_to_jiffies(50));
-               disable_irq(host->irq);
-               spin_lock(&host->lock);
+               spin_lock_irqsave(&host->lock, flags);
 
                if (!host->tuning_done) {
                        pr_info(DRIVER_NAME ": Timeout waiting for "
@@ -1834,8 +1829,7 @@ out:
                err = 0;
 
        sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier);
-       spin_unlock(&host->lock);
-       enable_irq(host->irq);
+       spin_unlock_irqrestore(&host->lock, flags);
        sdhci_runtime_pm_put(host);
 
        return err;
@@ -2327,7 +2321,7 @@ out:
 
 #ifdef CONFIG_PM
 
-int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state)
+int sdhci_suspend_host(struct sdhci_host *host)
 {
        int ret;
 
@@ -2336,9 +2330,8 @@ int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state)
        /* Disable tuning since we are suspending */
        if (host->version >= SDHCI_SPEC_300 && host->tuning_count &&
            host->tuning_mode == SDHCI_TUNING_MODE_1) {
+               del_timer_sync(&host->tuning_timer);
                host->flags &= ~SDHCI_NEEDS_RETUNING;
-               mod_timer(&host->tuning_timer, jiffies +
-                       host->tuning_count * HZ);
        }
 
        ret = mmc_suspend_host(host->mmc);
@@ -2714,8 +2707,9 @@ int sdhci_add_host(struct sdhci_host *host)
            mmc_card_is_removable(mmc))
                mmc->caps |= MMC_CAP_NEEDS_POLL;
 
-       /* UHS-I mode(s) supported by the host controller. */
-       if (host->version >= SDHCI_SPEC_300)
+       /* Any UHS-I mode in caps implies SDR12 and SDR25 support. */
+       if (caps[1] & (SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
+                      SDHCI_SUPPORT_DDR50))
                mmc->caps |= MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25;
 
        /* SDR104 supports also implies SDR50 support */