alistair23-linux/kernel/irq
Marc Zyngier ae731f8d07 genirq: Introduce request_any_context_irq()
Now that we enjoy threaded interrupts, we're starting to see irq_chip
implementations (wm831x, pca953x) that make use of threaded interrupts
for the controller, and nested interrupts for the client interrupt. It
all works very well, with one drawback:

Drivers requesting an IRQ must now know whether the handler will
run in a thread context or not, and call request_threaded_irq() or
request_irq() accordingly.

The problem is that the requesting driver sometimes doesn't know
about the nature of the interrupt, specially when the interrupt
controller is a discrete chip (typically a GPIO expander connected
over I2C) that can be connected to a wide variety of otherwise perfectly
supported hardware.

This patch introduces the request_any_context_irq() function that mostly
mimics the usual request_irq(), except that it checks whether the irq
level is configured as nested or not, and calls the right backend.
On success, it also returns either IRQC_IS_HARDIRQ or IRQC_IS_NESTED.

[ tglx: Made return value an enum, simplified code and made the export
  	of request_any_context_irq GPL ]

Signed-off-by: Marc Zyngier <maz@misterjones.org>
Cc: <joachim.eastwood@jotron.com>
LKML-Reference: <927ea285bd0c68934ddae1a47e44a9ba@localhost>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2010-04-13 16:36:39 +02:00
..
autoprobe.c genirq: Convert irq_desc.lock to raw_spinlock 2009-12-14 23:55:33 +01:00
chip.c Merge branch 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-03-26 15:09:06 -07:00
devres.c devres/irq: Fix devm_irq_match comment 2010-02-11 16:01:02 +01:00
handle.c sparseirq: Use radix_tree instead of ptrs array 2010-02-17 17:27:20 -08:00
internals.h sparseirq: Change irq_desc_ptrs to static 2010-02-17 17:27:03 -08:00
Makefile x86/irq: use move_irq_desc() in create_irq_nr() 2009-05-01 19:01:12 +02:00
manage.c genirq: Introduce request_any_context_irq() 2010-04-13 16:36:39 +02:00
migration.c genirq: Convert irq_desc.lock to raw_spinlock 2009-12-14 23:55:33 +01:00
numa_migrate.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
pm.c genirq: Convert irq_desc.lock to raw_spinlock 2009-12-14 23:55:33 +01:00
proc.c Merge branch 'linus' into irq/core 2010-04-13 14:12:17 +02:00
resend.c irq: Remove superfluous NULL pointer check in check_irq_resend() 2009-08-09 12:44:29 +02:00
spurious.c genirq: Convert irq_desc.lock to raw_spinlock 2009-12-14 23:55:33 +01:00