diff options
author | Alan Kwong <akwong@codeaurora.org> | 2016-08-12 19:15:25 -0400 |
---|---|---|
committer | Alan Kwong <akwong@codeaurora.org> | 2016-08-16 20:46:51 -0400 |
commit | 4b225b46c34b53c900be28f49c0390d8c74d67ab (patch) | |
tree | 8277e74a07d92b661523237fe41e51aa0a34826e /drivers | |
parent | c5984ec85c1e095f932f2fdaf5f327a2c1480c9b (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.c | 35 |
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); |