diff options
author | Barry Song | 2012-09-27 17:56:10 +0800 |
---|---|---|
committer | Linus Walleij | 2012-09-28 09:27:36 +0200 |
commit | 6fd4011e165e4a28c06a044c919161e657138181 (patch) | |
tree | c87d27e690ddb1ae7ef38675217ec1a25799fe22 /drivers/pinctrl | |
parent | 19830401396d19345ea5ada50a9adddbf1fd65f0 (diff) |
pinctrl: sirf: add lost chained_irq_enter and exit in sirfsoc_gpio_handle_irq
This patch fixes the chained irq hang issue, tested by DM9000 driver using
GPIO0-3(irqnr=131) as the external IRQ on SiRFmarco:
$ cat /proc/interrupts
CPU0 CPU1
32: 1608 0 GIC sirfsoc_timer0
33: 0 3197 GIC sirfsoc_timer1
50: 10207 0 GIC sirfsoc-uart
56: 2 0 GIC cc0e0000.i2c
70: 44 0 GIC mmc0
131: 333 0 sirf-gpio-irq eth0
...
Signed-off-by: Barry Song <Baohua.Song@csr.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/pinctrl-sirf.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-sirf.c b/drivers/pinctrl/pinctrl-sirf.c index 8bf781e8c35e..fa88655c5e96 100644 --- a/drivers/pinctrl/pinctrl-sirf.c +++ b/drivers/pinctrl/pinctrl-sirf.c @@ -24,6 +24,7 @@ #include <linux/bitops.h> #include <linux/gpio.h> #include <linux/of_gpio.h> +#include <asm/mach/irq.h> #define DRIVER_NAME "pinmux-sirf" @@ -1427,6 +1428,9 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc) u32 status, ctrl; int idx = 0; unsigned int first_irq; + struct irq_chip *chip = irq_get_chip(irq); + + chained_irq_enter(chip, desc); status = readl(bank->chip.regs + SIRFSOC_GPIO_INT_STATUS(bank->id)); if (!status) { @@ -1455,6 +1459,8 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc) idx++; status = status >> 1; } + + chained_irq_exit(chip, desc); } static inline void sirfsoc_gpio_set_input(struct sirfsoc_gpio_bank *bank, unsigned ctrl_offset) |