hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/mmc/host/sdhci-esdhc-imx.c
....@@ -103,6 +103,7 @@
103103 #define ESDHC_TUNING_START_TAP_DEFAULT 0x1
104104 #define ESDHC_TUNING_START_TAP_MASK 0x7f
105105 #define ESDHC_TUNING_CMD_CRC_CHECK_DISABLE (1 << 7)
106
+#define ESDHC_TUNING_STEP_DEFAULT 0x1
106107 #define ESDHC_TUNING_STEP_MASK 0x00070000
107108 #define ESDHC_TUNING_STEP_SHIFT 16
108109
....@@ -165,8 +166,8 @@
165166 #define ESDHC_FLAG_HS400 BIT(9)
166167 /*
167168 * The IP has errata ERR010450
168
- * uSDHC: Due to the I/O timing limit, for SDR mode, SD card clock can't
169
- * exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz.
169
+ * uSDHC: At 1.8V due to the I/O timing limit, for SDR mode, SD card
170
+ * clock can't exceed 150MHz, for DDR mode, SD card clock can't exceed 45MHz.
170171 */
171172 #define ESDHC_FLAG_ERR010450 BIT(10)
172173 /* The IP supports HS400ES mode */
....@@ -872,7 +873,8 @@
872873 | ESDHC_CLOCK_MASK);
873874 sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
874875
875
- if (imx_data->socdata->flags & ESDHC_FLAG_ERR010450) {
876
+ if ((imx_data->socdata->flags & ESDHC_FLAG_ERR010450) &&
877
+ (!(host->quirks2 & SDHCI_QUIRK2_NO_1_8_V))) {
876878 unsigned int max_clock;
877879
878880 max_clock = imx_data->is_ddr ? 45000000 : 150000000;
....@@ -1300,7 +1302,7 @@
13001302 struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
13011303 struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
13021304 struct cqhci_host *cq_host = host->mmc->cqe_private;
1303
- int tmp;
1305
+ u32 tmp;
13041306
13051307 if (esdhc_is_usdhc(imx_data)) {
13061308 /*
....@@ -1353,17 +1355,24 @@
13531355
13541356 if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) {
13551357 tmp = readl(host->ioaddr + ESDHC_TUNING_CTRL);
1356
- tmp |= ESDHC_STD_TUNING_EN |
1357
- ESDHC_TUNING_START_TAP_DEFAULT;
1358
- if (imx_data->boarddata.tuning_start_tap) {
1359
- tmp &= ~ESDHC_TUNING_START_TAP_MASK;
1358
+ tmp |= ESDHC_STD_TUNING_EN;
1359
+
1360
+ /*
1361
+ * ROM code or bootloader may config the start tap
1362
+ * and step, unmask them first.
1363
+ */
1364
+ tmp &= ~(ESDHC_TUNING_START_TAP_MASK | ESDHC_TUNING_STEP_MASK);
1365
+ if (imx_data->boarddata.tuning_start_tap)
13601366 tmp |= imx_data->boarddata.tuning_start_tap;
1361
- }
1367
+ else
1368
+ tmp |= ESDHC_TUNING_START_TAP_DEFAULT;
13621369
13631370 if (imx_data->boarddata.tuning_step) {
1364
- tmp &= ~ESDHC_TUNING_STEP_MASK;
13651371 tmp |= imx_data->boarddata.tuning_step
13661372 << ESDHC_TUNING_STEP_SHIFT;
1373
+ } else {
1374
+ tmp |= ESDHC_TUNING_STEP_DEFAULT
1375
+ << ESDHC_TUNING_STEP_SHIFT;
13671376 }
13681377
13691378 /* Disable the CMD CRC check for tuning, if not, need to