|
50 | 50 | #define ESDHC_MIX_CTRL_AUTO_TUNE_EN (1 << 24) |
51 | 51 | #define ESDHC_MIX_CTRL_FBCLK_SEL (1 << 25) |
52 | 52 | #define ESDHC_MIX_CTRL_HS400_EN (1 << 26) |
| 53 | +#define ESDHC_MIX_CTRL_HS400_ES_EN (1 << 27) |
53 | 54 | /* Bits 3 and 6 are not SDHCI standard definitions */ |
54 | 55 | #define ESDHC_MIX_CTRL_SDHCI_MASK 0xb7 |
55 | 56 | /* Tuning bits */ |
|
144 | 145 | * exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz. |
145 | 146 | */ |
146 | 147 | #define ESDHC_FLAG_ERR010450 BIT(10) |
| 148 | +/* The IP supports HS400ES mode */ |
| 149 | +#define ESDHC_FLAG_HS400_ES BIT(11) |
147 | 150 |
|
148 | 151 | struct esdhc_soc_data { |
149 | 152 | u32 flags; |
@@ -192,6 +195,12 @@ static const struct esdhc_soc_data usdhc_imx7d_data = { |
192 | 195 | | ESDHC_FLAG_HS400, |
193 | 196 | }; |
194 | 197 |
|
| 198 | +static struct esdhc_soc_data usdhc_imx8qxp_data = { |
| 199 | + .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING |
| 200 | + | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200 |
| 201 | + | ESDHC_FLAG_HS400 | ESDHC_FLAG_HS400_ES, |
| 202 | +}; |
| 203 | + |
195 | 204 | struct pltfm_imx_data { |
196 | 205 | u32 scratchpad; |
197 | 206 | struct pinctrl *pinctrl; |
@@ -238,6 +247,7 @@ static const struct of_device_id imx_esdhc_dt_ids[] = { |
238 | 247 | { .compatible = "fsl,imx6q-usdhc", .data = &usdhc_imx6q_data, }, |
239 | 248 | { .compatible = "fsl,imx6ull-usdhc", .data = &usdhc_imx6ull_data, }, |
240 | 249 | { .compatible = "fsl,imx7d-usdhc", .data = &usdhc_imx7d_data, }, |
| 250 | + { .compatible = "fsl,imx8qxp-usdhc", .data = &usdhc_imx8qxp_data, }, |
241 | 251 | { /* sentinel */ } |
242 | 252 | }; |
243 | 253 | MODULE_DEVICE_TABLE(of, imx_esdhc_dt_ids); |
@@ -896,6 +906,19 @@ static int esdhc_executing_tuning(struct sdhci_host *host, u32 opcode) |
896 | 906 | return ret; |
897 | 907 | } |
898 | 908 |
|
| 909 | +static void esdhc_hs400_enhanced_strobe(struct mmc_host *mmc, struct mmc_ios *ios) |
| 910 | +{ |
| 911 | + struct sdhci_host *host = mmc_priv(mmc); |
| 912 | + u32 m; |
| 913 | + |
| 914 | + m = readl(host->ioaddr + ESDHC_MIX_CTRL); |
| 915 | + if (ios->enhanced_strobe) |
| 916 | + m |= ESDHC_MIX_CTRL_HS400_ES_EN; |
| 917 | + else |
| 918 | + m &= ~ESDHC_MIX_CTRL_HS400_ES_EN; |
| 919 | + writel(m, host->ioaddr + ESDHC_MIX_CTRL); |
| 920 | +} |
| 921 | + |
899 | 922 | static int esdhc_change_pinstate(struct sdhci_host *host, |
900 | 923 | unsigned int uhs) |
901 | 924 | { |
@@ -1377,6 +1400,12 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) |
1377 | 1400 | if (imx_data->socdata->flags & ESDHC_FLAG_HS400) |
1378 | 1401 | host->quirks2 |= SDHCI_QUIRK2_CAPS_BIT63_FOR_HS400; |
1379 | 1402 |
|
| 1403 | + if (imx_data->socdata->flags & ESDHC_FLAG_HS400_ES) { |
| 1404 | + host->mmc->caps2 |= MMC_CAP2_HS400_ES; |
| 1405 | + host->mmc_host_ops.hs400_enhanced_strobe = |
| 1406 | + esdhc_hs400_enhanced_strobe; |
| 1407 | + } |
| 1408 | + |
1380 | 1409 | if (of_id) |
1381 | 1410 | err = sdhci_esdhc_imx_probe_dt(pdev, host, imx_data); |
1382 | 1411 | else |
|
0 commit comments