فهرست منبع

disp: msm: obtain bridge from bridge chain

Commit 05193dc38197 ("drm/bridge: Make the bridge chain
a double-linked list") creates a bridge chain linked
list. This change updates the relevant changes to msm
driver to use the list to find the bridge associated to
the encoder.

Change-Id: I59eb2910be96f4fff7bdbeb040d6ad204c41d747
Signed-off-by: Samantha Tran <[email protected]>
Signed-off-by: Nilaan Gunabalachandran <[email protected]>
Samantha Tran 4 سال پیش
والد
کامیت
16cc165833
6فایلهای تغییر یافته به همراه40 افزوده شده و 26 حذف شده
  1. 0 4
      msm/dp/dp_drm.c
  2. 15 5
      msm/dp/dp_mst_drm.c
  3. 1 1
      msm/dsi/dsi_display.c
  4. 7 5
      msm/dsi/dsi_drm.c
  5. 13 5
      msm/msm_atomic.c
  6. 4 6
      msm/sde/sde_encoder.c

+ 0 - 4
msm/dp/dp_drm.c

@@ -628,7 +628,6 @@ int dp_drm_bridge_init(void *data, struct drm_encoder *encoder,
 		goto error_free_bridge;
 	}
 
-	encoder->bridge = &bridge->base;
 	priv->bridges[priv->num_bridges++] = &bridge->base;
 	display->bridge = bridge;
 	display->max_mixer_count = max_mixer_count;
@@ -646,9 +645,6 @@ void dp_drm_bridge_deinit(void *data)
 	struct dp_display *display = data;
 	struct dp_bridge *bridge = display->bridge;
 
-	if (bridge && bridge->base.encoder)
-		bridge->base.encoder->bridge = NULL;
-
 	kfree(bridge);
 }
 

+ 15 - 5
msm/dp/dp_mst_drm.c

@@ -1300,7 +1300,6 @@ int dp_mst_drm_bridge_init(void *data, struct drm_encoder *encoder)
 		goto end;
 	}
 
-	encoder->bridge = &bridge->base;
 	priv->bridges[priv->num_bridges++] = &bridge->base;
 
 	state = kzalloc(sizeof(*state), GFP_KERNEL);
@@ -1604,6 +1603,7 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector,
 	struct drm_crtc_state *crtc_state;
 	struct dp_mst_bridge *bridge;
 	struct dp_mst_bridge_state *bridge_state;
+	struct drm_bridge *drm_bridge;
 	struct dp_display *dp_display = display;
 	struct dp_mst_private *mst = dp_display->dp_mst_prv_info;
 	struct sde_connector *c_conn = to_sde_connector(connector);
@@ -1642,8 +1642,13 @@ static int dp_mst_connector_atomic_check(struct drm_connector *connector,
 			goto end;
 		}
 
-		bridge = to_dp_mst_bridge(
-				old_conn_state->best_encoder->bridge);
+		drm_bridge = drm_bridge_chain_get_first_bridge(
+				old_conn_state->best_encoder);
+		if (WARN_ON(!drm_bridge)) {
+			rc = -EINVAL;
+			goto end;
+		}
+		bridge = to_dp_mst_bridge(drm_bridge);
 
 		bridge_state = dp_mst_get_bridge_atomic_state(state, bridge);
 		if (IS_ERR(bridge_state)) {
@@ -1691,8 +1696,13 @@ mode_set:
 			goto end;
 		}
 
-		bridge = to_dp_mst_bridge(
-				new_conn_state->best_encoder->bridge);
+		drm_bridge = drm_bridge_chain_get_first_bridge(
+				new_conn_state->best_encoder);
+		if (WARN_ON(!drm_bridge)) {
+			rc = -EINVAL;
+			goto end;
+		}
+		bridge = to_dp_mst_bridge(drm_bridge);
 
 		bridge_state = dp_mst_get_bridge_atomic_state(state, bridge);
 		if (IS_ERR(bridge_state)) {

+ 1 - 1
msm/dsi/dsi_display.c

@@ -6381,7 +6381,7 @@ int dsi_display_drm_ext_bridge_init(struct dsi_display *display,
 		return -EINVAL;
 
 	drm = encoder->dev;
-	bridge = encoder->bridge;
+	bridge = drm_bridge_chain_get_first_bridge(encoder);
 	sde_conn = to_sde_connector(connector);
 	prev_bridge = bridge;
 

+ 7 - 5
msm/dsi/dsi_drm.c

@@ -1023,6 +1023,7 @@ int dsi_conn_post_kickoff(struct drm_connector *connector,
 	struct msm_display_conn_params *params)
 {
 	struct drm_encoder *encoder;
+	struct drm_bridge *bridge;
 	struct dsi_bridge *c_bridge;
 	struct dsi_display_mode adj_mode;
 	struct dsi_display *display;
@@ -1042,7 +1043,12 @@ int dsi_conn_post_kickoff(struct drm_connector *connector,
 		return 0;
 	}
 
-	c_bridge = to_dsi_bridge(encoder->bridge);
+	bridge = drm_bridge_chain_get_first_bridge(encoder);
+	if (!bridge) {
+		DSI_DEBUG("bridge is not available\n");
+		return 0;
+	}
+	c_bridge = to_dsi_bridge(bridge);
 	adj_mode = c_bridge->dsi_mode;
 	display = c_bridge->display;
 	dyn_clk_caps = &(display->panel->dyn_clk_caps);
@@ -1123,7 +1129,6 @@ struct dsi_bridge *dsi_drm_bridge_init(struct dsi_display *display,
 		goto error_free_bridge;
 	}
 
-	encoder->bridge = &bridge->base;
 	return bridge;
 error_free_bridge:
 	kfree(bridge);
@@ -1133,9 +1138,6 @@ error:
 
 void dsi_drm_bridge_cleanup(struct dsi_bridge *bridge)
 {
-	if (bridge && bridge->base.encoder)
-		bridge->base.encoder->bridge = NULL;
-
 	kfree(bridge);
 }
 

+ 13 - 5
msm/msm_atomic.c

@@ -156,6 +156,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
 			old_conn_state, i) {
 		const struct drm_encoder_helper_funcs *funcs;
 		struct drm_encoder *encoder;
+		struct drm_bridge *bridge;
 
 		/*
 		 * Shut down everything that's in the changeset and currently
@@ -191,7 +192,8 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
 		 * Each encoder has at most one connector (since we always steal
 		 * it away), so we won't call disable hooks twice.
 		 */
-		drm_bridge_disable(encoder->bridge);
+		bridge = drm_bridge_chain_get_first_bridge(encoder);
+		drm_bridge_chain_disable(bridge);
 
 		/* Right function depends upon target state. */
 		if (connector->state->crtc && funcs->prepare)
@@ -201,7 +203,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
 		else
 			funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
 
-		drm_bridge_post_disable(encoder->bridge);
+		drm_bridge_chain_post_disable(bridge);
 	}
 
 	for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
@@ -264,6 +266,7 @@ msm_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
 		struct drm_crtc_state *new_crtc_state;
 		struct drm_encoder *encoder;
 		struct drm_display_mode *mode, *adjusted_mode;
+		struct drm_bridge *bridge;
 
 		if (!connector->state->best_encoder)
 			continue;
@@ -294,7 +297,8 @@ msm_crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
 		if (funcs->mode_set)
 			funcs->mode_set(encoder, mode, adjusted_mode);
 
-		drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
+		bridge = drm_bridge_chain_get_first_bridge(encoder);
+		drm_bridge_chain_mode_set(bridge, mode, adjusted_mode);
 		SDE_ATRACE_END("msm_set_mode");
 	}
 }
@@ -388,6 +392,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
 		const struct drm_encoder_helper_funcs *funcs;
 		struct drm_encoder *encoder;
 		struct drm_connector_state *old_conn_state;
+		struct drm_bridge *bridge;
 
 		if (!new_conn_state->best_encoder)
 			continue;
@@ -412,7 +417,8 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
 		 * Each encoder has at most one connector (since we always steal
 		 * it away), so we won't call enable hooks twice.
 		 */
-		drm_bridge_pre_enable(encoder->bridge);
+		bridge = drm_bridge_chain_get_first_bridge(encoder);
+		drm_bridge_chain_pre_enable(bridge);
 		++bridge_enable_count;
 
 		if (funcs->enable)
@@ -436,6 +442,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
 			new_conn_state, i) {
 		struct drm_encoder *encoder;
 		struct drm_connector_state *old_conn_state;
+		struct drm_bridge *bridge;
 
 		if (!new_conn_state->best_encoder)
 			continue;
@@ -455,7 +462,8 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
 		DRM_DEBUG_ATOMIC("bridge enable enabling [ENCODER:%d:%s]\n",
 				 encoder->base.id, encoder->name);
 
-		drm_bridge_enable(encoder->bridge);
+		bridge = drm_bridge_chain_get_first_bridge(encoder);
+		drm_bridge_chain_enable(bridge);
 	}
 	SDE_ATRACE_END("msm_enable");
 }

+ 4 - 6
msm/sde/sde_encoder.c

@@ -5218,6 +5218,7 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
 	struct sde_connector_state *sde_conn_state = NULL;
 	struct drm_display_mode *drm_mode = NULL;
 	struct sde_encoder_phys *phys_enc;
+	struct drm_bridge *bridge;
 	int ret = 0, i;
 
 	if (!encoder) {
@@ -5318,7 +5319,8 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
 			drm_mode->hdisplay, drm_mode->vdisplay);
 	drm_set_preferred_mode(conn, drm_mode->hdisplay, drm_mode->vdisplay);
 
-	if (encoder->bridge) {
+	bridge = drm_bridge_chain_get_first_bridge(encoder);
+	if (bridge) {
 		SDE_DEBUG_ENC(sde_enc, "Bridge mapped to encoder\n");
 		/*
 		 * For cont-splash use case, we update the mode
@@ -5328,11 +5330,7 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
 		 * be updated with the current drm mode by
 		 * calling the bridge mode set ops.
 		 */
-		if (encoder->bridge->funcs) {
-			SDE_DEBUG_ENC(sde_enc, "calling mode_set\n");
-			encoder->bridge->funcs->mode_set(encoder->bridge,
-						drm_mode, drm_mode);
-		}
+		drm_bridge_chain_mode_set(bridge, drm_mode, drm_mode);
 	} else {
 		SDE_ERROR_ENC(sde_enc, "No bridge attached to encoder\n");
 	}