diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-09-20 23:39:34 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-09-25 22:59:59 (GMT) |
commit | dd89a8b60997eab41a1e92a618bd739535c58459 (patch) | |
tree | c68615e6ae04da59e7a7091be9e0ccabf7441e48 | |
parent | 8f494fe626b4733f407a6db62963f594cc8dbcf8 (diff) | |
download | linux-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.c | 39 |
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); } |