staging: comedi: ni_660x: tidy up ni_660x_dio_insn_bits()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 22 Mar 2016 18:10:32 +0000 (11:10 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 28 Mar 2016 14:30:36 +0000 (07:30 -0700)
Use some local variables to clarify this function.

This (*insn_bits) function is a bit different from most comedi drivers.
Add some comments to clarify why the shifts are used.

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_660x.c

index f24009c98e0afe9c50a57c9c19fda349044b864a..f614927411cb0f6743f5dd8e1d34999872239853 100644 (file)
@@ -780,21 +780,30 @@ static void init_tio_chip(struct comedi_device *dev, int chipset)
 
 static int ni_660x_dio_insn_bits(struct comedi_device *dev,
                                 struct comedi_subdevice *s,
-                                struct comedi_insn *insn, unsigned int *data)
+                                struct comedi_insn *insn,
+                                unsigned int *data)
 {
-       unsigned int base_bitfield_channel = CR_CHAN(insn->chanspec);
+       unsigned int shift = CR_CHAN(insn->chanspec);
+       unsigned int mask = data[0] << shift;
+       unsigned int bits = data[1] << shift;
 
-       /*  Check if we have to write some bits */
-       if (data[0]) {
-               s->state &= ~(data[0] << base_bitfield_channel);
-               s->state |= (data[0] & data[1]) << base_bitfield_channel;
-               /* Write out the new digital output lines */
+       /*
+        * There are 40 channels in this subdevice but only 32 are usable
+        * as DIO. The shift adjusts the mask/bits to account for the base
+        * channel in insn->chanspec. The state update can then be handled
+        * normally for the 32 usable channels.
+        */
+       if (mask) {
+               s->state &= ~mask;
+               s->state |= (bits & mask);
                ni_660x_write(dev, 0, s->state, NI660X_DIO32_OUTPUT);
        }
-       /* on return, data[1] contains the value of the digital
-        * input and output lines. */
-       data[1] = (ni_660x_read(dev, 0, NI660X_DIO32_INPUT) >>
-                       base_bitfield_channel);
+
+       /*
+        * Return the input channels, shifted back to account for the base
+        * channel.
+        */
+       data[1] = ni_660x_read(dev, 0, NI660X_DIO32_INPUT) >> shift;
 
        return insn->n;
 }