diff options
author | H Hartley Sweeten <[email protected]> | 2015-08-05 10:45:19 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <[email protected]> | 2015-08-07 15:03:31 -0700 |
commit | 7022781c460290687b374dab1c230c06091bba10 (patch) | |
tree | 35da5f9bc4259dc8862bf76fbbc54efb2f4958ef | |
parent | 36d59d70babc9ad4275d0c7c5e63241a077f572c (diff) |
staging: comedi: me4000: introduce me4000_ai_get_sample()
The hardware returns two's complement values for the analog input
samples. These need to be converted to the unsigned binary format
that the comedi core expects. Introduce a helper function to handle
this.
Signed-off-by: H Hartley Sweeten <[email protected]>
Reviewed-by: Ian Abbott <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
-rw-r--r-- | drivers/staging/comedi/drivers/me4000.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/staging/comedi/drivers/me4000.c b/drivers/staging/comedi/drivers/me4000.c index b17183dee7fb..3974f59c0478 100644 --- a/drivers/staging/comedi/drivers/me4000.c +++ b/drivers/staging/comedi/drivers/me4000.c @@ -445,6 +445,16 @@ static void me4000_reset(struct comedi_device *dev) outl(0x1, dev->iobase + ME4000_DIO_CTRL_REG); } +static unsigned int me4000_ai_get_sample(struct comedi_device *dev, + struct comedi_subdevice *s) +{ + unsigned int val; + + /* read two's complement value and munge to offset binary */ + val = inl(dev->iobase + ME4000_AI_DATA_REG); + return comedi_offset_munge(s, val); +} + static int me4000_ai_eoc(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, @@ -515,8 +525,7 @@ static int me4000_ai_insn_read(struct comedi_device *dev, if (ret) break; - /* read two's complement value and munge to offset binary */ - val = inl(dev->iobase + ME4000_AI_DATA_REG); + val = me4000_ai_get_sample(dev, s); data[i] = comedi_offset_munge(s, val); } @@ -953,10 +962,7 @@ static irqreturn_t me4000_ai_isr(int irq, void *dev_id) } for (i = 0; i < c; i++) { - /* Read value from data fifo */ - lval = inl(dev->iobase + ME4000_AI_DATA_REG) & 0xFFFF; - lval ^= 0x8000; - + lval = me4000_ai_get_sample(dev, s); if (!comedi_buf_write_samples(s, &lval, 1)) break; } @@ -976,10 +982,7 @@ static irqreturn_t me4000_ai_isr(int irq, void *dev_id) /* Poll data until fifo empty */ while (inl(dev->iobase + ME4000_AI_STATUS_REG) & ME4000_AI_STATUS_EF_DATA) { - /* Read value from data fifo */ - lval = inl(dev->iobase + ME4000_AI_DATA_REG) & 0xFFFF; - lval ^= 0x8000; - + lval = me4000_ai_get_sample(dev, s); if (!comedi_buf_write_samples(s, &lval, 1)) break; } |