]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/drm_encoder.c
drm/bridge: Make the bridge chain a double-linked list
[linux.git] / drivers / gpu / drm / drm_encoder.c
index 80d88a55302eca62ebc076785a33ff541754fc49..e555281f43d4b4daf5919e61ccf1549fca90f1d6 100644 (file)
@@ -140,6 +140,7 @@ int drm_encoder_init(struct drm_device *dev,
                goto out_put;
        }
 
+       INIT_LIST_HEAD(&encoder->bridge_chain);
        list_add_tail(&encoder->head, &dev->mode_config.encoder_list);
        encoder->index = dev->mode_config.num_encoder++;
 
@@ -160,22 +161,16 @@ EXPORT_SYMBOL(drm_encoder_init);
 void drm_encoder_cleanup(struct drm_encoder *encoder)
 {
        struct drm_device *dev = encoder->dev;
+       struct drm_bridge *bridge, *next;
 
        /* Note that the encoder_list is considered to be static; should we
         * remove the drm_encoder at runtime we would have to decrement all
         * the indices on the drm_encoder after us in the encoder_list.
         */
 
-       if (encoder->bridge) {
-               struct drm_bridge *bridge = encoder->bridge;
-               struct drm_bridge *next;
-
-               while (bridge) {
-                       next = bridge->next;
-                       drm_bridge_detach(bridge);
-                       bridge = next;
-               }
-       }
+       list_for_each_entry_safe(bridge, next, &encoder->bridge_chain,
+                                chain_node)
+               drm_bridge_detach(bridge);
 
        drm_mode_object_unregister(dev, &encoder->base);
        kfree(encoder->name);