]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - arch/m68k/mac/baboon.c
m68k/mac: Optimize interrupts using chain handlers
[mirror_ubuntu-jammy-kernel.git] / arch / m68k / mac / baboon.c
index 2a96bebd8969eb6ef304a00c8f833e010465881c..425144cbfa7d7730fa0b70da9bbee893192f96ec 100644 (file)
@@ -11,6 +11,9 @@
 #include <linux/mm.h>
 #include <linux/delay.h>
 #include <linux/init.h>
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#endif
 
 #include <asm/traps.h>
 #include <asm/bootinfo.h>
@@ -53,6 +56,39 @@ void __init baboon_init(void)
  * Baboon interrupt handler. This works a lot like a VIA.
  */
 
+#ifdef CONFIG_GENERIC_HARDIRQS
+static void baboon_irq(unsigned int irq, struct irq_desc *desc)
+{
+       int irq_bit, irq_num;
+       unsigned char events;
+
+#ifdef DEBUG_IRQS
+       printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X\n",
+               (uint) baboon->mb_control, (uint) baboon->mb_ifr,
+               (uint) baboon->mb_status);
+#endif
+
+       events = baboon->mb_ifr & 0x07;
+       if (!events)
+               return;
+
+       irq_num = IRQ_BABOON_0;
+       irq_bit = 1;
+       do {
+               if (events & irq_bit) {
+                       baboon->mb_ifr &= ~irq_bit;
+                       generic_handle_irq(irq_num);
+               }
+               irq_bit <<= 1;
+               irq_num++;
+       } while(events >= irq_bit);
+#if 0
+       if (baboon->mb_ifr & 0x02) macide_ack_intr(NULL);
+       /* for now we need to smash all interrupts */
+       baboon->mb_ifr &= ~events;
+#endif
+}
+#else
 static irqreturn_t baboon_irq(int irq, void *dev_id)
 {
        int irq_bit, irq_num;
@@ -72,7 +108,7 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
        do {
                if (events & irq_bit) {
                        baboon->mb_ifr &= ~irq_bit;
-                       m68k_handle_int(irq_num);
+                       generic_handle_irq(irq_num);
                }
                irq_bit <<= 1;
                irq_num++;
@@ -84,6 +120,7 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
 #endif
        return IRQ_HANDLED;
 }
+#endif
 
 /*
  * Register the Baboon interrupt dispatcher on nubus slot $C.
@@ -92,8 +129,12 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
 void __init baboon_register_interrupts(void)
 {
        baboon_disabled = 0;
+#ifdef CONFIG_GENERIC_HARDIRQS
+       irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);
+#else
        if (request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon))
                pr_err("Couldn't register baboon interrupt\n");
+#endif
 }
 
 /*