summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/dc.c
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2010-11-22 18:54:53 -0800
committerColin Cross <ccross@android.com>2010-12-08 19:44:28 -0800
commita1243f678346f467701ec5c8026bf28fc97c7056 (patch)
tree734830b6ebf38236fb8168b6d61416b15500fbd2 /drivers/video/tegra/dc/dc.c
parent94ef9a634fe1ac8d3b268aee37431621ad51e864 (diff)
video: tegra: dc: Force memory bus to full when display is enabled
Change-Id: Ia9dfef275561fdb3b6f0a37ae0535684a60cb63e Signed-off-by: Colin Cross <ccross@android.com>
Diffstat (limited to 'drivers/video/tegra/dc/dc.c')
-rw-r--r--drivers/video/tegra/dc/dc.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index 5c65e3c1a61a..3c3a4754b7dc 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -967,6 +967,7 @@ static bool _tegra_dc_enable(struct tegra_dc *dc)
tegra_dc_setup_clk(dc, dc->clk);
clk_enable(dc->clk);
+ clk_enable(dc->emc_clk);
enable_irq(dc->irq);
tegra_dc_init(dc);
@@ -997,6 +998,7 @@ static void _tegra_dc_disable(struct tegra_dc *dc)
if (dc->out_ops && dc->out_ops->disable)
dc->out_ops->disable(dc);
+ clk_disable(dc->emc_clk);
clk_disable(dc->clk);
tegra_dvfs_set_rate(dc->clk, 0);
@@ -1029,6 +1031,7 @@ static int tegra_dc_probe(struct nvhost_device *ndev)
{
struct tegra_dc *dc;
struct clk *clk;
+ struct clk *emc_clk;
struct resource *res;
struct resource *base_res;
struct resource *fb_mem = NULL;
@@ -1085,7 +1088,22 @@ static int tegra_dc_probe(struct nvhost_device *ndev)
goto err_iounmap_reg;
}
+ emc_clk = clk_get(&ndev->dev, "emc");
+ if (IS_ERR_OR_NULL(emc_clk)) {
+ dev_err(&ndev->dev, "can't get emc clock\n");
+ ret = -ENOENT;
+ goto err_put_clk;
+ }
+
+ /*
+ * The emc is a shared clock, it will be set to the highest
+ * requested rate from any user. Set the rate to ULONG_MAX to
+ * always request the max rate whenever this request is enabled
+ */
+ clk_set_rate(emc_clk, ULONG_MAX);
+
dc->clk = clk;
+ dc->emc_clk = emc_clk;
dc->base_res = base_res;
dc->base = base;
dc->irq = irq;
@@ -1108,7 +1126,7 @@ static int tegra_dc_probe(struct nvhost_device *ndev)
dev_name(&ndev->dev), dc)) {
dev_err(&ndev->dev, "request_irq %d failed\n", irq);
ret = -EBUSY;
- goto err_put_clk;
+ goto err_put_emc_clk;
}
/* hack to ballence enable_irq calls in _tegra_dc_enable() */
@@ -1158,6 +1176,8 @@ static int tegra_dc_probe(struct nvhost_device *ndev)
err_free_irq:
free_irq(irq, dc);
+err_put_emc_clk:
+ clk_put(emc_clk);
err_put_clk:
clk_put(clk);
err_iounmap_reg:
@@ -1187,6 +1207,7 @@ static int tegra_dc_remove(struct nvhost_device *ndev)
_tegra_dc_disable(dc);
free_irq(dc->irq, dc);
+ clk_put(dc->emc_clk);
clk_put(dc->clk);
iounmap(dc->base);
if (dc->fb_mem)