On Fri, 10 Jun 2022 at 10:30, Maxime Ripard maxime@cerno.tech 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@cerno.tech
Reviewed-by: Dave Stevenson dave.stevenson@raspberrypi.com
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