powerpc: Fix timekeeping on PowerPC 601
PATCH 2/2 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 <[email protected]>
---
arch/powerpc/kernel/time.c | 8 +++++--- include/asm-powerpc/time.h | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-)
arch/powerpc/kernel/time.c +5 -3
@@ -239,7 +239,7 @@ static void snapshot_tb_and_purr(void *dstruct cpu_purr_data *p = &__get_cpu_var (cpu_purr_data);local_irq_save (flags); - p->tb =mftb (); + p->tb =get_tb_or_rtc (); p->purr =mfspr (SPRN_PURR );wmb (); p->initialized =1 ;
@@ -317,7 +317,7 @@ static void snapshot_purr(void)*/ void snapshot_timebase (void ) { -__get_cpu_var (last_jiffy) =get_tb (); +__get_cpu_var (last_jiffy) =get_tb_or_rtc ();snapshot_purr (); }
@@ -684,6 +684,8 @@ void timer_interrupt(struct pt_regs * rewrite_seqlock (&xtime_lock); tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy; +if (__USE_RTC () && tb_next_jiffy >=1000000000 ) + tb_next_jiffy -=1000000000 ;if (per_cpu (last_jiffy, cpu) >= tb_next_jiffy) { tb_last_jiffy = tb_next_jiffy;do_timer (1 );
@@ -977,7 +979,7 @@ void __init time_init(void) tb_to_ns_scale = scale; tb_to_ns_shift = shift;/* Save the current timebase to pretty up CONFIG_PRINTK_TIME */ - boot_tb =get_tb (); + boot_tb =get_tb_or_rtc (); tm =get_boot_time ();
include/asm-powerpc/time.h +5 -0
@@ -149,6 +149,11 @@ static inline u64 get_tb(void) }#endif /* !CONFIG_PPC64 */ +static inline u64 get_tb_or_rtc (void ) +{ +return __USE_RTC () ?get_rtc () :get_tb (); +} +static inline void set_tb (unsigned int upper,unsigned int lower) {mtspr (SPRN_TBWL ,0 );