video: tegra: dc: Force memory bus to full when display is enabled
authorColin Cross <ccross@android.com>
Tue, 23 Nov 2010 02:54:53 +0000 (18:54 -0800)
committerColin Cross <ccross@android.com>
Thu, 9 Dec 2010 03:44:28 +0000 (19:44 -0800)
Change-Id: Ia9dfef275561fdb3b6f0a37ae0535684a60cb63e
Signed-off-by: Colin Cross <ccross@android.com>
drivers/video/tegra/dc/dc.c
drivers/video/tegra/dc/dc_priv.h

index 5c65e3c1a61a6fde3ad4ac38fda10361874bd910..3c3a4754b7dc0d869d0e08c083cda6cfd1dcafbb 100644 (file)
@@ -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)
index 7d0e340a6ee219e4faa9edd2c97c7b67baa066ba..253d03f057d7a8c2f61954264e6a3707506a6ce6 100644 (file)
@@ -60,6 +60,7 @@ struct tegra_dc {
        int                             irq;
 
        struct clk                      *clk;
+       struct clk                      *emc_clk;
 
        bool                            enabled;