]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/frv/kernel/irq-mb93091.c
x86: ioremap_nocache fix
[linux-2.6-omap-h63xx.git] / arch / frv / kernel / irq-mb93091.c
index 635d23437666abb75461879507be76568ac96a6d..9e38f99bbab89c7e0677e5da0f38f09d9d6590ea 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/irq.h>
+#include <linux/bitops.h>
 
 #include <asm/io.h>
 #include <asm/system.h>
-#include <asm/bitops.h>
 #include <asm/delay.h>
 #include <asm/irq.h>
 #include <asm/irc-regs.h>
 /*
  * on-motherboard FPGA PIC operations
  */
-static void frv_fpga_enable(unsigned int irq)
+static void frv_fpga_mask(unsigned int irq)
 {
        uint16_t imr = __get_IMR();
 
-       imr &= ~(1 << (irq - IRQ_BASE_FPGA));
+       imr |= 1 << (irq - IRQ_BASE_FPGA);
 
        __set_IMR(imr);
 }
 
-static void frv_fpga_disable(unsigned int irq)
+static void frv_fpga_ack(unsigned int irq)
+{
+       __clr_IFR(1 << (irq - IRQ_BASE_FPGA));
+}
+
+static void frv_fpga_mask_ack(unsigned int irq)
 {
        uint16_t imr = __get_IMR();
 
        imr |= 1 << (irq - IRQ_BASE_FPGA);
-
        __set_IMR(imr);
-}
 
-static void frv_fpga_ack(unsigned int irq)
-{
        __clr_IFR(1 << (irq - IRQ_BASE_FPGA));
 }
 
-static void frv_fpga_end(unsigned int irq)
+static void frv_fpga_unmask(unsigned int irq)
 {
+       uint16_t imr = __get_IMR();
+
+       imr &= ~(1 << (irq - IRQ_BASE_FPGA));
+
+       __set_IMR(imr);
 }
 
 static struct irq_chip frv_fpga_pic = {
        .name           = "mb93091",
-       .enable         = frv_fpga_enable,
-       .disable        = frv_fpga_disable,
        .ack            = frv_fpga_ack,
-       .mask           = frv_fpga_disable,
-       .unmask         = frv_fpga_enable,
-       .end            = frv_fpga_end,
+       .mask           = frv_fpga_mask,
+       .mask_ack       = frv_fpga_mask_ack,
+       .unmask         = frv_fpga_unmask,
 };
 
 /*
  * FPGA PIC interrupt handler
  */
-static irqreturn_t fpga_interrupt(int irq, void *_mask, struct pt_regs *regs)
+static irqreturn_t fpga_interrupt(int irq, void *_mask)
 {
        uint16_t imr, mask = (unsigned long) _mask;
-       irqreturn_t iret = 0;
 
        imr = __get_IMR();
        mask = mask & ~imr & __get_IFR();
@@ -92,11 +95,10 @@ static irqreturn_t fpga_interrupt(int irq, void *_mask, struct pt_regs *regs)
                irq = 31 - irq;
                mask &= ~(1 << irq);
 
-               if (__do_IRQ(IRQ_BASE_FPGA + irq, regs))
-                       iret |= IRQ_HANDLED;
+               generic_handle_irq(IRQ_BASE_FPGA + irq);
        }
 
-       return iret;
+       return IRQ_HANDLED;
 }
 
 /*