diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-04-08 21:20:21 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-04-09 19:29:07 -0400 |
commit | 929b343297f3f7419a67dff4e8f4110f919682f8 (patch) | |
tree | 023c55566541211dd3b867bd30516606943483fc /drivers/staging | |
parent | 0546f777627b93022bdb2d8b7fdfb91d2f8f4c74 (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.c | 44 |
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 | 164 | static 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 | ||
164 | static int rti800_ai_insn_read(struct comedi_device *dev, | 183 | static 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 | ||