diff options
author | Gary King <gking@nvidia.com> | 2010-05-25 22:54:36 -0700 |
---|---|---|
committer | Gary King <gking@nvidia.com> | 2010-05-26 13:44:03 -0700 |
commit | f0449fc8a848601b2d0df78f4680c2f5cb222af8 (patch) | |
tree | 885ea1c419a2b451abd478d4c824e3c9a4d1b254 /arch/arm/mach-tegra/clock_nvrm.c | |
parent | 01af3d44e93a99a68c13595f5bc77e93b6230043 (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.c | 16 |
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 } |