]> Pileus Git - ~andy/linux/commitdiff
staging: comedi: pcmmio: use core helpers to munge bipolar ai data
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Mon, 9 Dec 2013 22:30:40 +0000 (15:30 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Dec 2013 18:01:50 +0000 (10:01 -0800)
Use the comedi_range_is_bipolar() and comedi_offset_munge() helpers to
munge the bipolar analog input data.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/pcmmio.c

index 9394782fb74b6beb52ced16634964abc420bbab9..eb6139570f3eed45edf05597bfa37981442c85cb 100644 (file)
@@ -785,7 +785,7 @@ static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
                    CR_RANGE(insn->chanspec), aref = CR_AREF(insn->chanspec);
                unsigned char command_byte = 0;
                unsigned iooffset = 0;
-               unsigned short sample, adc_adjust = 0;
+               unsigned int val;
 
                if (chan > 7)
                        chan -= 8, iooffset = 4;        /*
@@ -800,14 +800,6 @@ static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
                                                 * single-ended
                                                 */
                }
-               if (range < 2)
-                       adc_adjust = 0x8000;    /*
-                                                * bipolar ranges
-                                                * (-5,5 .. -10,10 need to be
-                                                * adjusted -- that is.. they
-                                                * need to wrap around by
-                                                * adding 0x8000
-                                                */
 
                if (chan % 2) {
                        command_byte |= 1 << 6; /*
@@ -835,12 +827,16 @@ static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
                adc_wait_ready(iobase + iooffset);
 
                /* read data lo byte */
-               sample = inb(iobase + iooffset + 0);
+               val = inb(iobase + iooffset + 0);
 
                /* read data hi byte */
-               sample |= inb(iobase + iooffset + 1) << 8;
-               sample += adc_adjust;   /* adjustment .. munge data */
-               data[n] = sample;
+               val |= inb(iobase + iooffset + 1) << 8;
+
+               /* bipolar data is two's complement */
+               if (comedi_range_is_bipolar(s, range))
+                       val = comedi_offset_munge(s, val);
+
+               data[n] = val;
        }
        /* return the number of samples read/written */
        return n;