diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2006-03-22 23:14:09 +0300 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-03-22 23:14:09 +0300 |
commit | bd115ea007e671e96b8b53c2e0e885103d39fd40 (patch) | |
tree | e33f6a612f0a4dcb447d2bd3ce4678f928d94838 /arch/arm/mach-ixp2000 | |
parent | bec1b8193651ea4394cc4d6e18152cb83e735f93 (diff) | |
download | linux-bd115ea007e671e96b8b53c2e0e885103d39fd40.tar.xz |
[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/arm/mach-ixp2000')
-rw-r--r-- | arch/arm/mach-ixp2000/core.c | 13 |
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); |