Prev: [PATCH] perf: fix initialization bug in parse_single_tracepoint_event()
Next: [PATCH] KEYS: Fix an RCU warning in the reading of user keys
From: Will Newton on 21 Apr 2010 12:40 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, -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Jonathan Corbet on 21 Apr 2010 13:30 On Wed, 21 Apr 2010 17:35:32 +0100 Will Newton <will.newton(a)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. jon -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Yong Zhang on 21 Apr 2010 21:40
On Wed, Apr 21, 2010 at 05:35:32PM +0100, Will Newton wrote: > Hi all, > 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? Does IRQF_ONESHOT meet your need? Thanks, Yong -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |