diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-10-11 03:56:12 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-10-11 03:56:12 -0400 |
commit | 24fcbacedb0d83cabc6761acbecfbf751265ce52 (patch) | |
tree | 7147b206304b028c3cfd5de6317e5c8510098ca9 /arch/powerpc/kernel/irq.c | |
parent | 2f614fe04f4463ff22234133319067d7361f54e5 (diff) | |
parent | 53a5fbdc2dff55161a206ed1a1385a8fa8055c34 (diff) |
Merge branch 'master' into upstream-fixes
Diffstat (limited to 'arch/powerpc/kernel/irq.c')
-rw-r--r-- | arch/powerpc/kernel/irq.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index c3f58f2f9f52..5e37bf14ef2d 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -187,6 +187,7 @@ void fixup_irqs(cpumask_t map) | |||
187 | 187 | ||
188 | void do_IRQ(struct pt_regs *regs) | 188 | void do_IRQ(struct pt_regs *regs) |
189 | { | 189 | { |
190 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
190 | unsigned int irq; | 191 | unsigned int irq; |
191 | #ifdef CONFIG_IRQSTACKS | 192 | #ifdef CONFIG_IRQSTACKS |
192 | struct thread_info *curtp, *irqtp; | 193 | struct thread_info *curtp, *irqtp; |
@@ -216,7 +217,7 @@ void do_IRQ(struct pt_regs *regs) | |||
216 | * The value -2 is for buggy hardware and means that this IRQ | 217 | * The value -2 is for buggy hardware and means that this IRQ |
217 | * has already been handled. -- Tom | 218 | * has already been handled. -- Tom |
218 | */ | 219 | */ |
219 | irq = ppc_md.get_irq(regs); | 220 | irq = ppc_md.get_irq(); |
220 | 221 | ||
221 | if (irq != NO_IRQ && irq != NO_IRQ_IGNORE) { | 222 | if (irq != NO_IRQ && irq != NO_IRQ_IGNORE) { |
222 | #ifdef CONFIG_IRQSTACKS | 223 | #ifdef CONFIG_IRQSTACKS |
@@ -230,18 +231,19 @@ void do_IRQ(struct pt_regs *regs) | |||
230 | handler = &__do_IRQ; | 231 | handler = &__do_IRQ; |
231 | irqtp->task = curtp->task; | 232 | irqtp->task = curtp->task; |
232 | irqtp->flags = 0; | 233 | irqtp->flags = 0; |
233 | call_handle_irq(irq, desc, regs, irqtp, handler); | 234 | call_handle_irq(irq, desc, irqtp, handler); |
234 | irqtp->task = NULL; | 235 | irqtp->task = NULL; |
235 | if (irqtp->flags) | 236 | if (irqtp->flags) |
236 | set_bits(irqtp->flags, &curtp->flags); | 237 | set_bits(irqtp->flags, &curtp->flags); |
237 | } else | 238 | } else |
238 | #endif | 239 | #endif |
239 | generic_handle_irq(irq, regs); | 240 | generic_handle_irq(irq); |
240 | } else if (irq != NO_IRQ_IGNORE) | 241 | } else if (irq != NO_IRQ_IGNORE) |
241 | /* That's not SMP safe ... but who cares ? */ | 242 | /* That's not SMP safe ... but who cares ? */ |
242 | ppc_spurious_interrupts++; | 243 | ppc_spurious_interrupts++; |
243 | 244 | ||
244 | irq_exit(); | 245 | irq_exit(); |
246 | set_irq_regs(old_regs); | ||
245 | 247 | ||
246 | #ifdef CONFIG_PPC_ISERIES | 248 | #ifdef CONFIG_PPC_ISERIES |
247 | if (get_lppaca()->int_dword.fields.decr_int) { | 249 | if (get_lppaca()->int_dword.fields.decr_int) { |
@@ -570,8 +572,8 @@ unsigned int irq_create_mapping(struct irq_host *host, | |||
570 | } | 572 | } |
571 | EXPORT_SYMBOL_GPL(irq_create_mapping); | 573 | EXPORT_SYMBOL_GPL(irq_create_mapping); |
572 | 574 | ||
573 | extern unsigned int irq_create_of_mapping(struct device_node *controller, | 575 | unsigned int irq_create_of_mapping(struct device_node *controller, |
574 | u32 *intspec, unsigned int intsize) | 576 | u32 *intspec, unsigned int intsize) |
575 | { | 577 | { |
576 | struct irq_host *host; | 578 | struct irq_host *host; |
577 | irq_hw_number_t hwirq; | 579 | irq_hw_number_t hwirq; |