Message ID | 20230504111836.3599573-1-haibo.chen@nxp.com |
---|---|
State | New |
Headers | show |
Series | mmc: sdhci-esdhc-imx: make "no-mmc-hs400" works | expand |
Sorry, forget to cc stable maillist, will resend again. > -----Original Message----- > From: Bough Chen <haibo.chen@nxp.com> > Sent: 2023年5月4日 19:19 > To: adrian.hunter@intel.com; ulf.hansson@linaro.org; s.hauer@pengutronix.de > Cc: linux-mmc@vger.kernel.org; dl-linux-imx <linux-imx@nxp.com>; Bough Chen > <haibo.chen@nxp.com>; shawnguo@kernel.org; kernel@pengutronix.de; > festevam@gmail.com > Subject: [PATCH] mmc: sdhci-esdhc-imx: make "no-mmc-hs400" works > > From: Haibo Chen <haibo.chen@nxp.com> > > After commit 1ed5c3b22fc7 ("mmc: sdhci-esdhc-imx: Propagate > ESDHC_FLAG_HS400* only on 8bit bus"), the property "no-mmc-hs400" > from device tree file do not work any more. > This patch reorder the code, which can avoid the warning message "drop HS400 > support since no 8-bit bus" and also make the property "no-mmc-hs400" from > dts file works. > > Fixes: 1ed5c3b22fc7 ("mmc: sdhci-esdhc-imx: Propagate ESDHC_FLAG_HS400* > only on 8bit bus") > Signed-off-by: Haibo Chen <haibo.chen@nxp.com> > Cc: stable@vger.kernel.org > --- > drivers/mmc/host/sdhci-esdhc-imx.c | 18 ++++++++++-------- > 1 file changed, 10 insertions(+), 8 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c > b/drivers/mmc/host/sdhci-esdhc-imx.c > index d7c0c0b9e26c..eebf94604a7f 100644 > --- a/drivers/mmc/host/sdhci-esdhc-imx.c > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c > @@ -1634,6 +1634,10 @@ sdhci_esdhc_imx_probe_dt(struct platform_device > *pdev, > if (ret) > return ret; > > + /* HS400/HS400ES require 8 bit bus */ > + if (!(host->mmc->caps & MMC_CAP_8_BIT_DATA)) > + host->mmc->caps2 &= ~(MMC_CAP2_HS400 | > MMC_CAP2_HS400_ES); > + > if (mmc_gpio_get_cd(host->mmc) >= 0) > host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; > > @@ -1724,10 +1728,6 @@ static int sdhci_esdhc_imx_probe(struct > platform_device *pdev) > host->mmc_host_ops.init_card = usdhc_init_card; > } > > - err = sdhci_esdhc_imx_probe_dt(pdev, host, imx_data); > - if (err) > - goto disable_ahb_clk; > - > if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING) > sdhci_esdhc_ops.platform_execute_tuning = > esdhc_executing_tuning; > @@ -1735,15 +1735,13 @@ static int sdhci_esdhc_imx_probe(struct > platform_device *pdev) > if (imx_data->socdata->flags & ESDHC_FLAG_ERR004536) > host->quirks |= SDHCI_QUIRK_BROKEN_ADMA; > > - if (host->mmc->caps & MMC_CAP_8_BIT_DATA && > - imx_data->socdata->flags & ESDHC_FLAG_HS400) > + if (imx_data->socdata->flags & ESDHC_FLAG_HS400) > host->mmc->caps2 |= MMC_CAP2_HS400; > > if (imx_data->socdata->flags & ESDHC_FLAG_BROKEN_AUTO_CMD23) > host->quirks2 |= SDHCI_QUIRK2_ACMD23_BROKEN; > > - if (host->mmc->caps & MMC_CAP_8_BIT_DATA && > - imx_data->socdata->flags & ESDHC_FLAG_HS400_ES) { > + if (imx_data->socdata->flags & ESDHC_FLAG_HS400_ES) { > host->mmc->caps2 |= MMC_CAP2_HS400_ES; > host->mmc_host_ops.hs400_enhanced_strobe = > esdhc_hs400_enhanced_strobe; > @@ -1765,6 +1763,10 @@ static int sdhci_esdhc_imx_probe(struct > platform_device *pdev) > goto disable_ahb_clk; > } > > + err = sdhci_esdhc_imx_probe_dt(pdev, host, imx_data); > + if (err) > + goto disable_ahb_clk; > + > sdhci_esdhc_imx_hwinit(host); > > err = sdhci_add_host(host); > -- > 2.34.1
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index d7c0c0b9e26c..eebf94604a7f 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c @@ -1634,6 +1634,10 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev, if (ret) return ret; + /* HS400/HS400ES require 8 bit bus */ + if (!(host->mmc->caps & MMC_CAP_8_BIT_DATA)) + host->mmc->caps2 &= ~(MMC_CAP2_HS400 | MMC_CAP2_HS400_ES); + if (mmc_gpio_get_cd(host->mmc) >= 0) host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; @@ -1724,10 +1728,6 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) host->mmc_host_ops.init_card = usdhc_init_card; } - err = sdhci_esdhc_imx_probe_dt(pdev, host, imx_data); - if (err) - goto disable_ahb_clk; - if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING) sdhci_esdhc_ops.platform_execute_tuning = esdhc_executing_tuning; @@ -1735,15 +1735,13 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) if (imx_data->socdata->flags & ESDHC_FLAG_ERR004536) host->quirks |= SDHCI_QUIRK_BROKEN_ADMA; - if (host->mmc->caps & MMC_CAP_8_BIT_DATA && - imx_data->socdata->flags & ESDHC_FLAG_HS400) + if (imx_data->socdata->flags & ESDHC_FLAG_HS400) host->mmc->caps2 |= MMC_CAP2_HS400; if (imx_data->socdata->flags & ESDHC_FLAG_BROKEN_AUTO_CMD23) host->quirks2 |= SDHCI_QUIRK2_ACMD23_BROKEN; - if (host->mmc->caps & MMC_CAP_8_BIT_DATA && - imx_data->socdata->flags & ESDHC_FLAG_HS400_ES) { + if (imx_data->socdata->flags & ESDHC_FLAG_HS400_ES) { host->mmc->caps2 |= MMC_CAP2_HS400_ES; host->mmc_host_ops.hs400_enhanced_strobe = esdhc_hs400_enhanced_strobe; @@ -1765,6 +1763,10 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) goto disable_ahb_clk; } + err = sdhci_esdhc_imx_probe_dt(pdev, host, imx_data); + if (err) + goto disable_ahb_clk; + sdhci_esdhc_imx_hwinit(host); err = sdhci_add_host(host);