]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/staging/comedi/drivers/pcl812.c
Staging: comedi: pcl812: Update MUX for multi-channel AI command
[net-next-2.6.git] / drivers / staging / comedi / drivers / pcl812.c
index aa912735ddba711bf89bebcd4fb205e5e0c76037..d4634c4f02dc2ec7cd14e86c2a3de9056d3859a3 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 */