Merge branch 'next' of git://git.monstr.eu/linux-2.6-microblaze
[firefly-linux-kernel-4.4.55.git] / arch / arc / kernel / irq.c
index 551c10dff481387f5b9d89e6c09b937cb22760df..8115fa531575f0d46d6fb030aa05270f7c7d6983 100644 (file)
@@ -11,6 +11,8 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip.h>
+#include "../../drivers/irqchip/irqchip.h"
 #include <asm/sections.h>
 #include <asm/irq.h>
 #include <asm/mach_desc.h>
@@ -26,7 +28,7 @@
  * -Disable all IRQs (on CPU side)
  * -Optionally, setup the High priority Interrupts as Level 2 IRQs
  */
-void __init arc_init_IRQ(void)
+void __cpuinit arc_init_IRQ(void)
 {
        int level_mask = 0;
 
@@ -97,15 +99,13 @@ static const struct irq_domain_ops arc_intc_domain_ops = {
 
 static struct irq_domain *root_domain;
 
-void __init init_onchip_IRQ(void)
+static int __init
+init_onchip_IRQ(struct device_node *intc, struct device_node *parent)
 {
-       struct device_node *intc = NULL;
+       if (parent)
+               panic("DeviceTree incore intc not a root irq controller\n");
 
-       intc = of_find_compatible_node(NULL, NULL, "snps,arc700-intc");
-       if(!intc)
-               panic("DeviceTree Missing incore intc\n");
-
-       root_domain = irq_domain_add_legacy(intc, NR_IRQS, 0, 0,
+       root_domain = irq_domain_add_legacy(intc, NR_CPU_IRQS, 0, 0,
                                            &arc_intc_domain_ops, NULL);
 
        if (!root_domain)
@@ -113,8 +113,12 @@ void __init init_onchip_IRQ(void)
 
        /* with this we don't need to export root_domain */
        irq_set_default_host(root_domain);
+
+       return 0;
 }
 
+IRQCHIP_DECLARE(arc_intc, "snps,arc700-intc", init_onchip_IRQ);
+
 /*
  * Late Interrupt system init called from start_kernel for Boot CPU only
  *
@@ -123,12 +127,13 @@ void __init init_onchip_IRQ(void)
  */
 void __init init_IRQ(void)
 {
-       init_onchip_IRQ();
-
        /* Any external intc can be setup here */
        if (machine_desc->init_irq)
                machine_desc->init_irq();
 
+       /* process the entire interrupt tree in one go */
+       irqchip_init();
+
 #ifdef CONFIG_SMP
        /* Master CPU can initialize it's side of IPI */
        if (machine_desc->init_smp)