summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/clock_nvrm.c
diff options
context:
space:
mode:
authorGary King <gking@nvidia.com>2010-05-25 22:54:36 -0700
committerGary King <gking@nvidia.com>2010-05-26 13:44:03 -0700
commitf0449fc8a848601b2d0df78f4680c2f5cb222af8 (patch)
tree885ea1c419a2b451abd478d4c824e3c9a4d1b254 /arch/arm/mach-tegra/clock_nvrm.c
parent01af3d44e93a99a68c13595f5bc77e93b6230043 (diff)
[ARM/tegra] initialize local timer prescaler during clock init
the local timer prescaler needs to be initialized on all CPUs early in the init process; clock init seems as good a place as any Change-Id: Icc306579a1cd74600b368aede5eaa686453dc7fd
Diffstat (limited to 'arch/arm/mach-tegra/clock_nvrm.c')
-rw-r--r--arch/arm/mach-tegra/clock_nvrm.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/clock_nvrm.c b/arch/arm/mach-tegra/clock_nvrm.c
index 449c7251b795..1d32c71dd5bc 100644
--- a/arch/arm/mach-tegra/clock_nvrm.c
+++ b/arch/arm/mach-tegra/clock_nvrm.c
@@ -25,10 +25,14 @@
#include <linux/spinlock.h>
#include <linux/delay.h>
#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/clk.h>
#include <asm/clkdev.h>
+#include <asm/smp_twd.h>
#include <mach/iomap.h>
+#include <mach/timex.h>
#include <mach/nvrm_linux.h>
#include "nvrm/core/common/nvrm_clocks.h"
@@ -389,9 +393,21 @@ EXPORT_SYMBOL(clk_get_rate);
void __init tegra_init_clock(void)
{
NvError e;
+ struct clk *cpu_clk = NULL;
+ unsigned long rate = 0;
e = NvRmOpenNew(&s_hRmGlobal);
BUG_ON(e!=NvSuccess);
NvRmPowerRegister(s_hRmGlobal, 0, &clk_pwr_client);
tegra2_init_clocks();
+
+#ifdef CONFIG_USE_ARM_TWD_PRESCALER
+ cpu_clk = clk_get_sys(NULL, "cpu");
+ BUG_ON(IS_ERR(cpu_clk));
+
+ rate = clk_get_rate(cpu_clk);
+ local_timer_rescale(rate / 1000);
+ clk_put(cpu_clk);
+ on_each_cpu(twd_set_prescaler, NULL, true);
+#endif
}