Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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,
+12 −3
Original line number Diff line number Diff line
@@ -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);

+16 −0
Original line number Diff line number Diff line
@@ -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:
 */