Staging: VME: Fix ca91cx42 VME interrupt generation.
authorVincent Bossier <vincent.bossier@gmail.com>
Thu, 9 Jun 2011 07:59:43 +0000 (08:59 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 28 Jun 2011 21:08:34 +0000 (14:08 -0700)
The wait_event_interruptible call requires a condition as second argument that
needs to be true sometimes, which is obviously not the case with '0'. The new
logic is inspired from the tsi148 driver and takes into account Universe II chip
specifics.

Signed-off-by: Vincent Bossier <vincent.bossier@gmail.com>
Acked-by: Martyn Welch <martyn.welch@ge.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/vme/bridges/vme_ca91cx42.c

index 6aad34b8b3fe4c7d2e63f08d6cab6ebeb06ea090..5122c13a9563876baaadb512b5754cdfcc5df12e 100644 (file)
@@ -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);