diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-03-31 15:05:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-03-31 15:05:05 -0400 |
commit | 728f4b3aa6621aba12e9f9c2f006f2912a90463a (patch) | |
tree | 9bc11cbaa7276e4e9683122f77dab24a41b39e99 | |
parent | 0fc04f911374594de1c6b50cde53f5802241e668 (diff) | |
parent | d0918764c17b94c30bbb2619929b1719ff52707a (diff) |
Merge tag 'mmc-v4.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
Pull MMC fixes from Ulf Hansson:
"Here are a couple of mmc fixes intended for v4.11 rc5.
MMC host:
- sdhci: Fix bug when using SDIO IRQ
- sdhci-of-at91: Fix eMMC DDR52 card detection"
* tag 'mmc-v4.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
mmc: sdhci-of-at91: fix MMC_DDR_52 timing selection
mmc: sdhci: Disable runtime pm when the sdio_irq is enabled
-rw-r--r-- | drivers/mmc/host/sdhci-of-at91.c | 11 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 6 |
2 files changed, 16 insertions, 1 deletions
diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c index 7fd964256faa..d5430ed02a67 100644 --- a/drivers/mmc/host/sdhci-of-at91.c +++ b/drivers/mmc/host/sdhci-of-at91.c | |||
@@ -29,6 +29,8 @@ | |||
29 | 29 | ||
30 | #include "sdhci-pltfm.h" | 30 | #include "sdhci-pltfm.h" |
31 | 31 | ||
32 | #define SDMMC_MC1R 0x204 | ||
33 | #define SDMMC_MC1R_DDR BIT(3) | ||
32 | #define SDMMC_CACR 0x230 | 34 | #define SDMMC_CACR 0x230 |
33 | #define SDMMC_CACR_CAPWREN BIT(0) | 35 | #define SDMMC_CACR_CAPWREN BIT(0) |
34 | #define SDMMC_CACR_KEY (0x46 << 8) | 36 | #define SDMMC_CACR_KEY (0x46 << 8) |
@@ -103,11 +105,18 @@ static void sdhci_at91_set_power(struct sdhci_host *host, unsigned char mode, | |||
103 | sdhci_set_power_noreg(host, mode, vdd); | 105 | sdhci_set_power_noreg(host, mode, vdd); |
104 | } | 106 | } |
105 | 107 | ||
108 | void sdhci_at91_set_uhs_signaling(struct sdhci_host *host, unsigned int timing) | ||
109 | { | ||
110 | if (timing == MMC_TIMING_MMC_DDR52) | ||
111 | sdhci_writeb(host, SDMMC_MC1R_DDR, SDMMC_MC1R); | ||
112 | sdhci_set_uhs_signaling(host, timing); | ||
113 | } | ||
114 | |||
106 | static const struct sdhci_ops sdhci_at91_sama5d2_ops = { | 115 | static const struct sdhci_ops sdhci_at91_sama5d2_ops = { |
107 | .set_clock = sdhci_at91_set_clock, | 116 | .set_clock = sdhci_at91_set_clock, |
108 | .set_bus_width = sdhci_set_bus_width, | 117 | .set_bus_width = sdhci_set_bus_width, |
109 | .reset = sdhci_reset, | 118 | .reset = sdhci_reset, |
110 | .set_uhs_signaling = sdhci_set_uhs_signaling, | 119 | .set_uhs_signaling = sdhci_at91_set_uhs_signaling, |
111 | .set_power = sdhci_at91_set_power, | 120 | .set_power = sdhci_at91_set_power, |
112 | }; | 121 | }; |
113 | 122 | ||
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 9c1a099afbbe..63bc33a54d0d 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -1830,6 +1830,9 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) | |||
1830 | struct sdhci_host *host = mmc_priv(mmc); | 1830 | struct sdhci_host *host = mmc_priv(mmc); |
1831 | unsigned long flags; | 1831 | unsigned long flags; |
1832 | 1832 | ||
1833 | if (enable) | ||
1834 | pm_runtime_get_noresume(host->mmc->parent); | ||
1835 | |||
1833 | spin_lock_irqsave(&host->lock, flags); | 1836 | spin_lock_irqsave(&host->lock, flags); |
1834 | if (enable) | 1837 | if (enable) |
1835 | host->flags |= SDHCI_SDIO_IRQ_ENABLED; | 1838 | host->flags |= SDHCI_SDIO_IRQ_ENABLED; |
@@ -1838,6 +1841,9 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) | |||
1838 | 1841 | ||
1839 | sdhci_enable_sdio_irq_nolock(host, enable); | 1842 | sdhci_enable_sdio_irq_nolock(host, enable); |
1840 | spin_unlock_irqrestore(&host->lock, flags); | 1843 | spin_unlock_irqrestore(&host->lock, flags); |
1844 | |||
1845 | if (!enable) | ||
1846 | pm_runtime_put_noidle(host->mmc->parent); | ||
1841 | } | 1847 | } |
1842 | 1848 | ||
1843 | static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, | 1849 | static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, |