Staging: comedi: pcl812: Update MUX for multi-channel AI command
authorIan Abbott <abbotti@mev.co.uk>
Wed, 20 Jan 2010 13:04:49 +0000 (13:04 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 4 Mar 2010 00:42:48 +0000 (16:42 -0800)
For multi-channel AI commands, the interrupt handler is missing code to
switch to the next channel.  Add some (untested) code to handle this.

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

index aa91273..d4634c4 100644 (file)
@@ -955,6 +955,7 @@ static irqreturn_t interrupt_pcl812_ai_int(int irq, void *d)
        unsigned int mask, timeout;
        struct comedi_device *dev = d;
        struct comedi_subdevice *s = dev->subdevices + 0;
+       unsigned int next_chan;
 
        s->async->events = 0;
 
@@ -993,11 +994,18 @@ static irqreturn_t interrupt_pcl812_ai_int(int irq, void *d)
                       ((inb(dev->iobase + PCL812_AD_HI) << 8) |
                        inb(dev->iobase + PCL812_AD_LO)) & mask);
 
+       /* Set up next channel. Added by abbotti 2010-01-20, but untested. */
+       next_chan = s->async->cur_chan + 1;
+       if (next_chan >= devpriv->ai_n_chan)
+               next_chan = 0;
+       if (devpriv->ai_chanlist[s->async->cur_chan] !=
+                       devpriv->ai_chanlist[next_chan])
+               setup_range_channel(dev, s, devpriv->ai_chanlist[next_chan], 0);
+
        outb(0, dev->iobase + PCL812_CLRINT);   /* clear INT request */
 
-       s->async->cur_chan++;
-       if (s->async->cur_chan >= devpriv->ai_n_chan) { /* one scan done */
-               s->async->cur_chan = 0;
+       s->async->cur_chan = next_chan;
+       if (next_chan == 0) {   /* one scan done */
                devpriv->ai_act_scan++;
                if (!(devpriv->ai_neverending))
                        if (devpriv->ai_act_scan >= devpriv->ai_scans) {        /* all data sampled */