unsigned int chan = CR_CHAN(insn->chanspec);
        unsigned int base_chan = (chan < 32) ? 0 : chan;
        unsigned int _data[2];
+       unsigned int i;
        int ret;
 
-       if (insn->n == 0)
-               return 0;
-
        memset(_data, 0, sizeof(_data));
        memset(&_insn, 0, sizeof(_insn));
        _insn.insn = INSN_BITS;
        if (insn->insn == INSN_WRITE) {
                if (!(s->subdev_flags & SDF_WRITABLE))
                        return -EINVAL;
-               _data[0] = 1U << (chan - base_chan);                 /* mask */
-               _data[1] = data[0] ? (1U << (chan - base_chan)) : 0; /* bits */
+               _data[0] = 1U << (chan - base_chan);            /* mask */
        }
+       for (i = 0; i < insn->n; i++) {
+               if (insn->insn == INSN_WRITE)
+                       _data[1] = data[i] ? _data[0] : 0;      /* bits */
 
-       ret = s->insn_bits(dev, s, &_insn, _data);
-       if (ret < 0)
-               return ret;
+               ret = s->insn_bits(dev, s, &_insn, _data);
+               if (ret < 0)
+                       return ret;
 
-       if (insn->insn == INSN_READ)
-               data[0] = (_data[1] >> (chan - base_chan)) & 1;
+               if (insn->insn == INSN_READ)
+                       data[i] = (_data[1] >> (chan - base_chan)) & 1;
+       }
 
-       return 1;
+       return insn->n;
 }
 
 static int __comedi_device_postconfig_async(struct comedi_device *dev,