staging: comedi: pcl711: factor out the ai end-of-conversion wait
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Fri, 20 Sep 2013 23:39:34 +0000 (16:39 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Sep 2013 22:59:59 +0000 (15:59 -0700)
Factor out the analog input end-of-conversion wait to clarify the
pcl711_ai_insn() function a bit.

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

index 7888781efcc90ea9d6c1e80751852854cae12523..aab3d731faa2ae7c424823581240e86df3692ca0 100644 (file)
@@ -71,6 +71,7 @@ supported.
 #define PCL711_CTRCTL          0x03
 #define PCL711_AI_LSB_REG      0x04
 #define PCL711_AI_MSB_REG      0x05
+#define PCL711_AI_MSB_DRDY     (1 << 4)
 #define PCL711_AO_LSB_REG(x)   (0x04 + ((x) * 2))
 #define PCL711_AO_MSB_REG(x)   (0x05 + ((x) * 2))
 #define PCL711_DI_LO           0x06
@@ -124,13 +125,6 @@ static const struct comedi_lrange range_acl8112dg_ai = {
        }
 };
 
-/*
- * flags
- */
-
-#define PCL711_TIMEOUT 100
-#define PCL711_DRDY 0x10
-
 static const int i8253_osc_base = 500; /* 2 Mhz */
 
 struct pcl711_board {
@@ -254,12 +248,26 @@ static void pcl711_set_changain(struct comedi_device *dev, int chan)
        }
 }
 
+static int pcl711_ai_wait_for_eoc(struct comedi_device *dev,
+                                 unsigned int timeout)
+{
+       unsigned int msb;
+
+       while (timeout--) {
+               msb = inb(dev->iobase + PCL711_AI_MSB_REG);
+               if ((msb & PCL711_AI_MSB_DRDY) == 0)
+                       return 0;
+               udelay(1);
+       }
+       return -ETIME;
+}
+
 static int pcl711_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s,
                          struct comedi_insn *insn, unsigned int *data)
 {
        const struct pcl711_board *board = comedi_board(dev);
-       int i, n;
-       int hi;
+       int ret;
+       int n;
 
        pcl711_set_changain(dev, insn->chanspec);
 
@@ -273,17 +281,10 @@ static int pcl711_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s,
                if (!board->is_8112)
                        outb(0, dev->iobase + PCL711_SOFTTRIG);
 
-               i = PCL711_TIMEOUT;
-               while (--i) {
-                       hi = inb(dev->iobase + PCL711_AI_MSB_REG);
-                       if (!(hi & PCL711_DRDY))
-                               goto ok;
-                       udelay(1);
-               }
-               printk(KERN_ERR "comedi%d: pcl711: A/D timeout\n", dev->minor);
-               return -ETIME;
+               ret = pcl711_ai_wait_for_eoc(dev, 100);
+               if (ret)
+                       return ret;
 
-ok:
                data[n] = pcl711_ai_get_sample(dev, s);
        }