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 <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 drivers/staging/comedi/drivers/me_daq.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/comedi/drivers/me_daq.c 
b/drivers/staging/comedi/drivers/me_daq.c
index 9110405..cfb3566 100644
--- a/drivers/staging/comedi/drivers/me_daq.c
+++ b/drivers/staging/comedi/drivers/me_daq.c
@@ -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;
-- 
2.5.1

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to