On Tue, Mar 24, 2026 at 07:05:05PM +0100, Tommaso Merciai wrote: > 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. > > Based on similar work done by Laurent Pinchart for R-Car DU.
If the R-Car DU patch gets merged before this one, you could mention the commit ID here. > > Signed-off-by: Tommaso Merciai <[email protected]> Reviewed-by: Laurent Pinchart <[email protected]> > --- > drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c | 16 ++++++++++++++++ > drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h | 2 ++ > 2 files changed, 18 insertions(+) > > diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c > index bd486377f037..eb626c3cc421 100644 > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c > @@ -20,6 +20,7 @@ > #include <drm/drm_vblank.h> > > #include <linux/bitops.h> > +#include <linux/device.h> > #include <linux/dma-mapping.h> > #include <linux/of_platform.h> > #include <linux/platform_device.h> > @@ -293,6 +294,9 @@ static void rzg2l_du_vsp_cleanup(struct drm_device *dev, > void *res) > { > struct rzg2l_du_vsp *vsp = res; > > + if (vsp->link) > + device_link_del(vsp->link); > + > put_device(vsp->vsp); > } > > @@ -317,6 +321,18 @@ int rzg2l_du_vsp_init(struct rzg2l_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/rz-du/rzg2l_du_vsp.h > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h > index 322eb80dcbaf..a22aaf0843ed 100644 > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h > @@ -15,6 +15,7 @@ > #include <linux/scatterlist.h> > > struct device; > +struct device_link; > struct drm_framebuffer; > struct rzg2l_du_device; > struct rzg2l_du_format_info; > @@ -29,6 +30,7 @@ struct rzg2l_du_vsp_plane { > struct rzg2l_du_vsp { > unsigned int index; > struct device *vsp; > + struct device_link *link; > struct rzg2l_du_device *dev; > }; > -- Regards, Laurent Pinchart
