summaryrefslogtreecommitdiff
path: root/drivers/staging/comedi/drivers/das800.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/comedi/drivers/das800.c')
-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;
}