staging: comedi: me_daq: allow differential analog inputs
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Wed, 7 Oct 2015 00:23:43 +0000 (17:23 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Oct 2015 05:56:26 +0000 (22:56 -0700)
The ai (*insn_read) allows differential analog inputs but the subdevice
initialization is missing the SDF_DIFF subdev_flag to allow the user to
select this mode. Fix the subdevice init.

According to the manual, differential operation only works with the
first 8 channels and bipolar ranges. Add a check to the (*insn_read) to
ensure this.

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/me_daq.c

index 91104050a203787f190b8d6a744496953144951b..cfb35662bf23bb1b2eaa5d697e0d2be6f9c6fc42 100644 (file)
@@ -246,6 +246,15 @@ static int me_ai_insn_read(struct comedi_device *dev,
        unsigned short val;
        int ret;
 
+       /*
+        * For differential operation, there are only 8 input channels
+        * and only bipolar ranges are available.
+        */
+       if (aref & AREF_DIFF) {
+               if (chan > 7 || comedi_range_is_unipolar(s, range))
+                       return -EINVAL;
+       }
+
        /* stop any running conversion */
        devpriv->ctrl1 &= ~ME_CTRL1_ADC_MODE_MASK;
        writew(devpriv->ctrl1, dev->mmio + ME_CTRL1_REG);
@@ -472,7 +481,7 @@ static int me_auto_attach(struct comedi_device *dev,
 
        s = &dev->subdevices[0];
        s->type         = COMEDI_SUBD_AI;
-       s->subdev_flags = SDF_READABLE | SDF_COMMON;
+       s->subdev_flags = SDF_READABLE | SDF_COMMON | SDF_DIFF;
        s->n_chan       = 16;
        s->maxdata      = 0x0fff;
        s->len_chanlist = 16;