Re: [Uclinux-dist-devel] [PATCH v2] mfd: ADP5520 Multifunction LCDBacklight and Keypad Input Device Driver

Mark Brown
2009-10-02T14:27:34Z

On Fri, Oct 02, 2009 at 02:48:27PM +0100, Hennerich, Michael wrote:

> Well the threaded irq handlers are no option here, since we use a Level
> Sensitive Interrupt.
> The work queue here is to schedule the main irq handler outside hardirq
> context.
> I2C can't we invoked form none sleepy context, so we can't clear the
> interrupt.
> This will cause that we execute the hardirq over and over again,
> preventing the irq thread to be run.

> The threaded irqs with its current implementation also doesn't allow me
> to disable the irq in the hardirq handler.

This should all work perfectly fine. If you don't supply a hard IRQ
handler then the genirq infrastructure will disable the IRQ and schedule
the threaded handler, reenabling the IRQ when the threaded handler
finishes. The threaded handler runs in a non-atomic context so it can
happily access I2C devices.

> There have been some discussions about this on lkml recently.
> Until there is a way to workaround this issue (handle_level_oneshot_irq,
> etc.),
> I like to stick with:

> >>> + disable_irq_nosync(irq);
> >>> + schedule_work(&chip->irq_work);

This is essentially what a threaded IRQ handler does with current
mainline. There were issues in 2.6.31 but I believe all Thomas' fixes
have been merged now.