ARM: tegra: powermon: Fix copyrights from GPLv3 to GPLv2
[linux-3.10.git] / arch / arm / mach-tegra / tegra3_actmon.c
index 861faf4..e604f24 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, NVIDIA Corporation.
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -86,6 +86,10 @@ static u8 actmon_sampling_period;
 
 static unsigned long actmon_clk_freq;
 
+/* Maximum frequency EMC is running at when sourced from PLLP. This is
+ * really a short-cut, but it is true for all Tegra3  platforms
+ */
+#define EMC_PLLP_FREQ_MAX                      204000
 
 /* Units:
  * - frequency in kHz
@@ -103,6 +107,7 @@ struct actmon_dev {
        unsigned long   max_freq;
        unsigned long   target_freq;
        unsigned long   cur_freq;
+       unsigned long   suspend_freq;
 
        unsigned long   avg_actv_freq;
        unsigned long   avg_band_freq;
@@ -405,6 +410,9 @@ static void actmon_dev_suspend(struct actmon_dev *dev)
                actmon_wmb();
        }
        spin_unlock_irqrestore(&dev->lock, flags);
+
+       if (dev->suspend_freq)
+               clk_set_rate(dev->clk, dev->suspend_freq * 1000);
 }
 
 static void actmon_dev_resume(struct actmon_dev *dev)
@@ -473,13 +481,14 @@ static int __init actmon_dev_init(struct actmon_dev *dev)
 
        dev->state = ACTMON_OFF;
        actmon_dev_enable(dev);
-       clk_enable(dev->clk);
+       tegra_clk_prepare_enable(dev->clk);
        return 0;
 }
 
 /* EMC activity monitor: frequency sampling device:
  * activity counter is incremented every 256 memory transactions, and
- * each transaction takes 2 EMC clocks; count_weight = 512.
+ * each transaction takes 2 EMC clocks; count_weight = 512 on Tegra3.
+ * On Tegra11 there is only 1 clock per transaction, hence weight = 256.
  */
 static struct actmon_dev actmon_dev_emc = {
        .reg    = 0x1c0,
@@ -487,16 +496,28 @@ static struct actmon_dev actmon_dev_emc = {
        .dev_id = "tegra_actmon",
        .con_id = "emc",
 
+       /* EMC suspend floor to guarantee suspend entry on PLLM */
+       .suspend_freq           = EMC_PLLP_FREQ_MAX + 2000,
+
        .boost_freq_step        = 16000,
        .boost_up_coef          = 200,
        .boost_down_coef        = 50,
+#if defined(CONFIG_ARCH_TEGRA_14x_SOC)
+       .boost_up_threshold     = 70,
+       .boost_down_threshold   = 50,
+#else
        .boost_up_threshold     = 60,
        .boost_down_threshold   = 40,
+#endif
 
        .up_wmark_window        = 1,
        .down_wmark_window      = 3,
        .avg_window_log2        = ACTMON_DEFAULT_AVG_WINDOW_LOG2,
+#if defined(CONFIG_ARCH_TEGRA_3x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
        .count_weight           = 0x200,
+#else
+       .count_weight           = 0x100,
+#endif
 
        .type                   = ACTMON_FREQ_SAMPLER,
        .state                  = ACTMON_UNINITIALIZED,
@@ -516,10 +537,13 @@ static struct actmon_dev actmon_dev_avp = {
        .dev_id = "tegra_actmon",
        .con_id = "avp",
 
+       /* AVP/SCLK suspend activity floor */
+       .suspend_freq           = 40000,
+
        .boost_freq_step        = 8000,
        .boost_up_coef          = 200,
        .boost_down_coef        = 50,
-       .boost_up_threshold     = 75,
+       .boost_up_threshold     = 85,
        .boost_down_threshold   = 50,
 
        .up_wmark_window        = 1,
@@ -824,7 +848,7 @@ static int __init tegra_actmon_init(void)
                return 0;
        }
        actmon_clk_freq = clk_get_rate(c) / 1000;
-       ret = clk_enable(c);
+       ret = tegra_clk_prepare_enable(c);
        if (ret) {
                pr_err("%s: Failed to enable actmon clock\n", __func__);
                return 0;