Commit f93b399b authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: adq12b: fix ctreg (ai channel/range) programming

This driver only updates the ctreg (ai channel/range) register if the
desired channel or range has changed since the last analog input read
operation. It does this becuase the hardware requires an udelay to
allow the multiplexor to settle. Unfortunatly the current code never
updates the 'last_channel' and 'last_range' in the private data so
the ctreg gets updated every time.

Fix this and simplify it a bit by just storing the last ctreg value
in the private data.
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 d9c4261f
...@@ -116,8 +116,7 @@ static const struct comedi_lrange range_adq12b_ai_unipolar = { ...@@ -116,8 +116,7 @@ static const struct comedi_lrange range_adq12b_ai_unipolar = {
struct adq12b_private { struct adq12b_private {
int unipolar; /* option 2 of comedi_config (1 is iobase) */ int unipolar; /* option 2 of comedi_config (1 is iobase) */
int differential; /* option 3 of comedi_config */ int differential; /* option 3 of comedi_config */
int last_channel; unsigned int last_ctreg;
int last_range;
}; };
static int adq12b_ai_eoc(struct comedi_device *dev, static int adq12b_ai_eoc(struct comedi_device *dev,
...@@ -134,20 +133,23 @@ static int adq12b_ai_eoc(struct comedi_device *dev, ...@@ -134,20 +133,23 @@ static int adq12b_ai_eoc(struct comedi_device *dev,
} }
static int adq12b_ai_rinsn(struct comedi_device *dev, static int adq12b_ai_rinsn(struct comedi_device *dev,
struct comedi_subdevice *s, struct comedi_insn *insn, struct comedi_subdevice *s,
struct comedi_insn *insn,
unsigned int *data) unsigned int *data)
{ {
struct adq12b_private *devpriv = dev->private; struct adq12b_private *devpriv = dev->private;
unsigned int chan = CR_CHAN(insn->chanspec);
unsigned int range = CR_RANGE(insn->chanspec);
unsigned int val;
int n; int n;
int range, channel;
unsigned char hi, lo, status; unsigned char hi, lo, status;
int ret; int ret;
/* change channel and range only if it is different from the previous */ /* change channel and range only if it is different from the previous */
range = CR_RANGE(insn->chanspec); val = (range << 4) | chan;
channel = CR_CHAN(insn->chanspec); if (val != devpriv->last_ctreg) {
if (channel != devpriv->last_channel || range != devpriv->last_range) { outb(val, dev->iobase + ADQ12B_CTREG);
outb((range << 4) | channel, dev->iobase + ADQ12B_CTREG); devpriv->last_ctreg = val;
udelay(50); /* wait for the mux to settle */ udelay(50); /* wait for the mux to settle */
} }
...@@ -226,12 +228,7 @@ static int adq12b_attach(struct comedi_device *dev, struct comedi_devconfig *it) ...@@ -226,12 +228,7 @@ static int adq12b_attach(struct comedi_device *dev, struct comedi_devconfig *it)
devpriv->unipolar = it->options[1]; devpriv->unipolar = it->options[1];
devpriv->differential = it->options[2]; devpriv->differential = it->options[2];
/* devpriv->last_ctreg = -1; /* force ctreg update */
* initialize channel and range to -1 so we make sure we
* always write at least once to the CTREG in the instruction
*/
devpriv->last_channel = -1;
devpriv->last_range = -1;
ret = comedi_alloc_subdevices(dev, 3); ret = comedi_alloc_subdevices(dev, 3);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment