video: tegra: host: Disable 3d powergating
authorColin Cross <ccross@android.com>
Fri, 7 Jan 2011 04:16:10 +0000 (20:16 -0800)
committerColin Cross <ccross@android.com>
Fri, 7 Jan 2011 04:22:22 +0000 (20:22 -0800)
It is possible for the 3d block to generate an invalid memory
request during the power up sequence in some cases.  Workaround
is to disable 3d block power gating.

Change-Id: I10efad1f7d3dada7cd3fe18e268f06d60bdbab67
Signed-off-by: Colin Cross <ccross@android.com>
drivers/video/tegra/host/nvhost_acm.c

index c4ac035a26ec8faca1ef3b8ca4a3d30f6ea22f00..a4bbce2b6f1ddec778c677877644e0579fb93bbe 100644 (file)
@@ -30,6 +30,8 @@
 
 #define ACM_TIMEOUT 1*HZ
 
+#define DISABLE_3D_POWERGATING
+
 void nvhost_module_busy(struct nvhost_module *mod)
 {
        mutex_lock(&mod->lock);
@@ -139,6 +141,21 @@ int nvhost_module_init(struct nvhost_module *mod, const char *name,
        mod->parent = parent;
        mod->powered = false;
        mod->powergate_id = get_module_powergate_id(name);
+
+#ifdef DISABLE_3D_POWERGATING
+       /*
+        * It is possible for the 3d block to generate an invalid memory
+        * request during the power up sequence in some cases.  Workaround
+        * is to disable 3d block power gating.
+        */
+       if (mod->powergate_id == TEGRA_POWERGATE_3D) {
+               tegra_powergate_sequence_power_up(mod->powergate_id,
+                       mod->clk[0]);
+               clk_disable(mod->clk[0]);
+               mod->powergate_id = -1;
+       }
+#endif
+
        mutex_init(&mod->lock);
        init_waitqueue_head(&mod->idle);
        INIT_DELAYED_WORK(&mod->powerdown, powerdown_handler);