Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54b4a779 authored by Vincent Bossier's avatar Vincent Bossier Committed by Greg Kroah-Hartman
Browse files

Staging: VME: Fix ca91cx42 VME interrupt generation.



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: default avatarVincent Bossier <vincent.bossier@gmail.com>
Acked-by: default avatarMartyn Welch <martyn.welch@ge.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 05614fbf
Loading
Loading
Loading
Loading
+14 −1
Original line number Original line Diff line number Diff line
@@ -256,6 +256,18 @@ static void ca91cx42_irq_exit(struct ca91cx42_driver *bridge,
	free_irq(pdev->irq, pdev);
	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
 * 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);
	iowrite32(tmp, bridge->base + VINT_EN);


	/* Wait for IACK */
	/* 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 */
	/* Return interrupt to low state */
	tmp = ioread32(bridge->base + VINT_EN);
	tmp = ioread32(bridge->base + VINT_EN);