summaryrefslogtreecommitdiffstats
path: root/arch/xtensa
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2013-10-17 00:42:24 +0200
committerChris Zankel <chris@zankel.net>2014-01-14 19:19:57 +0100
commitbae07f8a9dfaf6268f2fba5522b70bce6fc7d718 (patch)
treeb18ad1da0f8842dbec11f4d8b3398edb64472b31 /arch/xtensa
parentxtensa: clean up do_interrupt/do_IRQ (diff)
downloadlinux-bae07f8a9dfaf6268f2fba5522b70bce6fc7d718.tar.xz
linux-bae07f8a9dfaf6268f2fba5522b70bce6fc7d718.zip
xtensa: clear timer IRQ unconditionally in its handler
PIC irq_ack doesn't clear timer IRQ, because timer interrupt handler usually set up new timer by writing to ccompare register and thus clearing timer IRQ. However timer may not be set up in the IRQ handler, e.g. with tickless idle on SMP, or when CPU is going offline, leaving timer IRQ raised and making do_interrupt attempting to handle it forever. To fix this always write current value of ccompare SR chosen to be linux timer back to that SR on entry to timer interrupt handler. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> Signed-off-by: Chris Zankel <chris@zankel.net>
Diffstat (limited to 'arch/xtensa')
-rw-r--r--arch/xtensa/kernel/time.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c
index 4ce7aae39e64..60dcb3fcaeae 100644
--- a/arch/xtensa/kernel/time.c
+++ b/arch/xtensa/kernel/time.c
@@ -158,6 +158,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id)
{
struct clock_event_device *evt = &this_cpu_ptr(&ccount_timer)->evt;
+ set_linux_timer(get_linux_timer());
evt->event_handler(evt);
/* Allow platform to do something useful (Wdog). */