Messages in this thread | | | Date | Wed, 21 Apr 2010 17:35:32 +0100 | Subject | Threaded irq handler question | From | Will Newton <> |
| |
Hi all,
I have a threaded irq handler attached to a level-triggered gpio interrupt line. The check handler checks the status of the gpio line and disables the irq line amd returns WAKE_THREAD in that case:
static irqreturn_t isr_check(int irq, void *p) { if (gpio_status()) { disable_irq_nosync(irq); return IRQ_WAKE_THREAD; }
return IRQ_NONE; }
The thread then does some i2c transactions that will eventually deassert the gpio line:
static irqreturn_t isr(int irq, void *p) { /* do some i2c transfers */ enable_irq(irq); return IRQ_HANDLED; }
My problem is that this structure does not work, because once I call disable_irq_nosync() on the irq in the check handler the thread will no longer run because the irq is disabled. However if I don't call disable_irq_nosync() I will get endless irqs because the line is level-triggered and will not be deasserted until the thread has run.
Could someone tell me what I'm doing wrong here?
Thanks,
| |