aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Salido <salidoa@google.com>2017-06-29 13:13:23 -0700
committerceltare21 <celtare21@gmail.com>2019-08-26 16:56:42 +0000
commit176992c0788bd3adc96c0800e3a1ce900c6461b7 (patch)
tree1c424aa4fc4ad6236dd863a85cf0878b7a97ad14
parent757eb2dac083fb3e857d874e507ba10c8dcfcc0b (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.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 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);