summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-09-20 23:39:34 (GMT)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-09-25 22:59:59 (GMT)
commitdd89a8b60997eab41a1e92a618bd739535c58459 (patch)
treec68615e6ae04da59e7a7091be9e0ccabf7441e48
parent8f494fe626b4733f407a6db62963f594cc8dbcf8 (diff)
downloadlinux-fsl-qoriq-dd89a8b60997eab41a1e92a618bd739535c58459.tar.xz
staging: comedi: pcl711: factor out the ai end-of-conversion wait
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>
-rw-r--r--drivers/staging/comedi/drivers/pcl711.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c
index 7888781..aab3d73 100644
--- a/drivers/staging/comedi/drivers/pcl711.c
+++ b/drivers/staging/comedi/drivers/pcl711.c
@@ -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);
}