drm: bridge: Detach all bridges in a chain at encoder cleanup time
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 29 Nov 2016 18:55:44 +0000 (20:55 +0200)
committerArchit Taneja <architt@codeaurora.org>
Sun, 18 Dec 2016 11:02:49 +0000 (16:32 +0530)
Instead of detaching only the bridge directly connected to the encoder,
detach all bridges in the chain.

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-6-git-send-email-laurent.pinchart+renesas@ideasonboard.com
drivers/gpu/drm/drm_encoder.c

index 0944f08abf58612d8ae13f137ad600b687836c67..5dde3c6b14678e591b14cb1f4c42de93346cef22 100644 (file)
@@ -159,8 +159,16 @@ 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);
+       if (encoder->bridge) {
+               struct drm_bridge *bridge = encoder->bridge;
+               struct drm_bridge *next;
+
+               while (bridge) {
+                       next = bridge->next;
+                       drm_bridge_detach(bridge);
+                       bridge = next;
+               }
+       }
 
        drm_mode_object_unregister(dev, &encoder->base);
        kfree(encoder->name);