]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
staging: comedi: pcl818: interrupt handlers should not busywait
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 4 Mar 2014 18:29:33 +0000 (11:29 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Mar 2014 01:06:11 +0000 (17:06 -0800)
The interrupt is only generated by the hardware at the completion of
an A/D conversion. Because of this the sanity check to make sure that
the A/D conversion is complete and data is available is probably
unnecessary but it doesn't hurt anything.

The busywait loop is a different issue. Interrupt routines should not
busywait. That's just mean...

Remove the bustwait and use pcl818_ai_eoc() to check for the end-of-
conversion.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/pcl818.c

index 661a907272bcec10207a64acb70872dc996dfc86..0167d7ee6d0d9fa008748474659c2d9123e07efa 100644 (file)
@@ -547,21 +547,16 @@ static irqreturn_t interrupt_pcl818_ai_mode13_int(int irq, void *d)
        struct comedi_subdevice *s = dev->read_subdev;
        struct comedi_cmd *cmd = &s->async->cmd;
        unsigned int chan;
-       int timeout = 50;       /* wait max 50us */
 
-       while (timeout--) {
-               if (inb(dev->iobase + PCL818_STATUS) & 0x10)
-                       goto conv_finish;
-               udelay(1);
+       if (pcl818_ai_eoc(dev, s, NULL, 0)) {
+               outb(0, dev->iobase + PCL818_STATUS);   /* clear INT request */
+               comedi_error(dev, "A/D mode1/3 IRQ without DRDY!");
+               s->cancel(dev, s);
+               s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
+               comedi_event(dev, s);
+               return IRQ_HANDLED;
        }
-       outb(0, dev->iobase + PCL818_STATUS);   /* clear INT request */
-       comedi_error(dev, "A/D mode1/3 IRQ without DRDY!");
-       s->cancel(dev, s);
-       s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
-       comedi_event(dev, s);
-       return IRQ_HANDLED;
 
-conv_finish:
        comedi_buf_put(s->async, pcl818_ai_get_sample(dev, s, &chan));
        outb(0, dev->iobase + PCL818_CLRINT);   /* clear INT request */