Loading arch/sparc/kernel/irq.c +15 −8 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ #include <asm/pgtable.h> #include <asm/pcic.h> #include <asm/cacheflush.h> #include <asm/irq_regs.h> #ifdef CONFIG_SMP #define SMP_NOP2 "nop; nop;\n\t" Loading Loading @@ -133,8 +134,8 @@ static void irq_panic(void) prom_halt(); } void (*sparc_init_timers)(irqreturn_t (*)(int, void *,struct pt_regs *)) = (void (*)(irqreturn_t (*)(int, void *,struct pt_regs *))) irq_panic; void (*sparc_init_timers)(irqreturn_t (*)(int, void *)) = (void (*)(irqreturn_t (*)(int, void *))) irq_panic; /* * Dave Redman (djhr@tadpole.co.uk) Loading Loading @@ -319,12 +320,14 @@ void unexpected_irq(int irq, void *dev_id, struct pt_regs * regs) void handler_irq(int irq, struct pt_regs * regs) { struct pt_regs *old_regs; struct irqaction * action; int cpu = smp_processor_id(); #ifdef CONFIG_SMP extern void smp4m_irq_rotate(int cpu); #endif old_regs = set_irq_regs(regs); irq_enter(); disable_pil_irq(irq); #ifdef CONFIG_SMP Loading @@ -338,27 +341,31 @@ void handler_irq(int irq, struct pt_regs * regs) do { if (!action || !action->handler) unexpected_irq(irq, NULL, regs); action->handler(irq, action->dev_id, regs); action->handler(irq, action->dev_id); action = action->next; } while (action); sparc_irq[irq].flags &= ~SPARC_IRQ_INPROGRESS; enable_pil_irq(irq); irq_exit(); set_irq_regs(old_regs); } #ifdef CONFIG_BLK_DEV_FD extern void floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs); extern void floppy_interrupt(int irq, void *dev_id) void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs) { struct pt_regs *old_regs; int cpu = smp_processor_id(); old_regs = set_irq_regs(regs); disable_pil_irq(irq); irq_enter(); kstat_cpu(cpu).irqs[irq]++; floppy_interrupt(irq, dev_id, regs); floppy_interrupt(irq, dev_id); irq_exit(); enable_pil_irq(irq); set_irq_regs(old_regs); // XXX Eek, it's totally changed with preempt_count() and such // if (softirq_pending(cpu)) // do_softirq(); Loading @@ -369,7 +376,7 @@ void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs) * thus no sharing possible. */ int request_fast_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), irqreturn_t (*handler)(int, void *), unsigned long irqflags, const char *devname) { struct irqaction *action; Loading Loading @@ -468,7 +475,7 @@ out: } int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), irqreturn_t (*handler)(int, void *), unsigned long irqflags, const char * devname, void *dev_id) { struct irqaction * action, **actionp; Loading @@ -478,7 +485,7 @@ int request_irq(unsigned int irq, if (sparc_cpu_model == sun4d) { extern int sun4d_request_irq(unsigned int, irqreturn_t (*)(int, void *, struct pt_regs *), irqreturn_t (*)(int, void *), unsigned long, const char *, void *); return sun4d_request_irq(irq, handler, irqflags, devname, dev_id); } Loading arch/sparc/kernel/pcic.c +2 −2 Original line number Diff line number Diff line Loading @@ -708,13 +708,13 @@ static void pcic_clear_clock_irq(void) pcic_timer_dummy = readl(pcic0.pcic_regs+PCI_SYS_LIMIT); } static irqreturn_t pcic_timer_handler (int irq, void *h, struct pt_regs *regs) static irqreturn_t pcic_timer_handler (int irq, void *h) { write_seqlock(&xtime_lock); /* Dummy, to show that we remember */ pcic_clear_clock_irq(); do_timer(1); #ifndef CONFIG_SMP update_process_times(user_mode(regs)); update_process_times(user_mode(get_irq_regs())); #endif write_sequnlock(&xtime_lock); return IRQ_HANDLED; Loading arch/sparc/kernel/sun4c_irq.c +1 −1 Original line number Diff line number Diff line Loading @@ -154,7 +154,7 @@ static void sun4c_load_profile_irq(int cpu, unsigned int limit) /* Errm.. not sure how to do this.. */ } static void __init sun4c_init_timers(irqreturn_t (*counter_fn)(int, void *, struct pt_regs *)) static void __init sun4c_init_timers(irqreturn_t (*counter_fn)(int, void *)) { int irq; Loading arch/sparc/kernel/sun4d_irq.c +8 −4 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <asm/sbus.h> #include <asm/sbi.h> #include <asm/cacheflush.h> #include <asm/irq_regs.h> /* If you trust current SCSI layer to handle different SCSI IRQs, enable this. I don't trust it... -jj */ /* #define DISTRIBUTE_IRQS */ Loading Loading @@ -198,6 +199,7 @@ extern void unexpected_irq(int, void *, struct pt_regs *); void sun4d_handler_irq(int irq, struct pt_regs * regs) { struct pt_regs *old_regs; struct irqaction * action; int cpu = smp_processor_id(); /* SBUS IRQ level (1 - 7) */ Loading @@ -208,6 +210,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) cc_set_iclr(1 << irq); old_regs = set_irq_regs(regs); irq_enter(); kstat_cpu(cpu).irqs[irq]++; if (!sbusl) { Loading @@ -215,7 +218,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) if (!action) unexpected_irq(irq, NULL, regs); do { action->handler(irq, action->dev_id, regs); action->handler(irq, action->dev_id); action = action->next; } while (action); } else { Loading @@ -242,7 +245,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) if (!action) unexpected_irq(irq, NULL, regs); do { action->handler(irq, action->dev_id, regs); action->handler(irq, action->dev_id); action = action->next; } while (action); release_sbi(SBI2DEVID(sbino), slot); Loading @@ -250,6 +253,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) } } irq_exit(); set_irq_regs(old_regs); } unsigned int sun4d_build_irq(struct sbus_dev *sdev, int irq) Loading @@ -272,7 +276,7 @@ unsigned int sun4d_sbint_to_irq(struct sbus_dev *sdev, unsigned int sbint) } int sun4d_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), irqreturn_t (*handler)(int, void *), unsigned long irqflags, const char * devname, void *dev_id) { struct irqaction *action, *tmp = NULL, **actionp; Loading Loading @@ -466,7 +470,7 @@ static void sun4d_load_profile_irq(int cpu, unsigned int limit) bw_set_prof_limit(cpu, limit); } static void __init sun4d_init_timers(irqreturn_t (*counter_fn)(int, void *, struct pt_regs *)) static void __init sun4d_init_timers(irqreturn_t (*counter_fn)(int, void *)) { int irq; int cpu; Loading arch/sparc/kernel/sun4d_smp.c +5 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <asm/ptrace.h> #include <asm/atomic.h> #include <asm/irq_regs.h> #include <asm/delay.h> #include <asm/irq.h> Loading Loading @@ -369,10 +370,12 @@ void smp4d_message_pass(int target, int msg, unsigned long data, int wait) void smp4d_percpu_timer_interrupt(struct pt_regs *regs) { struct pt_regs *old_regs; int cpu = hard_smp4d_processor_id(); static int cpu_tick[NR_CPUS]; static char led_mask[] = { 0xe, 0xd, 0xb, 0x7, 0xb, 0xd }; old_regs = set_irq_regs(regs); bw_get_prof_limit(cpu); bw_clear_intr_mask(0, 1); /* INTR_TABLE[0] & 1 is Profile IRQ */ Loading @@ -384,7 +387,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs) show_leds(cpu); } profile_tick(CPU_PROFILING, regs); profile_tick(CPU_PROFILING); if(!--prof_counter(cpu)) { int user = user_mode(regs); Loading @@ -395,6 +398,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs) prof_counter(cpu) = prof_multiplier(cpu); } set_irq_regs(old_regs); } extern unsigned int lvl14_resolution; Loading Loading
arch/sparc/kernel/irq.c +15 −8 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ #include <asm/pgtable.h> #include <asm/pcic.h> #include <asm/cacheflush.h> #include <asm/irq_regs.h> #ifdef CONFIG_SMP #define SMP_NOP2 "nop; nop;\n\t" Loading Loading @@ -133,8 +134,8 @@ static void irq_panic(void) prom_halt(); } void (*sparc_init_timers)(irqreturn_t (*)(int, void *,struct pt_regs *)) = (void (*)(irqreturn_t (*)(int, void *,struct pt_regs *))) irq_panic; void (*sparc_init_timers)(irqreturn_t (*)(int, void *)) = (void (*)(irqreturn_t (*)(int, void *))) irq_panic; /* * Dave Redman (djhr@tadpole.co.uk) Loading Loading @@ -319,12 +320,14 @@ void unexpected_irq(int irq, void *dev_id, struct pt_regs * regs) void handler_irq(int irq, struct pt_regs * regs) { struct pt_regs *old_regs; struct irqaction * action; int cpu = smp_processor_id(); #ifdef CONFIG_SMP extern void smp4m_irq_rotate(int cpu); #endif old_regs = set_irq_regs(regs); irq_enter(); disable_pil_irq(irq); #ifdef CONFIG_SMP Loading @@ -338,27 +341,31 @@ void handler_irq(int irq, struct pt_regs * regs) do { if (!action || !action->handler) unexpected_irq(irq, NULL, regs); action->handler(irq, action->dev_id, regs); action->handler(irq, action->dev_id); action = action->next; } while (action); sparc_irq[irq].flags &= ~SPARC_IRQ_INPROGRESS; enable_pil_irq(irq); irq_exit(); set_irq_regs(old_regs); } #ifdef CONFIG_BLK_DEV_FD extern void floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs); extern void floppy_interrupt(int irq, void *dev_id) void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs) { struct pt_regs *old_regs; int cpu = smp_processor_id(); old_regs = set_irq_regs(regs); disable_pil_irq(irq); irq_enter(); kstat_cpu(cpu).irqs[irq]++; floppy_interrupt(irq, dev_id, regs); floppy_interrupt(irq, dev_id); irq_exit(); enable_pil_irq(irq); set_irq_regs(old_regs); // XXX Eek, it's totally changed with preempt_count() and such // if (softirq_pending(cpu)) // do_softirq(); Loading @@ -369,7 +376,7 @@ void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs) * thus no sharing possible. */ int request_fast_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), irqreturn_t (*handler)(int, void *), unsigned long irqflags, const char *devname) { struct irqaction *action; Loading Loading @@ -468,7 +475,7 @@ out: } int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), irqreturn_t (*handler)(int, void *), unsigned long irqflags, const char * devname, void *dev_id) { struct irqaction * action, **actionp; Loading @@ -478,7 +485,7 @@ int request_irq(unsigned int irq, if (sparc_cpu_model == sun4d) { extern int sun4d_request_irq(unsigned int, irqreturn_t (*)(int, void *, struct pt_regs *), irqreturn_t (*)(int, void *), unsigned long, const char *, void *); return sun4d_request_irq(irq, handler, irqflags, devname, dev_id); } Loading
arch/sparc/kernel/pcic.c +2 −2 Original line number Diff line number Diff line Loading @@ -708,13 +708,13 @@ static void pcic_clear_clock_irq(void) pcic_timer_dummy = readl(pcic0.pcic_regs+PCI_SYS_LIMIT); } static irqreturn_t pcic_timer_handler (int irq, void *h, struct pt_regs *regs) static irqreturn_t pcic_timer_handler (int irq, void *h) { write_seqlock(&xtime_lock); /* Dummy, to show that we remember */ pcic_clear_clock_irq(); do_timer(1); #ifndef CONFIG_SMP update_process_times(user_mode(regs)); update_process_times(user_mode(get_irq_regs())); #endif write_sequnlock(&xtime_lock); return IRQ_HANDLED; Loading
arch/sparc/kernel/sun4c_irq.c +1 −1 Original line number Diff line number Diff line Loading @@ -154,7 +154,7 @@ static void sun4c_load_profile_irq(int cpu, unsigned int limit) /* Errm.. not sure how to do this.. */ } static void __init sun4c_init_timers(irqreturn_t (*counter_fn)(int, void *, struct pt_regs *)) static void __init sun4c_init_timers(irqreturn_t (*counter_fn)(int, void *)) { int irq; Loading
arch/sparc/kernel/sun4d_irq.c +8 −4 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <asm/sbus.h> #include <asm/sbi.h> #include <asm/cacheflush.h> #include <asm/irq_regs.h> /* If you trust current SCSI layer to handle different SCSI IRQs, enable this. I don't trust it... -jj */ /* #define DISTRIBUTE_IRQS */ Loading Loading @@ -198,6 +199,7 @@ extern void unexpected_irq(int, void *, struct pt_regs *); void sun4d_handler_irq(int irq, struct pt_regs * regs) { struct pt_regs *old_regs; struct irqaction * action; int cpu = smp_processor_id(); /* SBUS IRQ level (1 - 7) */ Loading @@ -208,6 +210,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) cc_set_iclr(1 << irq); old_regs = set_irq_regs(regs); irq_enter(); kstat_cpu(cpu).irqs[irq]++; if (!sbusl) { Loading @@ -215,7 +218,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) if (!action) unexpected_irq(irq, NULL, regs); do { action->handler(irq, action->dev_id, regs); action->handler(irq, action->dev_id); action = action->next; } while (action); } else { Loading @@ -242,7 +245,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) if (!action) unexpected_irq(irq, NULL, regs); do { action->handler(irq, action->dev_id, regs); action->handler(irq, action->dev_id); action = action->next; } while (action); release_sbi(SBI2DEVID(sbino), slot); Loading @@ -250,6 +253,7 @@ void sun4d_handler_irq(int irq, struct pt_regs * regs) } } irq_exit(); set_irq_regs(old_regs); } unsigned int sun4d_build_irq(struct sbus_dev *sdev, int irq) Loading @@ -272,7 +276,7 @@ unsigned int sun4d_sbint_to_irq(struct sbus_dev *sdev, unsigned int sbint) } int sun4d_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), irqreturn_t (*handler)(int, void *), unsigned long irqflags, const char * devname, void *dev_id) { struct irqaction *action, *tmp = NULL, **actionp; Loading Loading @@ -466,7 +470,7 @@ static void sun4d_load_profile_irq(int cpu, unsigned int limit) bw_set_prof_limit(cpu, limit); } static void __init sun4d_init_timers(irqreturn_t (*counter_fn)(int, void *, struct pt_regs *)) static void __init sun4d_init_timers(irqreturn_t (*counter_fn)(int, void *)) { int irq; int cpu; Loading
arch/sparc/kernel/sun4d_smp.c +5 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <asm/ptrace.h> #include <asm/atomic.h> #include <asm/irq_regs.h> #include <asm/delay.h> #include <asm/irq.h> Loading Loading @@ -369,10 +370,12 @@ void smp4d_message_pass(int target, int msg, unsigned long data, int wait) void smp4d_percpu_timer_interrupt(struct pt_regs *regs) { struct pt_regs *old_regs; int cpu = hard_smp4d_processor_id(); static int cpu_tick[NR_CPUS]; static char led_mask[] = { 0xe, 0xd, 0xb, 0x7, 0xb, 0xd }; old_regs = set_irq_regs(regs); bw_get_prof_limit(cpu); bw_clear_intr_mask(0, 1); /* INTR_TABLE[0] & 1 is Profile IRQ */ Loading @@ -384,7 +387,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs) show_leds(cpu); } profile_tick(CPU_PROFILING, regs); profile_tick(CPU_PROFILING); if(!--prof_counter(cpu)) { int user = user_mode(regs); Loading @@ -395,6 +398,7 @@ void smp4d_percpu_timer_interrupt(struct pt_regs *regs) prof_counter(cpu) = prof_multiplier(cpu); } set_irq_regs(old_regs); } extern unsigned int lvl14_resolution; Loading