ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / powergate.c
index f61de0a..2778e8c 100644 (file)
@@ -2,7 +2,7 @@
  * arch/arm/mach-tegra/powergate.c
  *
  * Copyright (c) 2010 Google, Inc
- * Copyright (c) 2011 - 2013, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2011 - 2014, NVIDIA CORPORATION.  All rights reserved.
  *
  * Author:
  *     Colin Cross <ccross@google.com>
@@ -37,9 +37,9 @@
 #include <asm/atomic.h>
 
 #include "clock.h"
-#include "fuse.h"
 #include "iomap.h"
 #include "powergate-priv.h"
+#include "common.h"
 
 static struct powergate_ops *pg_ops;
 
@@ -58,6 +58,7 @@ int tegra_powergate_set(int id, bool new_state)
        bool status;
        unsigned long flags;
        spinlock_t *lock;
+       u32 reg;
 
        /* 10us timeout for toggle operation if it takes affect*/
        int toggle_timeout = 10;
@@ -88,7 +89,38 @@ int tegra_powergate_set(int id, bool new_state)
                return 0;
        }
 
+#if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
+       /* Wait if PMC is already processing some other power gating request */
+       do {
+               udelay(1);
+               reg = pmc_read(PWRGATE_TOGGLE);
+               contention_timeout--;
+       } while ((contention_timeout > 0) && (reg & PWRGATE_TOGGLE_START));
+
+       if (contention_timeout <= 0)
+               pr_err(" Timed out waiting for PMC to submit \
+                               new power gate request \n");
+       contention_timeout = 100;
+#endif
+
+       /* Submit power gate request */
        pmc_write(PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
+
+#if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
+       /* Wait while PMC accepts the request */
+       do {
+               udelay(1);
+               reg = pmc_read(PWRGATE_TOGGLE);
+               contention_timeout--;
+       } while ((contention_timeout > 0) && (reg & PWRGATE_TOGGLE_START));
+
+       if (contention_timeout <= 0)
+               pr_err(" Timed out waiting for PMC to accept \
+                               new power gate request \n");
+       contention_timeout = 100;
+#endif
+
+       /* Check power gate status */
        do {
                do {
                        udelay(1);
@@ -330,7 +362,7 @@ int tegra_powergate_remove_clamping(int id)
                udelay(1);
                contention_timeout--;
        } while ((contention_timeout > 0)
-                       && (pmc_read(PWRGATE_CLAMP_STATUS) & mask));
+                       && (pmc_read(PWRGATE_CLAMP_STATUS) & BIT(id)));
 
        WARN(contention_timeout <= 0, "Couldn't remove clamping");
 
@@ -350,7 +382,7 @@ bool tegra_powergate_is_powered(int id)
        u32 status;
 
        if (!pg_ops) {
-               pr_info("This SOC doesn't support powergating\n");
+               pr_debug("This SOC doesn't support powergating\n");
                return -EINVAL;
        }
 
@@ -604,7 +636,7 @@ int tegra_powergate_init_refcount(void)
 
 int __init tegra_powergate_init(void)
 {
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
                case TEGRA_CHIPID_TEGRA2:
                        pg_ops = tegra2_powergate_init_chip_support();
                        break;