On Tue, Mar 29, 2022 at 4:42 PM Tony Huang <tonyhuang.sunplus@xxxxxxxxx> wrote: > > Add mmc driver for Sunplus SP7021 > > Signed-off-by: Tony Huang <tonyhuang.sunplus@xxxxxxxxx> There should be a description of the device in the changelog, not just the same text as the subject. > +static void spmmc_request(struct mmc_host *mmc, struct mmc_request *mrq) > +{ > + struct spmmc_host *host = mmc_priv(mmc); > + struct mmc_data *data; > + struct mmc_command *cmd; > + int ret; > + > + ret = mutex_lock_interruptible(&host->mrq_lock); > + if (ret) > + return; I don't think it's valid to just return here when you get a signal. If nothing can handle the signal, doesn't it just hang? It also appears that you don't release the mutex until the tasklet runs, but it is not valid to release a mutex from a different context. You should get a warning about this when running a kernel with lockdep enabled at compile time. Please rework the locking to make this work. > +#endif /* ifdef CONFIG_PM_RUNTIME */ > + > +static const struct dev_pm_ops spmmc_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(spmmc_pm_suspend, spmmc_pm_resume) > +#ifdef CONFIG_PM_RUNTIME > + SET_RUNTIME_PM_OPS(spmmc_pm_runtime_suspend, spmmc_pm_runtime_resume, NULL) > +#endif > +}; > +#endif /* ifdef CONFIG_PM */ It's better to use SYSTEM_SLEEP_PM_OPS/RUNTIME_PM_OPS instead of the SET_ version, then you can remove all the #ifdef checks. Arnd