On Wed, Dec 14, 2016 at 11:59:09AM +0200, Laurent Pinchart wrote: > Most drivers that use bridges forgot to detach them at cleanup time. > Instead of fixing them one by one, detach the bridge in the core > drm_encoder_cleanup() function. > > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx> Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > --- > drivers/gpu/drm/drm_bridge.c | 13 ++----------- > drivers/gpu/drm/drm_crtc_internal.h | 3 +++ > drivers/gpu/drm/drm_encoder.c | 3 +++ > drivers/gpu/drm/drm_simple_kms_helper.c | 17 ----------------- > drivers/gpu/drm/imx/imx-ldb.c | 2 -- > drivers/gpu/drm/imx/parallel-display.c | 2 -- > include/drm/drm_bridge.h | 1 - > include/drm/drm_simple_kms_helper.h | 2 -- > 8 files changed, 8 insertions(+), 35 deletions(-) > > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c > index 850bd6509ef1..cd10095e8d00 100644 > --- a/drivers/gpu/drm/drm_bridge.c > +++ b/drivers/gpu/drm/drm_bridge.c > @@ -28,6 +28,8 @@ > #include <drm/drm_bridge.h> > #include <drm/drm_encoder.h> > > +#include "drm_crtc_internal.h" > + > /** > * DOC: overview > * > @@ -145,16 +147,6 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, > } > EXPORT_SYMBOL(drm_bridge_attach); > > -/** > - * drm_bridge_detach - deassociate given bridge from its DRM device > - * > - * @bridge: bridge control structure > - * > - * Called by a kms driver to unlink the given bridge from its DRM device. > - * > - * Note that tearing down links between the bridge and our encoder/bridge > - * objects needs to be handled by the kms driver itself. > - */ > void drm_bridge_detach(struct drm_bridge *bridge) > { > if (WARN_ON(!bridge)) > @@ -168,7 +160,6 @@ void drm_bridge_detach(struct drm_bridge *bridge) > > bridge->dev = NULL; > } > -EXPORT_SYMBOL(drm_bridge_detach); > > /** > * DOC: bridge callbacks > diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h > index cdf6860c9d22..42471dfc7405 100644 > --- a/drivers/gpu/drm/drm_crtc_internal.h > +++ b/drivers/gpu/drm/drm_crtc_internal.h > @@ -186,6 +186,9 @@ void drm_plane_unregister_all(struct drm_device *dev); > int drm_plane_check_pixel_format(const struct drm_plane *plane, > u32 format); > > +/* drm_bridge.c */ > +void drm_bridge_detach(struct drm_bridge *bridge); > + > /* IOCTL */ > int drm_mode_getplane_res(struct drm_device *dev, void *data, > struct drm_file *file_priv); > diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c > index 992879f15f23..0944f08abf58 100644 > --- a/drivers/gpu/drm/drm_encoder.c > +++ b/drivers/gpu/drm/drm_encoder.c > @@ -159,6 +159,9 @@ void drm_encoder_cleanup(struct drm_encoder *encoder) > * the indices on the drm_encoder after us in the encoder_list. > */ > > + if (encoder->bridge) > + drm_bridge_detach(encoder->bridge); > + > drm_mode_object_unregister(dev, &encoder->base); > kfree(encoder->name); > list_del(&encoder->head); > diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c > index ba7be6169339..3cc42f5dfba1 100644 > --- a/drivers/gpu/drm/drm_simple_kms_helper.c > +++ b/drivers/gpu/drm/drm_simple_kms_helper.c > @@ -187,23 +187,6 @@ int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe, > EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge); > > /** > - * drm_simple_display_pipe_detach_bridge - Detach the bridge from the display pipe > - * @pipe: simple display pipe object > - * > - * Detaches the drm bridge previously attached with > - * drm_simple_display_pipe_attach_bridge() > - */ > -void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe) > -{ > - if (WARN_ON(!pipe->encoder.bridge)) > - return; > - > - drm_bridge_detach(pipe->encoder.bridge); > - pipe->encoder.bridge = NULL; > -} > -EXPORT_SYMBOL(drm_simple_display_pipe_detach_bridge); > - > -/** > * drm_simple_display_pipe_init - Initialize a simple display pipeline > * @dev: DRM device > * @pipe: simple display pipe object to initialize > diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c > index ec49ea3d8e40..88cd11d30134 100644 > --- a/drivers/gpu/drm/imx/imx-ldb.c > +++ b/drivers/gpu/drm/imx/imx-ldb.c > @@ -736,8 +736,6 @@ static void imx_ldb_unbind(struct device *dev, struct device *master, > for (i = 0; i < 2; i++) { > struct imx_ldb_channel *channel = &imx_ldb->channel[i]; > > - if (channel->bridge) > - drm_bridge_detach(channel->bridge); > if (channel->panel) > drm_panel_detach(channel->panel); > > diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c > index 51d9f735c358..d5c06fd89f90 100644 > --- a/drivers/gpu/drm/imx/parallel-display.c > +++ b/drivers/gpu/drm/imx/parallel-display.c > @@ -284,8 +284,6 @@ static void imx_pd_unbind(struct device *dev, struct device *master, > { > struct imx_parallel_display *imxpd = dev_get_drvdata(dev); > > - if (imxpd->bridge) > - drm_bridge_detach(imxpd->bridge); > if (imxpd->panel) > drm_panel_detach(imxpd->panel); > > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h > index 94e5ee96b3b5..435be20029f7 100644 > --- a/include/drm/drm_bridge.h > +++ b/include/drm/drm_bridge.h > @@ -203,7 +203,6 @@ void drm_bridge_remove(struct drm_bridge *bridge); > struct drm_bridge *of_drm_find_bridge(struct device_node *np); > int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, > struct drm_bridge *previous); > -void drm_bridge_detach(struct drm_bridge *bridge); > > bool drm_bridge_mode_fixup(struct drm_bridge *bridge, > const struct drm_display_mode *mode, > diff --git a/include/drm/drm_simple_kms_helper.h b/include/drm/drm_simple_kms_helper.h > index 01a8436ccb0a..2bbc610ec3a2 100644 > --- a/include/drm/drm_simple_kms_helper.h > +++ b/include/drm/drm_simple_kms_helper.h > @@ -114,8 +114,6 @@ struct drm_simple_display_pipe { > int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe, > struct drm_bridge *bridge); > > -void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe); > - > int drm_simple_display_pipe_init(struct drm_device *dev, > struct drm_simple_display_pipe *pipe, > const struct drm_simple_display_pipe_funcs *funcs, > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel