Commit f8b5473f authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Russell King

[ARM] 3690/1: genirq: Introduce and make use of dummy irq chip

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent a2166abd
...@@ -348,8 +348,9 @@ extern int noirqdebug_setup(char *str); ...@@ -348,8 +348,9 @@ extern int noirqdebug_setup(char *str);
/* Checks whether the interrupt can be requested by request_irq(): */ /* Checks whether the interrupt can be requested by request_irq(): */
extern int can_request_irq(unsigned int irq, unsigned long irqflags); 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 no_irq_chip;
extern struct irq_chip dummy_irq_chip;
extern void extern void
set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
......
...@@ -462,9 +462,18 @@ __set_irq_handler(unsigned int irq, ...@@ -462,9 +462,18 @@ __set_irq_handler(unsigned int irq,
if (!handle) if (!handle)
handle = handle_bad_irq; handle = handle_bad_irq;
if (is_chained && desc->chip == &no_irq_chip) if (desc->chip == &no_irq_chip) {
printk(KERN_WARNING "Trying to install " printk(KERN_WARNING "Trying to install %sinterrupt handler "
"chained interrupt type for IRQ%d\n", irq); "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); spin_lock_irqsave(&desc->lock, flags);
......
...@@ -95,6 +95,22 @@ struct irq_chip no_irq_chip = { ...@@ -95,6 +95,22 @@ struct irq_chip no_irq_chip = {
.end = noop, .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: * Special, empty irq handler:
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment