[PATCH 06/19] staging: comedi: adv_pci1724: use comedi_timeout() to wait for DAC idle state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
Cc: Ian Abbott <abbotti@xxxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 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
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux