staging: comedi: ni_atmio16d: fix atmio16d_dio_insn_config()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Mon, 26 Aug 2013 22:29:33 +0000 (15:29 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Aug 2013 23:59:08 +0000 (16:59 -0700)
This is the (*insn_config) function for a DIO subdevice. It should be
using the data[0] value as the "instruction" to perform on the subdevice.

Use the comedi_dio_insn_config() helper to properly handle instructions.

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

index 8520d83d940f7bb49a86c91fd09fce0c398134dd..bb3491f5ad21c993c916ab827cfe74dffa05ad41 100644 (file)
@@ -576,15 +576,19 @@ static int atmio16d_dio_insn_config(struct comedi_device *dev,
                                    unsigned int *data)
 {
        struct atmio16d_private *devpriv = dev->private;
-       int i;
-       int mask;
+       unsigned int chan = CR_CHAN(insn->chanspec);
+       unsigned int mask;
+       int ret;
+
+       if (chan < 4)
+               mask = 0x0f;
+       else
+               mask = 0xf0;
+
+       ret = comedi_dio_insn_config(dev, s, insn, data, mask);
+       if (ret)
+               return ret;
 
-       for (i = 0; i < insn->n; i++) {
-               mask = (CR_CHAN(insn->chanspec) < 4) ? 0x0f : 0xf0;
-               s->io_bits &= ~mask;
-               if (data[i])
-                       s->io_bits |= mask;
-       }
        devpriv->com_reg_2_state &= ~(COMREG2_DOUTEN0 | COMREG2_DOUTEN1);
        if (s->io_bits & 0x0f)
                devpriv->com_reg_2_state |= COMREG2_DOUTEN0;
@@ -592,7 +596,7 @@ static int atmio16d_dio_insn_config(struct comedi_device *dev,
                devpriv->com_reg_2_state |= COMREG2_DOUTEN1;
        outw(devpriv->com_reg_2_state, dev->iobase + COM_REG_2);
 
-       return i;
+       return insn->n;
 }
 
 /*