Clarify the scan list programming a bit by refactoring this function to program
the entire scan list instead of just a single entry. Move the necessary reset
of the scan list into this function. Rename the function.

Signed-off-by: H Hartley Sweeten <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 drivers/staging/comedi/drivers/quatech_daqp_cs.c | 49 +++++++++++-------------
 1 file changed, 22 insertions(+), 27 deletions(-)

diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c 
b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index 7c8f081..de28224 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -243,25 +243,31 @@ static enum irqreturn daqp_interrupt(int irq, void 
*dev_id)
        return IRQ_HANDLED;
 }
 
-static void daqp_ai_set_one_scanlist_entry(struct comedi_device *dev,
-                                          unsigned int chanspec,
-                                          int start)
+static void daqp_ai_set_scanlist(struct comedi_device *dev,
+                                unsigned int *chanspec, int len)
 {
-       unsigned int chan = CR_CHAN(chanspec);
-       unsigned int range = CR_RANGE(chanspec);
-       unsigned int aref = CR_AREF(chanspec);
-       unsigned int val;
+       int i;
+
+       /* Reset scan list queue */
+       outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
 
-       val = DAQP_SCANLIST_CHANNEL(chan) | DAQP_SCANLIST_GAIN(range);
+       for (i = 0; i < len; i++) {
+               unsigned int chan = CR_CHAN(chanspec[i]);
+               unsigned int range = CR_RANGE(chanspec[i]);
+               unsigned int aref = CR_AREF(chanspec[i]);
+               unsigned int val;
 
-       if (aref == AREF_DIFF)
-               val |= DAQP_SCANLIST_DIFFERENTIAL;
+               val = DAQP_SCANLIST_CHANNEL(chan) | DAQP_SCANLIST_GAIN(range);
 
-       if (start)
-               val |= DAQP_SCANLIST_START;
+               if (aref == AREF_DIFF)
+                       val |= DAQP_SCANLIST_DIFFERENTIAL;
 
-       outb(val & 0xff, dev->iobase + DAQP_SCANLIST);
-       outb((val >> 8) & 0xff, dev->iobase + DAQP_SCANLIST);
+               if (i == 0)
+                       val |= DAQP_SCANLIST_START;
+
+               outb(val & 0xff, dev->iobase + DAQP_SCANLIST);
+               outb((val >> 8) & 0xff, dev->iobase + DAQP_SCANLIST);
+       }
 }
 
 /* One-shot analog data acquisition routine */
@@ -283,11 +289,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
 
        outb(0, dev->iobase + DAQP_AUX);
 
-       /* Reset scan list queue */
-       outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
-
        /* Program one scan list entry */
-       daqp_ai_set_one_scanlist_entry(dev, insn->chanspec, 1);
+       daqp_ai_set_scanlist(dev, &insn->chanspec, 1);
 
        /* Reset data FIFO (see page 28 of DAQP User's Manual) */
 
@@ -438,7 +441,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
        struct comedi_cmd *cmd = &s->async->cmd;
        int counter;
        int threshold;
-       int i;
        int v;
 
        if (devpriv->stop)
@@ -449,20 +451,13 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct 
comedi_subdevice *s)
 
        outb(0, dev->iobase + DAQP_AUX);
 
-       /* Reset scan list queue */
-       outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
-
        /* Program pacer clock */
        outb(devpriv->pacer_div & 0xff, dev->iobase + DAQP_PACER_LOW);
        outb((devpriv->pacer_div >> 8) & 0xff, dev->iobase + DAQP_PACER_MID);
        outb((devpriv->pacer_div >> 16) & 0xff, dev->iobase + DAQP_PACER_HIGH);
 
        /* Program scan list */
-       for (i = 0; i < cmd->chanlist_len; i++) {
-               int start = (i == 0);
-
-               daqp_ai_set_one_scanlist_entry(dev, cmd->chanlist[i], start);
-       }
+       daqp_ai_set_scanlist(dev, cmd->chanlist, cmd->chanlist_len);
 
        /* Now it's time to program the FIFO threshold, basically the
         * number of samples the card will buffer before it interrupts
-- 
2.5.1

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to