Hi, > -----Original Message----- > From: Judith Mendez <j...@ti.com> > Sent: Tuesday, April 16, 2024 6:28 AM > To: Peng Fan <peng....@nxp.com>; Jaehoon Chung <jh80.ch...@samsung.com>; Tom > Rini <tr...@konsulko.com> > Cc: Nitin Yadav <n-ya...@ti.com>; Simon Glass <s...@chromium.org>; > u-boot@lists.denx.de > Subject: [PATCH 3/5] mmc: am654_sdhci: Add itap_del_ena[] to store itapdlyena > bit > > Set itap_del_ena if ITAPDLY is found in DT or if the tuning > algorithm was executed and found the optimal ITAPDLY. Add the > functionality to save ITAPDLYENA that can be referenced later > by storing the bit in array itap_del_ena[]. > > Signed-off-by: Judith Mendez <j...@ti.com> > --- > drivers/mmc/am654_sdhci.c | 30 ++++++++++++++++++++---------- > 1 file changed, 20 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/am654_sdhci.c b/drivers/mmc/am654_sdhci.c > index 1dd032e1e36..38f1ad28ec4 100644 > --- a/drivers/mmc/am654_sdhci.c > +++ b/drivers/mmc/am654_sdhci.c > @@ -92,6 +92,7 @@ struct am654_sdhci_plat { > bool non_removable; > u32 otap_del_sel[MMC_MODES_END]; > u32 itap_del_sel[MMC_MODES_END]; > + u32 itap_del_ena[MMC_MODES_END]; > u32 trm_icp; > u32 drv_strength; > u32 strb_sel; > @@ -223,8 +224,10 @@ static int am654_sdhci_setup_dll(struct am654_sdhci_plat > *plat, > } > > static void am654_sdhci_write_itapdly(struct am654_sdhci_plat *plat, > - u32 itapdly) > + u32 itapdly, u32 enable) > { > + regmap_update_bits(plat->base, PHY_CTRL4, ITAPDLYENA_MASK, > + enable << ITAPDLYENA_SHIFT); > /* Set ITAPCHGWIN before writing to ITAPDLY */ > regmap_update_bits(plat->base, PHY_CTRL4, ITAPCHGWIN_MASK, > 1 << ITAPCHGWIN_SHIFT); > @@ -242,7 +245,8 @@ static void am654_sdhci_setup_delay_chain(struct > am654_sdhci_plat *plat, > mask = SELDLYTXCLK_MASK | SELDLYRXCLK_MASK; > regmap_update_bits(plat->base, PHY_CTRL5, mask, val); > > - am654_sdhci_write_itapdly(plat, plat->itap_del_sel[mode]); > + am654_sdhci_write_itapdly(plat, plat->itap_del_sel[mode], > + plat->itap_del_ena[mode]); > } > > static int am654_sdhci_set_ios_post(struct sdhci_host *host) > @@ -443,6 +447,7 @@ static int am654_sdhci_execute_tuning(struct mmc *mmc, u8 > opcode) > struct udevice *dev = mmc->dev; > struct am654_sdhci_plat *plat = dev_get_plat(dev); > struct window fail_window[ITAPDLY_LENGTH]; > + int mode = mmc->selected_mode; > u8 curr_pass, itap; > u8 fail_index = 0; > u8 prev_pass = 1; > @@ -450,11 +455,10 @@ static int am654_sdhci_execute_tuning(struct mmc *mmc, > u8 opcode) > memset(fail_window, 0, sizeof(fail_window)); > > /* Enable ITAPDLY */ > - regmap_update_bits(plat->base, PHY_CTRL4, ITAPDLYENA_MASK, > - 1 << ITAPDLYENA_SHIFT); > + plat->itap_del_ena[mode] = 0x1;
0x1 means "enable"? I want to use a macro with meaning. > > for (itap = 0; itap < ITAPDLY_LENGTH; itap++) { > - am654_sdhci_write_itapdly(plat, itap); > + am654_sdhci_write_itapdly(plat, itap, plat->itap_del_ena[mode]); > > curr_pass = !mmc_send_tuning(mmc, opcode, NULL); > > @@ -478,7 +482,7 @@ static int am654_sdhci_execute_tuning(struct mmc *mmc, u8 > opcode) > itap = am654_sdhci_calculate_itap(dev, fail_window, fail_index, > plat->dll_enable); > > - am654_sdhci_write_itapdly(plat, itap); > + am654_sdhci_write_itapdly(plat, itap, plat->itap_del_ena[mode]); > > return 0; > } > @@ -515,6 +519,7 @@ static int j721e_4bit_sdhci_set_ios_post(struct > sdhci_host *host) > struct am654_sdhci_plat *plat = dev_get_plat(dev); > int mode = host->mmc->selected_mode; > u32 otap_del_sel; > + u32 itap_del_ena; > u32 itap_del_sel; > u32 mask, val; > > @@ -524,10 +529,11 @@ static int j721e_4bit_sdhci_set_ios_post(struct > sdhci_host *host) > val = (1 << OTAPDLYENA_SHIFT) | > (otap_del_sel << OTAPDLYSEL_SHIFT); > > + itap_del_ena = plat->itap_del_ena[mode]; > itap_del_sel = plat->itap_del_sel[mode]; > > mask |= ITAPDLYENA_MASK | ITAPDLYSEL_MASK; > - val = (1 << ITAPDLYENA_SHIFT) | > + val = (itap_del_ena << ITAPDLYENA_SHIFT) | > (itap_del_sel << ITAPDLYSEL_SHIFT); > > regmap_update_bits(plat->base, PHY_CTRL4, ITAPCHGWIN_MASK, > @@ -599,9 +605,13 @@ static int sdhci_am654_get_otap_delay(struct udevice > *dev, > cfg->host_caps &= ~td[i].capability; > } > > - if (td[i].itap_binding) > - dev_read_u32(dev, td[i].itap_binding, > - &plat->itap_del_sel[i]); > + if (td[i].itap_binding) { > + ret = dev_read_u32(dev, td[i].itap_binding, > + &plat->itap_del_sel[i]); > + > + if (!ret) > + plat->itap_del_ena[i] = 0x1; Ditto. Best Regards, Jaehoon Chung > + } > } > > return 0; > -- > 2.43.2