]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
sh: irq: Rework the SR.IMASK bitmap handling.
authorPaul Mundt <lethal@linux-sh.org>
Thu, 21 May 2009 16:16:17 +0000 (01:16 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 21 May 2009 16:16:17 +0000 (01:16 +0900)
This tidies up how the SR.IMASK bitmap is managed, using the bitmap API
directly instead. At the same time, tidy up the irq_chip conversion a
bit.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/kernel/cpu/irq/imask.c

index f43753b54e1d6f82a6dd8eec0ab273474b9a14f4..3bef3c2629ad2e22f0560f31f0ca1860fdf6bad3 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/cache.h>
 #include <linux/irq.h>
+#include <linux/bitmap.h>
 #include <asm/system.h>
 #include <asm/irq.h>
 
 /* Bitmap of IRQ masked */
-static unsigned long imask_mask = 0x7fff;
-static int interrupt_priority = 0;
-
-static void enable_imask_irq(unsigned int irq);
-static void disable_imask_irq(unsigned int irq);
-static void shutdown_imask_irq(unsigned int irq);
-static void mask_and_ack_imask(unsigned int);
-static void end_imask_irq(unsigned int irq);
-
 #define IMASK_PRIORITY 15
 
-static unsigned int startup_imask_irq(unsigned int irq)
-{
-       /* Nothing to do */
-       return 0; /* never anything pending */
-}
+static DECLARE_BITMAP(imask_mask, IMASK_PRIORITY);
+static int interrupt_priority;
 
-static struct irq_chip imask_irq_type = {
-       .typename = "SR.IMASK",
-       .startup = startup_imask_irq,
-       .shutdown = shutdown_imask_irq,
-       .enable = enable_imask_irq,
-       .disable = disable_imask_irq,
-       .ack = mask_and_ack_imask,
-       .end = end_imask_irq
-};
-
-void static inline set_interrupt_registers(int ip)
+static inline void set_interrupt_registers(int ip)
 {
        unsigned long __dummy;
 
@@ -72,42 +51,31 @@ void static inline set_interrupt_registers(int ip)
                     : "t");
 }
 
-static void disable_imask_irq(unsigned int irq)
+static void mask_imask_irq(unsigned int irq)
 {
        clear_bit(irq, &imask_mask);
        if (interrupt_priority < IMASK_PRIORITY - irq)
                interrupt_priority = IMASK_PRIORITY - irq;
-
        set_interrupt_registers(interrupt_priority);
 }
 
-static void enable_imask_irq(unsigned int irq)
+static void unmask_imask_irq(unsigned int irq)
 {
        set_bit(irq, &imask_mask);
-       interrupt_priority = IMASK_PRIORITY - ffz(imask_mask);
-
+       interrupt_priority = IMASK_PRIORITY -
+               find_first_zero_bit(imask_mask, IMASK_PRIORITY);
        set_interrupt_registers(interrupt_priority);
 }
 
-static void mask_and_ack_imask(unsigned int irq)
-{
-       disable_imask_irq(irq);
-}
-
-static void end_imask_irq(unsigned int irq)
-{
-       if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-               enable_imask_irq(irq);
-}
-
-static void shutdown_imask_irq(unsigned int irq)
-{
-       /* Nothing to do */
-}
+static struct irq_chip imask_irq_chip = {
+       .typename       = "SR.IMASK",
+       .mask           = mask_imask_irq,
+       .unmask         = unmask_imask_irq,
+       .mask_ack       = mask_imask_irq,
+};
 
 void make_imask_irq(unsigned int irq)
 {
-       disable_irq_nosync(irq);
-       irq_desc[irq].chip = &imask_irq_type;
-       enable_irq(irq);
+       set_irq_chip_and_handler_name(irq, &imask_irq_chip,
+                                     handle_level_irq, "level");
 }