summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLennert Buytenhek <buytenh@wantstofly.org>2006-03-22 20:14:09 +0000
committerRussell King <rmk+kernel@arm.linux.org.uk>2006-03-22 20:14:09 +0000
commitbd115ea007e671e96b8b53c2e0e885103d39fd40 (patch)
treee33f6a612f0a4dcb447d2bd3ce4678f928d94838 /arch
parentbec1b8193651ea4394cc4d6e18152cb83e735f93 (diff)
downloadlinux-bd115ea007e671e96b8b53c2e0e885103d39fd40.tar.bz2
[ARM] 3378/1: ixp2000: fix gpio interrupt handling
Patch from Lennert Buytenhek ixp2000 used to initially mark GPIO interrupts as invalid, and not mark them valid until set_irq_type() was called, but this doesn't work if you want to use request_irq() with the SA_TRIGGER_* flags. So, just mark the GPIO interrupts valid from the beginning. We configure GPIOs as inputs when set_irq_type() is called anyway, so this shouldn't be a problem. Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-ixp2000/core.c13
1 files changed, 1 insertions, 12 deletions
diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c
index cfd5bef3190b..6e8d504aca55 100644
--- a/arch/arm/mach-ixp2000/core.c
+++ b/arch/arm/mach-ixp2000/core.c
@@ -288,8 +288,6 @@ void gpio_line_config(int line, int direction)
local_irq_save(flags);
if (direction == GPIO_OUT) {
- irq_desc[line + IRQ_IXP2000_GPIO0].valid = 0;
-
/* if it's an output, it ain't an interrupt anymore */
GPIO_IRQ_falling_edge &= ~(1 << line);
GPIO_IRQ_rising_edge &= ~(1 << line);
@@ -351,11 +349,6 @@ static int ixp2000_GPIO_irq_type(unsigned int irq, unsigned int type)
GPIO_IRQ_level_high &= ~(1 << line);
update_gpio_int_csrs();
- /*
- * Finally, mark the corresponding IRQ as valid.
- */
- irq_desc[irq].valid = 1;
-
return 0;
}
@@ -506,14 +499,10 @@ void __init ixp2000_init_irq(void)
}
set_irq_chained_handler(IRQ_IXP2000_ERRSUM, ixp2000_err_irq_handler);
- /*
- * GPIO IRQs are invalid until someone sets the interrupt mode
- * by calling set_irq_type().
- */
for (irq = IRQ_IXP2000_GPIO0; irq <= IRQ_IXP2000_GPIO7; irq++) {
set_irq_chip(irq, &ixp2000_GPIO_irq_chip);
set_irq_handler(irq, do_level_IRQ);
- set_irq_flags(irq, 0);
+ set_irq_flags(irq, IRQF_VALID);
}
set_irq_chained_handler(IRQ_IXP2000_GPIO, ixp2000_GPIO_irq_handler);