diff options
Diffstat (limited to 'arch/sh/kernel/irq.c')
-rw-r--r-- | arch/sh/kernel/irq.c | 23 |
1 files changed, 7 insertions, 16 deletions
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index 3b93682bf18..acf2602569c 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/kernel_stat.h> | 12 | #include <linux/kernel_stat.h> |
13 | #include <linux/seq_file.h> | 13 | #include <linux/seq_file.h> |
14 | #include <linux/io.h> | ||
14 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
15 | #include <asm/processor.h> | 16 | #include <asm/processor.h> |
16 | #include <asm/uaccess.h> | 17 | #include <asm/uaccess.h> |
@@ -26,6 +27,7 @@ atomic_t irq_err_count; | |||
26 | */ | 27 | */ |
27 | void ack_bad_irq(unsigned int irq) | 28 | void ack_bad_irq(unsigned int irq) |
28 | { | 29 | { |
30 | atomic_inc(&irq_err_count); | ||
29 | printk("unexpected IRQ trap at vector %02x\n", irq); | 31 | printk("unexpected IRQ trap at vector %02x\n", irq); |
30 | } | 32 | } |
31 | 33 | ||
@@ -85,7 +87,7 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | |||
85 | struct pt_regs regs) | 87 | struct pt_regs regs) |
86 | { | 88 | { |
87 | struct pt_regs *old_regs = set_irq_regs(®s); | 89 | struct pt_regs *old_regs = set_irq_regs(®s); |
88 | int irq = r4; | 90 | int irq; |
89 | #ifdef CONFIG_4KSTACKS | 91 | #ifdef CONFIG_4KSTACKS |
90 | union irq_ctx *curctx, *irqctx; | 92 | union irq_ctx *curctx, *irqctx; |
91 | #endif | 93 | #endif |
@@ -109,20 +111,9 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | |||
109 | #endif | 111 | #endif |
110 | 112 | ||
111 | #ifdef CONFIG_CPU_HAS_INTEVT | 113 | #ifdef CONFIG_CPU_HAS_INTEVT |
112 | __asm__ __volatile__ ( | 114 | irq = (ctrl_inl(INTEVT) >> 5) - 16; |
113 | #ifdef CONFIG_CPU_HAS_SR_RB | ||
114 | "stc r2_bank, %0\n\t" | ||
115 | #else | 115 | #else |
116 | "mov.l @%1, %0\n\t" | 116 | irq = r4; |
117 | #endif | ||
118 | "shlr2 %0\n\t" | ||
119 | "shlr2 %0\n\t" | ||
120 | "shlr %0\n\t" | ||
121 | "add #-16, %0\n\t" | ||
122 | : "=z" (irq), "=r" (r4) | ||
123 | : "1" (INTEVT) | ||
124 | : "memory" | ||
125 | ); | ||
126 | #endif | 117 | #endif |
127 | 118 | ||
128 | irq = irq_demux(irq); | 119 | irq = irq_demux(irq); |
@@ -147,9 +138,9 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, | |||
147 | __asm__ __volatile__ ( | 138 | __asm__ __volatile__ ( |
148 | "mov %0, r4 \n" | 139 | "mov %0, r4 \n" |
149 | "mov r15, r9 \n" | 140 | "mov r15, r9 \n" |
150 | "jsr @%2 \n" | 141 | "jsr @%1 \n" |
151 | /* swith to the irq stack */ | 142 | /* swith to the irq stack */ |
152 | " mov %3, r15 \n" | 143 | " mov %2, r15 \n" |
153 | /* restore the stack (ring zero) */ | 144 | /* restore the stack (ring zero) */ |
154 | "mov r9, r15 \n" | 145 | "mov r9, r15 \n" |
155 | : /* no outputs */ | 146 | : /* no outputs */ |