From: Laurent Pinchart Date: Mon, 23 Mar 2026 16:45:23 +0000 (+0200) Subject: drm: rcar-du: Ensure correct suspend/resume ordering with VSP X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=db5be3a7d6bd5c0e9694803a489d4d1689d6d5ef;p=thirdparty%2Flinux.git drm: rcar-du: Ensure correct suspend/resume ordering with VSP The VSP serves as an interface to memory and a compositor to the DU. It therefore needs to be suspended after and resumed before the DU, to be properly stopped and restarted in a controlled fashion driven by the DU driver. This currently works by chance. Avoid relying on luck by enforcing the correct suspend/resume ordering with device links. Signed-off-by: Laurent Pinchart Reviewed-by: Biju Das Tested-by: Tommaso Merciai Reviewed-by: Tommaso Merciai Link: https://patch.msgid.link/20260323164526.2292491-2-laurent.pinchart+renesas@ideasonboard.com Signed-off-by: Tomi Valkeinen --- diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c index 94c22d2db197e..a4a49dcd82330 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -458,6 +459,9 @@ static void rcar_du_vsp_cleanup(struct drm_device *dev, void *res) kfree(vsp->planes); + if (vsp->link) + device_link_del(vsp->link); + put_device(vsp->vsp); } @@ -482,6 +486,18 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np, if (ret < 0) return ret; + /* + * Enforce suspend/resume ordering between the DU (consumer) and the + * VSP (supplier). The DU will be suspended before and resume after the + * VSP. + */ + vsp->link = device_link_add(rcdu->dev, vsp->vsp, DL_FLAG_STATELESS); + if (!vsp->link) { + dev_err(rcdu->dev, "Failed to create device link to VSP %s\n", + dev_name(vsp->vsp)); + return -EINVAL; + } + ret = vsp1_du_init(vsp->vsp); if (ret < 0) return ret; diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.h b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.h index 67630f0b65997..a6731249db34e 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.h +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.h @@ -12,6 +12,7 @@ #include +struct device_link; struct drm_framebuffer; struct rcar_du_format_info; struct rcar_du_vsp; @@ -26,6 +27,7 @@ struct rcar_du_vsp_plane { struct rcar_du_vsp { unsigned int index; struct device *vsp; + struct device_link *link; struct rcar_du_device *dev; struct rcar_du_vsp_plane *planes; unsigned int num_planes;