Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 716343c4 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: pcl726: fix the analog output range_table_list initialization



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: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fff46207
Loading
Loading
Loading
Loading
+10 −15
Original line number Diff line number Diff line
@@ -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 */