[PATCH 17/31] staging: comedi: pcl711: add differential input support for 8112 boards

H Hartley Sweeten hsweeten at visionengravers.com
Fri Sep 20 23:40:23 UTC 2013


The ACL-8112 boards can do differential analog inputs. Add support for
this mode.

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

diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c
index 8aa3d92..1386d8f 100644
--- a/drivers/staging/comedi/drivers/pcl711.c
+++ b/drivers/staging/comedi/drivers/pcl711.c
@@ -82,6 +82,7 @@ supported.
 #define PCL711_MUX_CHAN(x)	(((x) & 0xf) << 0)
 #define PCL711_MUX_CS0		(1 << 4)
 #define PCL711_MUX_CS1		(1 << 5)
+#define PCL711_MUX_DIFF		(PCL711_MUX_CS0 | PCL711_MUX_CS1)
 #define PCL711_MODE		0x0b
 #define PCL711_SOFTTRIG		0x0c
 #define PCL711_DO_LO		0x0d
@@ -229,16 +230,22 @@ static void pcl711_set_changain(struct comedi_device *dev,
 	const struct pcl711_board *board = comedi_board(dev);
 	unsigned int chan = CR_CHAN(chanspec);
 	unsigned int range = CR_RANGE(chanspec);
+	unsigned int aref = CR_AREF(chanspec);
 	unsigned int mux = 0;
 
 	outb(range, dev->iobase + PCL711_GAIN);
 
 	if (board->is_8112) {
 		/* Select the correct MPC508A chip */
-		if (chan < 8)
-			mux |= PCL711_MUX_CS0;
-		else
-			mux |= PCL711_MUX_CS1;
+		if (aref == AREF_DIFF) {
+			chan &= 0x7;
+			mux |= PCL711_MUX_DIFF;
+		} else {
+			if (chan < 8)
+				mux |= PCL711_MUX_CS0;
+			else
+				mux |= PCL711_MUX_CS1;
+		}
 	}
 	outb(mux | PCL711_MUX_CHAN(chan), dev->iobase + PCL711_MUX_REG);
 }
@@ -515,6 +522,8 @@ static int pcl711_attach(struct comedi_device *dev, struct comedi_devconfig *it)
 	s = &dev->subdevices[0];
 	s->type		= COMEDI_SUBD_AI;
 	s->subdev_flags	= SDF_READABLE | SDF_GROUND;
+	if (board->is_8112)
+		s->subdev_flags	|= SDF_DIFF;
 	s->n_chan	= board->n_aichan;
 	s->maxdata	= 0xfff;
 	s->range_table	= board->ai_range_type;
-- 
1.8.3.2



More information about the devel mailing list