summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);