From c3f7e15383a9e86a56820c34d5ef761c4682e47b Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Mon, 5 Oct 2015 14:22:50 -0700 Subject: [PATCH] staging: comedi: quatech_daqp_cs: introduce daqp_ai_get_sample() Introduce a helper function to get a two's complement sample from the FIFO and munge it to the offset binary format that comedi uses. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/drivers/quatech_daqp_cs.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c b/drivers/staging/comedi/drivers/quatech_daqp_cs.c index b2effb8..cf144ce 100644 --- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c +++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c @@ -172,6 +172,20 @@ static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s) return 0; } +static unsigned int daqp_ai_get_sample(struct comedi_device *dev, + struct comedi_subdevice *s) +{ + unsigned int val; + + /* + * Get a two's complement sample from the FIFO and + * return the munged offset binary value. + */ + val = inb(dev->iobase + DAQP_FIFO); + val |= inb(dev->iobase + DAQP_FIFO) << 8; + return comedi_offset_munge(s, val); +} + /* Interrupt handler * * Operates in one of two modes. If devpriv->interrupt_mode is @@ -209,10 +223,7 @@ static enum irqreturn daqp_interrupt(int irq, void *dev_id) break; } - data = inb(dev->iobase + DAQP_FIFO); - data |= inb(dev->iobase + DAQP_FIFO) << 8; - data ^= 0x8000; - + data = daqp_ai_get_sample(dev, s); comedi_buf_write_samples(s, &data, 1); /* If there's a limit, decrement it @@ -323,9 +334,7 @@ static int daqp_ai_insn_read(struct comedi_device *dev, if (wait_for_completion_interruptible(&devpriv->eos)) return -EINTR; - data[i] = inb(dev->iobase + DAQP_FIFO); - data[i] |= inb(dev->iobase + DAQP_FIFO) << 8; - data[i] ^= 0x8000; + data[i] = daqp_ai_get_sample(dev, s); } return insn->n; -- 2.7.4