aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-02-17 15:33:13 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 04:13:29 -0500
commit3763be32d591cacf808c36390a8af3f2784cde5f (patch)
tree124ae01bf91905a6d3af931caf28acf82900699b /arch
parent3f19a84e39619053f117bd5bb9183c5bfea7db45 (diff)
[SPARC64]: Define ARCH_HAS_READ_CURRENT_TIMER.
This gives more consistent bogomips and delay() semantics, especially on sun4v. It gives weird looking values though... Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch')
-rw-r--r--arch/sparc64/kernel/time.c8
-rw-r--r--arch/sparc64/lib/delay.c19
2 files changed, 9 insertions, 18 deletions
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c
index 7041146f86f0..f6275adbc811 100644
--- a/arch/sparc64/kernel/time.c
+++ b/arch/sparc64/kernel/time.c
@@ -1029,11 +1029,10 @@ static void sparc64_start_timers(irqreturn_t (*cfunc)(int, void *, struct pt_reg
1029} 1029}
1030 1030
1031struct freq_table { 1031struct freq_table {
1032 unsigned long udelay_val_ref;
1033 unsigned long clock_tick_ref; 1032 unsigned long clock_tick_ref;
1034 unsigned int ref_freq; 1033 unsigned int ref_freq;
1035}; 1034};
1036static DEFINE_PER_CPU(struct freq_table, sparc64_freq_table) = { 0, 0, 0 }; 1035static DEFINE_PER_CPU(struct freq_table, sparc64_freq_table) = { 0, 0 };
1037 1036
1038unsigned long sparc64_get_clock_tick(unsigned int cpu) 1037unsigned long sparc64_get_clock_tick(unsigned int cpu)
1039{ 1038{
@@ -1055,16 +1054,11 @@ static int sparc64_cpufreq_notifier(struct notifier_block *nb, unsigned long val
1055 1054
1056 if (!ft->ref_freq) { 1055 if (!ft->ref_freq) {
1057 ft->ref_freq = freq->old; 1056 ft->ref_freq = freq->old;
1058 ft->udelay_val_ref = cpu_data(cpu).udelay_val;
1059 ft->clock_tick_ref = cpu_data(cpu).clock_tick; 1057 ft->clock_tick_ref = cpu_data(cpu).clock_tick;
1060 } 1058 }
1061 if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) || 1059 if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) ||
1062 (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) || 1060 (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) ||
1063 (val == CPUFREQ_RESUMECHANGE)) { 1061 (val == CPUFREQ_RESUMECHANGE)) {
1064 cpu_data(cpu).udelay_val =
1065 cpufreq_scale(ft->udelay_val_ref,
1066 ft->ref_freq,
1067 freq->new);
1068 cpu_data(cpu).clock_tick = 1062 cpu_data(cpu).clock_tick =
1069 cpufreq_scale(ft->clock_tick_ref, 1063 cpufreq_scale(ft->clock_tick_ref,
1070 ft->ref_freq, 1064 ft->ref_freq,
diff --git a/arch/sparc64/lib/delay.c b/arch/sparc64/lib/delay.c
index e8808727617a..fb27e54a03ee 100644
--- a/arch/sparc64/lib/delay.c
+++ b/arch/sparc64/lib/delay.c
@@ -1,6 +1,6 @@
1/* delay.c: Delay loops for sparc64 1/* delay.c: Delay loops for sparc64
2 * 2 *
3 * Copyright (C) 2004 David S. Miller <davem@redhat.com> 3 * Copyright (C) 2004, 2006 David S. Miller <davem@davemloft.net>
4 * 4 *
5 * Based heavily upon x86 variant which is: 5 * Based heavily upon x86 variant which is:
6 * Copyright (C) 1993 Linus Torvalds 6 * Copyright (C) 1993 Linus Torvalds
@@ -8,19 +8,16 @@
8 */ 8 */
9 9
10#include <linux/delay.h> 10#include <linux/delay.h>
11#include <asm/timer.h>
11 12
12void __delay(unsigned long loops) 13void __delay(unsigned long loops)
13{ 14{
14 __asm__ __volatile__( 15 unsigned long bclock, now;
15" b,pt %%xcc, 1f\n" 16
16" cmp %0, 0\n" 17 bclock = tick_ops->get_tick();
17" .align 32\n" 18 do {
18"1:\n" 19 now = tick_ops->get_tick();
19" bne,pt %%xcc, 1b\n" 20 } while ((now-bclock) < loops);
20" subcc %0, 1, %0\n"
21 : "=&r" (loops)
22 : "0" (loops)
23 : "cc");
24} 21}
25 22
26/* We used to multiply by HZ after shifting down by 32 bits 23/* We used to multiply by HZ after shifting down by 32 bits