ARM: tegra: moving the CPU power timer function to PMC driver
Joseph Lo [Wed, 3 Apr 2013 11:31:28 +0000 (19:31 +0800)]
The CPU power timer set up function was related to PMC register. Now moving
it to PMC driver. And it also help to clean up the PM related code later.

The timer was calculated based on the input clock of PMC. In this patch, we
also get the clock from DT.

Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
(cherry picked from commit 0337c3e0c3cbbb3a4f411c292f52fcc314abae67)

bug 1173104

Change-Id: I03a80b2c0cfcb5223b1b113f395ef3899eafd06e
Signed-off-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-on: http://git-master/r/263722

arch/arm/mach-tegra/pm.c
arch/arm/mach-tegra/pmc.c
arch/arm/mach-tegra/pmc.h

index 74e6567..53f333d 100644 (file)
@@ -28,7 +28,9 @@
 #include <linux/smp.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
-#include <linux/clk.h>
+#include <linux/cpumask.h>
+#include <linux/delay.h>
+#include <linux/cpu_pm.h>
 #include <linux/err.h>
 #include <linux/debugfs.h>
 #include <linux/delay.h>
@@ -72,6 +74,7 @@
 #include "pm.h"
 #include "pm-irq.h"
 #include "reset.h"
+#include "pmc.h"
 #include "sleep.h"
 #include "timer.h"
 #include "dvfs.h"
@@ -105,6 +108,7 @@ struct suspend_context {
 
        struct tegra_twd_context twd;
 };
+#define PMC_CTRL               0x0
 
 #ifdef CONFIG_PM_SLEEP
 phys_addr_t tegra_pgd_phys;    /* pgd used by hotplug & LP2 bootup */
@@ -473,6 +477,8 @@ void tegra_limit_cpu_power_timers(unsigned long us_on, unsigned long us_off)
        set_power_timers(us_on, us_off, clk_get_min_rate(tegra_pclk));
 }
 
+void (*tegra_tear_down_cpu)(void);
+
 /*
  * restore_cpu_complex
  *
index a1e1874..d18f5f0 100644 (file)
@@ -49,7 +49,9 @@ static DEFINE_SPINLOCK(tegra_powergate_lock);
 
 static void __iomem *tegra_pmc_base;
 static bool tegra_pmc_invert_interrupt;
+#if defined(CONFIG_OF) && defined(CONFIG_COMMON_CLK)
 static struct clk *tegra_pclk;
+#endif
 
 struct pmc_pm_data {
        u32 cpu_good_time;      /* CPU power good time in uS */
@@ -156,7 +158,7 @@ int tegra_pmc_cpu_remove_clamping(int cpuid)
        return tegra_pmc_powergate_remove_clamping(id);
 }
 
-#ifdef CONFIG_PM_SLEEP
+#if defined(CONFIG_OF) && defined(CONFIG_COMMON_CLK) && defined(CONFIG_PM_SLEEP)
 void set_power_timers(unsigned long us_on, unsigned long us_off)
 {
        unsigned long long ticks;
@@ -208,8 +210,10 @@ static void tegra_pmc_parse_dt(void)
 
        tegra_pmc_invert_interrupt = of_property_read_bool(np,
                                     "nvidia,invert-interrupt");
+#if defined(CONFIG_OF) && defined(CONFIG_COMMON_CLK)
        tegra_pclk = of_clk_get_by_name(np, "pclk");
        WARN_ON(IS_ERR(tegra_pclk));
+#endif
 
        /* Grabbing the power management configurations */
        if (of_property_read_u32(np, "nvidia,suspend-mode", &prop)) {
index 6bc0fc0..efb3e71 100644 (file)
@@ -26,7 +26,7 @@ enum tegra_suspend_mode {
        TEGRA_MAX_SUSPEND_MODE,
 };
 
-#ifdef CONFIG_PM_SLEEP
+#if defined(CONFIG_OF) && defined(CONFIG_COMMON_CLK) && defined(CONFIG_PM_SLEEP)
 void set_power_timers(unsigned long us_on, unsigned long us_off);
 #endif