On Thu, 2 Feb 2023 at 01:35, Shawn Lin <shawn.lin@xxxxxxxxxxxxxx> wrote: > Please elaborate a bit to share some more information to the commit message. Perhaps you have some performance numbers too, that would be nice to share in the commit message. > Signed-off-by: Shawn Lin <shawn.lin@xxxxxxxxxxxxxx> > > --- > > Changes in v2: > - fix Kconfig error > > drivers/mmc/host/Kconfig | 1 + > drivers/mmc/host/sdhci-of-dwcmshc.c | 29 ++++++++++++++++++++++++++++- > 2 files changed, 29 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig > index e96b302..e060bab 100644 > --- a/drivers/mmc/host/Kconfig > +++ b/drivers/mmc/host/Kconfig > @@ -233,6 +233,7 @@ config MMC_SDHCI_OF_DWCMSHC > depends on MMC_SDHCI_PLTFM > depends on OF > depends on COMMON_CLK > + select MMC_HSQ > help > This selects Synopsys DesignWare Cores Mobile Storage Controller > support. > diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c > index fc917ed..e90fa69 100644 > --- a/drivers/mmc/host/sdhci-of-dwcmshc.c > +++ b/drivers/mmc/host/sdhci-of-dwcmshc.c > @@ -20,6 +20,7 @@ > #include <linux/sizes.h> > > #include "sdhci-pltfm.h" > +#include "mmc_hsq.h" > > #define SDHCI_DWCMSHC_ARG2_STUFF GENMASK(31, 16) > > @@ -331,6 +332,14 @@ static void rk35xx_sdhci_reset(struct sdhci_host *host, u8 mask) > sdhci_reset(host, mask); > } > > +static void sdhci_dwcmshc_request_done(struct sdhci_host *host, struct mmc_request *mrq) > +{ > + if (mmc_hsq_finalize_request(host->mmc, mrq)) > + return; > + > + mmc_request_done(host->mmc, mrq); > +} > + > static const struct sdhci_ops sdhci_dwcmshc_ops = { > .set_clock = sdhci_set_clock, > .set_bus_width = sdhci_set_bus_width, > @@ -347,6 +356,7 @@ static const struct sdhci_ops sdhci_dwcmshc_rk35xx_ops = { > .get_max_clock = sdhci_pltfm_clk_get_max_clock, > .reset = rk35xx_sdhci_reset, > .adma_write_desc = dwcmshc_adma_write_desc, > + .request_done = sdhci_dwcmshc_request_done, > }; > > static const struct sdhci_pltfm_data sdhci_dwcmshc_pdata = { > @@ -462,6 +472,7 @@ static int dwcmshc_probe(struct platform_device *pdev) > struct dwcmshc_priv *priv; > struct rk35xx_priv *rk_priv = NULL; > const struct sdhci_pltfm_data *pltfm_data; > + struct mmc_hsq *hsq; > int err; > u32 extra; > > @@ -515,6 +526,16 @@ static int dwcmshc_probe(struct platform_device *pdev) > host->mmc_host_ops.request = dwcmshc_request; > host->mmc_host_ops.hs400_enhanced_strobe = dwcmshc_hs400_enhanced_strobe; > > + hsq = devm_kzalloc(&pdev->dev, sizeof(*hsq), GFP_KERNEL); > + if (!hsq) { > + err = -ENOMEM; > + goto err_clk; > + } > + > + err = mmc_hsq_init(hsq, host->mmc); > + if (err) > + goto err_clk; > + > if (pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) { > rk_priv = devm_kzalloc(&pdev->dev, sizeof(struct rk35xx_priv), GFP_KERNEL); > if (!rk_priv) { > @@ -607,6 +628,8 @@ static int dwcmshc_suspend(struct device *dev) > struct rk35xx_priv *rk_priv = priv->priv; > int ret; > > + mmc_hsq_suspend(host->mmc); > + > ret = sdhci_suspend_host(host); > if (ret) > return ret; > @@ -647,7 +670,11 @@ static int dwcmshc_resume(struct device *dev) > return ret; > } > > - return sdhci_resume_host(host); > + ret = sdhci_resume_host(host); > + if (ret) > + return ret; > + > + return mmc_hsq_resume(host->mmc); > } > #endif If I understand correctly, you need to also inform sdhci and the mmc core, whether you support atomic request management or not. For sdhci-sprd, the following part below, is done during ->probe() - and I assume we need something similar for the sdhci-of-dwcmshc, right? if (!mmc_card_is_removable(host->mmc)) host->mmc_host_ops.request_atomic = sdhci_sprd_request_atomic; else host->always_defer_done = true; Kind regards Uffe