From 15ae91e80617f06de7f69cbe7c685a49fea62d1d Mon Sep 17 00:00:00 2001 From: Abhijit Kulkarni Date: Tue, 14 Jul 2020 23:06:20 -0700 Subject: [PATCH] disp: msm: sde: add delay after porches changed This change adds 2 vsync delay after changing the timing engine parameters namely the porches to update the refresh rate. This ensures that panel vsync is updated as per new timing before modifying it again. Change-Id: I5866ea2f6f2e68bc8ce7435c4a5dbe27d8ebdd91 Signed-off-by: Abhijit Kulkarni --- msm/sde/sde_encoder_phys.h | 5 ++++- msm/sde/sde_encoder_phys_vid.c | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) 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);