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

staging: comedi: me4000: fix me4000_ai_insn_read()

The coemdi (*insn_read) functions are supposed to read insn->n values
from the hardware. Make this function work like the core expects.

Use the comedi_offset_munge() helper to munge the two's complement
values to offset binary.
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 023c129f
...@@ -456,16 +456,8 @@ static int me4000_ai_insn_read(struct comedi_device *dev, ...@@ -456,16 +456,8 @@ static int me4000_ai_insn_read(struct comedi_device *dev,
int aref = CR_AREF(insn->chanspec); int aref = CR_AREF(insn->chanspec);
unsigned int entry = 0; unsigned int entry = 0;
unsigned int tmp; unsigned int tmp;
unsigned int lval;
int ret; int ret;
int i;
if (insn->n == 0) {
return 0;
} else if (insn->n > 1) {
dev_err(dev->class_dev, "Invalid instruction length %d\n",
insn->n);
return -EINVAL;
}
entry |= ME4000_AI_LIST_RANGE(rang); entry |= ME4000_AI_LIST_RANGE(rang);
entry |= chan; entry |= chan;
...@@ -515,18 +507,22 @@ static int me4000_ai_insn_read(struct comedi_device *dev, ...@@ -515,18 +507,22 @@ static int me4000_ai_insn_read(struct comedi_device *dev,
outl(ME4000_AI_MIN_TICKS, dev->iobase + ME4000_AI_CHAN_TIMER_REG); outl(ME4000_AI_MIN_TICKS, dev->iobase + ME4000_AI_CHAN_TIMER_REG);
outl(ME4000_AI_MIN_TICKS, dev->iobase + ME4000_AI_CHAN_PRE_TIMER_REG); outl(ME4000_AI_MIN_TICKS, dev->iobase + ME4000_AI_CHAN_PRE_TIMER_REG);
/* Start conversion by dummy read */ for (i = 0; i < insn->n; i++) {
inl(dev->iobase + ME4000_AI_START_REG); unsigned int val;
ret = comedi_timeout(dev, s, insn, me4000_ai_eoc, 0); /* start conversion by dummy read */
if (ret) inl(dev->iobase + ME4000_AI_START_REG);
return ret;
/* Read value from data fifo */ ret = comedi_timeout(dev, s, insn, me4000_ai_eoc, 0);
lval = inl(dev->iobase + ME4000_AI_DATA_REG) & 0xFFFF; if (ret)
data[0] = lval ^ 0x8000; return ret;
return 1; /* read two's complement value and munge to offset binary */
val = inl(dev->iobase + ME4000_AI_DATA_REG);
data[i] = comedi_offset_munge(s, val);
}
return insn->n;
} }
static int me4000_ai_cancel(struct comedi_device *dev, static int me4000_ai_cancel(struct comedi_device *dev,
......
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