summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorPing Li <pingli@codeaurora.org>2015-12-17 16:54:47 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:14:39 -0700
commit37563b3b8aabc6a4f949d58813923daa34aadbe6 (patch)
tree34853dcf4ebbfcfd152ec7982fbeba8f2ec023b5 /drivers/video/fbdev
parent329041fdd8e92e40828c048222d3db4930df999a (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.c39
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);