summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorNitin Yadav <n-yadav@ti.com>2022-11-11 20:25:52 +0530
committerAnand Gadiyar <gadiyar@ti.com>2022-11-15 08:14:35 -0600
commitfda91bdaf40e9ebc15216c33c29c858ebc19ca56 (patch)
tree8f615cefb1dad4f5a7f2f592b688b3ecd1c95cee /drivers
parent2a54311a126d303b2fc10ee28b350da620857585 (diff)
drivers: mmc: am654_sdhci: Update OTAP/ITAP delay
U-Boot is fail to boot class U1 UHS SD cards (such as microcenter) due to incorrect OTAP and ITAP delay select values. Update OTAP and ITAP delay select values based on recommeded RIOT values to fix boot issue. Signed-off-by: Nitin Yadav <n-yadav@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/am654_sdhci.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/mmc/am654_sdhci.c b/drivers/mmc/am654_sdhci.c
index 9307eb016b..a207f851f1 100644
--- a/drivers/mmc/am654_sdhci.c
+++ b/drivers/mmc/am654_sdhci.c
@@ -442,12 +442,18 @@ 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_platdata(dev);
- u32 otap_del_sel, mask, val;
+ u32 otap_del_sel, itap_del_sel, mask, val;
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);
+ itap_del_sel = plat->itap_del_sel[host->mmc->selected_mode];
+ mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK | ITAPDLYSEL_MASK |
+ ITAPDLYENA_MASK;
+ val = (1 << OTAPDLYENA_SHIFT) | (otap_del_sel << OTAPDLYSEL_SHIFT) |
+ (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);
@@ -501,7 +507,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) {