aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-04-22 21:36:28 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-23 13:41:51 -0400
commit26234771c1a53b0a3bf69c161d79cd37c77ebd1a (patch)
tree2a76c64b5da6959d20f99f60aff3f459df568104
parent264601c231c9c9dec3da2c665c0b9cbec11d8c9e (diff)
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>
-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,
648 unsigned int *data) 648 unsigned int *data)
649{ 649{
650 struct das800_private *devpriv = dev->private; 650 struct das800_private *devpriv = dev->private;
651 int wbits; 651 unsigned int mask = data[0];
652 unsigned int bits = data[1];
652 unsigned long irq_flags; 653 unsigned long irq_flags;
653 654
654 /* only set bits that have been masked */ 655 if (mask) {
655 data[0] &= 0xf; 656 s->state &= ~mask;
656 wbits = devpriv->do_bits >> 4; 657 s->state |= (bits & mask);
657 wbits &= ~data[0]; 658 devpriv->do_bits = s->state << 4;
658 wbits |= data[0] & data[1];
659 devpriv->do_bits = wbits << 4;
660 659
661 spin_lock_irqsave(&dev->spinlock, irq_flags); 660 spin_lock_irqsave(&dev->spinlock, irq_flags);
662 das800_ind_write(dev, CONTROL1_INTE | devpriv->do_bits, CONTROL1); 661 das800_ind_write(dev, CONTROL1_INTE | devpriv->do_bits,
663 spin_unlock_irqrestore(&dev->spinlock, irq_flags); 662 CONTROL1);
663 spin_unlock_irqrestore(&dev->spinlock, irq_flags);
664 }
664 665
665 data[1] = wbits; 666 data[1] = s->state;
666 667
667 return insn->n; 668 return insn->n;
668} 669}