On 7/12/22 13:23, haibo.chen@xxxxxxx wrote: > From: Haibo Chen <haibo.chen@xxxxxxx> > > Current code logic may be impacted by the setting of ROM/Bootloader, > so unmask these bits first, then setting these bits accordingly. > > Fixes: 2b16cf326b70 ("mmc: sdhci-esdhc-imx: move tuning static configuration into hwinit function") > Signed-off-by: Haibo Chen <haibo.chen@xxxxxxx> Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > drivers/mmc/host/sdhci-esdhc-imx.c | 22 +++++++++++++++------- > 1 file changed, 15 insertions(+), 7 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c > index 89ef0c80ac37..9e73c34b6401 100644 > --- a/drivers/mmc/host/sdhci-esdhc-imx.c > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c > @@ -107,6 +107,7 @@ > #define ESDHC_TUNING_START_TAP_DEFAULT 0x1 > #define ESDHC_TUNING_START_TAP_MASK 0x7f > #define ESDHC_TUNING_CMD_CRC_CHECK_DISABLE (1 << 7) > +#define ESDHC_TUNING_STEP_DEFAULT 0x1 > #define ESDHC_TUNING_STEP_MASK 0x00070000 > #define ESDHC_TUNING_STEP_SHIFT 16 > > @@ -1368,7 +1369,7 @@ static void sdhci_esdhc_imx_hwinit(struct sdhci_host *host) > struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host); > struct cqhci_host *cq_host = host->mmc->cqe_private; > - int tmp; > + u32 tmp; > > if (esdhc_is_usdhc(imx_data)) { > /* > @@ -1423,17 +1424,24 @@ static void sdhci_esdhc_imx_hwinit(struct sdhci_host *host) > > if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) { > tmp = readl(host->ioaddr + ESDHC_TUNING_CTRL); > - tmp |= ESDHC_STD_TUNING_EN | > - ESDHC_TUNING_START_TAP_DEFAULT; > - if (imx_data->boarddata.tuning_start_tap) { > - tmp &= ~ESDHC_TUNING_START_TAP_MASK; > + tmp |= ESDHC_STD_TUNING_EN; > + > + /* > + * ROM code or bootloader may config the start tap > + * and step, unmask them first. > + */ > + tmp &= ~(ESDHC_TUNING_START_TAP_MASK | ESDHC_TUNING_STEP_MASK); > + if (imx_data->boarddata.tuning_start_tap) > tmp |= imx_data->boarddata.tuning_start_tap; > - } > + else > + tmp |= ESDHC_TUNING_START_TAP_DEFAULT; > > if (imx_data->boarddata.tuning_step) { > - tmp &= ~ESDHC_TUNING_STEP_MASK; > tmp |= imx_data->boarddata.tuning_step > << ESDHC_TUNING_STEP_SHIFT; > + } else { > + tmp |= ESDHC_TUNING_STEP_DEFAULT > + << ESDHC_TUNING_STEP_SHIFT; > } > > /* Disable the CMD CRC check for tuning, if not, need to