diff options
| author | Marek Szyprowski <m.szyprowski@samsung.com> | 2011-08-12 23:55:36 -0400 |
|---|---|---|
| committer | Kukjin Kim <kgene.kim@samsung.com> | 2011-08-19 07:57:37 -0400 |
| commit | 70b0e82bc7d03d33de5bceea92d419a9be4340ee (patch) | |
| tree | 04c9f2c54ce443fddd37f94b67d8c399372aeaef | |
| parent | 995b528ad25968472742c50fe964d44fac2b857a (diff) | |
ARM: EXYNOS4: add required chained_irq_enter/exit to eint code
This patch adds chained IRQ enter/exit functions to external interrupt
handler in order to function correctly on primary controllers with
different methods of flow control.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
| -rw-r--r-- | arch/arm/mach-exynos4/irq-eint.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/arm/mach-exynos4/irq-eint.c b/arch/arm/mach-exynos4/irq-eint.c index 9d87d2ac7f68..badb8c66fc9b 100644 --- a/arch/arm/mach-exynos4/irq-eint.c +++ b/arch/arm/mach-exynos4/irq-eint.c | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | 23 | ||
| 24 | #include <mach/regs-gpio.h> | 24 | #include <mach/regs-gpio.h> |
| 25 | 25 | ||
| 26 | #include <asm/mach/irq.h> | ||
| 27 | |||
| 26 | static DEFINE_SPINLOCK(eint_lock); | 28 | static DEFINE_SPINLOCK(eint_lock); |
| 27 | 29 | ||
| 28 | static unsigned int eint0_15_data[16]; | 30 | static unsigned int eint0_15_data[16]; |
| @@ -184,8 +186,11 @@ static inline void exynos4_irq_demux_eint(unsigned int start) | |||
| 184 | 186 | ||
| 185 | static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) | 187 | static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) |
| 186 | { | 188 | { |
| 189 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 190 | chained_irq_enter(chip, desc); | ||
| 187 | exynos4_irq_demux_eint(IRQ_EINT(16)); | 191 | exynos4_irq_demux_eint(IRQ_EINT(16)); |
| 188 | exynos4_irq_demux_eint(IRQ_EINT(24)); | 192 | exynos4_irq_demux_eint(IRQ_EINT(24)); |
| 193 | chained_irq_exit(chip, desc); | ||
| 189 | } | 194 | } |
| 190 | 195 | ||
| 191 | static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | 196 | static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) |
| @@ -193,6 +198,7 @@ static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | |||
| 193 | u32 *irq_data = irq_get_handler_data(irq); | 198 | u32 *irq_data = irq_get_handler_data(irq); |
| 194 | struct irq_chip *chip = irq_get_chip(irq); | 199 | struct irq_chip *chip = irq_get_chip(irq); |
| 195 | 200 | ||
| 201 | chained_irq_enter(chip, desc); | ||
| 196 | chip->irq_mask(&desc->irq_data); | 202 | chip->irq_mask(&desc->irq_data); |
| 197 | 203 | ||
| 198 | if (chip->irq_ack) | 204 | if (chip->irq_ack) |
| @@ -201,6 +207,7 @@ static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | |||
| 201 | generic_handle_irq(*irq_data); | 207 | generic_handle_irq(*irq_data); |
| 202 | 208 | ||
| 203 | chip->irq_unmask(&desc->irq_data); | 209 | chip->irq_unmask(&desc->irq_data); |
| 210 | chained_irq_exit(chip, desc); | ||
| 204 | } | 211 | } |
| 205 | 212 | ||
| 206 | int __init exynos4_init_irq_eint(void) | 213 | int __init exynos4_init_irq_eint(void) |
