[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>
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 1df49ec..14d7e94 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -42,6 +42,7 @@
 
 #define IRQ_NOPROBE	512	/* IRQ is not valid for probing */
 #define IRQ_NOREQUEST	1024	/* IRQ cannot be requested */
+#define IRQ_NOAUTOEN	2048	/* IRQ will not be enabled on request irq */
 /**
  * struct hw_interrupt_type - hardware interrupt type descriptor
  *
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 @@
 	[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 @@
 		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);