On Mon, Feb 10, 2014 at 11:49:33AM -0700, H Hartley Sweeten wrote:
Use comedi_timeout() to wait for the analog input and output end-of-
conversion.
Use break to exit the loop when a timeout occurs during the analog
input read so that common code can be used to disable the device.
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/icp_multi.c | 104
+++--
1 file changed, 54 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/comedi/drivers/icp_multi.c
b/drivers/staging/comedi/drivers/icp_multi.c
index 19c586b..7fb6ca0 100644
--- a/drivers/staging/comedi/drivers/icp_multi.c
+++ b/drivers/staging/comedi/drivers/icp_multi.c
@@ -171,12 +171,27 @@ static void setup_channel_list(struct comedi_device
*dev,
}
}
+static int icp_multi_ai_eoc(struct comedi_device *dev,
+ struct comedi_subdevice *s,
+ struct comedi_insn *insn,
+ unsigned long context)
+{
+ struct icp_multi_private *devpriv = dev-private;
+ unsigned int status;
+
+ status = readw(devpriv-io_addr + ICP_MULTI_ADC_CSR);
+ if ((status ADC_BSY) == 0)
+ return 0;
+ return -EBUSY;
+}
+
static int icp_multi_insn_read_ai(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
struct icp_multi_private *devpriv = dev-private;
- int n, timeout;
+ int ret = 0;
+ int n;
/* Disable A/D conversion ready interrupt */
devpriv-IntEnable = ~ADC_READY;
@@ -199,33 +214,14 @@ static int icp_multi_insn_read_ai(struct comedi_device
*dev,
udelay(1);
/* Wait for conversion to complete, or get fed up waiting */
- timeout = 100;
- while (timeout--) {
- if (!(readw(devpriv-io_addr +
- ICP_MULTI_ADC_CSR) ADC_BSY))
- goto conv_finish;
-
- udelay(1);
+ ret = comedi_timeout(dev, s, insn, icp_multi_ai_eoc, 0);
+ if (ret) {
+ comedi_error(dev, A/D insn timeout);
+ /* Clear data received */
+ data[n] = 0;
+ break;
}
- /* If we reach here, a timeout has occurred */
- comedi_error(dev, A/D insn timeout);
-
- /* Disable interrupt */
- devpriv-IntEnable = ~ADC_READY;
- writew(devpriv-IntEnable, devpriv-io_addr + ICP_MULTI_INT_EN);
-
- /* Clear interrupt status */
- devpriv-IntStatus |= ADC_READY;
- writew(devpriv-IntStatus,
-devpriv-io_addr + ICP_MULTI_INT_STAT);
-
How come these writew() calls are removed? Don't we still need to do
them in failure mode?
thanks,
greg k-h
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel