On 2014-02-06 23:49, H Hartley Sweeten wrote:
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.
I don't think you can rely on jiffies being updated while holding the
spin-lock with interrupts disabled, so the timeout might not expire.
Probably best to drop this patch for now.
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/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 */
--
-=( Ian Abbott @ MEV Ltd. E-mail: <abbo...@mev.co.uk> )=-
-=( Tel: +44 (0)161 477 1898 FAX: +44 (0)161 718 3587 )=-
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel