[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: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
a2166abd06
commit
f8b5473fcb
3 changed files with 30 additions and 4 deletions
|
@ -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,
|
||||||
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 = {
|
||||||
.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:
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue