From d0439a71d9f0eb5bf97ced093ec668bf9411ed18 Mon Sep 17 00:00:00 2001 From: Adrian Salido Date: Fri, 19 Jul 2019 16:41:58 +0530 Subject: [PATCH] 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 Git-commit: dea49443c3e803158fb213a501452431b76fce3e Git-repo: https://android.googlesource.com/kernel/common Change-Id: Ic4e7d666f17852e5d6c60979151e27ab3fbf952d Signed-off-by: Adrian Salido Signed-off-by: Nirmal Abraham --- drivers/video/fbdev/msm/mdss_mdp.h | 1 + drivers/video/fbdev/msm/mdss_mdp_overlay.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) 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 81218319d58b..324e5e9ca60d 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);