staging: comedi: quatech_daqp_cs: introduce daqp_clear_events()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Mon, 5 Oct 2015 21:22:55 +0000 (14:22 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Oct 2015 04:16:05 +0000 (21:16 -0700)
Introduce a helper function for the common code used to clear any
pending interrupts.

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/quatech_daqp_cs.c

index 0d814ff..2f35305 100644 (file)
@@ -154,6 +154,23 @@ static const struct comedi_lrange range_daqp_ai = {
        }
 };
 
+static int daqp_clear_events(struct comedi_device *dev, int loops)
+{
+       unsigned int status;
+
+       /*
+        * Reset any pending interrupts (my card has a tendency to require
+        * require multiple reads on the status register to achieve this).
+        */
+       while (--loops) {
+               status = inb(dev->iobase + DAQP_STATUS);
+               if ((status & DAQP_STATUS_EVENTS) == 0)
+                       return 0;
+       }
+       dev_err(dev->class_dev, "couldn't clear events in status register\n");
+       return -EBUSY;
+}
+
 /* Cancel a running acquisition */
 
 static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
@@ -280,8 +297,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
                             struct comedi_insn *insn, unsigned int *data)
 {
        struct daqp_private *devpriv = dev->private;
+       int ret;
        int i;
-       int counter = 10000;
 
        if (devpriv->stop)
                return -EIO;
@@ -306,18 +323,9 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
             DAQP_CONTROL_PACER_CLK_100KHZ | DAQP_CONTROL_EOS_INT_ENABLE,
             dev->iobase + DAQP_CONTROL);
 
-       /* Reset any pending interrupts (my card has a tendency to require
-        * require multiple reads on the status register to achieve this)
-        */
-
-       while (--counter
-              && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
-               ;
-       if (!counter) {
-               dev_err(dev->class_dev,
-                       "couldn't clear interrupts in status register\n");
-               return -1;
-       }
+       ret = daqp_clear_events(dev, 10000);
+       if (ret)
+               return ret;
 
        init_completion(&devpriv->eos);
        devpriv->interrupt_mode = semaphore;
@@ -457,6 +465,7 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
        int counter;
        int scanlist_start_on_every_entry;
        int threshold;
+       int ret;
        int i;
 
        if (devpriv->stop)
@@ -607,18 +616,9 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
             DAQP_CONTROL_PACER_CLK_5MHZ | DAQP_CONTROL_FIFO_INT_ENABLE,
             dev->iobase + DAQP_CONTROL);
 
-       /* Reset any pending interrupts (my card has a tendency to require
-        * require multiple reads on the status register to achieve this)
-        */
-       counter = 100;
-       while (--counter
-              && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
-               ;
-       if (!counter) {
-               dev_err(dev->class_dev,
-                       "couldn't clear interrupts in status register\n");
-               return -1;
-       }
+       ret = daqp_clear_events(dev, 100);
+       if (ret)
+               return ret;
 
        devpriv->interrupt_mode = buffer;