vserver 1.9.3
[linux-2.6.git] / arch / arm / kernel / irq.c
index 68636bd..9c65012 100644 (file)
@@ -46,6 +46,7 @@
  */
 #define MAX_IRQ_CNT    100000
 
+static int noirqdebug;
 static volatile unsigned long irq_err_count;
 static spinlock_t irq_controller_lock = SPIN_LOCK_UNLOCKED;
 static LIST_HEAD(irq_pending);
@@ -235,7 +236,7 @@ report_bad_irq(unsigned int irq, struct pt_regs *regs, struct irqdesc *desc, int
        static int count = 100;
        struct irqaction *action;
 
-       if (!count)
+       if (!count || noirqdebug)
                return;
 
        count--;
@@ -261,7 +262,7 @@ static int
 __do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs)
 {
        unsigned int status;
-       int retval = 0;
+       int ret, retval = 0;
 
        spin_unlock(&irq_controller_lock);
 
@@ -270,8 +271,10 @@ __do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs)
 
        status = 0;
        do {
-               status |= action->flags;
-               retval |= action->handler(irq, action->dev_id, regs);
+               ret = action->handler(irq, action->dev_id, regs);
+               if (ret == IRQ_HANDLED)
+                       status |= action->flags;
+               retval |= ret;
                action = action->next;
        } while (action);
 
@@ -861,3 +864,11 @@ void __init init_IRQ(void)
        init_arch_irq();
        init_dma();
 }
+
+static int __init noirqdebug_setup(char *str)
+{
+       noirqdebug = 1;
+       return 1;
+}
+
+__setup("noirqdebug", noirqdebug_setup);