[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