Skip to content

Commit

Permalink
Staging: VME: Fix ca91cx42 VME interrupt generation.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Vincent Bossier authored and Greg Kroah-Hartman committed Jun 28, 2011
1 parent 05614fb commit 54b4a77
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion drivers/staging/vme/bridges/vme_ca91cx42.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 54b4a77

Please sign in to comment.