summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-04-22 18:36:28 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-23 10:41:51 -0700
commit26234771c1a53b0a3bf69c161d79cd37c77ebd1a (patch)
tree2a76c64b5da6959d20f99f60aff3f459df568104 /drivers
parent264601c231c9c9dec3da2c665c0b9cbec11d8c9e (diff)
downloadlinux-26234771c1a53b0a3bf69c161d79cd37c77ebd1a.tar.bz2
staging: comedi: das800: tidy up das800_do_insn_bits()
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/comedi/drivers/das800.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/staging/comedi/drivers/das800.c b/drivers/staging/comedi/drivers/das800.c
index b68c74106117..4f6698dc76db 100644
--- a/drivers/staging/comedi/drivers/das800.c
+++ b/drivers/staging/comedi/drivers/das800.c
@@ -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;
}