[PATCH 08/19] staging: comedi: pcl726: fix the analog output range_table_list initialization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxxxxx>
Cc: Ian Abbott <abbotti@xxxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 drivers/staging/comedi/drivers/pcl726.c | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/drivers/staging/comedi/drivers/pcl726.c b/drivers/staging/comedi/drivers/pcl726.c
index bcad27b..7952d87 100644
--- a/drivers/staging/comedi/drivers/pcl726.c
+++ b/drivers/staging/comedi/drivers/pcl726.c
@@ -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 */
-- 
1.8.3.2

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




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux