]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
staging: comedi: das800: tidy up das800_do_insn_bits()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 23 Apr 2013 01:36:28 +0000 (18:36 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 23 Apr 2013 17:41:51 +0000 (10:41 -0700)
Use a couple local variables, mask and bits, to clarify this function.

Its only necessary to update the outputs if the mask indicates that
the bits are changing. Modify this function accordingly. Also, use
the subdevice 'state' variable to hold the actual output channel
state instead of needing to get it from the private data and shift
it.

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

index b68c74106117bab4590acee004dc8bda0af05451..4f6698dc76db8298a76017e3902b62ac7ee5533b 100644 (file)
@@ -648,21 +648,22 @@ static int das800_do_insn_bits(struct comedi_device *dev,
                               unsigned int *data)
 {
        struct das800_private *devpriv = dev->private;
-       int wbits;
+       unsigned int mask = data[0];
+       unsigned int bits = data[1];
        unsigned long irq_flags;
 
-       /*  only set bits that have been masked */
-       data[0] &= 0xf;
-       wbits = devpriv->do_bits >> 4;
-       wbits &= ~data[0];
-       wbits |= data[0] & data[1];
-       devpriv->do_bits = wbits << 4;
+       if (mask) {
+               s->state &= ~mask;
+               s->state |= (bits & mask);
+               devpriv->do_bits = s->state << 4;
 
-       spin_lock_irqsave(&dev->spinlock, irq_flags);
-       das800_ind_write(dev, CONTROL1_INTE | devpriv->do_bits, CONTROL1);
-       spin_unlock_irqrestore(&dev->spinlock, irq_flags);
+               spin_lock_irqsave(&dev->spinlock, irq_flags);
+               das800_ind_write(dev, CONTROL1_INTE | devpriv->do_bits,
+                                CONTROL1);
+               spin_unlock_irqrestore(&dev->spinlock, irq_flags);
+       }
 
-       data[1] = wbits;
+       data[1] = s->state;
 
        return insn->n;
 }