summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAlan Kwong <akwong@codeaurora.org>2016-08-12 19:15:25 -0400
committerAlan Kwong <akwong@codeaurora.org>2016-08-16 20:46:51 -0400
commit4b225b46c34b53c900be28f49c0390d8c74d67ab (patch)
tree8277e74a07d92b661523237fe41e51aa0a34826e /drivers
parentc5984ec85c1e095f932f2fdaf5f327a2c1480c9b (diff)
msm: mdss: shutoff axi memory and periphery when axi clk is off
Because of CBCR update, mdss driver needs to control mdss axi clock state of memory core and periphery control when branch clock is off. Since mdss does not have retention requirement for axi, both memory core and periphery control can be turned off to conserve power when mdss axi clock is off. CRs-Fixed: 1044375 Change-Id: Ia609549304be97cdaeff0f30ff0ca8ad5e22af75 Signed-off-by: Alan Kwong <akwong@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index 518b84fbad51..ca91742400ab 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -1454,6 +1454,35 @@ end:
}
/**
+ * mdss_mdp_retention_init() - initialize retention setting
+ * @mdata: pointer to the global mdss data structure.
+ */
+static int mdss_mdp_retention_init(struct mdss_data_type *mdata)
+{
+ struct clk *mdss_axi_clk = mdss_mdp_get_clk(MDSS_CLK_AXI);
+ int rc;
+
+ if (!mdss_axi_clk) {
+ pr_err("failed to get AXI clock\n");
+ return -EINVAL;
+ }
+
+ rc = clk_set_flags(mdss_axi_clk, CLKFLAG_NORETAIN_MEM);
+ if (rc) {
+ pr_err("failed to set AXI no memory retention %d\n", rc);
+ return rc;
+ }
+
+ rc = clk_set_flags(mdss_axi_clk, CLKFLAG_NORETAIN_PERIPH);
+ if (rc) {
+ pr_err("failed to set AXI no periphery retention %d\n", rc);
+ return rc;
+ }
+
+ return rc;
+}
+
+/**
* mdss_bus_bandwidth_ctrl() -- place bus bandwidth request
* @enable: value of enable or disable
*
@@ -2718,6 +2747,12 @@ static int mdss_mdp_probe(struct platform_device *pdev)
goto probe_done;
}
+ rc = mdss_mdp_retention_init(mdata);
+ if (rc) {
+ pr_err("unable to initialize mdss mdp retention\n");
+ goto probe_done;
+ }
+
pm_runtime_set_autosuspend_delay(&pdev->dev, AUTOSUSPEND_TIMEOUT_MS);
if (mdata->idle_pc_enabled)
pm_runtime_use_autosuspend(&pdev->dev);