]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mmc: am654_sdhci: Fix OTAP/ITAP delay values
authorNitin Yadav <n-yadav@ti.com>
Thu, 18 Apr 2024 19:00:57 +0000 (14:00 -0500)
committerTom Rini <trini@konsulko.com>
Mon, 29 Apr 2024 16:55:27 +0000 (10:55 -0600)
U-Boot is failing to boot class U1 UHS SD cards due to incorrect
OTAP and ITAP delay select values. Update OTAP and ITAP delay select
values from DT.

Fixes: c7d106b4eb3 ("mmc: am654_sdhci: Update output tap delay writes")
Signed-off-by: Nitin Yadav <n-yadav@ti.com>
Signed-off-by: Judith Mendez <jm@ti.com>
drivers/mmc/am654_sdhci.c

index 7e41dd91f8e2ff02a073b8bae439ce25a7e12ce9..becb35508994da0359ba2df60da57d042b19e17d 100644 (file)
@@ -513,12 +513,27 @@ static int j721e_4bit_sdhci_set_ios_post(struct sdhci_host *host)
 {
        struct udevice *dev = host->mmc->dev;
        struct am654_sdhci_plat *plat = dev_get_plat(dev);
-       u32 otap_del_sel, mask, val;
+       int mode = host->mmc->selected_mode;
+       u32 otap_del_sel;
+       u32 itap_del_sel;
+       u32 mask, val;
+
+       otap_del_sel = plat->otap_del_sel[mode];
 
-       otap_del_sel = plat->otap_del_sel[host->mmc->selected_mode];
        mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
-       val = (1 << OTAPDLYENA_SHIFT) | (otap_del_sel << OTAPDLYSEL_SHIFT);
+       val = (1 << OTAPDLYENA_SHIFT) |
+             (otap_del_sel << OTAPDLYSEL_SHIFT);
+
+       itap_del_sel = plat->itap_del_sel[mode];
+
+       mask |= ITAPDLYENA_MASK | ITAPDLYSEL_MASK;
+       val |= (1 << ITAPDLYENA_SHIFT) |
+              (itap_del_sel << ITAPDLYSEL_SHIFT);
+
+       regmap_update_bits(plat->base, PHY_CTRL4, ITAPCHGWIN_MASK,
+                          1 << ITAPCHGWIN_SHIFT);
        regmap_update_bits(plat->base, PHY_CTRL4, mask, val);
+       regmap_update_bits(plat->base, PHY_CTRL4, ITAPCHGWIN_MASK, 0);
 
        regmap_update_bits(plat->base, PHY_CTRL5, CLKBUFSEL_MASK,
                           plat->clkbuf_sel);
@@ -572,7 +587,7 @@ static int sdhci_am654_get_otap_delay(struct udevice *dev,
         * Remove the corresponding capability if an otap-del-sel
         * value is not found
         */
-       for (i = MMC_HS; i <= MMC_HS_400; i++) {
+       for (i = MMC_LEGACY; i <= MMC_HS_400; i++) {
                ret = dev_read_u32(dev, td[i].otap_binding,
                                   &plat->otap_del_sel[i]);
                if (ret) {