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) |