Commit df455175 authored by Martyn Welch's avatar Martyn Welch Committed by Greg Kroah-Hartman
Browse files

Staging: vme: Correct tsi-148 VME interrupt free routine



As identified by Jiri, the VME interrupt free routine removes the service
routine before disabling the interrupt. Re-order operations to be performed in
the reverse of the request routine.

Signed-off-by: default avatarMartyn Welch <martyn.welch@gefanuc.com>
Cc: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent c7ef5da3
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -484,21 +484,22 @@ void tsi148_free_irq(int level, int statid)
	/* Get semaphore */
	down(&(vme_irq));

	tsi148_bridge->irq[level - 1].callback[statid].func = NULL;
	tsi148_bridge->irq[level - 1].callback[statid].priv_data = NULL;
	tsi148_bridge->irq[level - 1].count--;

	/* Disable IRQ level */
	/* Disable IRQ level if no more interrupts attached at this level*/
	if (tsi148_bridge->irq[level - 1].count == 0) {
		tmp = ioread32be(tsi148_bridge->base + TSI148_LCSR_INTEO);
		tmp &= ~TSI148_LCSR_INTEO_IRQEO[level - 1];
		iowrite32be(tmp, tsi148_bridge->base + TSI148_LCSR_INTEO);

		tmp = ioread32be(tsi148_bridge->base + TSI148_LCSR_INTEN);
		tmp &= ~TSI148_LCSR_INTEN_IRQEN[level - 1];
		iowrite32be(tmp, tsi148_bridge->base + TSI148_LCSR_INTEN);

		tmp = ioread32be(tsi148_bridge->base + TSI148_LCSR_INTEO);
		tmp &= ~TSI148_LCSR_INTEO_IRQEO[level - 1];
		iowrite32be(tmp, tsi148_bridge->base + TSI148_LCSR_INTEO);
	}

	tsi148_bridge->irq[level - 1].callback[statid].func = NULL;
	tsi148_bridge->irq[level - 1].callback[statid].priv_data = NULL;

	/* Release semaphore */
	up(&(vme_irq));
}