aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2016-11-28 11:32:05 -0500
committerArchit Taneja <architt@codeaurora.org>2016-12-18 06:02:49 -0500
commit4a878c03d56214a3dcf1a014e17c93bcdc587668 (patch)
tree86dfb26724bec8cc0404b315e775e96ee2111e50
parent3bb80f249525c059572d4bc89ac77ac2e511bcbe (diff)
drm: bridge: Detach bridge from encoder at encoder cleanup time
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
-rw-r--r--drivers/gpu/drm/drm_bridge.c13
-rw-r--r--drivers/gpu/drm/drm_crtc_internal.h3
-rw-r--r--drivers/gpu/drm/drm_encoder.c3
-rw-r--r--drivers/gpu/drm/drm_simple_kms_helper.c17
-rw-r--r--drivers/gpu/drm/imx/imx-ldb.c2
-rw-r--r--drivers/gpu/drm/imx/parallel-display.c2
-rw-r--r--include/drm/drm_bridge.h1
-rw-r--r--include/drm/drm_simple_kms_helper.h2
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 @@
28#include <drm/drm_bridge.h> 28#include <drm/drm_bridge.h>
29#include <drm/drm_encoder.h> 29#include <drm/drm_encoder.h>
30 30
31#include "drm_crtc_internal.h"
32
31/** 33/**
32 * DOC: overview 34 * DOC: overview
33 * 35 *
@@ -145,16 +147,6 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
145} 147}
146EXPORT_SYMBOL(drm_bridge_attach); 148EXPORT_SYMBOL(drm_bridge_attach);
147 149
148/**
149 * drm_bridge_detach - deassociate given bridge from its DRM device
150 *
151 * @bridge: bridge control structure
152 *
153 * Called by a kms driver to unlink the given bridge from its DRM device.
154 *
155 * Note that tearing down links between the bridge and our encoder/bridge
156 * objects needs to be handled by the kms driver itself.
157 */
158void drm_bridge_detach(struct drm_bridge *bridge) 150void drm_bridge_detach(struct drm_bridge *bridge)
159{ 151{
160 if (WARN_ON(!bridge)) 152 if (WARN_ON(!bridge))
@@ -168,7 +160,6 @@ void drm_bridge_detach(struct drm_bridge *bridge)
168 160
169 bridge->dev = NULL; 161 bridge->dev = NULL;
170} 162}
171EXPORT_SYMBOL(drm_bridge_detach);
172 163
173/** 164/**
174 * DOC: bridge callbacks 165 * 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);
186int drm_plane_check_pixel_format(const struct drm_plane *plane, 186int drm_plane_check_pixel_format(const struct drm_plane *plane,
187 u32 format); 187 u32 format);
188 188
189/* drm_bridge.c */
190void drm_bridge_detach(struct drm_bridge *bridge);
191
189/* IOCTL */ 192/* IOCTL */
190int drm_mode_getplane_res(struct drm_device *dev, void *data, 193int drm_mode_getplane_res(struct drm_device *dev, void *data,
191 struct drm_file *file_priv); 194 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)
159 * the indices on the drm_encoder after us in the encoder_list. 159 * the indices on the drm_encoder after us in the encoder_list.
160 */ 160 */
161 161
162 if (encoder->bridge)
163 drm_bridge_detach(encoder->bridge);
164
162 drm_mode_object_unregister(dev, &encoder->base); 165 drm_mode_object_unregister(dev, &encoder->base);
163 kfree(encoder->name); 166 kfree(encoder->name);
164 list_del(&encoder->head); 167 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,
187EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge); 187EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
188 188
189/** 189/**
190 * drm_simple_display_pipe_detach_bridge - Detach the bridge from the display pipe
191 * @pipe: simple display pipe object
192 *
193 * Detaches the drm bridge previously attached with
194 * drm_simple_display_pipe_attach_bridge()
195 */
196void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe)
197{
198 if (WARN_ON(!pipe->encoder.bridge))
199 return;
200
201 drm_bridge_detach(pipe->encoder.bridge);
202 pipe->encoder.bridge = NULL;
203}
204EXPORT_SYMBOL(drm_simple_display_pipe_detach_bridge);
205
206/**
207 * drm_simple_display_pipe_init - Initialize a simple display pipeline 190 * drm_simple_display_pipe_init - Initialize a simple display pipeline
208 * @dev: DRM device 191 * @dev: DRM device
209 * @pipe: simple display pipe object to initialize 192 * @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,
736 for (i = 0; i < 2; i++) { 736 for (i = 0; i < 2; i++) {
737 struct imx_ldb_channel *channel = &imx_ldb->channel[i]; 737 struct imx_ldb_channel *channel = &imx_ldb->channel[i];
738 738
739 if (channel->bridge)
740 drm_bridge_detach(channel->bridge);
741 if (channel->panel) 739 if (channel->panel)
742 drm_panel_detach(channel->panel); 740 drm_panel_detach(channel->panel);
743 741
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,
284{ 284{
285 struct imx_parallel_display *imxpd = dev_get_drvdata(dev); 285 struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
286 286
287 if (imxpd->bridge)
288 drm_bridge_detach(imxpd->bridge);
289 if (imxpd->panel) 287 if (imxpd->panel)
290 drm_panel_detach(imxpd->panel); 288 drm_panel_detach(imxpd->panel);
291 289
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);
203struct drm_bridge *of_drm_find_bridge(struct device_node *np); 203struct drm_bridge *of_drm_find_bridge(struct device_node *np);
204int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, 204int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
205 struct drm_bridge *previous); 205 struct drm_bridge *previous);
206void drm_bridge_detach(struct drm_bridge *bridge);
207 206
208bool drm_bridge_mode_fixup(struct drm_bridge *bridge, 207bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
209 const struct drm_display_mode *mode, 208 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 {
114int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe, 114int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
115 struct drm_bridge *bridge); 115 struct drm_bridge *bridge);
116 116
117void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe);
118
119int drm_simple_display_pipe_init(struct drm_device *dev, 117int drm_simple_display_pipe_init(struct drm_device *dev,
120 struct drm_simple_display_pipe *pipe, 118 struct drm_simple_display_pipe *pipe,
121 const struct drm_simple_display_pipe_funcs *funcs, 119 const struct drm_simple_display_pipe_funcs *funcs,