From: Kaitao Cheng <[email protected]> A later change will make list_for_each_entry_from() and list_for_each_entry_reverse() cache the next or previous element before entering the loop body. The bridge enable and disable ordering code adjusts its cursor to skip ranges that have already been handled.
Keep those walks open-coded so the loop step observes the cursor selected by the body. This preserves the existing bridge ordering semantics and prepares the code for the list iterator update. Signed-off-by: Kaitao Cheng <[email protected]> --- drivers/gpu/drm/drm_bridge.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c index d6f512b73389..a538aabc4e0b 100644 --- a/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c @@ -868,7 +868,8 @@ void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge, encoder = bridge->encoder; - list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { + for (; !list_entry_is_head(bridge, &encoder->bridge_chain, chain_node); + bridge = list_next_entry(bridge, chain_node)) { limit = NULL; if (!list_is_last(&bridge->chain_node, &encoder->bridge_chain)) { @@ -962,7 +963,9 @@ void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge, encoder = bridge->encoder; - list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { + for (iter = list_last_entry(&encoder->bridge_chain, typeof(*iter), chain_node); + !list_entry_is_head(iter, &encoder->bridge_chain, chain_node); + iter = list_prev_entry(iter, chain_node)) { if (iter->pre_enable_prev_first) { next = iter; limit = bridge; -- 2.43.0
