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)
>  {

Reply via email to