diff options
| -rw-r--r-- | drivers/mmc/host/sdhci.c | 20 |
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; |
