layerscape: add patches-5.4
[openwrt/staging/wigyori.git] / target / linux / layerscape / patches-5.4 / 816-sdhc-0002-LF-605-mmc-sdhci-of-esdhc-convert-to-use-esdhc_tunin.patch
diff --git a/target/linux/layerscape/patches-5.4/816-sdhc-0002-LF-605-mmc-sdhci-of-esdhc-convert-to-use-esdhc_tunin.patch b/target/linux/layerscape/patches-5.4/816-sdhc-0002-LF-605-mmc-sdhci-of-esdhc-convert-to-use-esdhc_tunin.patch
new file mode 100644 (file)
index 0000000..74dd63d
--- /dev/null
@@ -0,0 +1,77 @@
+From e95c04bd6d9ebe081126184fb228461b1b3fa7aa Mon Sep 17 00:00:00 2001
+From: Yangbo Lu <yangbo.lu@nxp.com>
+Date: Thu, 12 Dec 2019 15:52:18 +0800
+Subject: [PATCH] LF-605 mmc: sdhci-of-esdhc: convert to use
+ esdhc_tuning_window_ptr()
+
+Convert to use a new function esdhc_tuning_window_ptr() to
+get tuning window start point and end point.
+
+Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
+Acked-by: Adrian Hunter <adrian.hunter@intel.com>
+---
+ drivers/mmc/host/sdhci-of-esdhc.c | 34 +++++++++++++++++++++-------------
+ 1 file changed, 21 insertions(+), 13 deletions(-)
+
+--- a/drivers/mmc/host/sdhci-of-esdhc.c
++++ b/drivers/mmc/host/sdhci-of-esdhc.c
+@@ -888,20 +888,11 @@ static void esdhc_tuning_block_enable(st
+       esdhc_clock_enable(host, true);
+ }
+-static void esdhc_prepare_sw_tuning(struct sdhci_host *host, u8 *window_start,
++static void esdhc_tuning_window_ptr(struct sdhci_host *host, u8 *window_start,
+                                   u8 *window_end)
+ {
+-      struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+-      struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
+-      u8 tbstat_15_8, tbstat_7_0;
+       u32 val;
+-      if (esdhc->quirk_tuning_erratum_type1) {
+-              *window_start = 5 * esdhc->div_ratio;
+-              *window_end = 3 * esdhc->div_ratio;
+-              return;
+-      }
+-
+       /* Write TBCTL[11:8]=4'h8 */
+       val = sdhci_readl(host, ESDHC_TBCTL);
+       val &= ~(0xf << 8);
+@@ -920,6 +911,25 @@ static void esdhc_prepare_sw_tuning(stru
+       val = sdhci_readl(host, ESDHC_TBSTAT);
+       val = sdhci_readl(host, ESDHC_TBSTAT);
++      *window_end = val & 0xff;
++      *window_start = (val >> 8) & 0xff;
++}
++
++static void esdhc_prepare_sw_tuning(struct sdhci_host *host, u8 *window_start,
++                                  u8 *window_end)
++{
++      struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
++      struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host);
++      u8 start_ptr, end_ptr;
++
++      if (esdhc->quirk_tuning_erratum_type1) {
++              *window_start = 5 * esdhc->div_ratio;
++              *window_end = 3 * esdhc->div_ratio;
++              return;
++      }
++
++      esdhc_tuning_window_ptr(host, &start_ptr, &end_ptr);
++
+       /* Reset data lines by setting ESDHCCTL[RSTD] */
+       sdhci_reset(host, SDHCI_RESET_DATA);
+       /* Write 32'hFFFF_FFFF to IRQSTAT register */
+@@ -930,10 +940,8 @@ static void esdhc_prepare_sw_tuning(stru
+        * then program TBPTR[TB_WNDW_END_PTR] = 4 * div_ratio
+        * and program TBPTR[TB_WNDW_START_PTR] = 8 * div_ratio.
+        */
+-      tbstat_7_0 = val & 0xff;
+-      tbstat_15_8 = (val >> 8) & 0xff;
+-      if (abs(tbstat_15_8 - tbstat_7_0) > (4 * esdhc->div_ratio)) {
++      if (abs(start_ptr - end_ptr) > (4 * esdhc->div_ratio)) {
+               *window_start = 8 * esdhc->div_ratio;
+               *window_end = 4 * esdhc->div_ratio;
+       } else {