]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/mips/txx9/jmr3927/irq.c
[MIPS] TXx9: Make tx3927-specific code more independent
[linux-2.6-omap-h63xx.git] / arch / mips / txx9 / jmr3927 / irq.c
index b97d22e15da6fc773f45be4c72897230ba57f3eb..68f74368ddecd92b1c6dd803145146c37bcd2e10 100644 (file)
 #include <asm/system.h>
 
 #include <asm/processor.h>
+#include <asm/txx9/generic.h>
 #include <asm/txx9/jmr3927.h>
 
 #if JMR3927_IRQ_END > NR_IRQS
 #error JMR3927_IRQ_END > NR_IRQS
 #endif
 
-static unsigned char irc_level[TX3927_NUM_IR] = {
-       5, 5, 5, 5, 5, 5,       /* INT[5:0] */
-       7, 7,                   /* SIO */
-       5, 5, 5, 0, 0,          /* DMA, PIO, PCI */
-       6, 6, 6                 /* TMR */
-};
-
 /*
  * CP0_STATUS is a thread's resource (saved/restored on context switch).
  * So disable_irq/enable_irq MUST handle IOC/IRC registers.
@@ -77,58 +71,44 @@ static void unmask_irq_ioc(unsigned int irq)
        (void)jmr3927_ioc_reg_in(JMR3927_IOC_REV_ADDR);
 }
 
-asmlinkage void plat_irq_dispatch(void)
-{
-       unsigned long cp0_cause = read_c0_cause();
-       int irq;
-
-       if ((cp0_cause & CAUSEF_IP7) == 0)
-               return;
-       irq = (cp0_cause >> CAUSEB_IP2) & 0x0f;
-
-       do_IRQ(irq + JMR3927_IRQ_IRC);
-}
-
-static irqreturn_t jmr3927_ioc_interrupt(int irq, void *dev_id)
+static int jmr3927_ioc_irqroute(void)
 {
        unsigned char istat = jmr3927_ioc_reg_in(JMR3927_IOC_INTS2_ADDR);
        int i;
 
        for (i = 0; i < JMR3927_NR_IRQ_IOC; i++) {
-               if (istat & (1 << i)) {
-                       irq = JMR3927_IRQ_IOC + i;
-                       do_IRQ(irq);
-               }
+               if (istat & (1 << i))
+                       return JMR3927_IRQ_IOC + i;
        }
-       return IRQ_HANDLED;
+       return -1;
 }
 
-static struct irqaction ioc_action = {
-       .handler = jmr3927_ioc_interrupt,
-       .mask = CPU_MASK_NONE,
-       .name = "IOC",
-};
-
-#ifdef CONFIG_PCI
-static irqreturn_t jmr3927_pcierr_interrupt(int irq, void *dev_id)
+static int jmr3927_irq_dispatch(int pending)
 {
-       printk(KERN_WARNING "PCI error interrupt (irq 0x%x).\n", irq);
-       printk(KERN_WARNING "pcistat:%02x, lbstat:%04lx\n",
-              tx3927_pcicptr->pcistat, tx3927_pcicptr->lbstat);
+       int irq;
 
-       return IRQ_HANDLED;
+       if ((pending & CAUSEF_IP7) == 0)
+               return -1;
+       irq = (pending >> CAUSEB_IP2) & 0x0f;
+       irq += JMR3927_IRQ_IRC;
+       if (irq == JMR3927_IRQ_IOCINT)
+               irq = jmr3927_ioc_irqroute();
+       return irq;
 }
-static struct irqaction pcierr_action = {
-       .handler = jmr3927_pcierr_interrupt,
-       .mask = CPU_MASK_NONE,
-       .name = "PCI error",
-};
-#endif
 
-static void __init jmr3927_irq_init(void);
+static struct irq_chip jmr3927_irq_ioc = {
+       .name = "jmr3927_ioc",
+       .ack = mask_irq_ioc,
+       .mask = mask_irq_ioc,
+       .mask_ack = mask_irq_ioc,
+       .unmask = unmask_irq_ioc,
+};
 
-void __init arch_init_irq(void)
+void __init jmr3927_irq_setup(void)
 {
+       int i;
+
+       txx9_irq_dispatch = jmr3927_irq_dispatch;
        /* Now, interrupt control disabled, */
        /* all IRC interrupts are masked, */
        /* all IRC interrupt mode are Low Active. */
@@ -143,34 +123,10 @@ void __init arch_init_irq(void)
        /* clear PCI Reset interrupts */
        jmr3927_ioc_reg_out(0, JMR3927_IOC_RESET_ADDR);
 
-       jmr3927_irq_init();
-
-       /* setup IOC interrupt 1 (PCI, MODEM) */
-       setup_irq(JMR3927_IRQ_IOCINT, &ioc_action);
-
-#ifdef CONFIG_PCI
-       setup_irq(JMR3927_IRQ_IRC_PCI, &pcierr_action);
-#endif
-
-       /* enable all CPU interrupt bits. */
-       set_c0_status(ST0_IM);  /* IE bit is still 0. */
-}
-
-static struct irq_chip jmr3927_irq_ioc = {
-       .name = "jmr3927_ioc",
-       .ack = mask_irq_ioc,
-       .mask = mask_irq_ioc,
-       .mask_ack = mask_irq_ioc,
-       .unmask = unmask_irq_ioc,
-};
-
-static void __init jmr3927_irq_init(void)
-{
-       u32 i;
-
-       txx9_irq_init(TX3927_IRC_REG);
-       for (i = 0; i < TXx9_MAX_IR; i++)
-               txx9_irq_set_pri(i, irc_level[i]);
+       tx3927_irq_init();
        for (i = JMR3927_IRQ_IOC; i < JMR3927_IRQ_IOC + JMR3927_NR_IRQ_IOC; i++)
                set_irq_chip_and_handler(i, &jmr3927_irq_ioc, handle_level_irq);
+
+       /* setup IOC interrupt 1 (PCI, MODEM) */
+       set_irq_chained_handler(JMR3927_IRQ_IOCINT, handle_simple_irq);
 }