On Tue, 26 Mar 2024 at 11:25, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: > > On 21/03/24 16:30, Mantas Pucka wrote: > > Generic sdhci code registers LED device and uses host->runtime_suspended > > flag to protect access to it. The sdhci-msm driver doesn't set this flag, > > which causes a crash when LED is accessed while controller is runtime > > suspended. Fix this by setting the flag correctly. > > > > Cc: stable@xxxxxxxxxxxxxxx > > Fixes: 67e6db113c90 ("mmc: sdhci-msm: Add pm_runtime and system PM support") > > Signed-off-by: Mantas Pucka <mantas@xxxxxxxxxxxx> > > Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> Looks like this problem may exist for other sdhci drivers too. In particular for those that enables runtime PM, don't set SDHCI_QUIRK_NO_LED and don't use sdhci_runtime|suspend_resume_host(). Don't know if there is a better way to address this, if not on a case by case basis. Do you have any thoughts about this? Kind regards Uffe > > > --- > > drivers/mmc/host/sdhci-msm.c | 16 +++++++++++++++- > > 1 file changed, 15 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c > > index 668e0aceeeba..e113b99a3eab 100644 > > --- a/drivers/mmc/host/sdhci-msm.c > > +++ b/drivers/mmc/host/sdhci-msm.c > > @@ -2694,6 +2694,11 @@ static __maybe_unused int sdhci_msm_runtime_suspend(struct device *dev) > > struct sdhci_host *host = dev_get_drvdata(dev); > > struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > > struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); > > + unsigned long flags; > > + > > + spin_lock_irqsave(&host->lock, flags); > > + host->runtime_suspended = true; > > + spin_unlock_irqrestore(&host->lock, flags); > > > > /* Drop the performance vote */ > > dev_pm_opp_set_rate(dev, 0); > > @@ -2708,6 +2713,7 @@ static __maybe_unused int sdhci_msm_runtime_resume(struct device *dev) > > struct sdhci_host *host = dev_get_drvdata(dev); > > struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > > struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); > > + unsigned long flags; > > int ret; > > > > ret = clk_bulk_prepare_enable(ARRAY_SIZE(msm_host->bulk_clks), > > @@ -2726,7 +2732,15 @@ static __maybe_unused int sdhci_msm_runtime_resume(struct device *dev) > > > > dev_pm_opp_set_rate(dev, msm_host->clk_rate); > > > > - return sdhci_msm_ice_resume(msm_host); > > + ret = sdhci_msm_ice_resume(msm_host); > > + if (ret) > > + return ret; > > + > > + spin_lock_irqsave(&host->lock, flags); > > + host->runtime_suspended = false; > > + spin_unlock_irqrestore(&host->lock, flags); > > + > > + return ret; > > } > > > > static const struct dev_pm_ops sdhci_msm_pm_ops = { > > > > --- > > base-commit: e8f897f4afef0031fe618a8e94127a0934896aba > > change-id: 20240321-sdhci-mmc-suspend-34f4af1d0286 > > > > Best regards, >