staging: comedi: pcl726: fix the analog output range_table_list initialization
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Wed, 25 Sep 2013 22:37:18 +0000 (15:37 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 26 Sep 2013 16:32:19 +0000 (09:32 -0700)
The analog output channels use jumpers on the board to individually set
the range used. This driver uses the configuration options passed to the
(*attach) function to setup the analog output subdevice range_table_list
for each channel.

The configuration options should be 'it->options[2 + i]' for each channel 'i'
not '...[2 + 1]' for each channel. Fix the error and move the code so that
the range_table_list is setup before the subdevice is initialized.

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/pcl726.c

index bcad27b1950e6da3147208ddbdee9b73de7ca277..7952d875444916741919276ed809b36132576401 100644 (file)
@@ -268,9 +268,6 @@ static int pcl726_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        if (!devpriv)
                return -ENOMEM;
 
-       for (i = 0; i < 12; i++)
-               devpriv->rangelist[i] = &range_unknown;
-
        /*
         * Hook up the external trigger source interrupt only if the
         * user config option is valid and the board supports interrupts.
@@ -284,6 +281,16 @@ static int pcl726_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                }
        }
 
+       /* setup the per-channel analog output range_table_list */
+       for (i = 0; i < 12; i++) {
+               unsigned int opt = it->options[2 + i];
+
+               if (opt < board->num_of_ranges && i < board->n_aochan)
+                       devpriv->rangelist[i] = board->range_type_list[opt];
+               else
+                       devpriv->rangelist[i] = &range_unknown;
+       }
+
        ret = comedi_alloc_subdevices(dev, 3);
        if (ret)
                return ret;
@@ -298,18 +305,6 @@ static int pcl726_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        s->insn_write = pcl726_ao_insn_write;
        s->insn_read = pcl726_ao_insn_read;
        s->range_table_list = devpriv->rangelist;
-       for (i = 0; i < board->n_aochan; i++) {
-               int j;
-
-               j = it->options[2 + 1];
-               if ((j < 0) || (j >= board->num_of_ranges)) {
-                       printk
-                           ("Invalid range for channel %d! Must be 0<=%d<%d\n",
-                            i, j, board->num_of_ranges - 1);
-                       j = 0;
-               }
-               devpriv->rangelist[i] = board->range_type_list[j];
-       }
 
        s = &dev->subdevices[1];
        /* di */