]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
irq-ath79-intc: add chained_irq_enter/exit
authorRosen Penev <rosenp@gmail.com>
Sat, 18 Apr 2026 02:12:59 +0000 (19:12 -0700)
committerJonas Jelonek <jelonek.jonas@gmail.com>
Tue, 16 Jun 2026 09:50:32 +0000 (11:50 +0200)
Original review said:

Missing chained_irq_enter/exit calls.

Also rework slightly to reduce indentation.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22981
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
target/linux/ath79/files/drivers/irqchip/irq-ath79-intc.c

index 4945215d12c01936c1194e07826dc48e4a9d80b3..fc938ad482a5d878fe6f1e73c34ce1f0979bd7db 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/interrupt.h>
 #include <linux/irqchip.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/irqdomain.h>
@@ -30,24 +31,30 @@ struct ath79_intc {
 static void ath79_intc_irq_handler(struct irq_desc *desc)
 {
        struct irq_domain *domain = irq_desc_get_handler_data(desc);
+       struct irq_chip *chip = irq_desc_get_chip(desc);
        struct ath79_intc *intc = domain->host_data;
        u32 pending;
+       int i;
+
+       chained_irq_enter(chip, desc);
 
        pending = ath79_reset_rr(intc->int_status);
        pending &= intc->enable_mask;
 
-       if (pending) {
-               int i;
-
-               for (i = 0; i < intc->num_irqs; i++)
-                       if (pending & intc->irq_mask[i]) {
-                               if (intc->irq_wb_chan[i] != 0xffffffff)
-                                       ath79_ddr_wb_flush(intc->irq_wb_chan[i]);
-                               generic_handle_domain_irq(domain, i);
-                       }
-       } else {
+       if (!pending) {
                spurious_interrupt();
+               chained_irq_exit(chip, desc);
+               return;
        }
+
+       for (i = 0; i < intc->num_irqs; i++)
+               if (pending & intc->irq_mask[i]) {
+                       if (intc->irq_wb_chan[i] != 0xffffffff)
+                               ath79_ddr_wb_flush(intc->irq_wb_chan[i]);
+                       generic_handle_domain_irq(domain, i);
+               }
+
+       chained_irq_exit(chip, desc);
 }
 
 static void ath79_intc_irq_enable(struct irq_data *d)