drm/bridge: Fix the stop condition of drm_bridge_chain_pre_enable()
authorDouglas Anderson <dianders@chromium.org>
Fri, 16 Apr 2021 22:39:24 +0000 (15:39 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jul 2021 14:56:15 +0000 (16:56 +0200)
[ Upstream commit bab5cca7e609952b069a550e39fe4893149fb658 ]

The drm_bridge_chain_pre_enable() is not the proper opposite of
drm_bridge_chain_post_disable(). It continues along the chain to
_before_ the starting bridge. Let's fix that.

Fixes: 05193dc38197 ("drm/bridge: Make the bridge chain a double-linked list")
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210416153909.v4.1.If62a003f76a2bc4ccc6c53565becc05d2aad4430@changeid
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/drm_bridge.c

index 64f0eff..044acd0 100644 (file)
@@ -522,6 +522,9 @@ void drm_bridge_chain_pre_enable(struct drm_bridge *bridge)
        list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
                if (iter->funcs->pre_enable)
                        iter->funcs->pre_enable(iter);
+
+               if (iter == bridge)
+                       break;
        }
 }
 EXPORT_SYMBOL(drm_bridge_chain_pre_enable);