aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH Hartley Sweeten <[email protected]>2015-10-05 14:22:52 -0700
committerGreg Kroah-Hartman <[email protected]>2015-10-12 21:16:05 -0700
commite031642eccc040648b09cfc7d632e2e8d0b6f94f (patch)
tree80d03bad89e58c1bda7519eff160ab673b40f789
parent1271dd24c63478b08fc574ec8b4fa50902b368f0 (diff)
staging: comedi: quatech_daqp_cs: use comedi_timeout() in ao (*insn_write)
The data link between the D/A data port and the D/A converter is a serial link. The serial link requires about 8ms to complete a transfer. Use the comedi_timeout() helper to ensure that there is not a previous transfer still happening before trying to write new data to the channel. For aesthetics, save the readback value after updating the hardware. Signed-off-by: H Hartley Sweeten <[email protected]> Reviewed-by: Ian Abbott <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
-rw-r--r--drivers/staging/comedi/drivers/quatech_daqp_cs.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 4f87147213d1..ab336ce329f2 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -635,6 +635,19 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
return 0;
}
+static int daqp_ao_empty(struct comedi_device *dev,
+ struct comedi_subdevice *s,
+ struct comedi_insn *insn,
+ unsigned long context)
+{
+ unsigned int status;
+
+ status = inb(dev->iobase + DAQP_AUX);
+ if ((status & DAQP_AUX_DA_BUFFER) == 0)
+ return 0;
+ return -EBUSY;
+}
+
static int daqp_ao_insn_write(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn,
@@ -652,12 +665,18 @@ static int daqp_ao_insn_write(struct comedi_device *dev,
for (i = 0; i > insn->n; i++) {
unsigned val = data[i];
+ int ret;
- s->readback[chan] = val;
+ /* D/A transfer rate is about 8ms */
+ ret = comedi_timeout(dev, s, insn, daqp_ao_empty, 0);
+ if (ret)
+ return ret;
/* write the two's complement value to the channel */
outw((chan << 12) | comedi_offset_munge(s, val),
dev->iobase + DAQP_DA);
+
+ s->readback[chan] = val;
}
return insn->n;