Merge "disp: msm: sde: avoid connector state mode update"

This commit is contained in:
qctecmdr 2019-07-05 21:36:26 -07:00 • committed by Gerrit - the friendly Code Review server
commit 751cbf5570

View file

@ -227,7 +227,8 @@ enum sde_enc_rc_states {
* @elevated_ahb_vote: increase AHB bus speed for the first frame
* after power collapse
* @pm_qos_cpu_req: pm_qos request for cpu frequency
* @mode_info: stores the current mode information
* @mode_info: stores the current mode and should be used
* only in commit phase
*/
struct sde_encoder_virt {
struct drm_encoder base;
@ -658,6 +659,7 @@ void sde_encoder_get_hw_resources(struct drm_encoder *drm_enc,
struct drm_connector_state *conn_state)
{
struct sde_encoder_virt *sde_enc = NULL;
struct msm_mode_info mode_info;
int i = 0;
if (!hw_res || !drm_enc || !conn_state) {
@ -680,8 +682,13 @@ void sde_encoder_get_hw_resources(struct drm_encoder *drm_enc,
phys->ops.get_hw_resources(phys, hw_res, conn_state);
}
sde_connector_get_mode_info(conn_state, &sde_enc->mode_info);
hw_res->topology = sde_enc->mode_info.topology;
/*
* NOTE: Do not use sde_encoder_get_mode_info here as this function is
* called from atomic_check phase. Use the below API to get mode
* information of the temporary conn_state passed
*/
sde_connector_get_mode_info(conn_state, &mode_info);
hw_res->topology = mode_info.topology;
hw_res->display_type = sde_enc->disp_info.display_type;
}
@ -2760,8 +2767,6 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
struct sde_kms *sde_kms;
struct list_head *connector_list;
struct drm_connector *conn = NULL, *conn_iter;
struct sde_connector_state *sde_conn_state = NULL;
struct sde_connector *sde_conn = NULL;
struct sde_rm_hw_iter dsc_iter, pp_iter, qdss_iter;
struct sde_rm_hw_request request_hw;
enum sde_intf_mode intf_mode;
@ -2812,21 +2817,11 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
return;
}
sde_conn = to_sde_connector(conn);
sde_conn_state = to_sde_connector_state(conn->state);
if (sde_conn && sde_conn_state) {
ret = sde_conn->ops.get_mode_info(&sde_conn->base, adj_mode,
&sde_conn_state->mode_info,
sde_kms->catalog->max_mixer_width,
sde_conn->display);
if (ret) {
SDE_ERROR_ENC(sde_enc,
"failed to get mode info from the display\n");
return;
}
}
intf_mode = sde_encoder_get_intf_mode(drm_enc);
/* store the mode_info */
sde_connector_get_mode_info(conn->state, &sde_enc->mode_info);
/* release resources before seamless mode change */
if (msm_is_mode_seamless_dms(adj_mode) ||
(msm_is_mode_seamless_dyn_clk(adj_mode) &&