提交 7ca56053 编写于 作者: A Al Viro 提交者: Linus Torvalds

[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: NAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 8dab42a9
...@@ -39,6 +39,7 @@ asmlinkage void ...@@ -39,6 +39,7 @@ asmlinkage void
do_entInt(unsigned long type, unsigned long vector, do_entInt(unsigned long type, unsigned long vector,
unsigned long la_ptr, struct pt_regs *regs) unsigned long la_ptr, struct pt_regs *regs)
{ {
struct pt_regs *old_regs;
switch (type) { switch (type) {
case 0: case 0:
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
...@@ -72,7 +73,9 @@ do_entInt(unsigned long type, unsigned long vector, ...@@ -72,7 +73,9 @@ do_entInt(unsigned long type, unsigned long vector,
alpha_mv.machine_check(vector, la_ptr, regs); alpha_mv.machine_check(vector, la_ptr, regs);
return; return;
case 3: case 3:
alpha_mv.device_interrupt(vector, regs); old_regs = set_irq_regs(regs);
alpha_mv.device_interrupt(vector);
set_irq_regs(old_regs);
return; return;
case 4: case 4:
perf_irq(la_ptr, regs); perf_irq(la_ptr, regs);
......
...@@ -137,7 +137,7 @@ init_i8259a_irqs(void) ...@@ -137,7 +137,7 @@ init_i8259a_irqs(void)
#if defined(IACK_SC) #if defined(IACK_SC)
void void
isa_device_interrupt(unsigned long vector, struct pt_regs *regs) isa_device_interrupt(unsigned long vector)
{ {
/* /*
* Generate a PCI interrupt acknowledge cycle. The PIC will * Generate a PCI interrupt acknowledge cycle. The PIC will
...@@ -147,7 +147,7 @@ isa_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -147,7 +147,7 @@ isa_device_interrupt(unsigned long vector, struct pt_regs *regs)
*/ */
int j = *(vuip) IACK_SC; int j = *(vuip) IACK_SC;
j &= 0xff; j &= 0xff;
handle_irq(j, regs); handle_irq(j, get_irq_regs());
} }
#endif #endif
......
...@@ -15,10 +15,10 @@ ...@@ -15,10 +15,10 @@
#define RTC_IRQ 8 #define RTC_IRQ 8
extern void isa_device_interrupt(unsigned long, struct pt_regs *); extern void isa_device_interrupt(unsigned long);
extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *); extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *);
extern void srm_device_interrupt(unsigned long, struct pt_regs *); extern void srm_device_interrupt(unsigned long);
extern void pyxis_device_interrupt(unsigned long, struct pt_regs *); extern void pyxis_device_interrupt(unsigned long);
extern struct irqaction timer_irqaction; extern struct irqaction timer_irqaction;
extern struct irqaction isa_cascade_irqaction; extern struct irqaction isa_cascade_irqaction;
......
...@@ -81,7 +81,7 @@ static struct hw_interrupt_type pyxis_irq_type = { ...@@ -81,7 +81,7 @@ static struct hw_interrupt_type pyxis_irq_type = {
}; };
void void
pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs) pyxis_device_interrupt(unsigned long vector)
{ {
unsigned long pld; unsigned long pld;
unsigned int i; unsigned int i;
...@@ -98,9 +98,9 @@ pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -98,9 +98,9 @@ pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs)
i = ffz(~pld); i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i == 7) if (i == 7)
isa_device_interrupt(vector, regs); isa_device_interrupt(vector);
else else
handle_irq(16+i, regs); handle_irq(16+i, get_irq_regs());
} }
} }
......
...@@ -72,8 +72,8 @@ init_srm_irqs(long max, unsigned long ignore_mask) ...@@ -72,8 +72,8 @@ init_srm_irqs(long max, unsigned long ignore_mask)
} }
void void
srm_device_interrupt(unsigned long vector, struct pt_regs * regs) srm_device_interrupt(unsigned long vector)
{ {
int irq = (vector - 0x800) >> 4; int irq = (vector - 0x800) >> 4;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
...@@ -100,7 +100,7 @@ static struct hw_interrupt_type alcor_irq_type = { ...@@ -100,7 +100,7 @@ static struct hw_interrupt_type alcor_irq_type = {
}; };
static void static void
alcor_device_interrupt(unsigned long vector, struct pt_regs *regs) alcor_device_interrupt(unsigned long vector)
{ {
unsigned long pld; unsigned long pld;
unsigned int i; unsigned int i;
...@@ -116,9 +116,9 @@ alcor_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -116,9 +116,9 @@ alcor_device_interrupt(unsigned long vector, struct pt_regs *regs)
i = ffz(~pld); i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i == 31) { if (i == 31) {
isa_device_interrupt(vector, regs); isa_device_interrupt(vector);
} else { } else {
handle_irq(16 + i, regs); handle_irq(16 + i, get_irq_regs());
} }
} }
} }
......
...@@ -82,7 +82,7 @@ static struct hw_interrupt_type cabriolet_irq_type = { ...@@ -82,7 +82,7 @@ static struct hw_interrupt_type cabriolet_irq_type = {
}; };
static void static void
cabriolet_device_interrupt(unsigned long v, struct pt_regs *r) cabriolet_device_interrupt(unsigned long v)
{ {
unsigned long pld; unsigned long pld;
unsigned int i; unsigned int i;
...@@ -98,15 +98,15 @@ cabriolet_device_interrupt(unsigned long v, struct pt_regs *r) ...@@ -98,15 +98,15 @@ cabriolet_device_interrupt(unsigned long v, struct pt_regs *r)
i = ffz(~pld); i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i == 4) { if (i == 4) {
isa_device_interrupt(v, r); isa_device_interrupt(v);
} else { } else {
handle_irq(16 + i, r); handle_irq(16 + i, get_irq_regs());
} }
} }
} }
static void __init static void __init
common_init_irq(void (*srm_dev_int)(unsigned long v, struct pt_regs *r)) common_init_irq(void (*srm_dev_int)(unsigned long v))
{ {
init_i8259a_irqs(); init_i8259a_irqs();
...@@ -154,18 +154,18 @@ cabriolet_init_irq(void) ...@@ -154,18 +154,18 @@ cabriolet_init_irq(void)
too invasive though. */ too invasive though. */
static void static void
pc164_srm_device_interrupt(unsigned long v, struct pt_regs *r) pc164_srm_device_interrupt(unsigned long v)
{ {
__min_ipl = getipl(); __min_ipl = getipl();
srm_device_interrupt(v, r); srm_device_interrupt(v);
__min_ipl = 0; __min_ipl = 0;
} }
static void static void
pc164_device_interrupt(unsigned long v, struct pt_regs *r) pc164_device_interrupt(unsigned long v)
{ {
__min_ipl = getipl(); __min_ipl = getipl();
cabriolet_device_interrupt(v, r); cabriolet_device_interrupt(v);
__min_ipl = 0; __min_ipl = 0;
} }
......
...@@ -217,7 +217,7 @@ static struct hw_interrupt_type clipper_irq_type = { ...@@ -217,7 +217,7 @@ static struct hw_interrupt_type clipper_irq_type = {
}; };
static void static void
dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) dp264_device_interrupt(unsigned long vector)
{ {
#if 1 #if 1
printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n"); printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n");
...@@ -236,9 +236,9 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -236,9 +236,9 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
i = ffz(~pld); i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i == 55) if (i == 55)
isa_device_interrupt(vector, regs); isa_device_interrupt(vector);
else else
handle_irq(16 + i, 16 + i, regs); handle_irq(16 + i, get_irq_regs());
#if 0 #if 0
TSUNAMI_cchip->dir0.csr = 1UL << i; mb(); TSUNAMI_cchip->dir0.csr = 1UL << i; mb();
tmp = TSUNAMI_cchip->dir0.csr; tmp = TSUNAMI_cchip->dir0.csr;
...@@ -248,7 +248,7 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -248,7 +248,7 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
} }
static void static void
dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) dp264_srm_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
...@@ -268,11 +268,11 @@ dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -268,11 +268,11 @@ dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
if (irq >= 32) if (irq >= 32)
irq -= 16; irq -= 16;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void static void
clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) clipper_srm_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
...@@ -290,7 +290,7 @@ clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -290,7 +290,7 @@ clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
* *
* Eg IRQ 24 is DRIR bit 8, etc, etc * Eg IRQ 24 is DRIR bit 8, etc, etc
*/ */
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -80,7 +80,7 @@ static struct hw_interrupt_type eb64p_irq_type = { ...@@ -80,7 +80,7 @@ static struct hw_interrupt_type eb64p_irq_type = {
}; };
static void static void
eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs) eb64p_device_interrupt(unsigned long vector)
{ {
unsigned long pld; unsigned long pld;
unsigned int i; unsigned int i;
...@@ -97,9 +97,9 @@ eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -97,9 +97,9 @@ eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs)
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i == 5) { if (i == 5) {
isa_device_interrupt(vector, regs); isa_device_interrupt(vector);
} else { } else {
handle_irq(16 + i, regs); handle_irq(16 + i, get_irq_regs());
} }
} }
} }
......
...@@ -91,7 +91,7 @@ static struct hw_interrupt_type eiger_irq_type = { ...@@ -91,7 +91,7 @@ static struct hw_interrupt_type eiger_irq_type = {
}; };
static void static void
eiger_device_interrupt(unsigned long vector, struct pt_regs * regs) eiger_device_interrupt(unsigned long vector)
{ {
unsigned intstatus; unsigned intstatus;
...@@ -118,20 +118,20 @@ eiger_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -118,20 +118,20 @@ eiger_device_interrupt(unsigned long vector, struct pt_regs * regs)
* despatch an interrupt if it's set. * despatch an interrupt if it's set.
*/ */
if (intstatus & 8) handle_irq(16+3, regs); if (intstatus & 8) handle_irq(16+3, get_irq_regs());
if (intstatus & 4) handle_irq(16+2, regs); if (intstatus & 4) handle_irq(16+2, get_irq_regs());
if (intstatus & 2) handle_irq(16+1, regs); if (intstatus & 2) handle_irq(16+1, get_irq_regs());
if (intstatus & 1) handle_irq(16+0, regs); if (intstatus & 1) handle_irq(16+0, get_irq_regs());
} else { } else {
isa_device_interrupt(vector, regs); isa_device_interrupt(vector);
} }
} }
static void static void
eiger_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) eiger_srm_device_interrupt(unsigned long vector)
{ {
int irq = (vector - 0x800) >> 4; int irq = (vector - 0x800) >> 4;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -129,7 +129,7 @@ static struct hw_interrupt_type jensen_local_irq_type = { ...@@ -129,7 +129,7 @@ static struct hw_interrupt_type jensen_local_irq_type = {
}; };
static void static void
jensen_device_interrupt(unsigned long vector, struct pt_regs * regs) jensen_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
...@@ -189,7 +189,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -189,7 +189,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) || if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) ||
irq != last_irq) { irq != last_irq) {
printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n", printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n",
irq, count, cc-last_cc, regs->pc); irq, count, cc-last_cc, get_irq_regs()->pc);
count = 0; count = 0;
last_msg = cc; last_msg = cc;
last_irq = irq; last_irq = irq;
...@@ -198,7 +198,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -198,7 +198,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
} }
#endif #endif
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
* Interrupt handling. * Interrupt handling.
*/ */
static void static void
io7_device_interrupt(unsigned long vector, struct pt_regs * regs) io7_device_interrupt(unsigned long vector)
{ {
unsigned int pid; unsigned int pid;
unsigned int irq; unsigned int irq;
...@@ -64,7 +64,7 @@ io7_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -64,7 +64,7 @@ io7_device_interrupt(unsigned long vector, struct pt_regs * regs)
irq &= MARVEL_IRQ_VEC_IRQ_MASK; /* not too many bits */ irq &= MARVEL_IRQ_VEC_IRQ_MASK; /* not too many bits */
irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT; /* merge the pid */ irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT; /* merge the pid */
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static volatile unsigned long * static volatile unsigned long *
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
static void static void
miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) miata_srm_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
...@@ -56,7 +56,7 @@ miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -56,7 +56,7 @@ miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
if (irq >= 16) if (irq >= 16)
irq = irq + 8; irq = irq + 8;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -79,7 +79,7 @@ static struct hw_interrupt_type mikasa_irq_type = { ...@@ -79,7 +79,7 @@ static struct hw_interrupt_type mikasa_irq_type = {
}; };
static void static void
mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs) mikasa_device_interrupt(unsigned long vector)
{ {
unsigned long pld; unsigned long pld;
unsigned int i; unsigned int i;
...@@ -97,9 +97,9 @@ mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -97,9 +97,9 @@ mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs)
i = ffz(~pld); i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i < 16) { if (i < 16) {
isa_device_interrupt(vector, regs); isa_device_interrupt(vector);
} else { } else {
handle_irq(i, regs); handle_irq(i, get_irq_regs());
} }
} }
} }
......
...@@ -77,7 +77,7 @@ static struct hw_interrupt_type noritake_irq_type = { ...@@ -77,7 +77,7 @@ static struct hw_interrupt_type noritake_irq_type = {
}; };
static void static void
noritake_device_interrupt(unsigned long vector, struct pt_regs *regs) noritake_device_interrupt(unsigned long vector)
{ {
unsigned long pld; unsigned long pld;
unsigned int i; unsigned int i;
...@@ -96,15 +96,15 @@ noritake_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -96,15 +96,15 @@ noritake_device_interrupt(unsigned long vector, struct pt_regs *regs)
i = ffz(~pld); i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i < 16) { if (i < 16) {
isa_device_interrupt(vector, regs); isa_device_interrupt(vector);
} else { } else {
handle_irq(i, regs); handle_irq(i, get_irq_regs());
} }
} }
} }
static void static void
noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) noritake_srm_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
...@@ -122,7 +122,7 @@ noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -122,7 +122,7 @@ noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
if (irq >= 16) if (irq >= 16)
irq = irq + 1; irq = irq + 1;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -134,7 +134,7 @@ static struct hw_interrupt_type rawhide_irq_type = { ...@@ -134,7 +134,7 @@ static struct hw_interrupt_type rawhide_irq_type = {
}; };
static void static void
rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) rawhide_srm_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
...@@ -158,7 +158,7 @@ rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -158,7 +158,7 @@ rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
/* Adjust by which hose it is from. */ /* Adjust by which hose it is from. */
irq -= ((irq + 16) >> 2) & 0x38; irq -= ((irq + 16) >> 2) & 0x38;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -83,7 +83,7 @@ static struct hw_interrupt_type rx164_irq_type = { ...@@ -83,7 +83,7 @@ static struct hw_interrupt_type rx164_irq_type = {
}; };
static void static void
rx164_device_interrupt(unsigned long vector, struct pt_regs *regs) rx164_device_interrupt(unsigned long vector)
{ {
unsigned long pld; unsigned long pld;
volatile unsigned int *dirr; volatile unsigned int *dirr;
...@@ -102,9 +102,9 @@ rx164_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -102,9 +102,9 @@ rx164_device_interrupt(unsigned long vector, struct pt_regs *regs)
i = ffz(~pld); i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */ pld &= pld - 1; /* clear least bit set */
if (i == 20) { if (i == 20) {
isa_no_iack_sc_device_interrupt(vector, regs); isa_no_iack_sc_device_interrupt(vector, get_irq_regs());
} else { } else {
handle_irq(16+i, regs); handle_irq(16+i, get_irq_regs());
} }
} }
} }
......
...@@ -512,7 +512,7 @@ static struct hw_interrupt_type sable_lynx_irq_type = { ...@@ -512,7 +512,7 @@ static struct hw_interrupt_type sable_lynx_irq_type = {
}; };
static void static void
sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) sable_lynx_srm_device_interrupt(unsigned long vector)
{ {
/* Note that the vector reported by the SRM PALcode corresponds /* Note that the vector reported by the SRM PALcode corresponds
to the interrupt mask bits, but we have to manage via the 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,7 +526,7 @@ sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n", printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n",
__FUNCTION__, vector, bit, irq); __FUNCTION__, vector, bit, irq);
#endif #endif
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -85,7 +85,7 @@ static struct hw_interrupt_type takara_irq_type = { ...@@ -85,7 +85,7 @@ static struct hw_interrupt_type takara_irq_type = {
}; };
static void static void
takara_device_interrupt(unsigned long vector, struct pt_regs *regs) takara_device_interrupt(unsigned long vector)
{ {
unsigned intstatus; unsigned intstatus;
...@@ -112,20 +112,20 @@ takara_device_interrupt(unsigned long vector, struct pt_regs *regs) ...@@ -112,20 +112,20 @@ takara_device_interrupt(unsigned long vector, struct pt_regs *regs)
* despatch an interrupt if it's set. * despatch an interrupt if it's set.
*/ */
if (intstatus & 8) handle_irq(16+3, regs); if (intstatus & 8) handle_irq(16+3, get_irq_regs());
if (intstatus & 4) handle_irq(16+2, regs); if (intstatus & 4) handle_irq(16+2, get_irq_regs());
if (intstatus & 2) handle_irq(16+1, regs); if (intstatus & 2) handle_irq(16+1, get_irq_regs());
if (intstatus & 1) handle_irq(16+0, regs); if (intstatus & 1) handle_irq(16+0, get_irq_regs());
} else { } else {
isa_device_interrupt (vector, regs); isa_device_interrupt (vector);
} }
} }
static void static void
takara_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) takara_srm_device_interrupt(unsigned long vector)
{ {
int irq = (vector - 0x800) >> 4; int irq = (vector - 0x800) >> 4;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
static void __init static void __init
......
...@@ -167,18 +167,18 @@ titan_set_irq_affinity(unsigned int irq, cpumask_t affinity) ...@@ -167,18 +167,18 @@ titan_set_irq_affinity(unsigned int irq, cpumask_t affinity)
} }
static void static void
titan_device_interrupt(unsigned long vector, struct pt_regs * regs) titan_device_interrupt(unsigned long vector)
{ {
printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n"); printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n");
} }
static void static void
titan_srm_device_interrupt(unsigned long vector, struct pt_regs * regs) titan_srm_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
irq = (vector - 0x800) >> 4; irq = (vector - 0x800) >> 4;
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
} }
...@@ -245,6 +245,7 @@ titan_legacy_init_irq(void) ...@@ -245,6 +245,7 @@ titan_legacy_init_irq(void)
void void
titan_dispatch_irqs(u64 mask, struct pt_regs *regs) titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
{ {
struct pt_regs *old_regs;
unsigned long vector; unsigned long vector;
/* /*
...@@ -252,6 +253,7 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs) ...@@ -252,6 +253,7 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
*/ */
mask &= titan_cpu_irq_affinity[smp_processor_id()]; mask &= titan_cpu_irq_affinity[smp_processor_id()];
old_regs = set_irq_regs(regs);
/* /*
* Dispatch all requested interrupts * Dispatch all requested interrupts
*/ */
...@@ -263,8 +265,9 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs) ...@@ -263,8 +265,9 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
vector = 0x900 + (vector << 4); /* convert to SRM vector */ vector = 0x900 + (vector << 4); /* convert to SRM vector */
/* dispatch it */ /* dispatch it */
alpha_mv.device_interrupt(vector, regs); alpha_mv.device_interrupt(vector);
} }
set_irq_regs(old_regs);
} }
......
...@@ -234,7 +234,7 @@ wildfire_init_irq(void) ...@@ -234,7 +234,7 @@ wildfire_init_irq(void)
} }
static void static void
wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs) wildfire_device_interrupt(unsigned long vector)
{ {
int irq; int irq;
...@@ -246,7 +246,7 @@ wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs) ...@@ -246,7 +246,7 @@ wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs)
* bits 5-0: irq in PCA * bits 5-0: irq in PCA
*/ */
handle_irq(irq, regs); handle_irq(irq, get_irq_regs());
return; return;
} }
......
...@@ -79,7 +79,7 @@ struct alpha_machine_vector ...@@ -79,7 +79,7 @@ struct alpha_machine_vector
void (*update_irq_hw)(unsigned long, unsigned long, int); void (*update_irq_hw)(unsigned long, unsigned long, int);
void (*ack_irq)(unsigned long); void (*ack_irq)(unsigned long);
void (*device_interrupt)(unsigned long vector, struct pt_regs *regs); void (*device_interrupt)(unsigned long vector);
void (*machine_check)(u64 vector, u64 la, struct pt_regs *regs); void (*machine_check)(u64 vector, u64 la, struct pt_regs *regs);
void (*smp_callin)(void); void (*smp_callin)(void);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册