diff options
| author | Ping Li <pingli@codeaurora.org> | 2016-06-14 15:39:02 -0700 |
|---|---|---|
| committer | Kyle Yan <kyan@codeaurora.org> | 2016-06-27 19:53:03 -0700 |
| commit | 3213a9e52ace2e2ef4a432b0069fd3789fca2780 (patch) | |
| tree | 3b8444f4091f159429d666a15d2e19d1c556091c /drivers/video/fbdev/msm | |
| parent | 50e33221abbb4af7c6f2b4c98bd160396faf8cff (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.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 57 |
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); |
