aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-04-08 21:20:21 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-09 19:29:07 -0400
commit929b343297f3f7419a67dff4e8f4110f919682f8 (patch)
tree023c55566541211dd3b867bd30516606943483fc /drivers/staging
parent0546f777627b93022bdb2d8b7fdfb91d2f8f4c74 (diff)
staging: comedi: rti800: factor out "ai wait for conversion"
Factor the timeout loop that waits for the ai conversion to complete out of rti800_ai_insn_read(). Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/comedi/drivers/rti800.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/staging/comedi/drivers/rti800.c b/drivers/staging/comedi/drivers/rti800.c
index e043ed91cdf0..917543a3effe 100644
--- a/drivers/staging/comedi/drivers/rti800.c
+++ b/drivers/staging/comedi/drivers/rti800.c
@@ -88,6 +88,8 @@ Configuration options:
88#define RTI800_INTR_EC 0x02 88#define RTI800_INTR_EC 0x02
89#define RTI800_INTR_OVRN 0x01 89#define RTI800_INTR_OVRN 0x01
90 90
91#define RTI800_AI_TIMEOUT 100
92
91#define Am9513_8BITBUS 93#define Am9513_8BITBUS
92 94
93#define Am9513_output_control(a) outb(a, dev->iobase+RTI800_9513A_CNTRL) 95#define Am9513_output_control(a) outb(a, dev->iobase+RTI800_9513A_CNTRL)
@@ -159,7 +161,24 @@ struct rti800_private {
159 unsigned char muxgain_bits; 161 unsigned char muxgain_bits;
160}; 162};
161 163
162#define RTI800_TIMEOUT 100 164static int rti800_ai_wait_for_conversion(struct comedi_device *dev,
165 int timeout)
166{
167 unsigned char status;
168 int i;
169
170 for (i = 0; i < timeout; i++) {
171 status = inb(dev->iobase + RTI800_CSR);
172 if (status & RTI800_OVERRUN) {
173 outb(0, dev->iobase + RTI800_CLRFLAGS);
174 return -EIO;
175 }
176 if (status & RTI800_DONE)
177 return 0;
178 udelay(1);
179 }
180 return -ETIME;
181}
163 182
164static int rti800_ai_insn_read(struct comedi_device *dev, 183static int rti800_ai_insn_read(struct comedi_device *dev,
165 struct comedi_subdevice *s, 184 struct comedi_subdevice *s,
@@ -170,8 +189,8 @@ static int rti800_ai_insn_read(struct comedi_device *dev,
170 unsigned int chan = CR_CHAN(insn->chanspec); 189 unsigned int chan = CR_CHAN(insn->chanspec);
171 unsigned int gain = CR_RANGE(insn->chanspec); 190 unsigned int gain = CR_RANGE(insn->chanspec);
172 unsigned char muxgain_bits; 191 unsigned char muxgain_bits;
173 int i, t; 192 int ret;
174 int status; 193 int i;
175 194
176 inb(dev->iobase + RTI800_ADCHI); 195 inb(dev->iobase + RTI800_ADCHI);
177 outb(0, dev->iobase + RTI800_CLRFLAGS); 196 outb(0, dev->iobase + RTI800_CLRFLAGS);
@@ -195,21 +214,10 @@ static int rti800_ai_insn_read(struct comedi_device *dev,
195 214
196 for (i = 0; i < insn->n; i++) { 215 for (i = 0; i < insn->n; i++) {
197 outb(0, dev->iobase + RTI800_CONVERT); 216 outb(0, dev->iobase + RTI800_CONVERT);
198 for (t = RTI800_TIMEOUT; t; t--) { 217 ret = rti800_ai_wait_for_conversion(dev, RTI800_AI_TIMEOUT);
199 status = inb(dev->iobase + RTI800_CSR); 218 if (ret)
200 if (status & RTI800_OVERRUN) { 219 return ret;
201 printk(KERN_WARNING "rti800: a/d overrun\n"); 220
202 outb(0, dev->iobase + RTI800_CLRFLAGS);
203 return -EIO;
204 }
205 if (status & RTI800_DONE)
206 break;
207 udelay(1);
208 }
209 if (t == 0) {
210 printk(KERN_WARNING "rti800: timeout\n");
211 return -ETIME;
212 }
213 data[i] = inb(dev->iobase + RTI800_ADCLO); 221 data[i] = inb(dev->iobase + RTI800_ADCLO);
214 data[i] |= (0xf & inb(dev->iobase + RTI800_ADCHI)) << 8; 222 data[i] |= (0xf & inb(dev->iobase + RTI800_ADCHI)) << 8;
215 223