]> www.infradead.org Git - users/willy/xarray.git/commitdiff
mmc: sdhci-esdhc-imx: widen auto-tuning window for standard tuning
authorHaibo Chen <haibo.chen@nxp.com>
Wed, 9 Apr 2025 07:55:47 +0000 (15:55 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 14 May 2025 14:59:17 +0000 (16:59 +0200)
Expand the auto-tuning window width from 2 to 3 for standard tuning to
account for sampling point shifts caused by temperature change. This change
is based on hardware recommendation, providing 50% more margin for the
auto-tuning logic to locate valid sampling points.

Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
Signed-off-by: Luke Wang <ziniu.wang_1@nxp.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/20250409075550.3413032-4-ziniu.wang_1@nxp.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-esdhc-imx.c

index 53c7b858b43c81639f1218fb46101faac19dad7a..5c8a00864c1d0fb063e7932830b36b2279f3ef1a 100644 (file)
 
 #define ESDHC_TUNING_CTRL              0xcc
 #define ESDHC_STD_TUNING_EN            (1 << 24)
+#define ESDHC_TUNING_WINDOW_MASK       GENMASK(22, 20)
 /* NOTE: the minimum valid tuning start tap for mx6sl is 1 */
 #define ESDHC_TUNING_START_TAP_DEFAULT 0x1
 #define ESDHC_TUNING_START_TAP_MASK    0x7f
 /* The IP does not have GPIO CD wake capabilities */
 #define ESDHC_FLAG_SKIP_CD_WAKE                BIT(18)
 
+#define ESDHC_AUTO_TUNING_WINDOW       3
+
 enum wp_types {
        ESDHC_WP_NONE,          /* no WP, neither controller nor gpio */
        ESDHC_WP_CONTROLLER,    /* mmc controller internal WP */
@@ -1553,6 +1556,16 @@ static void sdhci_esdhc_imx_hwinit(struct sdhci_host *host)
                                        << ESDHC_TUNING_STEP_SHIFT;
                        }
 
+                       /*
+                        * Config the tuning window to the hardware suggested value 3.
+                        * This tuning window is used for auto tuning logic. The default
+                        * tuning window is 2, here change to 3 make the window a bit
+                        * wider, give auto tuning enough space to handle the sample
+                        * point shift cause by temperature change.
+                        */
+                        tmp &= ~ESDHC_TUNING_WINDOW_MASK;
+                        tmp |= FIELD_PREP(ESDHC_TUNING_WINDOW_MASK, ESDHC_AUTO_TUNING_WINDOW);
+
                        /* Disable the CMD CRC check for tuning, if not, need to
                         * add some delay after every tuning command, because
                         * hardware standard tuning logic will directly go to next