Message ID | 1675298118-64243-4-git-send-email-shawn.lin@rock-chips.com |
---|---|
State | New |
Headers | show |
Series | Some features and fix for sdhci-of-dwcmshc | expand |
On Thu, 2 Feb 2023 at 01:35, Shawn Lin <shawn.lin@rock-chips.com> 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@rock-chips.com> > > --- > > 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
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
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> --- 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(-)