summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/dsi.c
diff options
context:
space:
mode:
authorKevin Huang <kevinh@nvidia.com>2011-07-26 17:49:43 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:56 -0800
commita4f8cf546a9e760712a6deee584dea672b71a72f (patch)
tree9b86f90b34c73e3b7242ae05a28a7969ab65ba8b /drivers/video/tegra/dc/dsi.c
parent95243055c79302b037ac0a68baebeaa057bd7f1c (diff)
ARM: tegra: clock: Optimize power consumption of DSI module.
- Disable phy clock at early suspend. - Set DSI to LP mode at early suspend Bug 847254 Bug 848069 Original-Change-Id: Ia53fa3be5280172bc5aede12cef3ca06e07ea7f5 Reviewed-on: http://git-master/r/39245 Reviewed-by: Kevin Huang <kevinh@nvidia.com> Tested-by: Kevin Huang <kevinh@nvidia.com> Reviewed-by: Jonathan Mayo <jmayo@nvidia.com> Rebase-Id: Ra8be9383813904f9514cfca59455e40f5aa32346
Diffstat (limited to 'drivers/video/tegra/dc/dsi.c')
-rw-r--r--drivers/video/tegra/dc/dsi.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index f395c60af46d..970e7ce91bb2 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -933,6 +933,13 @@ static void tegra_dsi_set_dsi_clk(struct tegra_dc *dc,
static void tegra_dsi_hs_clk_out_enable(struct tegra_dc_dsi_data *dsi)
{
u32 val;
+ struct clk *base_clk;
+
+ /* Enable PHY clock */
+ base_clk = clk_get_parent(dsi->dsi_clk);
+ tegra_clk_cfg_ex(base_clk, TEGRA_CLK_PLLD_DSI_OUT_ENB, 1);
+ if (dsi->info.dsi_instance)
+ tegra_clk_cfg_ex(base_clk, TEGRA_CLK_PLLD_CSI_OUT_ENB, 1);
val = tegra_dsi_readl(dsi, DSI_CONTROL);
val &= ~DSI_CONTROL_HS_CLK_CTRL(1);
@@ -969,6 +976,7 @@ static void tegra_dsi_hs_clk_out_disable(struct tegra_dc *dc,
struct tegra_dc_dsi_data *dsi)
{
u32 val;
+ struct clk *base_clk;
if (dsi->status.dc_stream == DSI_DC_STREAM_ENABLE)
tegra_dsi_stop_dc_stream(dc, dsi);
@@ -985,6 +993,12 @@ static void tegra_dsi_hs_clk_out_disable(struct tegra_dc *dc,
val |= DSI_HOST_DSI_CONTROL_HIGH_SPEED_TRANS(TEGRA_DSI_LOW);
tegra_dsi_writel(dsi, val, DSI_HOST_DSI_CONTROL);
+ /* Disable PHY clock */
+ base_clk = clk_get_parent(dsi->dsi_clk);
+ tegra_clk_cfg_ex(base_clk, TEGRA_CLK_PLLD_DSI_OUT_ENB, 0);
+ if (dsi->info.dsi_instance)
+ tegra_clk_cfg_ex(base_clk, TEGRA_CLK_PLLD_CSI_OUT_ENB, 0);
+
dsi->status.clk_mode = DSI_PHYCLK_NOT_INIT;
dsi->status.clk_out = DSI_PHYCLK_OUT_DIS;
}
@@ -1688,6 +1702,7 @@ static void tegra_dc_dsi_enable(struct tegra_dc *dc)
goto fail;
}
}
+
if (dsi->info.panel_reset) {
err = tegra_dsi_send_panel_cmd(dc, dsi,
dsi->info.dsi_init_cmd,
@@ -1707,6 +1722,13 @@ static void tegra_dc_dsi_enable(struct tegra_dc *dc)
goto fail;
}
}
+
+ err = tegra_dsi_set_to_hs_mode(dc, dsi);
+ if (err < 0) {
+ dev_err(&dc->ndev->dev,
+ "dsi: not able to set to hs mode\n");
+ goto fail;
+ }
} else {
err = tegra_dsi_init_hw(dc, dsi);
if (err < 0) {
@@ -2045,8 +2067,8 @@ static void tegra_dc_dsi_destroy(struct tegra_dc *dc)
static void tegra_dc_dsi_disable(struct tegra_dc *dc)
{
- struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc);
int err;
+ struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc);
tegra_dc_io_start(dc);
mutex_lock(&dsi->lock);
@@ -2065,6 +2087,13 @@ static void tegra_dc_dsi_disable(struct tegra_dc *dc)
}
}
+ err = tegra_dsi_set_to_lp_mode(dc, dsi);
+ if (err < 0) {
+ dev_err(&dc->ndev->dev,
+ "dsi: not able to set to lp mode\n");
+ goto fail;
+ }
+
if (!dsi->ulpm) {
if (tegra_dsi_enter_ulpm(dsi) < 0)
printk(KERN_ERR "DSI failed to enter ulpm\n");