diff --git a/msm/sde/sde_encoder_phys.h b/msm/sde/sde_encoder_phys.h index 336014d71c..42418ad74d 100644 --- a/msm/sde/sde_encoder_phys.h +++ b/msm/sde/sde_encoder_phys.h @@ -52,13 +52,16 @@ enum sde_enc_split_role { * @SDE_ENC_ENABLED: Encoder is enabled * @SDE_ENC_ERR_NEEDS_HW_RESET: Encoder is enabled, but requires a hw_reset * to recover from a previous error + * @SDE_ENC_TIMING_ENGINE_RECONFIG: Encoder is enabled and timing engine + * parameters are updated */ enum sde_enc_enable_state { SDE_ENC_DISABLING, SDE_ENC_DISABLED, SDE_ENC_ENABLING, SDE_ENC_ENABLED, - SDE_ENC_ERR_NEEDS_HW_RESET + SDE_ENC_ERR_NEEDS_HW_RESET, + SDE_ENC_TIMING_ENGINE_RECONFIG, }; struct sde_encoder_phys; diff --git a/msm/sde/sde_encoder_phys_vid.c b/msm/sde/sde_encoder_phys_vid.c index 57bab6d6f0..3a653969a8 100644 --- a/msm/sde/sde_encoder_phys_vid.c +++ b/msm/sde/sde_encoder_phys_vid.c @@ -830,6 +830,8 @@ skip_flush: /* ctl_flush & timing engine enable will be triggered by framework */ if (phys_enc->enable_state == SDE_ENC_DISABLED) phys_enc->enable_state = SDE_ENC_ENABLING; + if (phys_enc->enable_state == SDE_ENC_ENABLED) + phys_enc->enable_state = SDE_ENC_TIMING_ENGINE_RECONFIG; } static void sde_encoder_phys_vid_destroy(struct sde_encoder_phys *phys_enc) @@ -1120,6 +1122,11 @@ static void sde_encoder_phys_vid_handle_post_kickoff( lock_flags); } phys_enc->enable_state = SDE_ENC_ENABLED; + } else if (phys_enc->enable_state == SDE_ENC_TIMING_ENGINE_RECONFIG) { + /* add 2 vsync delay for timing engine change */ + sde_encoder_phys_vid_single_vblank_wait(phys_enc); + sde_encoder_phys_vid_single_vblank_wait(phys_enc); + phys_enc->enable_state = SDE_ENC_ENABLED; } avr_mode = sde_connector_get_qsync_mode(phys_enc->connector);