aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2012-01-15 19:17:41 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-02-09 10:34:13 -0500
commit710455201f6690841e9a40bedba09ddd0a7e0620 (patch)
treed30c4aee05ca2f8ae85ddc10252c45b9f61cd3b7 /arch
parent49e01e3fb6efe1b0abfa2d5675f88f07989d621f (diff)
ARM: sa11x0: neponset: fix interrupt setup
Since ARM was converted to genirq, the neponset IRQ implementation has gradually broken as a result of various subtle changes being introduced into genirq. It used to be that simple IRQs did not need an IRQ chip. This is no longer the case, and genirq barfs in irq_set_handler(). Fix this by introducing a dummy no-op chip, and registering it along with the flow handler. Neponset IRQs really don't have any masking ability - all we have is a status register to allow us to decode the source, and a three input OR gate inside a CPLD. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-sa1100/neponset.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c
index abbe859b265d..6a14d3760ccd 100644
--- a/arch/arm/mach-sa1100/neponset.c
+++ b/arch/arm/mach-sa1100/neponset.c
@@ -138,6 +138,20 @@ static struct sa1100_port_fns neponset_port_fns __devinitdata = {
138 .get_mctrl = neponset_get_mctrl, 138 .get_mctrl = neponset_get_mctrl,
139}; 139};
140 140
141/*
142 * Yes, we really do not have any kind of masking or unmasking
143 */
144static void nochip_noop(struct irq_data *irq)
145{
146}
147
148static struct irq_chip nochip = {
149 .name = "neponset",
150 .irq_ack = nochip_noop,
151 .irq_mask = nochip_noop,
152 .irq_unmask = nochip_noop,
153};
154
141static int __devinit neponset_probe(struct platform_device *dev) 155static int __devinit neponset_probe(struct platform_device *dev)
142{ 156{
143 sa1100_register_uart_fns(&neponset_port_fns); 157 sa1100_register_uart_fns(&neponset_port_fns);
@@ -161,10 +175,13 @@ static int __devinit neponset_probe(struct platform_device *dev)
161 * Setup other Neponset IRQs. SA1111 will be done by the 175 * Setup other Neponset IRQs. SA1111 will be done by the
162 * generic SA1111 code. 176 * generic SA1111 code.
163 */ 177 */
164 irq_set_handler(IRQ_NEPONSET_SMC9196, handle_simple_irq); 178 irq_set_chip_and_handler(IRQ_NEPONSET_SMC9196, &nochip,
179 handle_simple_irq);
165 set_irq_flags(IRQ_NEPONSET_SMC9196, IRQF_VALID | IRQF_PROBE); 180 set_irq_flags(IRQ_NEPONSET_SMC9196, IRQF_VALID | IRQF_PROBE);
166 irq_set_handler(IRQ_NEPONSET_USAR, handle_simple_irq); 181 irq_set_chip_and_handler(IRQ_NEPONSET_USAR, &nochip,
182 handle_simple_irq);
167 set_irq_flags(IRQ_NEPONSET_USAR, IRQF_VALID | IRQF_PROBE); 183 set_irq_flags(IRQ_NEPONSET_USAR, IRQF_VALID | IRQF_PROBE);
184 irq_set_chip(IRQ_NEPONSET_SA1111, &nochip);
168 185
169 /* 186 /*
170 * Disable GPIO 0/1 drivers so the buttons work on the module. 187 * Disable GPIO 0/1 drivers so the buttons work on the module.