diff options
Diffstat (limited to 'arch/powerpc/kernel/time.c')
| -rw-r--r-- | arch/powerpc/kernel/time.c | 23 | 
1 files changed, 11 insertions, 12 deletions
| diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index ce53dfa7130..8533b3b83f5 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -577,20 +577,11 @@ void timer_interrupt(struct pt_regs * regs)  	 * some CPUs will continuue to take decrementer exceptions */  	set_dec(DECREMENTER_MAX); -#ifdef CONFIG_PPC32 +#if defined(CONFIG_PPC32) && defined(CONFIG_PMAC)  	if (atomic_read(&ppc_n_lost_interrupts) != 0)  		do_IRQ(regs);  #endif -	now = get_tb_or_rtc(); -	if (now < decrementer->next_tb) { -		/* not time for this event yet */ -		now = decrementer->next_tb - now; -		if (now <= DECREMENTER_MAX) -			set_dec((int)now); -		trace_timer_interrupt_exit(regs); -		return; -	}  	old_regs = set_irq_regs(regs);  	irq_enter(); @@ -606,8 +597,16 @@ void timer_interrupt(struct pt_regs * regs)  		get_lppaca()->int_dword.fields.decr_int = 0;  #endif -	if (evt->event_handler) -		evt->event_handler(evt); +	now = get_tb_or_rtc(); +	if (now >= decrementer->next_tb) { +		decrementer->next_tb = ~(u64)0; +		if (evt->event_handler) +			evt->event_handler(evt); +	} else { +		now = decrementer->next_tb - now; +		if (now <= DECREMENTER_MAX) +			set_dec((int)now); +	}  #ifdef CONFIG_PPC_ISERIES  	if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending()) | 
