On Fri, 10 Jun 2022 at 10:30, Maxime Ripard <maxime@xxxxxxxxxx> wrote: > > While we were using the component framework to deal with all the DRM > subdevices, we were not calling component_unbind_all(). > > This leads to none of the subdevices freeing up their resources as part of > their unbind() or device managed hooks. > > Fixes: c8b75bca92cb ("drm/vc4: Add KMS support for Raspberry Pi.") > Signed-off-by: Maxime Ripard <maxime@xxxxxxxxxx> Reviewed-by: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/vc4/vc4_drv.c | 14 ++++++++++++-- > drivers/gpu/drm/vc4/vc4_drv.h | 1 + > 2 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c > index 162bc18e7497..031f2cdd658d 100644 > --- a/drivers/gpu/drm/vc4/vc4_drv.c > +++ b/drivers/gpu/drm/vc4/vc4_drv.c > @@ -209,6 +209,13 @@ static void vc4_match_add_drivers(struct device *dev, > } > } > > +static void vc4_component_unbind_all(void *ptr) > +{ > + struct vc4_dev *vc4 = ptr; > + > + component_unbind_all(vc4->dev, &vc4->base); > +} > + > static int vc4_drm_bind(struct device *dev) > { > struct platform_device *pdev = to_platform_device(dev); > @@ -230,6 +237,7 @@ static int vc4_drm_bind(struct device *dev) > vc4 = devm_drm_dev_alloc(dev, &vc4_drm_driver, struct vc4_dev, base); > if (IS_ERR(vc4)) > return PTR_ERR(vc4); > + vc4->dev = dev; > > drm = &vc4->base; > platform_set_drvdata(pdev, drm); > @@ -276,6 +284,10 @@ static int vc4_drm_bind(struct device *dev) > if (ret) > return ret; > > + ret = devm_add_action_or_reset(dev, vc4_component_unbind_all, vc4); > + if (ret) > + return ret; > + > ret = vc4_plane_create_additional_planes(drm); > if (ret) > goto unbind_all; > @@ -296,8 +308,6 @@ static int vc4_drm_bind(struct device *dev) > return 0; > > unbind_all: > - component_unbind_all(dev, drm); > - > return ret; > } > > diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h > index 15e0c2ac3940..aa4c5910ea05 100644 > --- a/drivers/gpu/drm/vc4/vc4_drv.h > +++ b/drivers/gpu/drm/vc4/vc4_drv.h > @@ -73,6 +73,7 @@ struct vc4_perfmon { > > struct vc4_dev { > struct drm_device base; > + struct device *dev; > > unsigned int irq; > > -- > 2.36.1 >