summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorAdrian Salido <salidoa@google.com>2019-07-19 16:41:58 +0530
committerNirmal Abraham <nabrah@codeaurora.org>2019-07-19 16:53:17 +0530
commitd0439a71d9f0eb5bf97ced093ec668bf9411ed18 (patch)
tree06f0e62a4d6645d1c0548a28435a4a589860ed1f /drivers/video/fbdev
parent5c004decb393647c7c86e624c77d230b74391853 (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 Git-commit: dea49443c3e803158fb213a501452431b76fce3e Git-repo: https://android.googlesource.com/kernel/common Change-Id: Ic4e7d666f17852e5d6c60979151e27ab3fbf952d Signed-off-by: Adrian Salido <salidoa@google.com> Signed-off-by: Nirmal Abraham <nabrah@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c12
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 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);