diff options
| author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 | 
| commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
| tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/mips/kernel/irq.c | |
| download | olio-linux-3.10-1da177e4c3f41524e886b7f1b8a0c1fc7321cac2.tar.xz olio-linux-3.10-1da177e4c3f41524e886b7f1b8a0c1fc7321cac2.zip  | |
Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/mips/kernel/irq.c')
| -rw-r--r-- | arch/mips/kernel/irq.c | 140 | 
1 files changed, 140 insertions, 0 deletions
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c new file mode 100644 index 00000000000..441157a1f99 --- /dev/null +++ b/arch/mips/kernel/irq.c @@ -0,0 +1,140 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Code to handle x86 style IRQs plus some generic interrupt stuff. + * + * Copyright (C) 1992 Linus Torvalds + * Copyright (C) 1994 - 2000 Ralf Baechle + */ +#include <linux/config.h> +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/kernel_stat.h> +#include <linux/module.h> +#include <linux/proc_fs.h> +#include <linux/slab.h> +#include <linux/mm.h> +#include <linux/random.h> +#include <linux/sched.h> +#include <linux/seq_file.h> +#include <linux/kallsyms.h> + +#include <asm/atomic.h> +#include <asm/system.h> +#include <asm/uaccess.h> + +/* + * 'what should we do if we get a hw irq event on an illegal vector'. + * each architecture has to answer this themselves. + */ +void ack_bad_irq(unsigned int irq) +{ +	printk("unexpected IRQ # %d\n", irq); +} + +atomic_t irq_err_count; + +#undef do_IRQ + +/* + * do_IRQ handles all normal device IRQ's (the special + * SMP cross-CPU interrupts have their own specific + * handlers). + */ +asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs) +{ +	irq_enter(); + +	__do_IRQ(irq, regs); + +	irq_exit(); + +	return 1; +} + +/* + * Generic, controller-independent functions: + */ + +int show_interrupts(struct seq_file *p, void *v) +{ +	int i = *(loff_t *) v, j; +	struct irqaction * action; +	unsigned long flags; + +	if (i == 0) { +		seq_printf(p, "           "); +		for (j=0; j<NR_CPUS; j++) +			if (cpu_online(j)) +				seq_printf(p, "CPU%d       ",j); +		seq_putc(p, '\n'); +	} + +	if (i < NR_IRQS) { +		spin_lock_irqsave(&irq_desc[i].lock, flags); +		action = irq_desc[i].action; +		if (!action)  +			goto skip; +		seq_printf(p, "%3d: ",i); +#ifndef CONFIG_SMP +		seq_printf(p, "%10u ", kstat_irqs(i)); +#else +		for (j = 0; j < NR_CPUS; j++) +			if (cpu_online(j)) +				seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); +#endif +		seq_printf(p, " %14s", irq_desc[i].handler->typename); +		seq_printf(p, "  %s", action->name); + +		for (action=action->next; action; action = action->next) +			seq_printf(p, ", %s", action->name); + +		seq_putc(p, '\n'); +skip: +		spin_unlock_irqrestore(&irq_desc[i].lock, flags); +	} else if (i == NR_IRQS) { +		seq_putc(p, '\n'); +		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); +	} +	return 0; +} + +#ifdef CONFIG_KGDB +extern void breakpoint(void); +extern void set_debug_traps(void); + +static int kgdb_flag = 1; +static int __init nokgdb(char *str) +{ +	kgdb_flag = 0; +	return 1; +} +__setup("nokgdb", nokgdb); +#endif + +void __init init_IRQ(void) +{ +	int i; + +	for (i = 0; i < NR_IRQS; i++) { +		irq_desc[i].status  = IRQ_DISABLED; +		irq_desc[i].action  = NULL; +		irq_desc[i].depth   = 1; +		irq_desc[i].handler = &no_irq_type; +		spin_lock_init(&irq_desc[i].lock); +	} + +	arch_init_irq(); + +#ifdef CONFIG_KGDB +	if (kgdb_flag) { +		printk("Wait for gdb client connection ...\n"); +		set_debug_traps(); +		breakpoint(); +	} +#endif +}  |