diff options
Diffstat (limited to 'arch/mips/philips')
-rw-r--r-- | arch/mips/philips/pnx8550/common/int.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/arch/mips/philips/pnx8550/common/int.c b/arch/mips/philips/pnx8550/common/int.c index 3c93512be1ec..710611615ca2 100644 --- a/arch/mips/philips/pnx8550/common/int.c +++ b/arch/mips/philips/pnx8550/common/int.c | |||
@@ -23,6 +23,7 @@ | |||
23 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | 23 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. |
24 | * | 24 | * |
25 | */ | 25 | */ |
26 | #include <linux/compiler.h> | ||
26 | #include <linux/init.h> | 27 | #include <linux/init.h> |
27 | #include <linux/irq.h> | 28 | #include <linux/irq.h> |
28 | #include <linux/sched.h> | 29 | #include <linux/sched.h> |
@@ -52,7 +53,7 @@ static char gic_prio[PNX8550_INT_GIC_TOTINT] = { | |||
52 | 1 // 70 | 53 | 1 // 70 |
53 | }; | 54 | }; |
54 | 55 | ||
55 | static void hw0_irqdispatch(int irq, struct pt_regs *regs) | 56 | static void hw0_irqdispatch(int irq) |
56 | { | 57 | { |
57 | /* find out which interrupt */ | 58 | /* find out which interrupt */ |
58 | irq = PNX8550_GIC_VECTOR_0 >> 3; | 59 | irq = PNX8550_GIC_VECTOR_0 >> 3; |
@@ -61,42 +62,39 @@ static void hw0_irqdispatch(int irq, struct pt_regs *regs) | |||
61 | printk("hw0_irqdispatch: irq 0, spurious interrupt?\n"); | 62 | printk("hw0_irqdispatch: irq 0, spurious interrupt?\n"); |
62 | return; | 63 | return; |
63 | } | 64 | } |
64 | do_IRQ(PNX8550_INT_GIC_MIN + irq, regs); | 65 | do_IRQ(PNX8550_INT_GIC_MIN + irq); |
65 | } | 66 | } |
66 | 67 | ||
67 | 68 | ||
68 | static void timer_irqdispatch(int irq, struct pt_regs *regs) | 69 | static void timer_irqdispatch(int irq) |
69 | { | 70 | { |
70 | irq = (0x01c0 & read_c0_config7()) >> 6; | 71 | irq = (0x01c0 & read_c0_config7()) >> 6; |
71 | 72 | ||
72 | if (irq == 0) { | 73 | if (unlikely(irq == 0)) { |
73 | printk("timer_irqdispatch: irq 0, spurious interrupt?\n"); | 74 | printk("timer_irqdispatch: irq 0, spurious interrupt?\n"); |
74 | return; | 75 | return; |
75 | } | 76 | } |
76 | 77 | ||
77 | if (irq & 0x1) { | 78 | if (irq & 0x1) |
78 | do_IRQ(PNX8550_INT_TIMER1, regs); | 79 | do_IRQ(PNX8550_INT_TIMER1); |
79 | } | 80 | if (irq & 0x2) |
80 | if (irq & 0x2) { | 81 | do_IRQ(PNX8550_INT_TIMER2); |
81 | do_IRQ(PNX8550_INT_TIMER2, regs); | 82 | if (irq & 0x4) |
82 | } | 83 | do_IRQ(PNX8550_INT_TIMER3); |
83 | if (irq & 0x4) { | ||
84 | do_IRQ(PNX8550_INT_TIMER3, regs); | ||
85 | } | ||
86 | } | 84 | } |
87 | 85 | ||
88 | asmlinkage void plat_irq_dispatch(struct pt_regs *regs) | 86 | asmlinkage void plat_irq_dispatch(void) |
89 | { | 87 | { |
90 | unsigned int pending = read_c0_status() & read_c0_cause(); | 88 | unsigned int pending = read_c0_status() & read_c0_cause(); |
91 | 89 | ||
92 | if (pending & STATUSF_IP2) | 90 | if (pending & STATUSF_IP2) |
93 | hw0_irqdispatch(2, regs); | 91 | hw0_irqdispatch(2); |
94 | else if (pending & STATUSF_IP7) { | 92 | else if (pending & STATUSF_IP7) { |
95 | if (read_c0_config7() & 0x01c0) | 93 | if (read_c0_config7() & 0x01c0) |
96 | timer_irqdispatch(7, regs); | 94 | timer_irqdispatch(7); |
97 | } | 95 | } |
98 | 96 | ||
99 | spurious_interrupt(regs); | 97 | spurious_interrupt(); |
100 | } | 98 | } |
101 | 99 | ||
102 | static inline void modify_cp0_intmask(unsigned clr_mask, unsigned set_mask) | 100 | static inline void modify_cp0_intmask(unsigned clr_mask, unsigned set_mask) |