staging: comedi: dt2814: Don't wait for conversion in interrupt handler
authorIan Abbott <abbotti@mev.co.uk>
Mon, 1 Mar 2021 16:57:53 +0000 (16:57 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Mar 2021 08:25:31 +0000 (09:25 +0100)
When the interrupt handler decides the final sample has been acquired,
it turns off the timer enable (ENB) bit in the Command register.  That
triggers another A/D conversion.  The interrupt handler currently waits
for that to finish and then reads the resulting, unwanted sample.  Since
the functions for handling Comedi read instructions and for setting up
asynchronous commands now call `dt2814_ai_clear()` to wait for and
discard any spurious A/D conversion, let's remove that code from the
interrupt handler.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Link: https://lore.kernel.org/r/20210301165757.243065-3-abbotti@mev.co.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/dt2814.c

index 7e73aa094eea23d8ccf63173b300416cea396f54..8a70b7ba30f465404bd1f2e7090356d3c26ddfef 100644 (file)
@@ -238,21 +238,13 @@ static irqreturn_t dt2814_interrupt(int irq, void *d)
        inb(dev->iobase + DT2814_DATA);
 
        if (!(--devpriv->ntrig)) {
-               int i;
-
                outb(0, dev->iobase + DT2814_CSR);
                /*
-                * note: turning off timed mode triggers another
-                * sample.
+                * Note: turning off timed mode triggers another
+                * sample.  This will be mopped up by the calls to
+                * dt2814_ai_clear().
                 */
 
-               for (i = 0; i < DT2814_TIMEOUT; i++) {
-                       if (inb(dev->iobase + DT2814_CSR) & DT2814_FINISH)
-                               break;
-               }
-               inb(dev->iobase + DT2814_DATA);
-               inb(dev->iobase + DT2814_DATA);
-
                s->async->events |= COMEDI_CB_EOA;
        }
        comedi_handle_events(dev, s);