diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2007-09-19 00:21:56 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-09-19 01:26:34 -0400 |
commit | c27da339698145a9383e052c1070a950d30da478 (patch) | |
tree | 817025c780b6be5d80405c90f4c5fb88086b6cb8 | |
parent | 7b5acbaac3f94ab810a977c0ec4e5fcabbf51bed (diff) |
[POWERPC] Fix timekeeping on PowerPC 601
Recent changes to the timekeeping code broke support for the PowerPC 601
processor which doesn't have the usual timebase facility but a slightly
different thing called (yuck) the RTC.
This fixes it, boot tested on an old 601 based PowerMac 7200.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/kernel/time.c | 8 | ||||
-rw-r--r-- | include/asm-powerpc/time.h | 5 |
2 files changed, 10 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 727a6699f2f4..c627cf86d1e3 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -239,7 +239,7 @@ static void snapshot_tb_and_purr(void *data) | |||
239 | struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data); | 239 | struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data); |
240 | 240 | ||
241 | local_irq_save(flags); | 241 | local_irq_save(flags); |
242 | p->tb = mftb(); | 242 | p->tb = get_tb_or_rtc(); |
243 | p->purr = mfspr(SPRN_PURR); | 243 | p->purr = mfspr(SPRN_PURR); |
244 | wmb(); | 244 | wmb(); |
245 | p->initialized = 1; | 245 | p->initialized = 1; |
@@ -317,7 +317,7 @@ static void snapshot_purr(void) | |||
317 | */ | 317 | */ |
318 | void snapshot_timebase(void) | 318 | void snapshot_timebase(void) |
319 | { | 319 | { |
320 | __get_cpu_var(last_jiffy) = get_tb(); | 320 | __get_cpu_var(last_jiffy) = get_tb_or_rtc(); |
321 | snapshot_purr(); | 321 | snapshot_purr(); |
322 | } | 322 | } |
323 | 323 | ||
@@ -684,6 +684,8 @@ void timer_interrupt(struct pt_regs * regs) | |||
684 | 684 | ||
685 | write_seqlock(&xtime_lock); | 685 | write_seqlock(&xtime_lock); |
686 | tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy; | 686 | tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy; |
687 | if (__USE_RTC() && tb_next_jiffy >= 1000000000) | ||
688 | tb_next_jiffy -= 1000000000; | ||
687 | if (per_cpu(last_jiffy, cpu) >= tb_next_jiffy) { | 689 | if (per_cpu(last_jiffy, cpu) >= tb_next_jiffy) { |
688 | tb_last_jiffy = tb_next_jiffy; | 690 | tb_last_jiffy = tb_next_jiffy; |
689 | do_timer(1); | 691 | do_timer(1); |
@@ -977,7 +979,7 @@ void __init time_init(void) | |||
977 | tb_to_ns_scale = scale; | 979 | tb_to_ns_scale = scale; |
978 | tb_to_ns_shift = shift; | 980 | tb_to_ns_shift = shift; |
979 | /* Save the current timebase to pretty up CONFIG_PRINTK_TIME */ | 981 | /* Save the current timebase to pretty up CONFIG_PRINTK_TIME */ |
980 | boot_tb = get_tb(); | 982 | boot_tb = get_tb_or_rtc(); |
981 | 983 | ||
982 | tm = get_boot_time(); | 984 | tm = get_boot_time(); |
983 | 985 | ||
diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h index d7f5ddfbaac7..c104c15c6625 100644 --- a/include/asm-powerpc/time.h +++ b/include/asm-powerpc/time.h | |||
@@ -149,6 +149,11 @@ static inline u64 get_tb(void) | |||
149 | } | 149 | } |
150 | #endif /* !CONFIG_PPC64 */ | 150 | #endif /* !CONFIG_PPC64 */ |
151 | 151 | ||
152 | static inline u64 get_tb_or_rtc(void) | ||
153 | { | ||
154 | return __USE_RTC() ? get_rtc() : get_tb(); | ||
155 | } | ||
156 | |||
152 | static inline void set_tb(unsigned int upper, unsigned int lower) | 157 | static inline void set_tb(unsigned int upper, unsigned int lower) |
153 | { | 158 | { |
154 | mtspr(SPRN_TBWL, 0); | 159 | mtspr(SPRN_TBWL, 0); |