diff options
author | Will Deacon <will.deacon@arm.com> | 2011-02-21 08:58:10 -0500 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2011-05-11 11:04:15 -0400 |
commit | 98022940c2431025be3c95e50035d762c40f539d (patch) | |
tree | 76652a069c185400939cfa19b8e2615072435294 /arch/arm/mach-tegra/gpio.c | |
parent | adfed159ab71bff53ccac3013776580bc866d2ba (diff) |
ARM: tegra: update GPIO chained IRQ handler to use entry/exit functions
This patch updates the Tegra gpio chained IRQ handler to use the chained
IRQ enter/exit functions in order to function correctly on primary
controllers with different methods of flow control.
This is required for the GIC to move to fasteoi interrupt handling.
Acked-by: Colin Cross <ccross@android.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm/mach-tegra/gpio.c')
-rw-r--r-- | arch/arm/mach-tegra/gpio.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/arm/mach-tegra/gpio.c b/arch/arm/mach-tegra/gpio.c index 65a1aba6823d..919d63837736 100644 --- a/arch/arm/mach-tegra/gpio.c +++ b/arch/arm/mach-tegra/gpio.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
26 | 26 | ||
27 | #include <asm/mach/irq.h> | ||
28 | |||
27 | #include <mach/iomap.h> | 29 | #include <mach/iomap.h> |
28 | #include <mach/suspend.h> | 30 | #include <mach/suspend.h> |
29 | 31 | ||
@@ -221,8 +223,9 @@ static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
221 | int port; | 223 | int port; |
222 | int pin; | 224 | int pin; |
223 | int unmasked = 0; | 225 | int unmasked = 0; |
226 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
224 | 227 | ||
225 | desc->irq_data.chip->irq_ack(&desc->irq_data); | 228 | chained_irq_enter(chip, desc); |
226 | 229 | ||
227 | bank = irq_get_handler_data(irq); | 230 | bank = irq_get_handler_data(irq); |
228 | 231 | ||
@@ -241,7 +244,7 @@ static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
241 | */ | 244 | */ |
242 | if (lvl & (0x100 << pin)) { | 245 | if (lvl & (0x100 << pin)) { |
243 | unmasked = 1; | 246 | unmasked = 1; |
244 | desc->irq_data.chip->irq_unmask(&desc->irq_data); | 247 | chained_irq_exit(chip, desc); |
245 | } | 248 | } |
246 | 249 | ||
247 | generic_handle_irq(gpio_to_irq(gpio + pin)); | 250 | generic_handle_irq(gpio_to_irq(gpio + pin)); |
@@ -249,7 +252,7 @@ static void tegra_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
249 | } | 252 | } |
250 | 253 | ||
251 | if (!unmasked) | 254 | if (!unmasked) |
252 | desc->irq_data.chip->irq_unmask(&desc->irq_data); | 255 | chained_irq_exit(chip, desc); |
253 | 256 | ||
254 | } | 257 | } |
255 | 258 | ||