Commit | Line | Data |
---|---|---|
eedbdab9 MS |
1 | /* |
2 | * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> | |
3 | * Copyright (C) 2007-2009 PetaLogix | |
4 | * Copyright (C) 2006 Atmark Techno, Inc. | |
5 | * | |
6 | * This file is subject to the terms and conditions of the GNU General Public | |
7 | * License. See the file "COPYING" in the main directory of this archive | |
8 | * for more details. | |
9 | */ | |
10 | ||
11 | #include <linux/init.h> | |
12 | #include <linux/kernel.h> | |
13 | #include <linux/hardirq.h> | |
14 | #include <linux/interrupt.h> | |
15 | #include <linux/irqflags.h> | |
16 | #include <linux/seq_file.h> | |
17 | #include <linux/kernel_stat.h> | |
18 | #include <linux/irq.h> | |
19 | ||
20 | #include <asm/prom.h> | |
21 | ||
22 | unsigned int irq_of_parse_and_map(struct device_node *dev, int index) | |
23 | { | |
24 | struct of_irq oirq; | |
25 | ||
26 | if (of_irq_map_one(dev, index, &oirq)) | |
27 | return NO_IRQ; | |
28 | ||
29 | return oirq.specifier[0]; | |
30 | } | |
31 | EXPORT_SYMBOL_GPL(irq_of_parse_and_map); | |
32 | ||
eedbdab9 MS |
33 | static u32 concurrent_irq; |
34 | ||
35 | void do_IRQ(struct pt_regs *regs) | |
36 | { | |
37 | unsigned int irq; | |
38 | struct pt_regs *old_regs = set_irq_regs(regs); | |
39 | ||
40 | irq_enter(); | |
41 | irq = get_irq(regs); | |
42 | next_irq: | |
43 | BUG_ON(irq == -1U); | |
44 | generic_handle_irq(irq); | |
45 | ||
46 | irq = get_irq(regs); | |
47 | if (irq != -1U) { | |
48 | pr_debug("next irq: %d\n", irq); | |
49 | ++concurrent_irq; | |
50 | goto next_irq; | |
51 | } | |
52 | ||
53 | irq_exit(); | |
54 | set_irq_regs(old_regs); | |
55 | } | |
56 | ||
57 | int show_interrupts(struct seq_file *p, void *v) | |
58 | { | |
59 | int i = *(loff_t *) v, j; | |
60 | struct irqaction *action; | |
61 | unsigned long flags; | |
62 | ||
63 | if (i == 0) { | |
64 | seq_printf(p, " "); | |
65 | for_each_online_cpu(j) | |
66 | seq_printf(p, "CPU%-8d", j); | |
67 | seq_putc(p, '\n'); | |
68 | } | |
69 | ||
70 | if (i < nr_irq) { | |
239007b8 | 71 | raw_spin_lock_irqsave(&irq_desc[i].lock, flags); |
eedbdab9 MS |
72 | action = irq_desc[i].action; |
73 | if (!action) | |
74 | goto skip; | |
75 | seq_printf(p, "%3d: ", i); | |
76 | #ifndef CONFIG_SMP | |
77 | seq_printf(p, "%10u ", kstat_irqs(i)); | |
78 | #else | |
79 | for_each_online_cpu(j) | |
80 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | |
81 | #endif | |
82 | seq_printf(p, " %8s", irq_desc[i].status & | |
83 | IRQ_LEVEL ? "level" : "edge"); | |
84 | seq_printf(p, " %8s", irq_desc[i].chip->name); | |
85 | seq_printf(p, " %s", action->name); | |
86 | ||
87 | for (action = action->next; action; action = action->next) | |
88 | seq_printf(p, ", %s", action->name); | |
89 | ||
90 | seq_putc(p, '\n'); | |
91 | skip: | |
239007b8 | 92 | raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); |
eedbdab9 MS |
93 | } |
94 | return 0; | |
95 | } | |
c6ba01a4 MS |
96 | |
97 | /* MS: There is no any advance mapping mechanism. We are using simple 32bit | |
98 | intc without any cascades or any connection that's why mapping is 1:1 */ | |
99 | unsigned int irq_create_mapping(struct irq_host *host, irq_hw_number_t hwirq) | |
100 | { | |
101 | return hwirq; | |
102 | } | |
103 | EXPORT_SYMBOL_GPL(irq_create_mapping); | |
104 | ||
105 | unsigned int irq_create_of_mapping(struct device_node *controller, | |
106 | u32 *intspec, unsigned int intsize) | |
107 | { | |
108 | return intspec[0]; | |
109 | } | |
110 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); |