aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@ftp.linux.org.uk>2006-10-08 09:36:08 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-08 15:32:35 -0400
commit7ca56053b29633ef08b14e5ca16c663363edac36 (patch)
treef8940145602aca5ea9ff35c9c8b5dc508e23d611
parent8dab42a96781a1100a6b5cc6a66953fc51c30bc1 (diff)
[PATCH] alpha pt_regs cleanups: device_interrupt
callers of ->device_interrupt() do set_irq_regs() now; pt_regs argument removed, remaining uses of regs in instances of ->device_interrupt() are switched to get_irq_regs() and will be gone in the next patch. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/alpha/kernel/irq_alpha.c5
-rw-r--r--arch/alpha/kernel/irq_i8259.c4
-rw-r--r--arch/alpha/kernel/irq_impl.h6
-rw-r--r--arch/alpha/kernel/irq_pyxis.c6
-rw-r--r--arch/alpha/kernel/irq_srm.c4
-rw-r--r--arch/alpha/kernel/sys_alcor.c6
-rw-r--r--arch/alpha/kernel/sys_cabriolet.c16
-rw-r--r--arch/alpha/kernel/sys_dp264.c14
-rw-r--r--arch/alpha/kernel/sys_eb64p.c6
-rw-r--r--arch/alpha/kernel/sys_eiger.c16
-rw-r--r--arch/alpha/kernel/sys_jensen.c6
-rw-r--r--arch/alpha/kernel/sys_marvel.c4
-rw-r--r--arch/alpha/kernel/sys_miata.c4
-rw-r--r--arch/alpha/kernel/sys_mikasa.c6
-rw-r--r--arch/alpha/kernel/sys_noritake.c10
-rw-r--r--arch/alpha/kernel/sys_rawhide.c4
-rw-r--r--arch/alpha/kernel/sys_rx164.c6
-rw-r--r--arch/alpha/kernel/sys_sable.c4
-rw-r--r--arch/alpha/kernel/sys_takara.c16
-rw-r--r--arch/alpha/kernel/sys_titan.c11
-rw-r--r--arch/alpha/kernel/sys_wildfire.c4
-rw-r--r--include/asm-alpha/machvec.h2
22 files changed, 83 insertions, 77 deletions
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c
index ddf5cf8dcb0b..d14cc423aa48 100644
--- a/arch/alpha/kernel/irq_alpha.c
+++ b/arch/alpha/kernel/irq_alpha.c
@@ -39,6 +39,7 @@ asmlinkage void
39do_entInt(unsigned long type, unsigned long vector, 39do_entInt(unsigned long type, unsigned long vector,
40 unsigned long la_ptr, struct pt_regs *regs) 40 unsigned long la_ptr, struct pt_regs *regs)
41{ 41{
42 struct pt_regs *old_regs;
42 switch (type) { 43 switch (type) {
43 case 0: 44 case 0:
44#ifdef CONFIG_SMP 45#ifdef CONFIG_SMP
@@ -72,7 +73,9 @@ do_entInt(unsigned long type, unsigned long vector,
72 alpha_mv.machine_check(vector, la_ptr, regs); 73 alpha_mv.machine_check(vector, la_ptr, regs);
73 return; 74 return;
74 case 3: 75 case 3:
75 alpha_mv.device_interrupt(vector, regs); 76 old_regs = set_irq_regs(regs);
77 alpha_mv.device_interrupt(vector);
78 set_irq_regs(old_regs);
76 return; 79 return;
77 case 4: 80 case 4:
78 perf_irq(la_ptr, regs); 81 perf_irq(la_ptr, regs);
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c
index ebbadbc0c36a..6c70f8b97b72 100644
--- a/arch/alpha/kernel/irq_i8259.c
+++ b/arch/alpha/kernel/irq_i8259.c
@@ -137,7 +137,7 @@ init_i8259a_irqs(void)
137 137
138#if defined(IACK_SC) 138#if defined(IACK_SC)
139void 139void
140isa_device_interrupt(unsigned long vector, struct pt_regs *regs) 140isa_device_interrupt(unsigned long vector)
141{ 141{
142 /* 142 /*
143 * Generate a PCI interrupt acknowledge cycle. The PIC will 143 * Generate a PCI interrupt acknowledge cycle. The PIC will
@@ -147,7 +147,7 @@ isa_device_interrupt(unsigned long vector, struct pt_regs *regs)
147 */ 147 */
148 int j = *(vuip) IACK_SC; 148 int j = *(vuip) IACK_SC;
149 j &= 0xff; 149 j &= 0xff;
150 handle_irq(j, regs); 150 handle_irq(j, get_irq_regs());
151} 151}
152#endif 152#endif
153 153
diff --git a/arch/alpha/kernel/irq_impl.h b/arch/alpha/kernel/irq_impl.h
index f201d8ffc0d9..5d84dbdcdb89 100644
--- a/arch/alpha/kernel/irq_impl.h
+++ b/arch/alpha/kernel/irq_impl.h
@@ -15,10 +15,10 @@
15 15
16#define RTC_IRQ 8 16#define RTC_IRQ 8
17 17
18extern void isa_device_interrupt(unsigned long, struct pt_regs *); 18extern void isa_device_interrupt(unsigned long);
19extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *); 19extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *);
20extern void srm_device_interrupt(unsigned long, struct pt_regs *); 20extern void srm_device_interrupt(unsigned long);
21extern void pyxis_device_interrupt(unsigned long, struct pt_regs *); 21extern void pyxis_device_interrupt(unsigned long);
22 22
23extern struct irqaction timer_irqaction; 23extern struct irqaction timer_irqaction;
24extern struct irqaction isa_cascade_irqaction; 24extern struct irqaction isa_cascade_irqaction;
diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c
index 3b581415bab0..686dc22111b2 100644
--- a/arch/alpha/kernel/irq_pyxis.c
+++ b/arch/alpha/kernel/irq_pyxis.c
@@ -81,7 +81,7 @@ static struct hw_interrupt_type pyxis_irq_type = {
81}; 81};
82 82
83void 83void
84pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs) 84pyxis_device_interrupt(unsigned long vector)
85{ 85{
86 unsigned long pld; 86 unsigned long pld;
87 unsigned int i; 87 unsigned int i;
@@ -98,9 +98,9 @@ pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs)
98 i = ffz(~pld); 98 i = ffz(~pld);
99 pld &= pld - 1; /* clear least bit set */ 99 pld &= pld - 1; /* clear least bit set */
100 if (i == 7) 100 if (i == 7)
101 isa_device_interrupt(vector, regs); 101 isa_device_interrupt(vector);
102 else 102 else
103 handle_irq(16+i, regs); 103 handle_irq(16+i, get_irq_regs());
104 } 104 }
105} 105}
106 106
diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c
index 8e4d121f84cc..2e9f6d421a8e 100644
--- a/arch/alpha/kernel/irq_srm.c
+++ b/arch/alpha/kernel/irq_srm.c
@@ -72,8 +72,8 @@ init_srm_irqs(long max, unsigned long ignore_mask)
72} 72}
73 73
74void 74void
75srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 75srm_device_interrupt(unsigned long vector)
76{ 76{
77 int irq = (vector - 0x800) >> 4; 77 int irq = (vector - 0x800) >> 4;
78 handle_irq(irq, regs); 78 handle_irq(irq, get_irq_regs());
79} 79}
diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c
index d6926b7b1e99..2d412c876549 100644
--- a/arch/alpha/kernel/sys_alcor.c
+++ b/arch/alpha/kernel/sys_alcor.c
@@ -100,7 +100,7 @@ static struct hw_interrupt_type alcor_irq_type = {
100}; 100};
101 101
102static void 102static void
103alcor_device_interrupt(unsigned long vector, struct pt_regs *regs) 103alcor_device_interrupt(unsigned long vector)
104{ 104{
105 unsigned long pld; 105 unsigned long pld;
106 unsigned int i; 106 unsigned int i;
@@ -116,9 +116,9 @@ alcor_device_interrupt(unsigned long vector, struct pt_regs *regs)
116 i = ffz(~pld); 116 i = ffz(~pld);
117 pld &= pld - 1; /* clear least bit set */ 117 pld &= pld - 1; /* clear least bit set */
118 if (i == 31) { 118 if (i == 31) {
119 isa_device_interrupt(vector, regs); 119 isa_device_interrupt(vector);
120 } else { 120 } else {
121 handle_irq(16 + i, regs); 121 handle_irq(16 + i, get_irq_regs());
122 } 122 }
123 } 123 }
124} 124}
diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c
index 25a215067da8..e75f0cea6fcc 100644
--- a/arch/alpha/kernel/sys_cabriolet.c
+++ b/arch/alpha/kernel/sys_cabriolet.c
@@ -82,7 +82,7 @@ static struct hw_interrupt_type cabriolet_irq_type = {
82}; 82};
83 83
84static void 84static void
85cabriolet_device_interrupt(unsigned long v, struct pt_regs *r) 85cabriolet_device_interrupt(unsigned long v)
86{ 86{
87 unsigned long pld; 87 unsigned long pld;
88 unsigned int i; 88 unsigned int i;
@@ -98,15 +98,15 @@ cabriolet_device_interrupt(unsigned long v, struct pt_regs *r)
98 i = ffz(~pld); 98 i = ffz(~pld);
99 pld &= pld - 1; /* clear least bit set */ 99 pld &= pld - 1; /* clear least bit set */
100 if (i == 4) { 100 if (i == 4) {
101 isa_device_interrupt(v, r); 101 isa_device_interrupt(v);
102 } else { 102 } else {
103 handle_irq(16 + i, r); 103 handle_irq(16 + i, get_irq_regs());
104 } 104 }
105 } 105 }
106} 106}
107 107
108static void __init 108static void __init
109common_init_irq(void (*srm_dev_int)(unsigned long v, struct pt_regs *r)) 109common_init_irq(void (*srm_dev_int)(unsigned long v))
110{ 110{
111 init_i8259a_irqs(); 111 init_i8259a_irqs();
112 112
@@ -154,18 +154,18 @@ cabriolet_init_irq(void)
154 too invasive though. */ 154 too invasive though. */
155 155
156static void 156static void
157pc164_srm_device_interrupt(unsigned long v, struct pt_regs *r) 157pc164_srm_device_interrupt(unsigned long v)
158{ 158{
159 __min_ipl = getipl(); 159 __min_ipl = getipl();
160 srm_device_interrupt(v, r); 160 srm_device_interrupt(v);
161 __min_ipl = 0; 161 __min_ipl = 0;
162} 162}
163 163
164static void 164static void
165pc164_device_interrupt(unsigned long v, struct pt_regs *r) 165pc164_device_interrupt(unsigned long v)
166{ 166{
167 __min_ipl = getipl(); 167 __min_ipl = getipl();
168 cabriolet_device_interrupt(v, r); 168 cabriolet_device_interrupt(v);
169 __min_ipl = 0; 169 __min_ipl = 0;
170} 170}
171 171
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c
index dd6103b867e7..57dce0098a1b 100644
--- a/arch/alpha/kernel/sys_dp264.c
+++ b/arch/alpha/kernel/sys_dp264.c
@@ -217,7 +217,7 @@ static struct hw_interrupt_type clipper_irq_type = {
217}; 217};
218 218
219static void 219static void
220dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) 220dp264_device_interrupt(unsigned long vector)
221{ 221{
222#if 1 222#if 1
223 printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n"); 223 printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n");
@@ -236,9 +236,9 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
236 i = ffz(~pld); 236 i = ffz(~pld);
237 pld &= pld - 1; /* clear least bit set */ 237 pld &= pld - 1; /* clear least bit set */
238 if (i == 55) 238 if (i == 55)
239 isa_device_interrupt(vector, regs); 239 isa_device_interrupt(vector);
240 else 240 else
241 handle_irq(16 + i, 16 + i, regs); 241 handle_irq(16 + i, get_irq_regs());
242#if 0 242#if 0
243 TSUNAMI_cchip->dir0.csr = 1UL << i; mb(); 243 TSUNAMI_cchip->dir0.csr = 1UL << i; mb();
244 tmp = TSUNAMI_cchip->dir0.csr; 244 tmp = TSUNAMI_cchip->dir0.csr;
@@ -248,7 +248,7 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
248} 248}
249 249
250static void 250static void
251dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 251dp264_srm_device_interrupt(unsigned long vector)
252{ 252{
253 int irq; 253 int irq;
254 254
@@ -268,11 +268,11 @@ dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
268 if (irq >= 32) 268 if (irq >= 32)
269 irq -= 16; 269 irq -= 16;
270 270
271 handle_irq(irq, regs); 271 handle_irq(irq, get_irq_regs());
272} 272}
273 273
274static void 274static void
275clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 275clipper_srm_device_interrupt(unsigned long vector)
276{ 276{
277 int irq; 277 int irq;
278 278
@@ -290,7 +290,7 @@ clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
290 * 290 *
291 * Eg IRQ 24 is DRIR bit 8, etc, etc 291 * Eg IRQ 24 is DRIR bit 8, etc, etc
292 */ 292 */
293 handle_irq(irq, regs); 293 handle_irq(irq, get_irq_regs());
294} 294}
295 295
296static void __init 296static void __init
diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c
index ed108b66ec09..90d27256d7d6 100644
--- a/arch/alpha/kernel/sys_eb64p.c
+++ b/arch/alpha/kernel/sys_eb64p.c
@@ -80,7 +80,7 @@ static struct hw_interrupt_type eb64p_irq_type = {
80}; 80};
81 81
82static void 82static void
83eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs) 83eb64p_device_interrupt(unsigned long vector)
84{ 84{
85 unsigned long pld; 85 unsigned long pld;
86 unsigned int i; 86 unsigned int i;
@@ -97,9 +97,9 @@ eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs)
97 pld &= pld - 1; /* clear least bit set */ 97 pld &= pld - 1; /* clear least bit set */
98 98
99 if (i == 5) { 99 if (i == 5) {
100 isa_device_interrupt(vector, regs); 100 isa_device_interrupt(vector);
101 } else { 101 } else {
102 handle_irq(16 + i, regs); 102 handle_irq(16 + i, get_irq_regs());
103 } 103 }
104 } 104 }
105} 105}
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c
index 64a785baf53a..f38cded2df97 100644
--- a/arch/alpha/kernel/sys_eiger.c
+++ b/arch/alpha/kernel/sys_eiger.c
@@ -91,7 +91,7 @@ static struct hw_interrupt_type eiger_irq_type = {
91}; 91};
92 92
93static void 93static void
94eiger_device_interrupt(unsigned long vector, struct pt_regs * regs) 94eiger_device_interrupt(unsigned long vector)
95{ 95{
96 unsigned intstatus; 96 unsigned intstatus;
97 97
@@ -118,20 +118,20 @@ eiger_device_interrupt(unsigned long vector, struct pt_regs * regs)
118 * despatch an interrupt if it's set. 118 * despatch an interrupt if it's set.
119 */ 119 */
120 120
121 if (intstatus & 8) handle_irq(16+3, regs); 121 if (intstatus & 8) handle_irq(16+3, get_irq_regs());
122 if (intstatus & 4) handle_irq(16+2, regs); 122 if (intstatus & 4) handle_irq(16+2, get_irq_regs());
123 if (intstatus & 2) handle_irq(16+1, regs); 123 if (intstatus & 2) handle_irq(16+1, get_irq_regs());
124 if (intstatus & 1) handle_irq(16+0, regs); 124 if (intstatus & 1) handle_irq(16+0, get_irq_regs());
125 } else { 125 } else {
126 isa_device_interrupt(vector, regs); 126 isa_device_interrupt(vector);
127 } 127 }
128} 128}
129 129
130static void 130static void
131eiger_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 131eiger_srm_device_interrupt(unsigned long vector)
132{ 132{
133 int irq = (vector - 0x800) >> 4; 133 int irq = (vector - 0x800) >> 4;
134 handle_irq(irq, regs); 134 handle_irq(irq, get_irq_regs());
135} 135}
136 136
137static void __init 137static void __init
diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c
index 4ac2b328b8de..fc316369f4d4 100644
--- a/arch/alpha/kernel/sys_jensen.c
+++ b/arch/alpha/kernel/sys_jensen.c
@@ -129,7 +129,7 @@ static struct hw_interrupt_type jensen_local_irq_type = {
129}; 129};
130 130
131static void 131static void
132jensen_device_interrupt(unsigned long vector, struct pt_regs * regs) 132jensen_device_interrupt(unsigned long vector)
133{ 133{
134 int irq; 134 int irq;
135 135
@@ -189,7 +189,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
189 if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) || 189 if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) ||
190 irq != last_irq) { 190 irq != last_irq) {
191 printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n", 191 printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n",
192 irq, count, cc-last_cc, regs->pc); 192 irq, count, cc-last_cc, get_irq_regs()->pc);
193 count = 0; 193 count = 0;
194 last_msg = cc; 194 last_msg = cc;
195 last_irq = irq; 195 last_irq = irq;
@@ -198,7 +198,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
198 } 198 }
199#endif 199#endif
200 200
201 handle_irq(irq, regs); 201 handle_irq(irq, get_irq_regs());
202} 202}
203 203
204static void __init 204static void __init
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c
index 36d215954376..4ea5615be43a 100644
--- a/arch/alpha/kernel/sys_marvel.c
+++ b/arch/alpha/kernel/sys_marvel.c
@@ -38,7 +38,7 @@
38 * Interrupt handling. 38 * Interrupt handling.
39 */ 39 */
40static void 40static void
41io7_device_interrupt(unsigned long vector, struct pt_regs * regs) 41io7_device_interrupt(unsigned long vector)
42{ 42{
43 unsigned int pid; 43 unsigned int pid;
44 unsigned int irq; 44 unsigned int irq;
@@ -64,7 +64,7 @@ io7_device_interrupt(unsigned long vector, struct pt_regs * regs)
64 irq &= MARVEL_IRQ_VEC_IRQ_MASK; /* not too many bits */ 64 irq &= MARVEL_IRQ_VEC_IRQ_MASK; /* not too many bits */
65 irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT; /* merge the pid */ 65 irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT; /* merge the pid */
66 66
67 handle_irq(irq, regs); 67 handle_irq(irq, get_irq_regs());
68} 68}
69 69
70static volatile unsigned long * 70static volatile unsigned long *
diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c
index 61ac56f8eeea..fbbd95212a96 100644
--- a/arch/alpha/kernel/sys_miata.c
+++ b/arch/alpha/kernel/sys_miata.c
@@ -33,7 +33,7 @@
33 33
34 34
35static void 35static void
36miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 36miata_srm_device_interrupt(unsigned long vector)
37{ 37{
38 int irq; 38 int irq;
39 39
@@ -56,7 +56,7 @@ miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
56 if (irq >= 16) 56 if (irq >= 16)
57 irq = irq + 8; 57 irq = irq + 8;
58 58
59 handle_irq(irq, regs); 59 handle_irq(irq, get_irq_regs());
60} 60}
61 61
62static void __init 62static void __init
diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c
index cc4c58111366..5429ba0e08f1 100644
--- a/arch/alpha/kernel/sys_mikasa.c
+++ b/arch/alpha/kernel/sys_mikasa.c
@@ -79,7 +79,7 @@ static struct hw_interrupt_type mikasa_irq_type = {
79}; 79};
80 80
81static void 81static void
82mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs) 82mikasa_device_interrupt(unsigned long vector)
83{ 83{
84 unsigned long pld; 84 unsigned long pld;
85 unsigned int i; 85 unsigned int i;
@@ -97,9 +97,9 @@ mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs)
97 i = ffz(~pld); 97 i = ffz(~pld);
98 pld &= pld - 1; /* clear least bit set */ 98 pld &= pld - 1; /* clear least bit set */
99 if (i < 16) { 99 if (i < 16) {
100 isa_device_interrupt(vector, regs); 100 isa_device_interrupt(vector);
101 } else { 101 } else {
102 handle_irq(i, regs); 102 handle_irq(i, get_irq_regs());
103 } 103 }
104 } 104 }
105} 105}
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c
index 2d3cff7e8c5f..b9a843447b89 100644
--- a/arch/alpha/kernel/sys_noritake.c
+++ b/arch/alpha/kernel/sys_noritake.c
@@ -77,7 +77,7 @@ static struct hw_interrupt_type noritake_irq_type = {
77}; 77};
78 78
79static void 79static void
80noritake_device_interrupt(unsigned long vector, struct pt_regs *regs) 80noritake_device_interrupt(unsigned long vector)
81{ 81{
82 unsigned long pld; 82 unsigned long pld;
83 unsigned int i; 83 unsigned int i;
@@ -96,15 +96,15 @@ noritake_device_interrupt(unsigned long vector, struct pt_regs *regs)
96 i = ffz(~pld); 96 i = ffz(~pld);
97 pld &= pld - 1; /* clear least bit set */ 97 pld &= pld - 1; /* clear least bit set */
98 if (i < 16) { 98 if (i < 16) {
99 isa_device_interrupt(vector, regs); 99 isa_device_interrupt(vector);
100 } else { 100 } else {
101 handle_irq(i, regs); 101 handle_irq(i, get_irq_regs());
102 } 102 }
103 } 103 }
104} 104}
105 105
106static void 106static void
107noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 107noritake_srm_device_interrupt(unsigned long vector)
108{ 108{
109 int irq; 109 int irq;
110 110
@@ -122,7 +122,7 @@ noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
122 if (irq >= 16) 122 if (irq >= 16)
123 irq = irq + 1; 123 irq = irq + 1;
124 124
125 handle_irq(irq, regs); 125 handle_irq(irq, get_irq_regs());
126} 126}
127 127
128static void __init 128static void __init
diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c
index 949607e3d6fb..bef65162bfab 100644
--- a/arch/alpha/kernel/sys_rawhide.c
+++ b/arch/alpha/kernel/sys_rawhide.c
@@ -134,7 +134,7 @@ static struct hw_interrupt_type rawhide_irq_type = {
134}; 134};
135 135
136static void 136static void
137rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 137rawhide_srm_device_interrupt(unsigned long vector)
138{ 138{
139 int irq; 139 int irq;
140 140
@@ -158,7 +158,7 @@ rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
158 /* Adjust by which hose it is from. */ 158 /* Adjust by which hose it is from. */
159 irq -= ((irq + 16) >> 2) & 0x38; 159 irq -= ((irq + 16) >> 2) & 0x38;
160 160
161 handle_irq(irq, regs); 161 handle_irq(irq, get_irq_regs());
162} 162}
163 163
164static void __init 164static void __init
diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c
index 6ae506052635..fa8eef8dd8c6 100644
--- a/arch/alpha/kernel/sys_rx164.c
+++ b/arch/alpha/kernel/sys_rx164.c
@@ -83,7 +83,7 @@ static struct hw_interrupt_type rx164_irq_type = {
83}; 83};
84 84
85static void 85static void
86rx164_device_interrupt(unsigned long vector, struct pt_regs *regs) 86rx164_device_interrupt(unsigned long vector)
87{ 87{
88 unsigned long pld; 88 unsigned long pld;
89 volatile unsigned int *dirr; 89 volatile unsigned int *dirr;
@@ -102,9 +102,9 @@ rx164_device_interrupt(unsigned long vector, struct pt_regs *regs)
102 i = ffz(~pld); 102 i = ffz(~pld);
103 pld &= pld - 1; /* clear least bit set */ 103 pld &= pld - 1; /* clear least bit set */
104 if (i == 20) { 104 if (i == 20) {
105 isa_no_iack_sc_device_interrupt(vector, regs); 105 isa_no_iack_sc_device_interrupt(vector, get_irq_regs());
106 } else { 106 } else {
107 handle_irq(16+i, regs); 107 handle_irq(16+i, get_irq_regs());
108 } 108 }
109 } 109 }
110} 110}
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c
index a7a14647b50e..791379101e7c 100644
--- a/arch/alpha/kernel/sys_sable.c
+++ b/arch/alpha/kernel/sys_sable.c
@@ -512,7 +512,7 @@ static struct hw_interrupt_type sable_lynx_irq_type = {
512}; 512};
513 513
514static void 514static void
515sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 515sable_lynx_srm_device_interrupt(unsigned long vector)
516{ 516{
517 /* Note that the vector reported by the SRM PALcode corresponds 517 /* Note that the vector reported by the SRM PALcode corresponds
518 to the interrupt mask bits, but we have to manage via the 518 to the interrupt mask bits, but we have to manage via the
@@ -526,7 +526,7 @@ sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
526 printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n", 526 printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n",
527 __FUNCTION__, vector, bit, irq); 527 __FUNCTION__, vector, bit, irq);
528#endif 528#endif
529 handle_irq(irq, regs); 529 handle_irq(irq, get_irq_regs());
530} 530}
531 531
532static void __init 532static void __init
diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c
index 2c75cd1fd81a..ce2d3b081dc8 100644
--- a/arch/alpha/kernel/sys_takara.c
+++ b/arch/alpha/kernel/sys_takara.c
@@ -85,7 +85,7 @@ static struct hw_interrupt_type takara_irq_type = {
85}; 85};
86 86
87static void 87static void
88takara_device_interrupt(unsigned long vector, struct pt_regs *regs) 88takara_device_interrupt(unsigned long vector)
89{ 89{
90 unsigned intstatus; 90 unsigned intstatus;
91 91
@@ -112,20 +112,20 @@ takara_device_interrupt(unsigned long vector, struct pt_regs *regs)
112 * despatch an interrupt if it's set. 112 * despatch an interrupt if it's set.
113 */ 113 */
114 114
115 if (intstatus & 8) handle_irq(16+3, regs); 115 if (intstatus & 8) handle_irq(16+3, get_irq_regs());
116 if (intstatus & 4) handle_irq(16+2, regs); 116 if (intstatus & 4) handle_irq(16+2, get_irq_regs());
117 if (intstatus & 2) handle_irq(16+1, regs); 117 if (intstatus & 2) handle_irq(16+1, get_irq_regs());
118 if (intstatus & 1) handle_irq(16+0, regs); 118 if (intstatus & 1) handle_irq(16+0, get_irq_regs());
119 } else { 119 } else {
120 isa_device_interrupt (vector, regs); 120 isa_device_interrupt (vector);
121 } 121 }
122} 122}
123 123
124static void 124static void
125takara_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 125takara_srm_device_interrupt(unsigned long vector)
126{ 126{
127 int irq = (vector - 0x800) >> 4; 127 int irq = (vector - 0x800) >> 4;
128 handle_irq(irq, regs); 128 handle_irq(irq, get_irq_regs());
129} 129}
130 130
131static void __init 131static void __init
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c
index 302aab38d95f..1473aa0e6982 100644
--- a/arch/alpha/kernel/sys_titan.c
+++ b/arch/alpha/kernel/sys_titan.c
@@ -167,18 +167,18 @@ titan_set_irq_affinity(unsigned int irq, cpumask_t affinity)
167} 167}
168 168
169static void 169static void
170titan_device_interrupt(unsigned long vector, struct pt_regs * regs) 170titan_device_interrupt(unsigned long vector)
171{ 171{
172 printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n"); 172 printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n");
173} 173}
174 174
175static void 175static void
176titan_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) 176titan_srm_device_interrupt(unsigned long vector)
177{ 177{
178 int irq; 178 int irq;
179 179
180 irq = (vector - 0x800) >> 4; 180 irq = (vector - 0x800) >> 4;
181 handle_irq(irq, regs); 181 handle_irq(irq, get_irq_regs());
182} 182}
183 183
184 184
@@ -245,6 +245,7 @@ titan_legacy_init_irq(void)
245void 245void
246titan_dispatch_irqs(u64 mask, struct pt_regs *regs) 246titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
247{ 247{
248 struct pt_regs *old_regs;
248 unsigned long vector; 249 unsigned long vector;
249 250
250 /* 251 /*
@@ -252,6 +253,7 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
252 */ 253 */
253 mask &= titan_cpu_irq_affinity[smp_processor_id()]; 254 mask &= titan_cpu_irq_affinity[smp_processor_id()];
254 255
256 old_regs = set_irq_regs(regs);
255 /* 257 /*
256 * Dispatch all requested interrupts 258 * Dispatch all requested interrupts
257 */ 259 */
@@ -263,8 +265,9 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
263 vector = 0x900 + (vector << 4); /* convert to SRM vector */ 265 vector = 0x900 + (vector << 4); /* convert to SRM vector */
264 266
265 /* dispatch it */ 267 /* dispatch it */
266 alpha_mv.device_interrupt(vector, regs); 268 alpha_mv.device_interrupt(vector);
267 } 269 }
270 set_irq_regs(old_regs);
268} 271}
269 272
270 273
diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c
index 22c5798fe083..ddf5edd0cecd 100644
--- a/arch/alpha/kernel/sys_wildfire.c
+++ b/arch/alpha/kernel/sys_wildfire.c
@@ -234,7 +234,7 @@ wildfire_init_irq(void)
234} 234}
235 235
236static void 236static void
237wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs) 237wildfire_device_interrupt(unsigned long vector)
238{ 238{
239 int irq; 239 int irq;
240 240
@@ -246,7 +246,7 @@ wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs)
246 * bits 5-0: irq in PCA 246 * bits 5-0: irq in PCA
247 */ 247 */
248 248
249 handle_irq(irq, regs); 249 handle_irq(irq, get_irq_regs());
250 return; 250 return;
251} 251}
252 252
diff --git a/include/asm-alpha/machvec.h b/include/asm-alpha/machvec.h
index aced22f91752..7ae744240f80 100644
--- a/include/asm-alpha/machvec.h
+++ b/include/asm-alpha/machvec.h
@@ -79,7 +79,7 @@ struct alpha_machine_vector
79 79
80 void (*update_irq_hw)(unsigned long, unsigned long, int); 80 void (*update_irq_hw)(unsigned long, unsigned long, int);
81 void (*ack_irq)(unsigned long); 81 void (*ack_irq)(unsigned long);
82 void (*device_interrupt)(unsigned long vector, struct pt_regs *regs); 82 void (*device_interrupt)(unsigned long vector);
83 void (*machine_check)(u64 vector, u64 la, struct pt_regs *regs); 83 void (*machine_check)(u64 vector, u64 la, struct pt_regs *regs);
84 84
85 void (*smp_callin)(void); 85 void (*smp_callin)(void);