staging: comedi: amplc_dio200: support multiple read/write of counter
authorIan Abbott <abbotti@mev.co.uk>
Wed, 24 Oct 2012 15:48:13 +0000 (16:48 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Oct 2012 22:25:23 +0000 (15:25 -0700)
Change the `insn_read` and `insn_write` handlers of the '8254' counter
subdevices to support reading and writing multiple data values.
(Writing multiple values isn't very useful, but if that's what the user
wants....)

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/amplc_dio200.c

index d72a86b3e9ffc331a30ccf1a9f272090423606a1..95c3f7824d81c34e958040dc55017e890039f9b6 100644 (file)
@@ -1270,13 +1270,15 @@ dio200_subdev_8254_read(struct comedi_device *dev, struct comedi_subdevice *s,
 {
        struct dio200_subdev_8254 *subpriv = s->private;
        int chan = CR_CHAN(insn->chanspec);
+       unsigned int n;
        unsigned long flags;
 
-       spin_lock_irqsave(&subpriv->spinlock, flags);
-       data[0] = dio200_subdev_8254_read_chan(dev, s, chan);
-       spin_unlock_irqrestore(&subpriv->spinlock, flags);
-
-       return 1;
+       for (n = 0; n < insn->n; n++) {
+               spin_lock_irqsave(&subpriv->spinlock, flags);
+               data[n] = dio200_subdev_8254_read_chan(dev, s, chan);
+               spin_unlock_irqrestore(&subpriv->spinlock, flags);
+       }
+       return insn->n;
 }
 
 /*
@@ -1288,13 +1290,15 @@ dio200_subdev_8254_write(struct comedi_device *dev, struct comedi_subdevice *s,
 {
        struct dio200_subdev_8254 *subpriv = s->private;
        int chan = CR_CHAN(insn->chanspec);
+       unsigned int n;
        unsigned long flags;
 
-       spin_lock_irqsave(&subpriv->spinlock, flags);
-       dio200_subdev_8254_write_chan(dev, s, chan, data[0]);
-       spin_unlock_irqrestore(&subpriv->spinlock, flags);
-
-       return 1;
+       for (n = 0; n < insn->n; n++) {
+               spin_lock_irqsave(&subpriv->spinlock, flags);
+               dio200_subdev_8254_write_chan(dev, s, chan, data[n]);
+               spin_unlock_irqrestore(&subpriv->spinlock, flags);
+       }
+       return insn->n;
 }
 
 /*