diff options
author | Takashi Iwai <tiwai@suse.de> | 2012-07-18 13:53:06 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2012-07-18 13:53:06 +0200 |
commit | 61eab000f3536f080eab43fd5eed3fd817ded76e (patch) | |
tree | d1448b3b90c5650b522c8d13d8bdd7bd65a5cf52 /arch/powerpc/kernel/time.c | |
parent | 68e67f40b7343383517c3f951b4b8db7626406bc (diff) | |
parent | 4e01ec636e64707d202a1ca21a47bbc6d53085b7 (diff) |
Merge branch 'topic/hda' into for-next
This is a large chunk merge for 3.6 HD-audio things
Diffstat (limited to 'arch/powerpc/kernel/time.c')
-rw-r--r-- | arch/powerpc/kernel/time.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 99a995c2a3f2..be171ee73bf8 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -475,6 +475,7 @@ void timer_interrupt(struct pt_regs * regs) struct pt_regs *old_regs; u64 *next_tb = &__get_cpu_var(decrementers_next_tb); struct clock_event_device *evt = &__get_cpu_var(decrementers); + u64 now; /* Ensure a positive value is written to the decrementer, or else * some CPUs will continue to take decrementer exceptions. @@ -509,9 +510,16 @@ void timer_interrupt(struct pt_regs * regs) irq_work_run(); } - *next_tb = ~(u64)0; - if (evt->event_handler) - evt->event_handler(evt); + now = get_tb_or_rtc(); + if (now >= *next_tb) { + *next_tb = ~(u64)0; + if (evt->event_handler) + evt->event_handler(evt); + } else { + now = *next_tb - now; + if (now <= DECREMENTER_MAX) + set_dec((int)now); + } #ifdef CONFIG_PPC64 /* collect purr register values often, for accurate calculations */ |