1
2
3
4
5
6
7
8
9
10
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
22static void mvme16x_defhand (int irq, void *dev_id, struct pt_regs *fp);
23
24
25
26
27
28static 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
38
39
40
41
42
43
44
45
46
47
48void 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
61int 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
89void 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
106void 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
117int 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
131static void mvme16x_defhand (int irq, void *dev_id, struct pt_regs *fp)
132{
133 printk ("Unknown interrupt 0x%02x\n", irq);
134}
135
136
137void mvme16x_enable_irq (unsigned int irq)
138{
139}
140
141
142void mvme16x_disable_irq (unsigned int irq)
143{
144}
145
146
147