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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [mips/] [kernel/] [irq.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
 * This file is subject to the terms and conditions of the GNU General Public
3
 * License.  See the file "COPYING" in the main directory of this archive
4
 * for more details.
5
 *
6
 * Code to handle x86 style IRQs plus some generic interrupt stuff.
7
 *
8
 * Copyright (C) 1992 Linus Torvalds
9
 * Copyright (C) 1994 - 2000 Ralf Baechle
10
 */
11
#include <linux/kernel.h>
12
#include <linux/delay.h>
13
#include <linux/init.h>
14
#include <linux/interrupt.h>
15
#include <linux/kernel_stat.h>
16
#include <linux/module.h>
17
#include <linux/proc_fs.h>
18
#include <linux/slab.h>
19
#include <linux/mm.h>
20
#include <linux/random.h>
21
#include <linux/sched.h>
22
#include <linux/seq_file.h>
23
#include <linux/kallsyms.h>
24
 
25
#include <asm/atomic.h>
26
#include <asm/system.h>
27
#include <asm/uaccess.h>
28
 
29
static unsigned long irq_map[NR_IRQS / BITS_PER_LONG];
30
 
31
int allocate_irqno(void)
32
{
33
        int irq;
34
 
35
again:
36
        irq = find_first_zero_bit(irq_map, NR_IRQS);
37
 
38
        if (irq >= NR_IRQS)
39
                return -ENOSPC;
40
 
41
        if (test_and_set_bit(irq, irq_map))
42
                goto again;
43
 
44
        return irq;
45
}
46
 
47
EXPORT_SYMBOL_GPL(allocate_irqno);
48
 
49
/*
50
 * Allocate the 16 legacy interrupts for i8259 devices.  This happens early
51
 * in the kernel initialization so treating allocation failure as BUG() is
52
 * ok.
53
 */
54
void __init alloc_legacy_irqno(void)
55
{
56
        int i;
57
 
58
        for (i = 0; i <= 16; i++)
59
                BUG_ON(test_and_set_bit(i, irq_map));
60
}
61
 
62
void free_irqno(unsigned int irq)
63
{
64
        smp_mb__before_clear_bit();
65
        clear_bit(irq, irq_map);
66
        smp_mb__after_clear_bit();
67
}
68
 
69
EXPORT_SYMBOL_GPL(free_irqno);
70
 
71
/*
72
 * 'what should we do if we get a hw irq event on an illegal vector'.
73
 * each architecture has to answer this themselves.
74
 */
75
void ack_bad_irq(unsigned int irq)
76
{
77
        smtc_im_ack_irq(irq);
78
        printk("unexpected IRQ # %d\n", irq);
79
}
80
 
81
atomic_t irq_err_count;
82
 
83
/*
84
 * Generic, controller-independent functions:
85
 */
86
 
87
int show_interrupts(struct seq_file *p, void *v)
88
{
89
        int i = *(loff_t *) v, j;
90
        struct irqaction * action;
91
        unsigned long flags;
92
 
93
        if (i == 0) {
94
                seq_printf(p, "           ");
95
                for_each_online_cpu(j)
96
                        seq_printf(p, "CPU%d       ", j);
97
                seq_putc(p, '\n');
98
        }
99
 
100
        if (i < NR_IRQS) {
101
                spin_lock_irqsave(&irq_desc[i].lock, flags);
102
                action = irq_desc[i].action;
103
                if (!action)
104
                        goto skip;
105
                seq_printf(p, "%3d: ", i);
106
#ifndef CONFIG_SMP
107
                seq_printf(p, "%10u ", kstat_irqs(i));
108
#else
109
                for_each_online_cpu(j)
110
                        seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
111
#endif
112
                seq_printf(p, " %14s", irq_desc[i].chip->name);
113
                seq_printf(p, "  %s", action->name);
114
 
115
                for (action=action->next; action; action = action->next)
116
                        seq_printf(p, ", %s", action->name);
117
 
118
                seq_putc(p, '\n');
119
skip:
120
                spin_unlock_irqrestore(&irq_desc[i].lock, flags);
121
        } else if (i == NR_IRQS) {
122
                seq_putc(p, '\n');
123
                seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
124
        }
125
        return 0;
126
}
127
 
128
asmlinkage void spurious_interrupt(void)
129
{
130
        atomic_inc(&irq_err_count);
131
}
132
 
133
#ifdef CONFIG_KGDB
134
extern void breakpoint(void);
135
extern void set_debug_traps(void);
136
 
137
static int kgdb_flag = 1;
138
static int __init nokgdb(char *str)
139
{
140
        kgdb_flag = 0;
141
        return 1;
142
}
143
__setup("nokgdb", nokgdb);
144
#endif
145
 
146
void __init init_IRQ(void)
147
{
148
        arch_init_irq();
149
 
150
#ifdef CONFIG_KGDB
151
        if (kgdb_flag) {
152
                printk("Wait for gdb client connection ...\n");
153
                set_debug_traps();
154
                breakpoint();
155
        }
156
#endif
157
}

powered by: WebSVN 2.1.0

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