2 * arch/m68k/bvme6000/bvmeints.c
4 * Copyright (C) 1997 Richard Hirst [richard@sleepie.demon.co.uk]
6 * based on amiints.c -- Amiga Linux interrupt handling code
8 * This file is subject to the terms and conditions of the GNU General Public
9 * License. See the file README.legal in the main directory of this archive
14 #include <linux/types.h>
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
18 #include <asm/ptrace.h>
19 #include <asm/system.h>
21 #include <asm/traps.h>
23 static void bvme6000_defhand (int irq, void *dev_id, struct pt_regs *fp);
26 * This should ideally be 4 elements only, for speed.
30 void (*handler)(int, void *, struct pt_regs *);
38 * void bvme6000_init_IRQ (void)
44 * This function is called during kernel startup to initialize
45 * the bvme6000 IRQ handling routines.
48 void bvme6000_init_IRQ (void)
52 for (i = 0; i < 256; i++) {
53 irq_tab[i].handler = bvme6000_defhand;
54 irq_tab[i].flags = IRQ_FLG_STD;
55 irq_tab[i].dev_id = NULL;
56 irq_tab[i].devname = NULL;
61 int bvme6000_request_irq(unsigned int irq,
62 void (*handler)(int, void *, struct pt_regs *),
63 unsigned long flags, const char *devname, void *dev_id)
66 printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION__, irq, devname);
70 /* Nothing special about auto-vectored devices for the BVME6000,
71 * but treat it specially to avoid changes elsewhere.
74 if (irq >= VEC_INT1 && irq <= VEC_INT7)
75 return sys_request_irq(irq - VEC_SPUR, handler, flags,
78 if (!(irq_tab[irq].flags & IRQ_FLG_STD)) {
79 if (irq_tab[irq].flags & IRQ_FLG_LOCK) {
80 printk("%s: IRQ %d from %s is not replaceable\n",
81 __FUNCTION__, irq, irq_tab[irq].devname);
84 if (flags & IRQ_FLG_REPLACE) {
85 printk("%s: %s can't replace IRQ %d from %s\n",
86 __FUNCTION__, devname, irq, irq_tab[irq].devname);
90 irq_tab[irq].handler = handler;
91 irq_tab[irq].flags = flags;
92 irq_tab[irq].dev_id = dev_id;
93 irq_tab[irq].devname = devname;
97 void bvme6000_free_irq(unsigned int irq, void *dev_id)
100 printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
104 if (irq >= VEC_INT1 && irq <= VEC_INT7) {
105 sys_free_irq(irq - VEC_SPUR, dev_id);
109 if (irq_tab[irq].dev_id != dev_id)
110 printk("%s: Removing probably wrong IRQ %d from %s\n",
111 __FUNCTION__, irq, irq_tab[irq].devname);
113 irq_tab[irq].handler = bvme6000_defhand;
114 irq_tab[irq].flags = IRQ_FLG_STD;
115 irq_tab[irq].dev_id = NULL;
116 irq_tab[irq].devname = NULL;
119 void bvme6000_process_int (unsigned long vec, struct pt_regs *fp)
122 printk ("bvme6000_process_int: Illegal vector %ld", vec);
125 irq_tab[vec].count++;
126 irq_tab[vec].handler(vec, irq_tab[vec].dev_id, fp);
130 int bvme6000_get_irq_list (char *buf)
134 for (i = 0; i < 256; i++) {
135 if (irq_tab[i].count)
136 len += sprintf (buf+len, "Vec 0x%02x: %8d %s\n",
138 irq_tab[i].devname ? irq_tab[i].devname : "free");
144 static void bvme6000_defhand (int irq, void *dev_id, struct pt_regs *fp)
146 printk ("Unknown interrupt 0x%02x\n", irq);
149 void bvme6000_enable_irq (unsigned int irq)
154 void bvme6000_disable_irq (unsigned int irq)