summaryrefslogtreecommitdiff
path: root/arch/arm/kernel
diff options
context:
space:
mode:
authorAjay Nandakumar <anandakumarm@nvidia.com>2014-01-09 23:15:25 +0530
committerBharat Nihalani <bnihalani@nvidia.com>2014-01-12 21:39:14 -0800
commit0a2f6aba77a6ea503c13df504193d75f73c52cd6 (patch)
tree54ed852bf5ec451bdb9c217fbd8cd68a9c755d27 /arch/arm/kernel
parent6568286659fa68d6efe8d01d0035a549b237e50d (diff)
Revert "Revert "ARM: arch_timer: use full 64-bit counter for sched_clock""
This reverts commit 60df2b1853f0df4251318ad1d3b741e0f9984e55. The change is reverted since changes from upstream are available that provides the actual solution for bug mentioned below. The upstream patches solve this bug by introducing support for more than 32 bit counters by sched clock framework. Bug 1399318 Change-Id: I1a7b20dcbf6c2e73a4a7e3446a5dcb72f4172236 Signed-off-by: Ajay Nandakumar <anandakumarm@nvidia.com> Reviewed-on: http://git-master/r/353860 Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r--arch/arm/kernel/arch_timer.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/arch/arm/kernel/arch_timer.c b/arch/arm/kernel/arch_timer.c
index f5de8afa1d12..b7e6a217ce07 100644
--- a/arch/arm/kernel/arch_timer.c
+++ b/arch/arm/kernel/arch_timer.c
@@ -22,9 +22,11 @@ static unsigned long arch_timer_read_counter_long(void)
return arch_timer_read_counter();
}
-static u32 arch_timer_read_counter_u32(void)
+static u32 sched_clock_mult __read_mostly;
+
+static unsigned long long notrace arch_timer_sched_clock(void)
{
- return arch_timer_read_counter();
+ return arch_timer_read_counter() * sched_clock_mult;
}
static struct delay_timer arch_delay_timer;
@@ -39,12 +41,18 @@ static void __init arch_timer_delay_timer_register(void)
int __init arch_timer_arch_init(void)
{
- if (arch_timer_get_rate() == 0)
+ u32 arch_timer_rate = arch_timer_get_rate();
+
+ if (arch_timer_rate == 0)
return -ENXIO;
arch_timer_delay_timer_register();
- setup_sched_clock(arch_timer_read_counter_u32,
- 32, arch_timer_get_rate());
+ /* Cache the sched_clock multiplier to save a divide in the hot path. */
+ sched_clock_mult = NSEC_PER_SEC / arch_timer_rate;
+ sched_clock_func = arch_timer_sched_clock;
+ pr_info("sched_clock: ARM arch timer >56 bits at %ukHz, resolution %uns\n",
+ arch_timer_rate / 1000, sched_clock_mult);
+
return 0;
}