diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2016-04-08 12:41:51 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-04-28 22:16:10 -0700 |
commit | cfc2236bbce6f0e21e2618c02d750a5239d45352 (patch) | |
tree | 2ba5df887ce989d9c586a8fc2481e11842cd2d48 /drivers/staging/comedi/drivers/das1800.c | |
parent | staging: comedi: das1800: refactor program_chanlist() (diff) | |
download | linux-dev-cfc2236bbce6f0e21e2618c02d750a5239d45352.tar.xz linux-dev-cfc2236bbce6f0e21e2618c02d750a5239d45352.zip |
staging: comedi: das1800: use comedi_timeout()
Use the helper function to handle the busywaiting for the analog
input conversion to complete.
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>
Diffstat (limited to 'drivers/staging/comedi/drivers/das1800.c')
-rw-r--r-- | drivers/staging/comedi/drivers/das1800.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/staging/comedi/drivers/das1800.c b/drivers/staging/comedi/drivers/das1800.c index 2bb53dbb85f7..4355171ad7d0 100644 --- a/drivers/staging/comedi/drivers/das1800.c +++ b/drivers/staging/comedi/drivers/das1800.c @@ -937,6 +937,19 @@ static int das1800_ai_cmd(struct comedi_device *dev, return 0; } +static int das1800_ai_eoc(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, + unsigned long context) +{ + unsigned char status; + + status = inb(dev->iobase + DAS1800_STATUS); + if (status & FNE) + return 0; + return -EBUSY; +} + static int das1800_ai_insn_read(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, @@ -944,8 +957,8 @@ static int das1800_ai_insn_read(struct comedi_device *dev, { unsigned int range = CR_RANGE(insn->chanspec); bool is_unipolar = comedi_range_is_unipolar(s, range); - int i, n; - int timeout = 1000; + int ret = 0; + int n; unsigned short dpnt; unsigned long flags; @@ -966,24 +979,19 @@ static int das1800_ai_insn_read(struct comedi_device *dev, for (n = 0; n < insn->n; n++) { /* trigger conversion */ outb(0, dev->iobase + DAS1800_FIFO); - for (i = 0; i < timeout; i++) { - if (inb(dev->iobase + DAS1800_STATUS) & FNE) - break; - } - if (i == timeout) { - dev_err(dev->class_dev, "timeout\n"); - n = -ETIME; - goto exit; - } + + ret = comedi_timeout(dev, s, insn, das1800_ai_eoc, 0); + if (ret) + break; + dpnt = inw(dev->iobase + DAS1800_FIFO); if (!is_unipolar) dpnt = comedi_offset_munge(s, dpnt); data[n] = dpnt; } -exit: spin_unlock_irqrestore(&dev->spinlock, flags); - return n; + return ret ? ret : insn->n; } static int das1800_ao_insn_write(struct comedi_device *dev, |