[PATCH] m68k: introduce irq controller
[linux-2.6.git] / arch / m68k / mvme147 / 147ints.c
1 /*
2  * arch/m68k/mvme147/147ints.c
3  *
4  * Copyright (C) 1997 Richard Hirst [richard@sleepie.demon.co.uk]
5  *
6  * based on amiints.c -- Amiga Linux interrupt handling code
7  *
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
10  * for more details.
11  *
12  */
13
14 #include <linux/types.h>
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
17 #include <linux/interrupt.h>
18 #include <linux/seq_file.h>
19
20 #include <asm/ptrace.h>
21 #include <asm/system.h>
22 #include <asm/irq.h>
23 #include <asm/traps.h>
24
25 static irqreturn_t mvme147_defhand (int irq, void *dev_id, struct pt_regs *fp);
26
27 /*
28  * This should ideally be 4 elements only, for speed.
29  */
30
31 static struct {
32         irqreturn_t     (*handler)(int, void *, struct pt_regs *);
33         unsigned long   flags;
34         void            *dev_id;
35         const char      *devname;
36         unsigned        count;
37 } irq_tab[256];
38
39 /*
40  * void mvme147_init_IRQ (void)
41  *
42  * Parameters:  None
43  *
44  * Returns:     Nothing
45  *
46  * This function is called during kernel startup to initialize
47  * the mvme147 IRQ handling routines.
48  */
49
50 void mvme147_init_IRQ (void)
51 {
52         int i;
53
54         for (i = 0; i < 256; i++) {
55                 irq_tab[i].handler = mvme147_defhand;
56                 irq_tab[i].flags = IRQ_FLG_STD;
57                 irq_tab[i].dev_id = NULL;
58                 irq_tab[i].devname = NULL;
59                 irq_tab[i].count = 0;
60         }
61 }
62
63 int mvme147_request_irq(unsigned int irq,
64                 irqreturn_t (*handler)(int, void *, struct pt_regs *),
65                 unsigned long flags, const char *devname, void *dev_id)
66 {
67         if (irq > 255) {
68                 printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION__, irq, devname);
69                 return -ENXIO;
70         }
71         if (!(irq_tab[irq].flags & IRQ_FLG_STD)) {
72                 if (irq_tab[irq].flags & IRQ_FLG_LOCK) {
73                         printk("%s: IRQ %d from %s is not replaceable\n",
74                                __FUNCTION__, irq, irq_tab[irq].devname);
75                         return -EBUSY;
76                 }
77                 if (flags & IRQ_FLG_REPLACE) {
78                         printk("%s: %s can't replace IRQ %d from %s\n",
79                                __FUNCTION__, devname, irq, irq_tab[irq].devname);
80                         return -EBUSY;
81                 }
82         }
83         irq_tab[irq].handler = handler;
84         irq_tab[irq].flags   = flags;
85         irq_tab[irq].dev_id  = dev_id;
86         irq_tab[irq].devname = devname;
87         return 0;
88 }
89
90 void mvme147_free_irq(unsigned int irq, void *dev_id)
91 {
92         if (irq > 255) {
93                 printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
94                 return;
95         }
96         if (irq_tab[irq].dev_id != dev_id)
97                 printk("%s: Removing probably wrong IRQ %d from %s\n",
98                        __FUNCTION__, irq, irq_tab[irq].devname);
99
100         irq_tab[irq].handler = mvme147_defhand;
101         irq_tab[irq].flags   = IRQ_FLG_STD;
102         irq_tab[irq].dev_id  = NULL;
103         irq_tab[irq].devname = NULL;
104 }
105
106 irqreturn_t mvme147_process_int (unsigned long vec, struct pt_regs *fp)
107 {
108         if (vec > 255) {
109                 printk ("mvme147_process_int: Illegal vector %ld\n", vec);
110                 return IRQ_NONE;
111         } else {
112                 irq_tab[vec].count++;
113                 irq_tab[vec].handler(vec, irq_tab[vec].dev_id, fp);
114                 return IRQ_HANDLED;
115         }
116 }
117
118 int show_mvme147_interrupts (struct seq_file *p, void *v)
119 {
120         int i;
121
122         for (i = 0; i < 256; i++) {
123                 if (irq_tab[i].count)
124                         seq_printf(p, "Vec 0x%02x: %8d  %s\n",
125                             i, irq_tab[i].count,
126                             irq_tab[i].devname ? irq_tab[i].devname : "free");
127         }
128         return 0;
129 }
130
131
132 static irqreturn_t mvme147_defhand (int irq, void *dev_id, struct pt_regs *fp)
133 {
134         printk ("Unknown interrupt 0x%02x\n", irq);
135         return IRQ_NONE;
136 }
137
138 void mvme147_enable_irq (unsigned int irq)
139 {
140 }
141
142
143 void mvme147_disable_irq (unsigned int irq)
144 {
145 }
146