aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/host/sdhci.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ec3eb30845c7..0a1893a54dd7 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1857,12 +1857,12 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
1857 unsigned long timeout; 1857 unsigned long timeout;
1858 int err = 0; 1858 int err = 0;
1859 bool requires_tuning_nonuhs = false; 1859 bool requires_tuning_nonuhs = false;
1860 unsigned long flags;
1860 1861
1861 host = mmc_priv(mmc); 1862 host = mmc_priv(mmc);
1862 1863
1863 sdhci_runtime_pm_get(host); 1864 sdhci_runtime_pm_get(host);
1864 disable_irq(host->irq); 1865 spin_lock_irqsave(&host->lock, flags);
1865 spin_lock(&host->lock);
1866 1866
1867 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); 1867 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
1868 1868
@@ -1882,15 +1882,13 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
1882 requires_tuning_nonuhs) 1882 requires_tuning_nonuhs)
1883 ctrl |= SDHCI_CTRL_EXEC_TUNING; 1883 ctrl |= SDHCI_CTRL_EXEC_TUNING;
1884 else { 1884 else {
1885 spin_unlock(&host->lock); 1885 spin_unlock_irqrestore(&host->lock, flags);
1886 enable_irq(host->irq);
1887 sdhci_runtime_pm_put(host); 1886 sdhci_runtime_pm_put(host);
1888 return 0; 1887 return 0;
1889 } 1888 }
1890 1889
1891 if (host->ops->platform_execute_tuning) { 1890 if (host->ops->platform_execute_tuning) {
1892 spin_unlock(&host->lock); 1891 spin_unlock_irqrestore(&host->lock, flags);
1893 enable_irq(host->irq);
1894 err = host->ops->platform_execute_tuning(host, opcode); 1892 err = host->ops->platform_execute_tuning(host, opcode);
1895 sdhci_runtime_pm_put(host); 1893 sdhci_runtime_pm_put(host);
1896 return err; 1894 return err;
@@ -1963,15 +1961,12 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
1963 host->cmd = NULL; 1961 host->cmd = NULL;
1964 host->mrq = NULL; 1962 host->mrq = NULL;
1965 1963
1966 spin_unlock(&host->lock); 1964 spin_unlock_irqrestore(&host->lock, flags);
1967 enable_irq(host->irq);
1968
1969 /* Wait for Buffer Read Ready interrupt */ 1965 /* Wait for Buffer Read Ready interrupt */
1970 wait_event_interruptible_timeout(host->buf_ready_int, 1966 wait_event_interruptible_timeout(host->buf_ready_int,
1971 (host->tuning_done == 1), 1967 (host->tuning_done == 1),
1972 msecs_to_jiffies(50)); 1968 msecs_to_jiffies(50));
1973 disable_irq(host->irq); 1969 spin_lock_irqsave(&host->lock, flags);
1974 spin_lock(&host->lock);
1975 1970
1976 if (!host->tuning_done) { 1971 if (!host->tuning_done) {
1977 pr_info(DRIVER_NAME ": Timeout waiting for " 1972 pr_info(DRIVER_NAME ": Timeout waiting for "
@@ -2046,8 +2041,7 @@ out:
2046 err = 0; 2041 err = 0;
2047 2042
2048 sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier); 2043 sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier);
2049 spin_unlock(&host->lock); 2044 spin_unlock_irqrestore(&host->lock, flags);
2050 enable_irq(host->irq);
2051 sdhci_runtime_pm_put(host); 2045 sdhci_runtime_pm_put(host);
2052 2046
2053 return err; 2047 return err;