OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [m68k/] [mvme16x/] [16xints.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.