Messages in this thread Patch in this message | | | From | Uwe Kleine-König <> | Subject | [PATCH] let setup_irq reenable a shared irq | Date | Mon, 28 Apr 2008 13:12:51 +0200 |
| |
Consider two devices A and B sharing an irq and B already asserts the irq on a booting machine. If the driver for A is loaded first the irq starts triggering and gets disabled after some time by note_interrupt(). Later when the driver for B is loaded the interrupt should be reenabled---other wise both A and B don't work properly.
Signed-off-by: Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> --- kernel/irq/manage.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 438a014..831ebb2 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -365,11 +365,18 @@ int setup_irq(unsigned int irq, struct irqaction *new) desc->status &= ~(IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS); + } + + /* in the shared case the interrupt might be disabled if a device + * asserts the irq but the corresponding driver wasn't the first to be + * loaded. So retry enabling the irq. + */ + if (!shared || desc->status & IRQ_DISABLED) { if (!(desc->status & IRQ_NOAUTOEN)) { desc->depth = 0; desc->status &= ~IRQ_DISABLED; - if (desc->chip->startup) + if (!shared && desc->chip->startup) desc->chip->startup(irq); else desc->chip->enable(irq); -- 1.5.5.1 -- 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/
| |