diff options
| author | H Hartley Sweeten <[email protected]> | 2015-10-05 14:22:52 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <[email protected]> | 2015-10-12 21:16:05 -0700 |
| commit | e031642eccc040648b09cfc7d632e2e8d0b6f94f (patch) | |
| tree | 80d03bad89e58c1bda7519eff160ab673b40f789 | |
| parent | 1271dd24c63478b08fc574ec8b4fa50902b368f0 (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.c | 21 |
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; |