[ARM] 3690/1: genirq: Introduce and make use of dummy irq chip
authorThomas Gleixner <tglx@linutronix.de>
Sat, 1 Jul 2006 21:30:08 +0000 (22:30 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 1 Jul 2006 21:30:08 +0000 (22:30 +0100)
Patch from Thomas Gleixner

From: Thomas Gleixner <tglx@linutronix.de>

ARM has a couple of really dumb interrupt controllers.
Implement a generic one and fixup the ARM migration. ARM reused
the no_irq_chip for this purpose, but this does not work out
for platforms which are not converted to the new interrupt
type handling model.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
include/linux/irq.h
kernel/irq/chip.c
kernel/irq/handle.c

index 0832149..00b6ef8 100644 (file)
@@ -348,8 +348,9 @@ extern int noirqdebug_setup(char *str);
 /* Checks whether the interrupt can be requested by request_irq(): */
 extern int can_request_irq(unsigned int irq, unsigned long irqflags);
 
-/* Dummy irq-chip implementation: */
+/* Dummy irq-chip implementations: */
 extern struct irq_chip no_irq_chip;
+extern struct irq_chip dummy_irq_chip;
 
 extern void
 set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
index 4a0952d..54105bd 100644 (file)
@@ -462,9 +462,18 @@ __set_irq_handler(unsigned int irq,
        if (!handle)
                handle = handle_bad_irq;
 
-       if (is_chained && desc->chip == &no_irq_chip)
-               printk(KERN_WARNING "Trying to install "
-                      "chained interrupt type for IRQ%d\n", irq);
+       if (desc->chip == &no_irq_chip) {
+               printk(KERN_WARNING "Trying to install %sinterrupt handler "
+                      "for IRQ%d\n", is_chained ? "chained " : " ", irq);
+               /*
+                * Some ARM implementations install a handler for really dumb
+                * interrupt hardware without setting an irq_chip. This worked
+                * with the ARM no_irq_chip but the check in setup_irq would
+                * prevent us to setup the interrupt at all. Switch it to
+                * dummy_irq_chip for easy transition.
+                */
+               desc->chip = &dummy_irq_chip;
+       }
 
        spin_lock_irqsave(&desc->lock, flags);
 
index 961b875..e71266c 100644 (file)
@@ -95,6 +95,22 @@ struct irq_chip no_irq_chip = {
        .end            = noop,
 };
 
+/*
+ * Generic dummy implementation which can be used for
+ * real dumb interrupt sources
+ */
+struct irq_chip dummy_irq_chip = {
+       .name           = "dummy",
+       .startup        = noop_ret,
+       .shutdown       = noop,
+       .enable         = noop,
+       .disable        = noop,
+       .ack            = noop,
+       .mask           = noop,
+       .unmask         = noop,
+       .end            = noop,
+};
+
 /*
  * Special, empty irq handler:
  */