Merge tag 'irqchip-fixes-5.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorThomas Gleixner <tglx@linutronix.de>
Sun, 14 Nov 2021 12:59:05 +0000 (13:59 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sun, 14 Nov 2021 12:59:05 +0000 (13:59 +0100)
Pull irqchip fixes from Marc Zyngier:

  - Address an issue with the SiFive PLIC being unable to EOI
    a masked interrupt

  - Move the disable/enable methods in the CSky mpintc to
    mask/unmask

  - Fix a regression in the OF irq code where an interrupt-controller
    property in the same node as an interrupt-map property would get
    ignored

Link: https://lore.kernel.org/all/20211112173459.4015233-1-maz@kernel.org
drivers/irqchip/irq-csky-mpintc.c
drivers/irqchip/irq-sifive-plic.c
drivers/of/irq.c

index cb403c9..4aebd67 100644 (file)
@@ -78,7 +78,7 @@ static void csky_mpintc_handler(struct pt_regs *regs)
                readl_relaxed(reg_base + INTCL_RDYIR));
 }
 
-static void csky_mpintc_enable(struct irq_data *d)
+static void csky_mpintc_unmask(struct irq_data *d)
 {
        void __iomem *reg_base = this_cpu_read(intcl_reg);
 
@@ -87,7 +87,7 @@ static void csky_mpintc_enable(struct irq_data *d)
        writel_relaxed(d->hwirq, reg_base + INTCL_SENR);
 }
 
-static void csky_mpintc_disable(struct irq_data *d)
+static void csky_mpintc_mask(struct irq_data *d)
 {
        void __iomem *reg_base = this_cpu_read(intcl_reg);
 
@@ -164,8 +164,8 @@ static int csky_irq_set_affinity(struct irq_data *d,
 static struct irq_chip csky_irq_chip = {
        .name           = "C-SKY SMP Intc",
        .irq_eoi        = csky_mpintc_eoi,
-       .irq_enable     = csky_mpintc_enable,
-       .irq_disable    = csky_mpintc_disable,
+       .irq_unmask     = csky_mpintc_unmask,
+       .irq_mask       = csky_mpintc_mask,
        .irq_set_type   = csky_mpintc_set_type,
 #ifdef CONFIG_SMP
        .irq_set_affinity = csky_irq_set_affinity,
index cf74cfa..259065d 100644 (file)
@@ -163,7 +163,13 @@ static void plic_irq_eoi(struct irq_data *d)
 {
        struct plic_handler *handler = this_cpu_ptr(&plic_handlers);
 
-       writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM);
+       if (irqd_irq_masked(d)) {
+               plic_irq_unmask(d);
+               writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM);
+               plic_irq_mask(d);
+       } else {
+               writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM);
+       }
 }
 
 static struct irq_chip plic_chip = {
index 32be5a0..b10f015 100644 (file)
@@ -161,9 +161,10 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
                 * if it is then we are done, unless there is an
                 * interrupt-map which takes precedence.
                 */
+               bool intc = of_property_read_bool(ipar, "interrupt-controller");
+
                imap = of_get_property(ipar, "interrupt-map", &imaplen);
-               if (imap == NULL &&
-                   of_property_read_bool(ipar, "interrupt-controller")) {
+               if (imap == NULL && intc) {
                        pr_debug(" -> got it !\n");
                        return 0;
                }
@@ -244,8 +245,20 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
 
                        pr_debug(" -> imaplen=%d\n", imaplen);
                }
-               if (!match)
+               if (!match) {
+                       if (intc) {
+                               /*
+                                * The PASEMI Nemo is a known offender, so
+                                * let's only warn for anyone else.
+                                */
+                               WARN(!IS_ENABLED(CONFIG_PPC_PASEMI),
+                                    "%pOF interrupt-map failed, using interrupt-controller\n",
+                                    ipar);
+                               return 0;
+                       }
+
                        goto fail;
+               }
 
                /*
                 * Successfully parsed an interrrupt-map translation; copy new