Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[pandora-kernel.git] / drivers / staging / vme / bridges / vme_ca91cx42.c
index 1c94ae6..5122c13 100644 (file)
@@ -190,7 +190,7 @@ static irqreturn_t ca91cx42_irqhandler(int irq, void *ptr)
                serviced |= ca91cx42_VIRQ_irqhandler(ca91cx42_bridge, stat);
 
        /* Clear serviced interrupts */
-       iowrite32(stat, bridge->base + LINT_STAT);
+       iowrite32(serviced, bridge->base + LINT_STAT);
 
        return IRQ_HANDLED;
 }
@@ -256,6 +256,18 @@ static void ca91cx42_irq_exit(struct ca91cx42_driver *bridge,
        free_irq(pdev->irq, pdev);
 }
 
+static int ca91cx42_iack_received(struct ca91cx42_driver *bridge, int level)
+{
+       u32 tmp;
+
+       tmp = ioread32(bridge->base + LINT_STAT);
+
+       if (tmp & (1 << level))
+               return 0;
+       else
+               return 1;
+}
+
 /*
  * Set up an VME interrupt
  */
@@ -311,7 +323,8 @@ static int ca91cx42_irq_generate(struct vme_bridge *ca91cx42_bridge, int level,
        iowrite32(tmp, bridge->base + VINT_EN);
 
        /* Wait for IACK */
-       wait_event_interruptible(bridge->iack_queue, 0);
+       wait_event_interruptible(bridge->iack_queue,
+                                ca91cx42_iack_received(bridge, level));
 
        /* Return interrupt to low state */
        tmp = ioread32(bridge->base + VINT_EN);