diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2006-06-29 02:24:50 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-29 10:26:24 -0700 |
commit | 94d39e1f6e8132ea982a1d61acbe0423d3d14365 (patch) | |
tree | 68ba3666c1d2c0805089e8ffdb47da961a760450 /kernel/irq | |
parent | 6550c775cb5ee94c132d93d84de3bb23f0abf37b (diff) | |
download | op-kernel-dev-94d39e1f6e8132ea982a1d61acbe0423d3d14365.zip op-kernel-dev-94d39e1f6e8132ea982a1d61acbe0423d3d14365.tar.gz |
[PATCH] genirq: add IRQ_NOAUTOEN support
Enable platforms to disable the automatic enabling of freshly set up irqs.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/irq')
-rw-r--r-- | kernel/irq/handle.c | 1 | ||||
-rw-r--r-- | kernel/irq/manage.c | 18 |
2 files changed, 12 insertions, 7 deletions
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 402fa3a..9b398d5 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -32,6 +32,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned = { [0 ... NR_IRQS-1] = { .status = IRQ_DISABLED, .chip = &no_irq_type, + .depth = 1, .lock = SPIN_LOCK_UNLOCKED, #ifdef CONFIG_SMP .affinity = CPU_MASK_ALL diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index cae900a..9ea1887 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -216,13 +216,17 @@ int setup_irq(unsigned int irq, struct irqaction *new) desc->status |= IRQ_PER_CPU; #endif if (!shared) { - desc->depth = 0; - desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | - IRQ_WAITING | IRQ_INPROGRESS); - if (desc->chip->startup) - desc->chip->startup(irq); - else - desc->chip->enable(irq); + desc->status &= ~(IRQ_AUTODETECT | IRQ_WAITING | + IRQ_INPROGRESS); + + if (!(desc->status & IRQ_NOAUTOEN)) { + desc->depth = 0; + desc->status &= ~IRQ_DISABLED; + if (desc->chip->startup) + desc->chip->startup(irq); + else + desc->chip->enable(irq); + } } spin_unlock_irqrestore(&desc->lock, flags); |