[PATCH 12/15] staging: comedi: ni_daq_700: introduce daq700_ai_set_chanspec()

H Hartley Sweeten hsweeten at visionengravers.com
Tue Jul 15 00:21:09 UTC 2014


In preperation for adding async command support, introduce a helper
function to set chan/range/aref information when reading an analog
input sample.

Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
Cc: Ian Abbott <abbotti at mev.co.uk>
Cc: Greg Kroah-Hartman <gregk at linuxfoundation.org>
---
 drivers/staging/comedi/drivers/ni_daq_700.c | 40 +++++++++++++++++------------
 1 file changed, 24 insertions(+), 16 deletions(-)

diff --git a/drivers/staging/comedi/drivers/ni_daq_700.c b/drivers/staging/comedi/drivers/ni_daq_700.c
index 2b4d4e6..2a474b0 100644
--- a/drivers/staging/comedi/drivers/ni_daq_700.c
+++ b/drivers/staging/comedi/drivers/ni_daq_700.c
@@ -150,6 +150,29 @@ static int daq700_dio_insn_config(struct comedi_device *dev,
 	return insn->n;
 }
 
+static void daq700_ai_set_chanspec(struct comedi_device *dev,
+				   unsigned int chanspec)
+{
+	unsigned int chan = CR_CHAN(chanspec);
+	unsigned int range = CR_RANGE(chanspec);
+	unsigned int aref = CR_AREF(chanspec);
+	unsigned int val;
+
+	/* set channel mode/range */
+	if (range >= 1)
+		range++;	/* convert range to hardware value */
+	val = DAQ700_CMD3_ARNG(range);
+	if (aref == AREF_DIFF)
+		val |= DAQ700_CMD3_DIFF;
+	outb(val, dev->iobase + DAQ700_CMD3_REG);
+
+	/* set multiplexer for single-channel scan */
+	outb(DAQ700_CMD1_SCANDISAB | DAQ700_CMD1_MA(chan),
+	     dev->iobase + DAQ700_CMD1_REG);
+	/* mux needs 2us to really settle [Fred Brooks]. */
+	udelay(2);
+}
+
 static void daq700_ai_start_conv(struct comedi_device *dev)
 {
 	/*
@@ -195,26 +218,11 @@ static int daq700_ai_insn_read(struct comedi_device *dev,
 			       struct comedi_insn *insn,
 			       unsigned int *data)
 {
-	unsigned int chan = CR_CHAN(insn->chanspec);
-	unsigned int range = CR_RANGE(insn->chanspec);
-	unsigned int aref = CR_AREF(insn->chanspec);
 	unsigned int val;
 	int ret;
 	int i;
 
-	/* set channel mode/range */
-	if (range >= 1)
-		range++;	/* convert range to hardware value */
-	val = DAQ700_CMD3_ARNG(range);
-	if (aref == AREF_DIFF)
-		val |= DAQ700_CMD3_DIFF;
-	outb(val, dev->iobase + DAQ700_CMD3_REG);
-
-	/* set multiplexer for single-channel scan */
-	outb(DAQ700_CMD1_SCANDISAB | DAQ700_CMD1_MA(chan),
-	     dev->iobase + DAQ700_CMD1_REG);
-	/* mux needs 2us to really settle [Fred Brooks]. */
-	udelay(2);
+	daq700_ai_set_chanspec(dev, insn->chanspec);
 
 	for (i = 0; i < insn->n; i++) {
 		daq700_ai_start_conv(dev);
-- 
1.9.3



More information about the devel mailing list