diff options
Diffstat (limited to 'arch/arc/kernel/irq.c')
-rw-r--r-- | arch/arc/kernel/irq.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/arch/arc/kernel/irq.c b/arch/arc/kernel/irq.c index 2f399eb88f9d..3c18e66386c7 100644 --- a/arch/arc/kernel/irq.c +++ b/arch/arc/kernel/irq.c | |||
@@ -9,6 +9,8 @@ | |||
9 | 9 | ||
10 | #include <linux/interrupt.h> | 10 | #include <linux/interrupt.h> |
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/of.h> | ||
13 | #include <linux/irqdomain.h> | ||
12 | #include <asm/sections.h> | 14 | #include <asm/sections.h> |
13 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
14 | 16 | ||
@@ -59,16 +61,40 @@ static struct irq_chip onchip_intc = { | |||
59 | .irq_unmask = arc_unmask_irq, | 61 | .irq_unmask = arc_unmask_irq, |
60 | }; | 62 | }; |
61 | 63 | ||
64 | static int arc_intc_domain_map(struct irq_domain *d, unsigned int irq, | ||
65 | irq_hw_number_t hw) | ||
66 | { | ||
67 | if (irq == TIMER0_IRQ) | ||
68 | irq_set_chip_and_handler(irq, &onchip_intc, handle_percpu_irq); | ||
69 | else | ||
70 | irq_set_chip_and_handler(irq, &onchip_intc, handle_level_irq); | ||
71 | |||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | static const struct irq_domain_ops arc_intc_domain_ops = { | ||
76 | .xlate = irq_domain_xlate_onecell, | ||
77 | .map = arc_intc_domain_map, | ||
78 | }; | ||
79 | |||
80 | static struct irq_domain *root_domain; | ||
81 | |||
62 | void __init init_onchip_IRQ(void) | 82 | void __init init_onchip_IRQ(void) |
63 | { | 83 | { |
64 | int i; | 84 | struct device_node *intc = NULL; |
85 | |||
86 | intc = of_find_compatible_node(NULL, NULL, "snps,arc700-intc"); | ||
87 | if(!intc) | ||
88 | panic("DeviceTree Missing incore intc\n"); | ||
89 | |||
90 | root_domain = irq_domain_add_legacy(intc, NR_IRQS, 0, 0, | ||
91 | &arc_intc_domain_ops, NULL); | ||
65 | 92 | ||
66 | for (i = 0; i < NR_IRQS; i++) | 93 | if (!root_domain) |
67 | irq_set_chip_and_handler(i, &onchip_intc, handle_level_irq); | 94 | panic("root irq domain not avail\n"); |
68 | 95 | ||
69 | #ifdef CONFIG_SMP | 96 | /* with this we don't need to export root_domain */ |
70 | irq_set_chip_and_handler(TIMER0_IRQ, &onchip_intc, handle_percpu_irq); | 97 | irq_set_default_host(root_domain); |
71 | #endif | ||
72 | } | 98 | } |
73 | 99 | ||
74 | /* | 100 | /* |