Merge tag 'staging-4.21-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[sfrench/cifs-2.6.git] / drivers / staging / comedi / drivers / cb_pcidas64.c
index 631a703b345d18f44ae9fc91538b03ad277458ff..e1774e09a320369e321f754d344f089f31345744 100644 (file)
@@ -3097,8 +3097,10 @@ static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
 {
        const struct pcidas64_board *board = dev->board_ptr;
        struct pcidas64_private *devpriv = dev->private;
-       int chan = CR_CHAN(insn->chanspec);
-       int range = CR_RANGE(insn->chanspec);
+       unsigned int chan = CR_CHAN(insn->chanspec);
+       unsigned int range = CR_RANGE(insn->chanspec);
+       unsigned int val = s->readback[chan];
+       unsigned int i;
 
        /* do some initializing */
        writew(0, devpriv->main_iobase + DAC_CONTROL0_REG);
@@ -3108,20 +3110,24 @@ static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
        writew(devpriv->dac_control1_bits,
               devpriv->main_iobase + DAC_CONTROL1_REG);
 
-       /* write to channel */
-       if (board->layout == LAYOUT_4020) {
-               writew(data[0] & 0xff,
-                      devpriv->main_iobase + dac_lsb_4020_reg(chan));
-               writew((data[0] >> 8) & 0xf,
-                      devpriv->main_iobase + dac_msb_4020_reg(chan));
-       } else {
-               writew(data[0], devpriv->main_iobase + dac_convert_reg(chan));
+       for (i = 0; i < insn->n; i++) {
+               /* write to channel */
+               val = data[i];
+               if (board->layout == LAYOUT_4020) {
+                       writew(val & 0xff,
+                              devpriv->main_iobase + dac_lsb_4020_reg(chan));
+                       writew((val >> 8) & 0xf,
+                              devpriv->main_iobase + dac_msb_4020_reg(chan));
+               } else {
+                       writew(val,
+                              devpriv->main_iobase + dac_convert_reg(chan));
+               }
        }
 
-       /* remember output value */
-       s->readback[chan] = data[0];
+       /* remember last output value */
+       s->readback[chan] = val;
 
-       return 1;
+       return insn->n;
 }
 
 static void set_dac_control0_reg(struct comedi_device *dev,
@@ -3762,9 +3768,17 @@ static int eeprom_read_insn(struct comedi_device *dev,
                            struct comedi_subdevice *s,
                            struct comedi_insn *insn, unsigned int *data)
 {
-       data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
+       unsigned int val;
+       unsigned int i;
 
-       return 1;
+       if (insn->n) {
+               /* No point reading the same EEPROM location more than once. */
+               val = read_eeprom(dev, CR_CHAN(insn->chanspec));
+               for (i = 0; i < insn->n; i++)
+                       data[i] = val;
+       }
+
+       return insn->n;
 }
 
 /* Allocate and initialize the subdevice structures. */