Hi, On 12/01/2026 11:12, Abhash Kumar Jha wrote: > If runtime-pm has already suspended the device and a system suspend > occurs, then we see a kernel crash when disabling and unpreparing the > clocks. > > Use pm_runtime_force_suspend/resume in system_sleep pm callbacks to let > runtime-pm take care of the coordination between system suspend and > itself. This ensures that they do not interfere with each other. > > Signed-off-by: Abhash Kumar Jha <[email protected]> > --- > Hi, > > If a device is runtime_pm suspended and a system wide suspend is triggered, > we see a kernel crash. Hence split the power management ops into separate > system_sleep and runtime_pm ops. > > Changes in v2: > - Improve the commit description and subject. > - Link to v1: > https://lore.kernel.org/all/[email protected]/
See: https://lore.kernel.org/all/20250512083215.436149-1-ivitro%40gmail.com/ I think that's a better fix. Tomi > > Thanks, > Abhash > > .../gpu/drm/bridge/cadence/cdns-dsi-core.c | 32 +++++++++++++------ > 1 file changed, 23 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c > b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c > index 09b289f0fcbf..25eaf0192013 100644 > --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c > +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c > @@ -1230,7 +1230,18 @@ static const struct mipi_dsi_host_ops cdns_dsi_ops = { > .transfer = cdns_dsi_transfer, > }; > > -static int __maybe_unused cdns_dsi_resume(struct device *dev) > +static int cdns_dsi_runtime_suspend(struct device *dev) > +{ > + struct cdns_dsi *dsi = dev_get_drvdata(dev); > + > + clk_disable_unprepare(dsi->dsi_sys_clk); > + clk_disable_unprepare(dsi->dsi_p_clk); > + reset_control_assert(dsi->dsi_p_rst); > + > + return 0; > +} > + > +static int cdns_dsi_runtime_resume(struct device *dev) > { > struct cdns_dsi *dsi = dev_get_drvdata(dev); > > @@ -1241,18 +1252,21 @@ static int __maybe_unused cdns_dsi_resume(struct > device *dev) > return 0; > } > > -static int __maybe_unused cdns_dsi_suspend(struct device *dev) > +static int cdns_dsi_suspend(struct device *dev) > { > - struct cdns_dsi *dsi = dev_get_drvdata(dev); > + return pm_runtime_force_suspend(dev); > +} > > - clk_disable_unprepare(dsi->dsi_sys_clk); > - clk_disable_unprepare(dsi->dsi_p_clk); > - reset_control_assert(dsi->dsi_p_rst); > - return 0; > +static int cdns_dsi_resume(struct device *dev) > +{ > + return pm_runtime_force_resume(dev); > } > > -static UNIVERSAL_DEV_PM_OPS(cdns_dsi_pm_ops, cdns_dsi_suspend, > cdns_dsi_resume, > - NULL); > +static const struct dev_pm_ops cdns_dsi_pm_ops = { > + SET_RUNTIME_PM_OPS(cdns_dsi_runtime_suspend, > + cdns_dsi_runtime_resume, NULL) > + SET_SYSTEM_SLEEP_PM_OPS(cdns_dsi_suspend, cdns_dsi_resume) > +}; > > static int cdns_dsi_drm_probe(struct platform_device *pdev) > {
