Skip to content

Commit 4a878c0

Browse files
Laurent Pinchartboddob
authored andcommitted
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
1 parent 3bb80f2 commit 4a878c0

File tree

8 files changed

+8
-35
lines changed

8 files changed

+8
-35
lines changed

drivers/gpu/drm/drm_bridge.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include <drm/drm_bridge.h>
2929
#include <drm/drm_encoder.h>
3030

31+
#include "drm_crtc_internal.h"
32+
3133
/**
3234
* DOC: overview
3335
*
@@ -145,16 +147,6 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
145147
}
146148
EXPORT_SYMBOL(drm_bridge_attach);
147149

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-
*/
158150
void drm_bridge_detach(struct drm_bridge *bridge)
159151
{
160152
if (WARN_ON(!bridge))
@@ -168,7 +160,6 @@ void drm_bridge_detach(struct drm_bridge *bridge)
168160

169161
bridge->dev = NULL;
170162
}
171-
EXPORT_SYMBOL(drm_bridge_detach);
172163

173164
/**
174165
* DOC: bridge callbacks

drivers/gpu/drm/drm_crtc_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ void drm_plane_unregister_all(struct drm_device *dev);
186186
int drm_plane_check_pixel_format(const struct drm_plane *plane,
187187
u32 format);
188188

189+
/* drm_bridge.c */
190+
void drm_bridge_detach(struct drm_bridge *bridge);
191+
189192
/* IOCTL */
190193
int drm_mode_getplane_res(struct drm_device *dev, void *data,
191194
struct drm_file *file_priv);

drivers/gpu/drm/drm_encoder.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
159159
* the indices on the drm_encoder after us in the encoder_list.
160160
*/
161161

162+
if (encoder->bridge)
163+
drm_bridge_detach(encoder->bridge);
164+
162165
drm_mode_object_unregister(dev, &encoder->base);
163166
kfree(encoder->name);
164167
list_del(&encoder->head);

drivers/gpu/drm/drm_simple_kms_helper.c

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -186,23 +186,6 @@ int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
186186
}
187187
EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge);
188188

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-
*/
196-
void 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-
}
204-
EXPORT_SYMBOL(drm_simple_display_pipe_detach_bridge);
205-
206189
/**
207190
* drm_simple_display_pipe_init - Initialize a simple display pipeline
208191
* @dev: DRM device

drivers/gpu/drm/imx/imx-ldb.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -736,8 +736,6 @@ static void imx_ldb_unbind(struct device *dev, struct device *master,
736736
for (i = 0; i < 2; i++) {
737737
struct imx_ldb_channel *channel = &imx_ldb->channel[i];
738738

739-
if (channel->bridge)
740-
drm_bridge_detach(channel->bridge);
741739
if (channel->panel)
742740
drm_panel_detach(channel->panel);
743741

drivers/gpu/drm/imx/parallel-display.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,6 @@ static void imx_pd_unbind(struct device *dev, struct device *master,
284284
{
285285
struct imx_parallel_display *imxpd = dev_get_drvdata(dev);
286286

287-
if (imxpd->bridge)
288-
drm_bridge_detach(imxpd->bridge);
289287
if (imxpd->panel)
290288
drm_panel_detach(imxpd->panel);
291289

include/drm/drm_bridge.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,6 @@ void drm_bridge_remove(struct drm_bridge *bridge);
203203
struct drm_bridge *of_drm_find_bridge(struct device_node *np);
204204
int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
205205
struct drm_bridge *previous);
206-
void drm_bridge_detach(struct drm_bridge *bridge);
207206

208207
bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
209208
const struct drm_display_mode *mode,

include/drm/drm_simple_kms_helper.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,6 @@ struct drm_simple_display_pipe {
114114
int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,
115115
struct drm_bridge *bridge);
116116

117-
void drm_simple_display_pipe_detach_bridge(struct drm_simple_display_pipe *pipe);
118-
119117
int drm_simple_display_pipe_init(struct drm_device *dev,
120118
struct drm_simple_display_pipe *pipe,
121119
const struct drm_simple_display_pipe_funcs *funcs,

0 commit comments

Comments
 (0)