summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev/msm
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-09-24 02:00:54 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-24 02:00:54 -0700
commitc480cfd424db4a62fdc5ab2ab94a149422633243 (patch)
tree9a3205439fc052d48b499b2c080a06980d5005ed /drivers/video/fbdev/msm
parent4b80b64e9d8a8d52e4437e558ddec4655976d9a6 (diff)
parentcdf62c6db2851a9407af4e965eb99be82c460ee6 (diff)
Merge "Revert "ARM: dts: msm: configure CX voltage levels from MDSS for msmcobalt""
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.c30
2 files changed, 31 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h
index 4d03920db005..a5368cdf2254 100644
--- a/drivers/video/fbdev/msm/mdss.h
+++ b/drivers/video/fbdev/msm/mdss.h
@@ -163,6 +163,7 @@ enum mdss_hw_quirk {
MDSS_QUIRK_FMT_PACK_PATTERN,
MDSS_QUIRK_NEED_SECURE_MAP,
MDSS_QUIRK_SRC_SPLIT_ALWAYS,
+ MDSS_QUIRK_MMSS_GDSC_COLLAPSE,
MDSS_QUIRK_MAX,
};
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index ee665ee92513..81e3438befca 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -1831,6 +1831,20 @@ static u32 mdss_get_props(void)
return props;
}
+static void mdss_rpm_set_msg_ram(bool enable)
+{
+ u32 read_reg = 0;
+ void __iomem *rpm_msg_ram = ioremap(0x7781FC, 4);
+
+ if (rpm_msg_ram) {
+ writel_relaxed(enable, rpm_msg_ram);
+ read_reg = readl_relaxed(rpm_msg_ram);
+ pr_debug("%s enable=%d read_val=%x\n", __func__, enable,
+ read_reg);
+ iounmap(rpm_msg_ram);
+ }
+}
+
void mdss_mdp_init_default_prefill_factors(struct mdss_data_type *mdata)
{
mdata->prefill_data.prefill_factors.fmt_mt_nv12_factor = 8;
@@ -2000,6 +2014,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata)
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);
+ mdss_set_quirk(mdata, MDSS_QUIRK_MMSS_GDSC_COLLAPSE);
mdata->has_wb_ubwc = true;
set_bit(MDSS_CAPS_10_BIT_SUPPORTED, mdata->mdss_caps_map);
set_bit(MDSS_CAPS_AVR_SUPPORTED, mdata->mdss_caps_map);
@@ -4885,6 +4900,13 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
active_cnt = atomic_read(&mdata->active_intf_cnt);
if (active_cnt != 0) {
/*
+ * Advise RPM to not turn MMSS GDSC off during
+ * idle case.
+ */
+ if (mdss_has_quirk(mdata,
+ MDSS_QUIRK_MMSS_GDSC_COLLAPSE))
+ mdss_rpm_set_msg_ram(true);
+ /*
* Turning off GDSC while overlays are still
* active.
*/
@@ -4893,6 +4915,14 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
active_cnt);
mdss_mdp_memory_retention_enter();
} else {
+ /*
+ * Advise RPM to turn MMSS GDSC off during
+ * suspend case
+ */
+ if (mdss_has_quirk(mdata,
+ MDSS_QUIRK_MMSS_GDSC_COLLAPSE))
+ mdss_rpm_set_msg_ram(false);
+
mdss_mdp_cx_ctrl(mdata, false);
mdss_mdp_batfet_ctrl(mdata, false);
}