aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/kernel/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64/kernel/irq.c')
-rw-r--r--arch/sparc64/kernel/irq.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
index 4e64724cb9ae..d64b1ea848de 100644
--- a/arch/sparc64/kernel/irq.c
+++ b/arch/sparc64/kernel/irq.c
@@ -522,12 +522,13 @@ void ack_bad_irq(unsigned int virt_irq)
522} 522}
523 523
524#ifndef CONFIG_SMP 524#ifndef CONFIG_SMP
525extern irqreturn_t timer_interrupt(int, void *, struct pt_regs *); 525extern irqreturn_t timer_interrupt(int, void *);
526 526
527void timer_irq(int irq, struct pt_regs *regs) 527void timer_irq(int irq, struct pt_regs *regs)
528{ 528{
529 unsigned long clr_mask = 1 << irq; 529 unsigned long clr_mask = 1 << irq;
530 unsigned long tick_mask = tick_ops->softint_mask; 530 unsigned long tick_mask = tick_ops->softint_mask;
531 struct pt_regs *old_regs;
531 532
532 if (get_softint() & tick_mask) { 533 if (get_softint() & tick_mask) {
533 irq = 0; 534 irq = 0;
@@ -535,21 +536,25 @@ void timer_irq(int irq, struct pt_regs *regs)
535 } 536 }
536 clear_softint(clr_mask); 537 clear_softint(clr_mask);
537 538
539 old_regs = set_irq_regs(regs);
538 irq_enter(); 540 irq_enter();
539 541
540 kstat_this_cpu.irqs[0]++; 542 kstat_this_cpu.irqs[0]++;
541 timer_interrupt(irq, NULL, regs); 543 timer_interrupt(irq, NULL);
542 544
543 irq_exit(); 545 irq_exit();
546 set_irq_regs(old_regs);
544} 547}
545#endif 548#endif
546 549
547void handler_irq(int irq, struct pt_regs *regs) 550void handler_irq(int irq, struct pt_regs *regs)
548{ 551{
549 struct ino_bucket *bucket; 552 struct ino_bucket *bucket;
553 struct pt_regs *old_regs;
550 554
551 clear_softint(1 << irq); 555 clear_softint(1 << irq);
552 556
557 old_regs = set_irq_regs(regs);
553 irq_enter(); 558 irq_enter();
554 559
555 /* Sliiiick... */ 560 /* Sliiiick... */
@@ -558,12 +563,13 @@ void handler_irq(int irq, struct pt_regs *regs)
558 struct ino_bucket *next = __bucket(bucket->irq_chain); 563 struct ino_bucket *next = __bucket(bucket->irq_chain);
559 564
560 bucket->irq_chain = 0; 565 bucket->irq_chain = 0;
561 __do_IRQ(bucket->virt_irq, regs); 566 __do_IRQ(bucket->virt_irq);
562 567
563 bucket = next; 568 bucket = next;
564 } 569 }
565 570
566 irq_exit(); 571 irq_exit();
572 set_irq_regs(old_regs);
567} 573}
568 574
569struct sun5_timer { 575struct sun5_timer {