aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arc/kernel/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arc/kernel/irq.c')
-rw-r--r--arch/arc/kernel/irq.c38
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
64static 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
75static const struct irq_domain_ops arc_intc_domain_ops = {
76 .xlate = irq_domain_xlate_onecell,
77 .map = arc_intc_domain_map,
78};
79
80static struct irq_domain *root_domain;
81
62void __init init_onchip_IRQ(void) 82void __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/*