[PATCH v4 4/5] drm: bridge: Detach bridge from encoder at encoder cleanup time

Daniel Vetter daniel at ffwll.ch
Wed Dec 14 10:19:31 UTC 2016


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 at ideasonboard.com>

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

> ---
>  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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list