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
