Messages in this thread | | | Date | Thu, 22 Apr 2010 11:51:33 +0100 | Subject | Re: Threaded irq handler question | From | Will Newton <> |
| |
On Wed, Apr 21, 2010 at 6:28 PM, Jonathan Corbet <corbet@lwn.net> wrote: > On Wed, 21 Apr 2010 17:35:32 +0100 > Will Newton <will.newton@gmail.com> wrote: > >> 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. > > Trying to disable IRQs at this level is the wrong approach. You need to > do enough in the primary interrupt handler to cause the hardware to > stop interrupting in the first place; usually that's just a matter of > some sort of acknowledgment. Then the threaded handler can move data > around in peace.
Unfortunately this device has no way of doing that - deasserting the interrupt line involves doing i2c transactions which will likely sleep so cannot be done in the check handler. This is quite a common problem for i2c connected devices. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |