diff --git a/msm/dp/dp_mst_drm.c b/msm/dp/dp_mst_drm.c index f30f07276a..1c45336488 100644 --- a/msm/dp/dp_mst_drm.c +++ b/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++) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 789520c76f..746c039974 100644 --- a/msm/dsi/dsi_display.c +++ b/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; } diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index dc8d2794c2..bd0f53fa44 100644 --- a/msm/sde/sde_kms.c +++ b/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);