summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-03-22 09:50:31 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-03-25 11:42:58 -0700
commit810c73c7e7d3892fb508e28ca774d69309c316a2 (patch)
treed3885824a0de3c4aead20ddc1a70c5f039ce69e1
parent3c4dfac8f7d2504234d1b7e3108e401a882bb9e1 (diff)
staging: comedi: ni_labpc: introduce labpc_ai_wait_for_data()
Introduce a helper function to wait for the a/d conversion to complete. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/comedi/drivers/ni_labpc.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 9e47fc0322f4..ceb6e786cbdd 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -206,6 +206,8 @@ NI manuals:
#define INIT_A1_BITS 0x70
#define COUNTER_B_BASE_REG 0x18
+#define LABPC_ADC_TIMEOUT 1000
+
enum scan_mode {
MODE_SINGLE_CHAN,
MODE_SINGLE_CHAN_INTERVAL,
@@ -453,6 +455,21 @@ static void labpc_clear_adc_fifo(struct comedi_device *dev)
labpc_read_adc_fifo(dev);
}
+static int labpc_ai_wait_for_data(struct comedi_device *dev,
+ int timeout)
+{
+ struct labpc_private *devpriv = dev->private;
+ int i;
+
+ for (i = 0; i < timeout; i++) {
+ devpriv->stat1 = devpriv->read_byte(dev->iobase + STATUS1_REG);
+ if (devpriv->stat1 & DATA_AVAIL_BIT)
+ return 0;
+ udelay(1);
+ }
+ return -ETIME;
+}
+
static int labpc_ai_insn_read(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn,
@@ -462,8 +479,8 @@ static int labpc_ai_insn_read(struct comedi_device *dev,
unsigned int chan = CR_CHAN(insn->chanspec);
unsigned int range = CR_RANGE(insn->chanspec);
unsigned int aref = CR_AREF(insn->chanspec);
- int timeout = 1000;
- int i, n;
+ int ret;
+ int i;
/* disable timed conversions, interrupt generation and dma */
labpc_cancel(dev, s);
@@ -489,24 +506,18 @@ static int labpc_ai_insn_read(struct comedi_device *dev,
labpc_clear_adc_fifo(dev);
- for (n = 0; n < insn->n; n++) {
+ for (i = 0; i < insn->n; i++) {
/* trigger conversion */
devpriv->write_byte(0x1, dev->iobase + ADC_CONVERT_REG);
- for (i = 0; i < timeout; i++) {
- if (devpriv->read_byte(dev->iobase +
- STATUS1_REG) & DATA_AVAIL_BIT)
- break;
- udelay(1);
- }
- if (i == timeout) {
- comedi_error(dev, "timeout");
- return -ETIME;
- }
- data[n] = labpc_read_adc_fifo(dev);
+ ret = labpc_ai_wait_for_data(dev, LABPC_ADC_TIMEOUT);
+ if (ret)
+ return ret;
+
+ data[i] = labpc_read_adc_fifo(dev);
}
- return n;
+ return insn->n;
}
#ifdef CONFIG_ISA_DMA_API