Pārlūkot izejas kodu

disp: msm: encoder_ids replaced in drm_connector

Commit 62afb4ad425a ("drm/connector: Allow max possible encoders
to attach to a connector") enables additional encoders per
connector through use of a mask rather than encoder ids.
This change updates the driver when looking for an encoder
for the connector to look through the list of all possible encoders.

Change-Id: I69cc7c38cd0a9842ed2f15712feeb3c6b88daadf
Signed-off-by: Samantha Tran <[email protected]>
Signed-off-by: Nilaan Gunabalachandran <[email protected]>
Samantha Tran 4 gadi atpakaļ
vecāks
revīzija
2616e57a0a
3 mainītis faili ar 37 papildinājumiem un 6 dzēšanām
  1. 1 2
      msm/dp/dp_mst_drm.c
  2. 14 1
      msm/dsi/dsi_display.c
  3. 22 3
      msm/sde/sde_kms.c

+ 1 - 2
msm/dp/dp_mst_drm.c

@@ -2078,8 +2078,7 @@ dp_mst_add_fixed_connector(struct drm_dp_mst_topology_mgr *mgr,
 	drm_modeset_lock_all(dev);
 
 	/* clear encoder list */
-	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++)
-		connector->encoder_ids[i] = 0;
+	connector->possible_encoders = 0;
 
 	/* re-attach encoders from first available encoders */
 	for (i = enc_idx; i < MAX_DP_MST_DRM_BRIDGES; i++)

+ 14 - 1
msm/dsi/dsi_display.c

@@ -6379,6 +6379,7 @@ int dsi_display_drm_ext_bridge_init(struct dsi_display *display,
 	for (i = 0; i < display->ext_bridge_cnt; i++) {
 		struct dsi_display_ext_bridge *ext_bridge_info =
 				&display->ext_bridge[i];
+		struct drm_encoder *c_encoder;
 
 		/* return if ext bridge is already initialized */
 		if (ext_bridge_info->bridge)
@@ -6424,8 +6425,20 @@ int dsi_display_drm_ext_bridge_init(struct dsi_display *display,
 		spin_lock_irq(&drm->mode_config.connector_list_lock);
 		ext_conn = list_last_entry(&drm->mode_config.connector_list,
 			struct drm_connector, head);
+
+		drm_connector_for_each_possible_encoder(ext_conn, c_encoder)
+			break;
+
+		if (!c_encoder) {
+			DSI_ERR("failed to get encoder\n");
+			rc = PTR_ERR(c_encoder);
+
+			spin_unlock_irq(&drm->mode_config.connector_list_lock);
+			goto error;
+		}
+
 		if (ext_conn && ext_conn != connector &&
-			ext_conn->encoder_ids[0] == bridge->encoder->base.id) {
+			c_encoder->base.id == bridge->encoder->base.id) {
 			list_del_init(&ext_conn->head);
 			display->ext_conn = ext_conn;
 		}

+ 22 - 3
msm/sde/sde_kms.c

@@ -2990,6 +2990,16 @@ static int sde_kms_inform_cont_splash_res_disable(struct msm_kms *kms,
 
 	drm_connector_list_iter_begin(dev, &conn_iter);
 	drm_for_each_connector_iter(connector, &conn_iter) {
+		struct drm_encoder *c_encoder;
+
+		drm_connector_for_each_possible_encoder(connector,
+				c_encoder)
+			break;
+		if (!c_encoder) {
+			SDE_ERROR("c_encoder not found\n");
+			return -EINVAL;
+		}
+
 		/**
 		 * Inform cont_splash is disabled to each interface/connector.
 		 * This is currently supported for DSI interface.
@@ -2999,8 +3009,7 @@ static int sde_kms_inform_cont_splash_res_disable(struct msm_kms *kms,
 			if (!dsi_display || !encoder) {
 				sde_conn->ops.cont_splash_res_disable
 						(sde_conn->display);
-			} else if (connector->encoder_ids[0]
-					== encoder->base.id) {
+			} else if (c_encoder->base.id == encoder->base.id) {
 				/**
 				 * This handles dual DSI
 				 * configuration where one DSI
@@ -3183,6 +3192,16 @@ static int sde_kms_cont_splash_config(struct msm_kms *kms,
 		mutex_lock(&dev->mode_config.mutex);
 		drm_connector_list_iter_begin(dev, &conn_iter);
 		drm_for_each_connector_iter(connector, &conn_iter) {
+			struct drm_encoder *c_encoder;
+
+			drm_connector_for_each_possible_encoder(connector,
+					c_encoder)
+				break;
+			if (!c_encoder) {
+				SDE_ERROR("c_encoder not found\n");
+				mutex_unlock(&dev->mode_config.mutex);
+				return -EINVAL;
+			}
 			/**
 			 * SDE_KMS doesn't attach more than one encoder to
 			 * a DSI connector. So it is safe to check only with
@@ -3190,7 +3209,7 @@ static int sde_kms_cont_splash_config(struct msm_kms *kms,
 			 * ever have to support continuous splash for
 			 * external displays in MST configuration.
 			 */
-			if (connector->encoder_ids[0] == encoder->base.id)
+			if (c_encoder->base.id == encoder->base.id)
 				break;
 		}
 		drm_connector_list_iter_end(&conn_iter);