]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
mmc: zynq_sdhci: Use Mask writes for Tap delays
authorAshok Reddy Soma <ashok.reddy.soma@xilinx.com>
Mon, 30 Nov 2020 15:08:44 +0000 (08:08 -0700)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 2 Feb 2021 12:49:32 +0000 (13:49 +0100)
Restrict tap_delay value to the allowed size(8bits for itap and 6 bits
for otap) before writing to the tap delay register.

Clear ITAP and OTAP delay bits before updating with the new tap value
for Versal platform.

Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
State: pending

drivers/mmc/zynq_sdhci.c

index 1c8b93a2272be4cb203470e40be9415c24aeaa35..098c0790e51888ee66999baf949fa2f22a6c19b2 100644 (file)
 #include <sdhci.h>
 #include <zynqmp_tap_delay.h>
 
-#define SDHCI_ARASAN_ITAPDLY_REGISTER   0xF0F8
-#define SDHCI_ARASAN_OTAPDLY_REGISTER   0xF0FC
-#define SDHCI_ITAPDLY_CHGWIN            0x200
-#define SDHCI_ITAPDLY_ENABLE            0x100
-#define SDHCI_OTAPDLY_ENABLE            0x40
+#define SDHCI_ARASAN_ITAPDLY_REGISTER  0xF0F8
+#define SDHCI_ARASAN_ITAPDLY_SEL_MASK  0xFF
+#define SDHCI_ARASAN_OTAPDLY_REGISTER  0xF0FC
+#define SDHCI_ARASAN_OTAPDLY_SEL_MASK  0x3F
+#define SDHCI_ITAPDLY_CHGWIN           0x200
+#define SDHCI_ITAPDLY_ENABLE           0x100
+#define SDHCI_OTAPDLY_ENABLE           0x40
 
 #define SDHCI_TUNING_LOOP_COUNT                40
 #define MMC_BANK2                      0x2
@@ -297,6 +299,7 @@ static int sdhci_versal_sdcardclk_set_phase(struct sdhci_host *host,
        struct mmc *mmc = (struct mmc *)host->mmc;
        u8 tap_delay, tap_max = 0;
        int timing = mode2timing[mmc->selected_mode];
+       u32 regval;
 
        /*
         * This is applicable for SDHCI_SPEC_300 and above
@@ -329,16 +332,16 @@ static int sdhci_versal_sdcardclk_set_phase(struct sdhci_host *host,
 
        tap_delay = (degrees * tap_max) / 360;
 
+       /* Limit output tap_delay value to 6 bits */
+       tap_delay &= SDHCI_ARASAN_OTAPDLY_SEL_MASK;
+
        /* Set the Clock Phase */
-       if (tap_delay) {
-               u32 regval;
-
-               regval = sdhci_readl(host, SDHCI_ARASAN_OTAPDLY_REGISTER);
-               regval |= SDHCI_OTAPDLY_ENABLE;
-               sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
-               regval |= tap_delay;
-               sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
-       }
+       regval = sdhci_readl(host, SDHCI_ARASAN_OTAPDLY_REGISTER);
+       regval |= SDHCI_OTAPDLY_ENABLE;
+       sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
+       regval &= ~SDHCI_ARASAN_OTAPDLY_SEL_MASK;
+       regval |= tap_delay;
+       sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
 
        return 0;
 }
@@ -358,6 +361,7 @@ static int sdhci_versal_sampleclk_set_phase(struct sdhci_host *host,
        struct mmc *mmc = (struct mmc *)host->mmc;
        u8 tap_delay, tap_max = 0;
        int timing = mode2timing[mmc->selected_mode];
+       u32 regval;
 
        /*
         * This is applicable for SDHCI_SPEC_300 and above
@@ -390,20 +394,20 @@ static int sdhci_versal_sampleclk_set_phase(struct sdhci_host *host,
 
        tap_delay = (degrees * tap_max) / 360;
 
+       /* Limit input tap_delay value to 8 bits */
+       tap_delay &= SDHCI_ARASAN_ITAPDLY_SEL_MASK;
+
        /* Set the Clock Phase */
-       if (tap_delay) {
-               u32 regval;
-
-               regval = sdhci_readl(host, SDHCI_ARASAN_ITAPDLY_REGISTER);
-               regval |= SDHCI_ITAPDLY_CHGWIN;
-               sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
-               regval |= SDHCI_ITAPDLY_ENABLE;
-               sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
-               regval |= tap_delay;
-               sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
-               regval &= ~SDHCI_ITAPDLY_CHGWIN;
-               sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
-       }
+       regval = sdhci_readl(host, SDHCI_ARASAN_ITAPDLY_REGISTER);
+       regval |= SDHCI_ITAPDLY_CHGWIN;
+       sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
+       regval |= SDHCI_ITAPDLY_ENABLE;
+       sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
+       regval &= ~SDHCI_ARASAN_ITAPDLY_SEL_MASK;
+       regval |= tap_delay;
+       sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
+       regval &= ~SDHCI_ITAPDLY_CHGWIN;
+       sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
 
        return 0;
 }