summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev/msm
diff options
context:
space:
mode:
authorPing Li <pingli@codeaurora.org>2016-06-14 15:39:02 -0700
committerKyle Yan <kyan@codeaurora.org>2016-06-27 19:53:03 -0700
commit3213a9e52ace2e2ef4a432b0069fd3789fca2780 (patch)
tree3b8444f4091f159429d666a15d2e19d1c556091c /drivers/video/fbdev/msm
parent50e33221abbb4af7c6f2b4c98bd160396faf8cff (diff)
msm: mdss: Add memory retention support for MDP LUT clock
A new MDP LUT clock is added to msmcobalt, add code to set the corresponding mdss_mdp_lut_cbcr register to support MDP memory retention on msmcobalt. Change-Id: Icf0890a6f2d3c44e426bd834b3c7943cc6766bae Signed-off-by: Ping Li <pingli@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev/msm')
-rw-r--r--drivers/video/fbdev/msm/mdss.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c57
2 files changed, 48 insertions, 10 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h
index 29cae8ac6166..88950e9cb2aa 100644
--- a/drivers/video/fbdev/msm/mdss.h
+++ b/drivers/video/fbdev/msm/mdss.h
@@ -175,6 +175,7 @@ enum mdss_hw_capabilities {
MDSS_CAPS_DEST_SCALER,
MDSS_CAPS_10_BIT_SUPPORTED,
MDSS_CAPS_CWB_SUPPORTED,
+ MDSS_CAPS_MDP_VOTE_CLK_NOT_SUPPORTED,
MDSS_CAPS_MAX,
};
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index 03ff3ea2c6ac..a7b90d149c27 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -1349,30 +1349,65 @@ 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);
+ struct clk *mdss_mdp_lut_clk = NULL;
+ struct clk *mdp_lut_vote_clk = mdss_mdp_get_clk(MDSS_CLK_MDP_LUT);
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
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);
+ if (test_bit(MDSS_CAPS_MDP_VOTE_CLK_NOT_SUPPORTED,
+ mdata->mdss_caps_map)) {
+ mdss_mdp_clk = mdp_vote_clk;
+ mdss_mdp_lut_clk = mdp_lut_vote_clk;
+ } else {
+ mdss_mdp_clk = clk_get_parent(mdp_vote_clk);
+ mdss_mdp_lut_clk = clk_get_parent(mdp_lut_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);
+ }
+
+ if (mdss_mdp_lut_clk) {
+ clk_set_flags(mdss_mdp_lut_clk, CLKFLAG_RETAIN_MEM);
+ clk_set_flags(mdss_mdp_lut_clk, CLKFLAG_PERIPH_OFF_SET);
+ clk_set_flags(mdss_mdp_lut_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);
+ struct clk *mdss_mdp_lut_clk = NULL;
+ struct clk *mdp_lut_vote_clk = mdss_mdp_get_clk(MDSS_CLK_MDP_LUT);
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
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);
+ if (test_bit(MDSS_CAPS_MDP_VOTE_CLK_NOT_SUPPORTED,
+ mdata->mdss_caps_map)) {
+ mdss_mdp_clk = mdp_vote_clk;
+ mdss_mdp_lut_clk = mdp_lut_vote_clk;
+ } else {
+ mdss_mdp_clk = clk_get_parent(mdp_vote_clk);
+ mdss_mdp_lut_clk = clk_get_parent(mdp_lut_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);
+ }
+
+ if (mdss_mdp_lut_clk) {
+ clk_set_flags(mdss_mdp_lut_clk, CLKFLAG_RETAIN_MEM);
+ clk_set_flags(mdss_mdp_lut_clk, CLKFLAG_RETAIN_PERIPH);
+ clk_set_flags(mdss_mdp_lut_clk, CLKFLAG_PERIPH_OFF_CLEAR);
+ }
}
/**
@@ -1900,6 +1935,8 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
set_bit(MDSS_CAPS_QSEED3, mdata->mdss_caps_map);
set_bit(MDSS_CAPS_DEST_SCALER, mdata->mdss_caps_map);
set_bit(MDSS_CAPS_CWB_SUPPORTED, mdata->mdss_caps_map);
+ set_bit(MDSS_CAPS_MDP_VOTE_CLK_NOT_SUPPORTED,
+ mdata->mdss_caps_map);
mdss_mdp_init_default_prefill_factors(mdata);
mdss_set_quirk(mdata, MDSS_QUIRK_DSC_RIGHT_ONLY_PU);
mdss_set_quirk(mdata, MDSS_QUIRK_DSC_2SLICE_PU_THRPUT);