Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / mips / ddb5xxx / ddb5074 / irq.c
index dc4e643..60c087b 100644 (file)
@@ -4,7 +4,6 @@
  *  Copyright (C) 2000 Geert Uytterhoeven <geert@sonycom.com>
  *                     Sony Software Development Center Europe (SDCE), Brussels
  */
-#include <linux/config.h>
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/signal.h>
@@ -22,9 +21,7 @@
 #include <asm/ddb5xxx/ddb5074.h>
 
 
-extern asmlinkage void ddbIRQ(void);
-
-static struct irqaction irq_cascade = { no_action, 0, 0, "cascade", NULL, NULL };
+static struct irqaction irq_cascade = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL };
 
 #define M1543_PNP_CONFIG       0x03f0  /* PnP Config Port */
 #define M1543_PNP_INDEX                0x03f0  /* PnP Index Port */
@@ -91,7 +88,7 @@ static void m1543_irq_setup(void)
 
 }
 
-void ddb_local0_irqdispatch(struct pt_regs *regs)
+static void ddb_local0_irqdispatch(struct pt_regs *regs)
 {
        u32 mask;
        int nile4_irq;
@@ -119,35 +116,41 @@ void ddb_local0_irqdispatch(struct pt_regs *regs)
                }
 }
 
-void ddb_local1_irqdispatch(void)
+static void ddb_local1_irqdispatch(void)
 {
        printk("ddb_local1_irqdispatch called\n");
 }
 
-void ddb_buserror_irq(void)
+static void ddb_buserror_irq(void)
 {
        printk("ddb_buserror_irq called\n");
 }
 
-void ddb_8254timer_irq(void)
+static void ddb_8254timer_irq(void)
 {
        printk("ddb_8254timer_irq called\n");
 }
 
-void __init ddb_irq_setup(void)
+asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
 {
-#ifdef CONFIG_KGDB
-       if (remote_debug)
-               set_debug_traps();
-       breakpoint();           /* you may move this line to whereever you want :-) */
-#endif
+       unsigned int pending = read_c0_cause() & read_c0_status();
+
+       if (pending & CAUSEF_IP2)
+               ddb_local0_irqdispatch(regs);
+       else if (pending & CAUSEF_IP3)
+               ddb_local1_irqdispatch();
+       else if (pending & CAUSEF_IP6)
+               ddb_buserror_irq();
+       else if (pending & (CAUSEF_IP4 | CAUSEF_IP5))
+               ddb_8254timer_irq();
+}
 
+void __init arch_init_irq(void)
+{
        /* setup cascade interrupts */
        setup_irq(NILE4_IRQ_BASE  + NILE4_INT_INTE, &irq_cascade);
        setup_irq(CPU_IRQ_BASE + CPU_NILE4_CASCADE, &irq_cascade);
 
-       set_except_vector(0, ddbIRQ);
-
        nile4_irq_setup(NILE4_IRQ_BASE);
        m1543_irq_setup();
        init_i8259_irqs();
@@ -163,6 +166,4 @@ void __init ddb_irq_setup(void)
 
        /* Enable the interrupt cascade */
        nile4_enable_irq(NILE4_IRQ_BASE+IRQ_I8259_CASCADE);
-
-
 }