more changes on original files
[linux-2.4.git] / arch / m68k / mvme16x / 16xints.c
1 /*
2  * arch/m68k/mvme16x/16xints.c
3  *
4  * Copyright (C) 1995 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
18 #include <asm/system.h>
19 #include <asm/ptrace.h>
20 #include <asm/irq.h>
21
22 static void mvme16x_defhand (int irq, void *dev_id, struct pt_regs *fp);
23
24 /*
25  * This should ideally be 4 elements only, for speed.
26  */
27
28 static struct {
29         void            (*handler)(int, void *, struct pt_regs *);
30         unsigned long   flags;
31         void            *dev_id;
32         const char      *devname;
33         unsigned        count;
34 } irq_tab[192];
35
36 /*
37  * void mvme16x_init_IRQ (void)
38  *
39  * Parameters:  None
40  *
41  * Returns:     Nothing
42  *
43  * This function is called during kernel startup to initialize
44  * the mvme16x IRQ handling routines.  Should probably ensure
45  * that the base vectors for the VMEChip2 and PCCChip2 are valid.
46  */
47
48 void mvme16x_init_IRQ (void)
49 {
50         int i;
51
52         for (i = 0; i < 192; i++) {
53                 irq_tab[i].handler = mvme16x_defhand;
54                 irq_tab[i].flags = IRQ_FLG_STD;
55                 irq_tab[i].dev_id = NULL;
56                 irq_tab[i].devname = NULL;
57                 irq_tab[i].count = 0;
58         }
59 }
60
61 int mvme16x_request_irq(unsigned int irq,
62                 void (*handler)(int, void *, struct pt_regs *),
63                 unsigned long flags, const char *devname, void *dev_id)
64 {
65         if (irq < 64 || irq > 255) {
66                 printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION__, irq, devname);
67                 return -ENXIO;
68         }
69
70         if (!(irq_tab[irq-64].flags & IRQ_FLG_STD)) {
71                 if (irq_tab[irq-64].flags & IRQ_FLG_LOCK) {
72                         printk("%s: IRQ %d from %s is not replaceable\n",
73                                __FUNCTION__, irq, irq_tab[irq-64].devname);
74                         return -EBUSY;
75                 }
76                 if (flags & IRQ_FLG_REPLACE) {
77                         printk("%s: %s can't replace IRQ %d from %s\n",
78                                __FUNCTION__, devname, irq, irq_tab[irq-64].devname);
79                         return -EBUSY;
80                 }
81         }
82         irq_tab[irq-64].handler = handler;
83         irq_tab[irq-64].flags   = flags;
84         irq_tab[irq-64].dev_id  = dev_id;
85         irq_tab[irq-64].devname = devname;
86         return 0;
87 }
88
89 void mvme16x_free_irq(unsigned int irq, void *dev_id)
90 {
91         if (irq < 64 || irq > 255) {
92                 printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
93                 return;
94         }
95
96         if (irq_tab[irq-64].dev_id != dev_id)
97                 printk("%s: Removing probably wrong IRQ %d from %s\n",
98                        __FUNCTION__, irq, irq_tab[irq-64].devname);
99
100         irq_tab[irq-64].handler = mvme16x_defhand;;
101         irq_tab[irq-64].flags   = IRQ_FLG_STD;
102         irq_tab[irq-64].dev_id  = NULL;
103         irq_tab[irq-64].devname = NULL;
104 }
105
106 void mvme16x_process_int (unsigned long vec, struct pt_regs *fp)
107 {
108         if (vec < 64 || vec > 255)
109                 printk ("mvme16x_process_int: Illegal vector %ld", vec);
110         else
111         {
112                 irq_tab[vec-64].count++;
113                 irq_tab[vec-64].handler(vec, irq_tab[vec-64].dev_id, fp);
114         }
115 }
116
117 int mvme16x_get_irq_list (char *buf)
118 {
119         int i, len = 0;
120
121         for (i = 0; i < 192; i++) {
122                 if (irq_tab[i].count)
123                         len += sprintf (buf+len, "Vec 0x%02x: %8d  %s\n",
124                             i+64, irq_tab[i].count,
125                             irq_tab[i].devname ? irq_tab[i].devname : "free");
126         }
127         return len;
128 }
129
130
131 static void mvme16x_defhand (int irq, void *dev_id, struct pt_regs *fp)
132 {
133         printk ("Unknown interrupt 0x%02x\n", irq);
134 }
135
136
137 void mvme16x_enable_irq (unsigned int irq)
138 {
139 }
140
141
142 void mvme16x_disable_irq (unsigned int irq)
143 {
144 }
145
146