drm: bridge: Detach bridge from encoder at encoder cleanup time
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Mon, 28 Nov 2016 16:32:05 +0000 (18:32 +0200)
committerArchit Taneja <architt@codeaurora.org>
Sun, 18 Dec 2016 11:02:49 +0000 (16:32 +0530)
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@ideasonboard.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Link: http://patchwork.freedesktop.org/patch/msgid/1481709550-29226-5-git-send-email-laurent.pinchart+renesas@ideasonboard.com
drivers/gpu/drm/drm_bridge.c
drivers/gpu/drm/drm_crtc_internal.h
drivers/gpu/drm/drm_encoder.c
drivers/gpu/drm/drm_simple_kms_helper.c
drivers/gpu/drm/imx/imx-ldb.c
drivers/gpu/drm/imx/parallel-display.c
include/drm/drm_bridge.h
include/drm/drm_simple_kms_helper.h

index 850bd6509ef1122d258dd2574f917833dcbeae6e..cd10095e8d00ae89eba02108d572b16593da4884 100644 (file)
@@ -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
index cdf6860c9d2297a40acae8684296b067d35dd7d4..42471dfc740506134ba584640012ed1af06e3952 100644 (file)
@@ -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);
index 992879f15f237b5ccd42e7f5300c851e35f3bcf1..0944f08abf58612d8ae13f137ad600b687836c67 100644 (file)
@@ -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);
index ba7be616933996a6588c45137810d38c640cff73..3cc42f5dfba1fdd0c33a3afcd6deac0bd5f47b16 100644 (file)
@@ -186,23 +186,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
index ec49ea3d8e4088b139f35f3c73facfe96a5e16f7..88cd11d301341748245e4edc79170dc9fc223a57 100644 (file)
@@ -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);
 
index 51d9f735c35841bd1c3b168e56bccdd509a9da2d..d5c06fd89f9094f09c9565da68df1dfc15fcf089 100644 (file)
@@ -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);
 
index 94e5ee96b3b5acf82388a0ac5f1a6fadcc799aad..435be20029f748c7814d248dad1095048b9962ff 100644 (file)
@@ -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,
index 01a8436ccb0a9b02ff38df34857ec1bac9ba8a6f..2bbc610ec3a2ba608ac69288e32dea713e504d2c 100644 (file)
@@ -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,