Use comedi_timeout() to wait for the analog input end-of-conversion. Use break to exit the loop so that the common path can be used to unlock the spinlock. Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/staging/comedi/drivers/das1800.c | 33 ++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/drivers/staging/comedi/drivers/das1800.c b/drivers/staging/comedi/drivers/das1800.c index 320d95a..e2022ee 100644 --- a/drivers/staging/comedi/drivers/das1800.c +++ b/drivers/staging/comedi/drivers/das1800.c @@ -1194,15 +1194,27 @@ static int das1800_ai_do_cmd(struct comedi_device *dev, return 0; } -/* read analog input */ +static int das1800_ai_eoc(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, + unsigned long context) +{ + unsigned int status; + + status = inb(dev->iobase + DAS1800_STATUS); + if (status & FNE) + return 0; + return -EBUSY; +} + static int das1800_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { const struct das1800_board *thisboard = comedi_board(dev); - int i, n; + int ret = 0; + int n; int chan, range, aref, chan_range; - int timeout = 1000; unsigned short dpnt; int conv_flags = 0; unsigned long irq_flags; @@ -1237,25 +1249,22 @@ static int das1800_ai_rinsn(struct comedi_device *dev, for (n = 0; n < insn->n; n++) { /* trigger conversion */ outb(0, dev->iobase + DAS1800_FIFO); - for (i = 0; i < timeout; i++) { - if (inb(dev->iobase + DAS1800_STATUS) & FNE) - break; - } - if (i == timeout) { + + ret = comedi_timeout(dev, s, insn, das1800_ai_eoc, 0); + if (ret) { comedi_error(dev, "timeout"); - n = -ETIME; - goto exit; + break; } + dpnt = inw(dev->iobase + DAS1800_FIFO); /* shift data to offset binary for bipolar ranges */ if ((conv_flags & UB) == 0) dpnt += 1 << (thisboard->resolution - 1); data[n] = dpnt; } -exit: spin_unlock_irqrestore(&dev->spinlock, irq_flags); - return n; + return ret ? ret : n; } /* writes to an analog output channel */ -- 1.8.5.2 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel