diff options
Diffstat (limited to 'arch/avr32/mach-at32ap/intc.c')
| -rw-r--r-- | arch/avr32/mach-at32ap/intc.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/avr32/mach-at32ap/intc.c b/arch/avr32/mach-at32ap/intc.c index 74f8c9f2f03d..eb87a18ad7b2 100644 --- a/arch/avr32/mach-at32ap/intc.c +++ b/arch/avr32/mach-at32ap/intc.c | |||
| @@ -52,16 +52,19 @@ static struct intc intc0 = { | |||
| 52 | asmlinkage void do_IRQ(int level, struct pt_regs *regs) | 52 | asmlinkage void do_IRQ(int level, struct pt_regs *regs) |
| 53 | { | 53 | { |
| 54 | struct irq_desc *desc; | 54 | struct irq_desc *desc; |
| 55 | struct pt_regs *old_regs; | ||
| 55 | unsigned int irq; | 56 | unsigned int irq; |
| 56 | unsigned long status_reg; | 57 | unsigned long status_reg; |
| 57 | 58 | ||
| 58 | local_irq_disable(); | 59 | local_irq_disable(); |
| 59 | 60 | ||
| 61 | old_regs = set_irq_regs(regs); | ||
| 62 | |||
| 60 | irq_enter(); | 63 | irq_enter(); |
| 61 | 64 | ||
| 62 | irq = intc_readl(&intc0, INTCAUSE0 - 4 * level); | 65 | irq = intc_readl(&intc0, INTCAUSE0 - 4 * level); |
| 63 | desc = irq_desc + irq; | 66 | desc = irq_desc + irq; |
| 64 | desc->handle_irq(irq, desc, regs); | 67 | desc->handle_irq(irq, desc); |
| 65 | 68 | ||
| 66 | /* | 69 | /* |
| 67 | * Clear all interrupt level masks so that we may handle | 70 | * Clear all interrupt level masks so that we may handle |
| @@ -75,6 +78,8 @@ asmlinkage void do_IRQ(int level, struct pt_regs *regs) | |||
| 75 | sysreg_write(SR, status_reg); | 78 | sysreg_write(SR, status_reg); |
| 76 | 79 | ||
| 77 | irq_exit(); | 80 | irq_exit(); |
| 81 | |||
| 82 | set_irq_regs(old_regs); | ||
| 78 | } | 83 | } |
| 79 | 84 | ||
| 80 | void __init init_IRQ(void) | 85 | void __init init_IRQ(void) |
