|
25 | 25 | #include "sdhci-pltfm.h"
|
26 | 26 |
|
27 | 27 | #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
|
| 28 | +#define SDHCI_ARASAN_VENDOR_REGISTER 0x78 |
28 | 29 |
|
| 30 | +#define VENDOR_ENHANCED_STROBE BIT(0) |
29 | 31 | #define CLK_CTRL_TIMEOUT_SHIFT 16
|
30 | 32 | #define CLK_CTRL_TIMEOUT_MASK (0xf << CLK_CTRL_TIMEOUT_SHIFT)
|
31 | 33 | #define CLK_CTRL_TIMEOUT_MIN_EXP 13
|
@@ -79,6 +81,21 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
|
79 | 81 | }
|
80 | 82 | }
|
81 | 83 |
|
| 84 | +static void sdhci_arasan_hs400_enhanced_strobe(struct mmc_host *mmc, |
| 85 | + struct mmc_ios *ios) |
| 86 | +{ |
| 87 | + u32 vendor; |
| 88 | + struct sdhci_host *host = mmc_priv(mmc); |
| 89 | + |
| 90 | + vendor = readl(host->ioaddr + SDHCI_ARASAN_VENDOR_REGISTER); |
| 91 | + if (ios->enhanced_strobe) |
| 92 | + vendor |= VENDOR_ENHANCED_STROBE; |
| 93 | + else |
| 94 | + vendor &= ~VENDOR_ENHANCED_STROBE; |
| 95 | + |
| 96 | + writel(vendor, host->ioaddr + SDHCI_ARASAN_VENDOR_REGISTER); |
| 97 | +} |
| 98 | + |
82 | 99 | static struct sdhci_ops sdhci_arasan_ops = {
|
83 | 100 | .set_clock = sdhci_arasan_set_clock,
|
84 | 101 | .get_max_clock = sdhci_pltfm_clk_get_max_clock,
|
@@ -245,6 +262,9 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
|
245 | 262 | dev_err(&pdev->dev, "phy_power_on err.\n");
|
246 | 263 | goto err_phy_power;
|
247 | 264 | }
|
| 265 | + |
| 266 | + host->mmc_host_ops.hs400_enhanced_strobe = |
| 267 | + sdhci_arasan_hs400_enhanced_strobe; |
248 | 268 | }
|
249 | 269 |
|
250 | 270 | ret = sdhci_add_host(host);
|
|
0 commit comments