irqchip: vic: Support cascaded VIC in device tree
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 19 Feb 2020 15:35:43 +0000 (16:35 +0100)
committerMarc Zyngier <maz@kernel.org>
Sun, 8 Mar 2020 14:25:45 +0000 (14:25 +0000)
When transitioning some elder platforms to device tree it
becomes necessary to cascade VIC IRQ chips off another
interrupt controller.

Tested with the cascaded VIC on the Integrator/AP attached
logic module IM-PD1.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200219153543.137153-1-linus.walleij@linaro.org
drivers/irqchip/irq-vic.c

index f3f20a3..3c87d92 100644 (file)
@@ -509,9 +509,7 @@ static int __init vic_of_init(struct device_node *node,
        void __iomem *regs;
        u32 interrupt_mask = ~0;
        u32 wakeup_mask = ~0;
-
-       if (WARN(parent, "non-root VICs are not supported"))
-               return -EINVAL;
+       int parent_irq;
 
        regs = of_iomap(node, 0);
        if (WARN_ON(!regs))
@@ -519,11 +517,14 @@ static int __init vic_of_init(struct device_node *node,
 
        of_property_read_u32(node, "valid-mask", &interrupt_mask);
        of_property_read_u32(node, "valid-wakeup-mask", &wakeup_mask);
+       parent_irq = of_irq_get(node, 0);
+       if (parent_irq < 0)
+               parent_irq = 0;
 
        /*
         * Passing 0 as first IRQ makes the simple domain allocate descriptors
         */
-       __vic_init(regs, 0, 0, interrupt_mask, wakeup_mask, node);
+       __vic_init(regs, parent_irq, 0, interrupt_mask, wakeup_mask, node);
 
        return 0;
 }