]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * linux/arch/m32r/kernel/irq.c | |
3 | * | |
4 | * Copyright (c) 2003, 2004 Hitoshi Yamamoto | |
5 | * Copyright (c) 2004 Hirokazu Takata <takata at linux-m32r.org> | |
6 | */ | |
7 | ||
8 | /* | |
9 | * linux/arch/i386/kernel/irq.c | |
10 | * | |
11 | * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar | |
12 | * | |
13 | * This file contains the lowest level m32r-specific interrupt | |
14 | * entry and irq statistics code. All the remaining irq logic is | |
15 | * done by the generic kernel/irq/ code and in the | |
16 | * m32r-specific irq controller code. | |
17 | */ | |
18 | ||
19 | #include <linux/kernel_stat.h> | |
20 | #include <linux/interrupt.h> | |
21 | #include <linux/seq_file.h> | |
22 | #include <linux/module.h> | |
23 | #include <asm/uaccess.h> | |
24 | ||
1da177e4 LT |
25 | /* |
26 | * Generic, controller-independent functions: | |
27 | */ | |
28 | ||
29 | int show_interrupts(struct seq_file *p, void *v) | |
30 | { | |
31 | int i = *(loff_t *) v, j; | |
32 | struct irqaction * action; | |
33 | unsigned long flags; | |
34 | ||
35 | if (i == 0) { | |
36 | seq_printf(p, " "); | |
394e3902 AM |
37 | for_each_online_cpu(j) |
38 | seq_printf(p, "CPU%d ",j); | |
1da177e4 LT |
39 | seq_putc(p, '\n'); |
40 | } | |
41 | ||
42 | if (i < NR_IRQS) { | |
239007b8 | 43 | raw_spin_lock_irqsave(&irq_desc[i].lock, flags); |
1da177e4 LT |
44 | action = irq_desc[i].action; |
45 | if (!action) | |
46 | goto skip; | |
47 | seq_printf(p, "%3d: ",i); | |
48 | #ifndef CONFIG_SMP | |
49 | seq_printf(p, "%10u ", kstat_irqs(i)); | |
50 | #else | |
394e3902 | 51 | for_each_online_cpu(j) |
dee4102a | 52 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
1da177e4 | 53 | #endif |
d1ea13c6 | 54 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
1da177e4 LT |
55 | seq_printf(p, " %s", action->name); |
56 | ||
57 | for (action=action->next; action; action = action->next) | |
58 | seq_printf(p, ", %s", action->name); | |
59 | ||
60 | seq_putc(p, '\n'); | |
61 | skip: | |
239007b8 | 62 | raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); |
1da177e4 LT |
63 | } |
64 | return 0; | |
65 | } | |
66 | ||
67 | /* | |
5aa8b6c1 | 68 | * do_IRQ handles all normal device IRQs (the special |
1da177e4 LT |
69 | * SMP cross-CPU interrupts have their own specific |
70 | * handlers). | |
71 | */ | |
72 | asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs) | |
73 | { | |
9c8e7f5c AV |
74 | struct pt_regs *old_regs; |
75 | old_regs = set_irq_regs(regs); | |
1da177e4 LT |
76 | irq_enter(); |
77 | ||
78 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | |
79 | /* FIXME M32R */ | |
80 | #endif | |
9c8e7f5c | 81 | __do_IRQ(irq); |
1da177e4 | 82 | irq_exit(); |
9c8e7f5c | 83 | set_irq_regs(old_regs); |
1da177e4 LT |
84 | |
85 | return 1; | |
86 | } |