summaryrefslogtreecommitdiff
path: root/arch/blackfin/kernel/time-ts.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2011-04-04 15:26:11 +0000
committerMike Frysinger <vapier@gentoo.org>2011-04-13 19:34:05 -0400
commit0bf02ce605b8780223b10739ab7c533de9eb10cc (patch)
tree2a7c66fa16817062979648dd434f9067f279c5a2 /arch/blackfin/kernel/time-ts.c
parentce24ee468aabb7c499b910aa3c4ab3cb338326ed (diff)
downloadlwn-0bf02ce605b8780223b10739ab7c533de9eb10cc.tar.gz
lwn-0bf02ce605b8780223b10739ab7c533de9eb10cc.zip
Blackfin: time-ts: ack gptimer sooner to avoid missing short ints
If the period of a gptimer is fairly low, we might miss an interrupt by acking it too late (we end up acking the new int as well). Reported-by: Isabelle Leonardi <i.leonardi@detracom.fr> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'arch/blackfin/kernel/time-ts.c')
-rw-r--r--arch/blackfin/kernel/time-ts.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/blackfin/kernel/time-ts.c b/arch/blackfin/kernel/time-ts.c
index 8c9a43daf80f..cdb4beb6bc8f 100644
--- a/arch/blackfin/kernel/time-ts.c
+++ b/arch/blackfin/kernel/time-ts.c
@@ -206,8 +206,14 @@ irqreturn_t bfin_gptmr0_interrupt(int irq, void *dev_id)
{
struct clock_event_device *evt = dev_id;
smp_mb();
- evt->event_handler(evt);
+ /*
+ * We want to ACK before we handle so that we can handle smaller timer
+ * intervals. This way if the timer expires again while we're handling
+ * things, we're more likely to see that 2nd int rather than swallowing
+ * it by ACKing the int at the end of this handler.
+ */
bfin_gptmr0_ack();
+ evt->event_handler(evt);
return IRQ_HANDLED;
}