Message ID | 20220610092924.754942-13-maxime@cerno.tech (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/vc4: Fix hotplug for vc4 | expand |
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 >
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;
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> --- drivers/gpu/drm/vc4/vc4_drv.c | 14 ++++++++++++-- drivers/gpu/drm/vc4/vc4_drv.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-)