Skip to content

Commit

Permalink
Input: wm97xx-core - only schedule interrupt handler if not already s…
Browse files Browse the repository at this point in the history
…cheduled

As well as clarifying the fact that the driver can cope if a second
interrupt occurs before the IRQ work is scheduled this also ensures
that calls to the machine irq_enable() are balanced, making that easier
to implement.  Normally this is redundant due to the interrupt disabling
but some unusal board configurations can trigger it.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
  • Loading branch information
Mark Brown authored and Dmitry Torokhov committed Apr 17, 2008
1 parent 4db8a5f commit d808fbe
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions drivers/input/touchscreen/wm97xx-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,18 +328,18 @@ static void wm97xx_pen_irq_worker(struct work_struct *work)
*
* We have to disable the codec interrupt in the handler because it
* can take upto 1ms to clear the interrupt source. We schedule a task
* in a work queue to do the actual interaction with the chip (it
* doesn't matter if we end up reenqueing it before it is executed
* since we don't touch the chip until it has run). The interrupt is
* then enabled again in the slow handler when the source has been
* cleared.
* in a work queue to do the actual interaction with the chip. The
* interrupt is then enabled again in the slow handler when the source
* has been cleared.
*/
static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id)
{
struct wm97xx *wm = dev_id;

wm->mach_ops->irq_enable(wm, 0);
queue_work(wm->ts_workq, &wm->pen_event_work);
if (!work_pending(&wm->pen_event_work)) {
wm->mach_ops->irq_enable(wm, 0);
queue_work(wm->ts_workq, &wm->pen_event_work);
}

return IRQ_HANDLED;
}
Expand Down

0 comments on commit d808fbe

Please sign in to comment.