diff options
| author | Ping Li <pingli@codeaurora.org> | 2015-12-17 16:54:47 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:14:39 -0700 |
| commit | 37563b3b8aabc6a4f949d58813923daa34aadbe6 (patch) | |
| tree | 34853dcf4ebbfcfd152ec7982fbeba8f2ec023b5 /drivers/video/fbdev | |
| parent | 329041fdd8e92e40828c048222d3db4930df999a (diff) | |
msm: mdss: Add support to retain AD RAMs
Modify the MDP_CBCR bits to retain the AD RAMs through idle power
collapse(IPC).
Bits setting when device enters IPC:
- MEM_CORE_ON: 1
- MEM_PERIPH_ON: 0
- MEM_PERIPH_OFF: 1
Bits setting when device exits the IPC:
- MEM_CORE_ON: 1
- MEM_PERIPH_ON: 1
- MEM_PERIPH_OFF: 0
Change-Id: I10749312d905eb4629e94e396b1604667738e84f
Signed-off-by: Ping Li <pingli@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 9d6d48d28846..64e2094e4085 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -861,6 +861,36 @@ int mdss_iommu_ctrl(int enable) return mdata->iommu_ref_cnt; } +static void mdss_mdp_memory_retention_enter(void) +{ + struct clk *mdss_mdp_clk = NULL; + struct clk *mdp_vote_clk = mdss_mdp_get_clk(MDSS_CLK_MDP_CORE); + + if (mdp_vote_clk) { + mdss_mdp_clk = clk_get_parent(mdp_vote_clk); + if (mdss_mdp_clk) { + clk_set_flags(mdss_mdp_clk, CLKFLAG_RETAIN_MEM); + clk_set_flags(mdss_mdp_clk, CLKFLAG_PERIPH_OFF_SET); + clk_set_flags(mdss_mdp_clk, CLKFLAG_NORETAIN_PERIPH); + } + } +} + +static void mdss_mdp_memory_retention_exit(void) +{ + struct clk *mdss_mdp_clk = NULL; + struct clk *mdp_vote_clk = mdss_mdp_get_clk(MDSS_CLK_MDP_CORE); + + if (mdp_vote_clk) { + mdss_mdp_clk = clk_get_parent(mdp_vote_clk); + if (mdss_mdp_clk) { + clk_set_flags(mdss_mdp_clk, CLKFLAG_RETAIN_MEM); + clk_set_flags(mdss_mdp_clk, CLKFLAG_RETAIN_PERIPH); + clk_set_flags(mdss_mdp_clk, CLKFLAG_PERIPH_OFF_CLEAR); + } + } +} + /** * mdss_mdp_idle_pc_restore() - Restore MDSS settings when exiting idle pc * @@ -888,6 +918,14 @@ static int mdss_mdp_idle_pc_restore(void) } mdss_hw_init(mdata); mdss_iommu_ctrl(0); + + /** + * sleep 10 microseconds to make sure AD auto-reinitialization + * is done + */ + udelay(10); + mdss_mdp_memory_retention_exit(); + mdss_mdp_ctl_restore(true); mdata->idle_pc = false; @@ -4057,6 +4095,7 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) mdata->idle_pc = true; pr_debug("idle pc. active overlays=%d\n", active_cnt); + mdss_mdp_memory_retention_enter(); } else { mdss_mdp_cx_ctrl(mdata, false); mdss_mdp_batfet_ctrl(mdata, false); |
