diff options
-rw-r--r-- | drivers/staging/comedi/drivers/das800.c | 23 |
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; } |