[PATCH 16/31] staging: comedi: pcl711: fix pcl711_set_changain()

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


Currently the board->is_8112 handling in this function does not write
the value to the mux register. Also, the value for channels >= 8 is
calculated incorrectly.

Define the magic numbers used with the mux register and fix the function
so 8112 boards work correctly.

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 | 35 ++++++++++++++-------------------
 1 file changed, 15 insertions(+), 20 deletions(-)

diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c
index aab3d73..8aa3d92 100644
--- a/drivers/staging/comedi/drivers/pcl711.c
+++ b/drivers/staging/comedi/drivers/pcl711.c
@@ -78,7 +78,10 @@ supported.
 #define PCL711_DI_HI		0x07
 #define PCL711_CLRINTR		0x08
 #define PCL711_GAIN		0x09
-#define PCL711_MUX		0x0a
+#define PCL711_MUX_REG		0x0a
+#define PCL711_MUX_CHAN(x)	(((x) & 0xf) << 0)
+#define PCL711_MUX_CS0		(1 << 4)
+#define PCL711_MUX_CS1		(1 << 5)
 #define PCL711_MODE		0x0b
 #define PCL711_SOFTTRIG		0x0c
 #define PCL711_DO_LO		0x0d
@@ -220,32 +223,24 @@ static irqreturn_t pcl711_interrupt(int irq, void *d)
 	return IRQ_HANDLED;
 }
 
-static void pcl711_set_changain(struct comedi_device *dev, int chan)
+static void pcl711_set_changain(struct comedi_device *dev,
+				unsigned int chanspec)
 {
 	const struct pcl711_board *board = comedi_board(dev);
-	int chan_register;
+	unsigned int chan = CR_CHAN(chanspec);
+	unsigned int range = CR_RANGE(chanspec);
+	unsigned int mux = 0;
 
-	outb(CR_RANGE(chan), dev->iobase + PCL711_GAIN);
-
-	chan_register = CR_CHAN(chan);
+	outb(range, dev->iobase + PCL711_GAIN);
 
 	if (board->is_8112) {
-
-		/*
-		 *  Set the correct channel.  The two channel banks are switched
-		 *  using the mask value.
-		 *  NB: To use differential channels, you should use
-		 *  mask = 0x30, but I haven't written the support for this
-		 *  yet. /JJ
-		 */
-
-		if (chan_register >= 8)
-			chan_register = 0x20 | (chan_register & 0x7);
+		/* Select the correct MPC508A chip */
+		if (chan < 8)
+			mux |= PCL711_MUX_CS0;
 		else
-			chan_register |= 0x10;
-	} else {
-		outb(chan_register, dev->iobase + PCL711_MUX);
+			mux |= PCL711_MUX_CS1;
 	}
+	outb(mux | PCL711_MUX_CHAN(chan), dev->iobase + PCL711_MUX_REG);
 }
 
 static int pcl711_ai_wait_for_eoc(struct comedi_device *dev,
-- 
1.8.3.2



More information about the devel mailing list