From: H Hartley Sweeten Date: Tue, 4 Mar 2014 18:30:01 +0000 (-0700) Subject: staging: comedi: pcl816: tidy up the analog input (*insn_read) X-Git-Tag: v3.15-rc1~139^2~642 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=937a3706880c9bd3ff106cba296ce7bf751951f2;p=karo-tx-linux.git staging: comedi: pcl816: tidy up the analog input (*insn_read) For aesthetics, move this function out of the async command support code. For safety, the INT request (end-of-conversion flag) should be cleared before doing each conversion and after the final data sample is read. This driver does that but it's a bit awkward with the initial clear being outside the for loop that reads the samples. Refactor the function a bit so it's more like the pcl818 driver and we can use common code to clear the flag for a timeout and after the last sample. Do a bit of other tidying up during the move. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/comedi/drivers/pcl816.c b/drivers/staging/comedi/drivers/pcl816.c index 2487e4448fc4..e9795106b848 100644 --- a/drivers/staging/comedi/drivers/pcl816.c +++ b/drivers/staging/comedi/drivers/pcl816.c @@ -232,42 +232,6 @@ static int pcl816_ai_eoc(struct comedi_device *dev, return -EBUSY; } -static int pcl816_ai_insn_read(struct comedi_device *dev, - struct comedi_subdevice *s, - struct comedi_insn *insn, unsigned int *data) -{ - int ret; - int n; - - /* software trigger, DMA and INT off */ - outb(0, dev->iobase + PCL816_CONTROL); - /* clear INT (conversion end) flag */ - outb(0, dev->iobase + PCL816_CLRINT); - - /* Set the input channel */ - outb(CR_CHAN(insn->chanspec) & 0xf, dev->iobase + PCL816_MUX); - /* select gain */ - outb(CR_RANGE(insn->chanspec), dev->iobase + PCL816_RANGE); - - for (n = 0; n < insn->n; n++) { - - outb(0, dev->iobase + PCL816_AD_LO); /* start conversion */ - - ret = comedi_timeout(dev, s, insn, pcl816_ai_eoc, 0); - if (ret) { - /* clear INT (conversion end) flag */ - outb(0, dev->iobase + PCL816_CLRINT); - return ret; - } - - data[n] = pcl816_ai_get_sample(dev, s); - - /* clear INT (conversion end) flag */ - outb(0, dev->iobase + PCL816_CLRINT); - } - return n; -} - static bool pcl816_ai_next_chan(struct comedi_device *dev, struct comedi_subdevice *s) { @@ -630,6 +594,42 @@ setup_channel_list(struct comedi_device *dev, dev->iobase + PCL816_MUX); } +static int pcl816_ai_insn_read(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, + unsigned int *data) +{ + unsigned int chan = CR_CHAN(insn->chanspec); + unsigned int range = CR_RANGE(insn->chanspec); + int ret = 0; + int i; + + /* software trigger, DMA and INT off */ + outb(0, dev->iobase + PCL816_CONTROL); + + /* Set the input channel */ + outb(chan, dev->iobase + PCL816_MUX); + /* select gain */ + outb(range, dev->iobase + PCL816_RANGE); + + for (i = 0; i < insn->n; i++) { + /* clear INT (conversion end) flag */ + outb(0, dev->iobase + PCL816_CLRINT); + /* start conversion */ + outb(0, dev->iobase + PCL816_AD_LO); + + ret = comedi_timeout(dev, s, insn, pcl816_ai_eoc, 0); + if (ret) + break; + + data[i] = pcl816_ai_get_sample(dev, s); + } + /* clear INT (conversion end) flag */ + outb(0, dev->iobase + PCL816_CLRINT); + + return ret ? ret : insn->n; +} + static int pcl816_di_insn_bits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn,