]> err.no Git - linux-2.6/blobdiff - kernel/irq/handle.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
[linux-2.6] / kernel / irq / handle.c
index c29f83c16497cff719b118bf1a8fabfb78076cd2..0f6530117105c6f000668c3bcae8ca8be1b6e4bd 100644 (file)
@@ -76,10 +76,11 @@ irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs)
 /*
  * Have got an event to handle:
  */
-fastcall int handle_IRQ_event(unsigned int irq, struct pt_regs *regs,
+fastcall irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs,
                                struct irqaction *action)
 {
-       int ret, retval = 0, status = 0;
+       irqreturn_t ret, retval = IRQ_NONE;
+       unsigned int status = 0;
 
        if (!(action->flags & SA_INTERRUPT))
                local_irq_enable();
@@ -111,20 +112,22 @@ fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs)
        unsigned int status;
 
        kstat_this_cpu.irqs[irq]++;
-       if (desc->status & IRQ_PER_CPU) {
+       if (CHECK_IRQ_PER_CPU(desc->status)) {
                irqreturn_t action_ret;
 
                /*
                 * No locking required for CPU-local interrupts:
                 */
-               desc->handler->ack(irq);
+               if (desc->handler->ack)
+                       desc->handler->ack(irq);
                action_ret = handle_IRQ_event(irq, regs, desc->action);
                desc->handler->end(irq);
                return 1;
        }
 
        spin_lock(&desc->lock);
-       desc->handler->ack(irq);
+       if (desc->handler->ack)
+               desc->handler->ack(irq);
        /*
         * REPLAY is when Linux resends an IRQ that was dropped earlier
         * WAITING is used by probe to mark irqs that are being tested