]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/drm_bridge.c
Revert "drm/bridge: Add the necessary bits to support bus format negotiation"
[linux.git] / drivers / gpu / drm / drm_bridge.c
index 872e159fcb42c328c03e9336b0158fa09a255e40..8e4b799150b0e29d8806dc7aaab7acd5efd6a5a9 100644 (file)
@@ -645,6 +645,68 @@ void drm_atomic_bridge_chain_enable(struct drm_bridge *bridge,
 }
 EXPORT_SYMBOL(drm_atomic_bridge_chain_enable);
 
+static int drm_atomic_bridge_check(struct drm_bridge *bridge,
+                                  struct drm_crtc_state *crtc_state,
+                                  struct drm_connector_state *conn_state)
+{
+       if (bridge->funcs->atomic_check) {
+               struct drm_bridge_state *bridge_state;
+               int ret;
+
+               bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state,
+                                                              bridge);
+               if (WARN_ON(!bridge_state))
+                       return -EINVAL;
+
+               ret = bridge->funcs->atomic_check(bridge, bridge_state,
+                                                 crtc_state, conn_state);
+               if (ret)
+                       return ret;
+       } else if (bridge->funcs->mode_fixup) {
+               if (!bridge->funcs->mode_fixup(bridge, &crtc_state->mode,
+                                              &crtc_state->adjusted_mode))
+                       return -EINVAL;
+       }
+
+       return 0;
+}
+
+/**
+ * drm_atomic_bridge_chain_check() - Do an atomic check on the bridge chain
+ * @bridge: bridge control structure
+ * @crtc_state: new CRTC state
+ * @conn_state: new connector state
+ *
+ * Calls &drm_bridge_funcs.atomic_check() (falls back on
+ * &drm_bridge_funcs.mode_fixup()) op for all the bridges in the encoder chain,
+ * starting from the last bridge to the first. These are called before calling
+ * &drm_encoder_helper_funcs.atomic_check()
+ *
+ * RETURNS:
+ * 0 on success, a negative error code on failure
+ */
+int drm_atomic_bridge_chain_check(struct drm_bridge *bridge,
+                                 struct drm_crtc_state *crtc_state,
+                                 struct drm_connector_state *conn_state)
+{
+       struct drm_encoder *encoder = bridge->encoder;
+       struct drm_bridge *iter;
+
+       list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
+               int ret;
+
+               ret = drm_atomic_bridge_check(iter, crtc_state, conn_state);
+               if (ret)
+                       return ret;
+
+               if (iter == bridge)
+                       break;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_atomic_bridge_chain_check);
+
 /**
  * __drm_atomic_helper_bridge_reset() - Initialize a bridge state to its
  *                                     default