staging: comedi: rtd520: fix ai_read_n() async->cur_chan use
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Thu, 30 Oct 2014 18:32:28 +0000 (11:32 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 4 Nov 2014 00:30:04 +0000 (16:30 -0800)
This functions uses the async->cur_chan to determine if the current channel
is using a bipolar range and the sample needs to be munged. The cur_chan is
never incremented so all the samples are munged based on the fist channel
in the cmd->chanlist.

Bump the cur_chan after writing each sample. This fixes the code so that
the munging will be done correctly.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/rtd520.c

index 888238e26073f9a3edcc8fbfda4793051ea9b24d..8e87655be7bb9c133e7031f01ea8df98799269db 100644 (file)
@@ -606,6 +606,8 @@ static int ai_read_n(struct comedi_device *dev, struct comedi_subdevice *s,
                     int count)
 {
        struct rtd_private *devpriv = dev->private;
+       struct comedi_async *async = s->async;
+       struct comedi_cmd *cmd = &async->cmd;
        int ii;
 
        for (ii = 0; ii < count; ii++) {
@@ -618,7 +620,7 @@ static int ai_read_n(struct comedi_device *dev, struct comedi_subdevice *s,
 
                d = readw(devpriv->las1 + LAS1_ADC_FIFO);
                d = d >> 3;     /* low 3 bits are marker lines */
-               if (test_bit(s->async->cur_chan, devpriv->chan_is_bipolar))
+               if (test_bit(async->cur_chan, devpriv->chan_is_bipolar))
                        /* convert to comedi unsigned data */
                        d = comedi_offset_munge(s, d);
                d &= s->maxdata;
@@ -626,6 +628,9 @@ static int ai_read_n(struct comedi_device *dev, struct comedi_subdevice *s,
                if (!comedi_buf_write_samples(s, &d, 1))
                        return -1;
 
+               async->cur_chan++;
+               async->cur_chan %= cmd->chanlist_len;
+
                if (devpriv->ai_count > 0)      /* < 0, means read forever */
                        devpriv->ai_count--;
        }