diff options
-rw-r--r-- | drivers/mmc/host/sdhci.c | 23 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 40de56d6da0b..de833b1eadb9 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -1653,6 +1653,29 @@ void sdhci_enable_clk(struct sdhci_host *host, u16 clk) | |||
1653 | udelay(10); | 1653 | udelay(10); |
1654 | } | 1654 | } |
1655 | 1655 | ||
1656 | if (host->version >= SDHCI_SPEC_410 && host->v4_mode) { | ||
1657 | clk |= SDHCI_CLOCK_PLL_EN; | ||
1658 | clk &= ~SDHCI_CLOCK_INT_STABLE; | ||
1659 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); | ||
1660 | |||
1661 | /* Wait max 150 ms */ | ||
1662 | timeout = ktime_add_ms(ktime_get(), 150); | ||
1663 | while (1) { | ||
1664 | bool timedout = ktime_after(ktime_get(), timeout); | ||
1665 | |||
1666 | clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); | ||
1667 | if (clk & SDHCI_CLOCK_INT_STABLE) | ||
1668 | break; | ||
1669 | if (timedout) { | ||
1670 | pr_err("%s: PLL clock never stabilised.\n", | ||
1671 | mmc_hostname(host->mmc)); | ||
1672 | sdhci_dumpregs(host); | ||
1673 | return; | ||
1674 | } | ||
1675 | udelay(10); | ||
1676 | } | ||
1677 | } | ||
1678 | |||
1656 | clk |= SDHCI_CLOCK_CARD_EN; | 1679 | clk |= SDHCI_CLOCK_CARD_EN; |
1657 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); | 1680 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); |
1658 | } | 1681 | } |
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 902f855efe8f..929310e869a3 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
@@ -114,6 +114,7 @@ | |||
114 | #define SDHCI_DIV_HI_MASK 0x300 | 114 | #define SDHCI_DIV_HI_MASK 0x300 |
115 | #define SDHCI_PROG_CLOCK_MODE 0x0020 | 115 | #define SDHCI_PROG_CLOCK_MODE 0x0020 |
116 | #define SDHCI_CLOCK_CARD_EN 0x0004 | 116 | #define SDHCI_CLOCK_CARD_EN 0x0004 |
117 | #define SDHCI_CLOCK_PLL_EN 0x0008 | ||
117 | #define SDHCI_CLOCK_INT_STABLE 0x0002 | 118 | #define SDHCI_CLOCK_INT_STABLE 0x0002 |
118 | #define SDHCI_CLOCK_INT_EN 0x0001 | 119 | #define SDHCI_CLOCK_INT_EN 0x0001 |
119 | 120 | ||