diff options
| author | Adrian Salido <salidoa@google.com> | 2017-06-29 13:13:23 -0700 |
|---|---|---|
| committer | celtare21 <celtare21@gmail.com> | 2019-08-26 16:56:42 +0000 |
| commit | 176992c0788bd3adc96c0800e3a1ce900c6461b7 (patch) | |
| tree | 1c424aa4fc4ad6236dd863a85cf0878b7a97ad14 | |
| parent | 757eb2dac083fb3e857d874e507ba10c8dcfcc0b (diff) | |
msm: mdss: save state of vsync handler
When going into low power modes, vsync handlers can be forcefully shut
down in order to disable clocks. If vsync handler was expected to be
enabled it would lose that state. Instead maintain the state of the
vsync and re-enable on next panel on.
Bug: 62375787
Change-Id: Ic4e7d666f17852e5d6c60979151e27ab3fbf952d
Signed-off-by: Adrian Salido <salidoa@google.com>
Signed-off-by: celtare21 <celtare21@gmail.com>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 12 |
2 files changed, 12 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 43fc5eafb047..90a38b79e561 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -933,6 +933,7 @@ struct mdss_mdp_writeback_arg { struct mdss_mdp_wfd; struct mdss_overlay_private { + bool vsync_en; ktime_t vsync_time; ktime_t lineptr_time; struct kernfs_node *vsync_event_sd; diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index a5abb70731fc..a3f2c8979d44 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -3307,12 +3307,14 @@ int mdss_mdp_overlay_vsync_ctrl(struct msm_fb_data_type *mfd, int en) goto end; } + mdp5_data->vsync_en = en; + if (!ctl->panel_data->panel_info.cont_splash_enabled && (!mdss_mdp_ctl_is_power_on(ctl) || mdss_panel_is_power_on_ulp(ctl->power_state))) { pr_debug("fb%d vsync pending first update en=%d, ctl power state:%d\n", mfd->index, en, ctl->power_state); - rc = -EPERM; + rc = 0; goto end; } @@ -5759,6 +5761,13 @@ static int mdss_mdp_overlay_on(struct msm_fb_data_type *mfd) } panel_on: + if (mdp5_data->vsync_en) { + pr_info("reenabling vsync for fb%d\n", mfd->index); + mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); + rc = ctl->ops.add_vsync_handler(ctl, &ctl->vsync_handler); + mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF); + } + if (IS_ERR_VALUE(rc)) { pr_err("Failed to turn on fb%d\n", mfd->index); mdss_mdp_overlay_off(mfd); @@ -6600,6 +6609,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd) } } mfd->mdp_sync_pt_data.async_wait_fences = true; + mdp5_data->vsync_en = false; pm_runtime_set_suspended(&mfd->pdev->dev); pm_runtime_enable(&mfd->pdev->dev); |
