[PATCH 3/8] staging: comedi: adv_pci1710: tidy up setup_channel_list()
H Hartley Sweeten
hsweeten at visionengravers.com
Fri Jun 20 19:01:55 UTC 2014
Each Analog input channel on this board has its own input range. This
function programms the ranges for each channel and sets up the private
data 'act_chalist' array for sample dropout detection.
Refactor this function to use a single for () loop to program the
channel list.
For aesthetics, rename the function to have namespace associated with
the driver.
Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
Cc: Ian Abbott <abbotti at mev.co.uk>
Cc: Greg Kroah-Hartman <gregk at linuxfoundation.org>
---
drivers/staging/comedi/drivers/adv_pci1710.c | 51 +++++++++++++++-------------
1 file changed, 27 insertions(+), 24 deletions(-)
diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c
index bd164d5..f2a9c00 100644
--- a/drivers/staging/comedi/drivers/adv_pci1710.c
+++ b/drivers/staging/comedi/drivers/adv_pci1710.c
@@ -388,40 +388,43 @@ static int pci171x_ai_check_chanlist(struct comedi_device *dev,
return 0;
}
-static void setup_channel_list(struct comedi_device *dev,
- struct comedi_subdevice *s,
- unsigned int *chanlist, unsigned int n_chan,
- unsigned int seglen)
+static void pci171x_ai_setup_chanlist(struct comedi_device *dev,
+ struct comedi_subdevice *s,
+ unsigned int *chanlist,
+ unsigned int n_chan,
+ unsigned int seglen)
{
struct pci1710_private *devpriv = dev->private;
- unsigned int i;
+ unsigned int chan0 = CR_CHAN(chanlist[0]);
+ unsigned int last_chan = chan0;
+ int i;
- for (i = 0; i < seglen; i++) { /* store range list to card */
+ /* program channel ranges and store chanlist for dropout detect */
+ for (i = 0; i < n_chan; i++) {
unsigned int chan = CR_CHAN(chanlist[i]);
unsigned int range = CR_RANGE(chanlist[i]);
unsigned int aref = CR_AREF(chanlist[i]);
- /* select channel */
- outw(chan | (chan << 8), dev->iobase + PCI171x_MUX);
+ if (i < seglen) {
+ /* select channel */
+ outw(chan | (chan << 8), dev->iobase + PCI171x_MUX);
- /* set range, uni/bipolar, and aref for the channel */
- if (comedi_range_is_unipolar(s, range)) {
- range -= devpriv->uni_range_adj;
- range |= PCI171x_RANGE_UNIPOL;
+ /* set range, uni/bipolar, and aref for the channel */
+ if (comedi_range_is_unipolar(s, range)) {
+ range -= devpriv->uni_range_adj;
+ range |= PCI171x_RANGE_UNIPOL;
+ }
+ if (aref == AREF_DIFF)
+ range |= PCI171x_RANGE_DIFF;
+ outw(range, dev->iobase + PCI171x_RANGE_REG);
+
+ last_chan = chan;
}
- if (aref == AREF_DIFF)
- range |= PCI171x_RANGE_DIFF;
- outw(range, dev->iobase + PCI171x_RANGE_REG);
devpriv->act_chanlist[i] = (chan << 12) & 0xf000;
}
- for ( ; i < n_chan; i++) { /* store remainder of channel list */
- devpriv->act_chanlist[i] =
- (CR_CHAN(chanlist[i]) << 12) & 0xf000;
- }
- devpriv->ai_et_MuxVal =
- CR_CHAN(chanlist[0]) | (CR_CHAN(chanlist[seglen - 1]) << 8);
+ devpriv->ai_et_MuxVal = chan0 | (last_chan << 8);
/* select channel interval to scan */
outw(devpriv->ai_et_MuxVal, dev->iobase + PCI171x_MUX);
}
@@ -454,7 +457,7 @@ static int pci171x_insn_read_ai(struct comedi_device *dev,
outb(0, dev->iobase + PCI171x_CLRFIFO);
outb(0, dev->iobase + PCI171x_CLRINT);
- setup_channel_list(dev, s, &insn->chanspec, 1, 1);
+ pci171x_ai_setup_chanlist(dev, s, &insn->chanspec, 1, 1);
for (i = 0; i < insn->n; i++) {
unsigned int val;
@@ -910,8 +913,8 @@ static int pci171x_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
pci171x_start_pacer(dev, false);
- setup_channel_list(dev, s, cmd->chanlist, cmd->chanlist_len,
- devpriv->saved_seglen);
+ pci171x_ai_setup_chanlist(dev, s, cmd->chanlist, cmd->chanlist_len,
+ devpriv->saved_seglen);
outb(0, dev->iobase + PCI171x_CLRFIFO);
outb(0, dev->iobase + PCI171x_CLRINT);
--
1.9.3
More information about the devel
mailing list