Use the comedi_timeout() helper to wait for the DAC to be idle before
writing to it.

Signed-off-by: H Hartley Sweeten <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 drivers/staging/comedi/drivers/adv_pci1724.c | 33 +++++++++++-----------------
 1 file 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;
-- 
2.0.3

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to