summaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2014-11-20 15:10:49 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-11-26 15:36:40 -0800
commite25e22b01203f6588b0124cc2d3d45756d6de59f (patch)
treed4a3ac473444fde35cf883dc52ac31077d6df598 /drivers/staging/comedi
parentdcbd4ed87cc82398238eb870008a338b4faec76f (diff)
downloadop-kernel-dev-e25e22b01203f6588b0124cc2d3d45756d6de59f.zip
op-kernel-dev-e25e22b01203f6588b0124cc2d3d45756d6de59f.tar.gz
staging: comedi: adv_pci1724: use comedi_timeout() to wait for DAC idle state
Use the comedi_timeout() helper to wait for the DAC to be idle before writing to it. 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')
-rw-r--r--drivers/staging/comedi/drivers/adv_pci1724.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/drivers/staging/comedi/drivers/adv_pci1724.c b/drivers/staging/comedi/drivers/adv_pci1724.c
index cc70ed8..c19d359 100644
--- a/drivers/staging/comedi/drivers/adv_pci1724.c
+++ b/drivers/staging/comedi/drivers/adv_pci1724.c
@@ -53,7 +53,6 @@ supported PCI devices are configured as comedi devices automatically.
*/
#include <linux/module.h>
-#include <linux/delay.h>
#include <linux/pci.h>
#include "../comedidev.h"
@@ -123,34 +122,24 @@ static const struct comedi_lrange ao_ranges_1724 = {
}
};
-static int wait_for_dac_idle(struct comedi_device *dev)
+static int adv_pci1724_dac_idle(struct comedi_device *dev,
+ struct comedi_subdevice *s,
+ struct comedi_insn *insn,
+ unsigned long context)
{
- static const int timeout = 10000;
- int i;
+ unsigned int status;
- for (i = 0; i < timeout; ++i) {
- if ((inl(dev->iobase + SYNC_OUTPUT_REG) & DAC_BUSY) == 0)
- break;
- udelay(1);
- }
- if (i == timeout) {
- dev_err(dev->class_dev,
- "Timed out waiting for dac to become idle\n");
- return -EIO;
- }
- return 0;
+ status = inl(dev->iobase + SYNC_OUTPUT_REG);
+ if ((status & DAC_BUSY) == 0)
+ return 0;
+ return -EBUSY;
}
static int set_dac(struct comedi_device *dev, unsigned mode, unsigned channel,
unsigned data)
{
- int retval;
unsigned control_bits;
- retval = wait_for_dac_idle(dev);
- if (retval < 0)
- return retval;
-
control_bits = mode;
control_bits |= dac_channel_and_group_select_bits(channel);
control_bits |= dac_data_bits(data);
@@ -174,6 +163,10 @@ static int adv_pci1724_insn_write(struct comedi_device *dev,
for (i = 0; i < insn->n; ++i) {
unsigned int val = data[i];
+ ret = comedi_timeout(dev, s, insn, adv_pci1724_dac_idle, 0);
+ if (ret)
+ return ret;
+
ret = set_dac(dev, mode, chan, val);
if (ret < 0)
return ret;
OpenPOWER on IntegriCloud