return;
encoder = bridge->encoder;
+ mutex_lock(&encoder->bridge_chain_mutex);
list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
if (iter->funcs->atomic_disable) {
iter->funcs->atomic_disable(iter, state);
if (iter == bridge)
break;
}
+ mutex_unlock(&encoder->bridge_chain_mutex);
}
EXPORT_SYMBOL(drm_atomic_bridge_chain_disable);
return ret;
encoder = bridge->encoder;
- list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
- int ret;
-
- /*
- * Bus flags are propagated by default. If a bridge needs to
- * tweak the input bus flags for any reason, it should happen
- * in its &drm_bridge_funcs.atomic_check() implementation such
- * that preceding bridges in the chain can propagate the new
- * bus flags.
- */
- drm_atomic_bridge_propagate_bus_flags(iter, conn,
- crtc_state->state);
-
- ret = drm_atomic_bridge_check(iter, crtc_state, conn_state);
- if (ret)
- return ret;
+ scoped_guard(mutex, &encoder->bridge_chain_mutex) {
+ list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
+ int ret;
+
+ /*
+ * Bus flags are propagated by default. If a bridge needs to
+ * tweak the input bus flags for any reason, it should happen
+ * in its &drm_bridge_funcs.atomic_check() implementation such
+ * that preceding bridges in the chain can propagate the new
+ * bus flags.
+ */
+ drm_atomic_bridge_propagate_bus_flags(iter, conn,
+ crtc_state->state);
+
+ ret = drm_atomic_bridge_check(iter, crtc_state, conn_state);
+ if (ret)
+ return ret;
- if (iter == bridge)
- break;
+ if (iter == bridge)
+ break;
+ }
}
return 0;