When a bridge is detached it is removed from the encoder bridge_chain list,
but the bridge::chain_node list head is not cleared. This is going to be
problematic with the upcoming hotplug bridge support because if a bridge is
detached from the encoder chain but not yet removed, when later detaching
it the encoder code may think it is still attached, thus trying to detach
it twice.

Avoid this by clearing the list head on detach, so there's a clear and
simple way to know when a bridge is not attached anymore.

Do the same in the error management code in drm_bridge_attach(), so that
chain_node is always empty [as in list_empty()] when it is not
(yet|anymore) in the bridge chain.

Signed-off-by: Luca Ceresoli <[email protected]>
---
 drivers/gpu/drm/drm_bridge.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index 657f6609d7b1..7f2d1a81d730 100644
--- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c
@@ -598,7 +598,7 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct 
drm_bridge *bridge,
        bridge->dev = NULL;
        bridge->encoder = NULL;
        mutex_lock(&encoder->bridge_chain_mutex);
-       list_del(&bridge->chain_node);
+       list_del_init(&bridge->chain_node);
        mutex_unlock(&encoder->bridge_chain_mutex);
 
        if (ret != -EPROBE_DEFER)
@@ -629,7 +629,7 @@ void drm_bridge_detach(struct drm_bridge *bridge)
        if (bridge->funcs->detach)
                bridge->funcs->detach(bridge);
 
-       list_del(&bridge->chain_node);
+       list_del_init(&bridge->chain_node);
        bridge->dev = NULL;
        drm_bridge_put(bridge);
 }

-- 
2.54.0

Reply via email to