}
};
+static int daqp_clear_events(struct comedi_device *dev, int loops)
+{
+ unsigned int status;
+
+ /*
+ * Reset any pending interrupts (my card has a tendency to require
+ * require multiple reads on the status register to achieve this).
+ */
+ while (--loops) {
+ status = inb(dev->iobase + DAQP_STATUS);
+ if ((status & DAQP_STATUS_EVENTS) == 0)
+ return 0;
+ }
+ dev_err(dev->class_dev, "couldn't clear events in status register\n");
+ return -EBUSY;
+}
+
/* Cancel a running acquisition */
static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
struct comedi_insn *insn, unsigned int *data)
{
struct daqp_private *devpriv = dev->private;
+ int ret;
int i;
- int counter = 10000;
if (devpriv->stop)
return -EIO;
DAQP_CONTROL_PACER_CLK_100KHZ | DAQP_CONTROL_EOS_INT_ENABLE,
dev->iobase + DAQP_CONTROL);
- /* Reset any pending interrupts (my card has a tendency to require
- * require multiple reads on the status register to achieve this)
- */
-
- while (--counter
- && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
- ;
- if (!counter) {
- dev_err(dev->class_dev,
- "couldn't clear interrupts in status register\n");
- return -1;
- }
+ ret = daqp_clear_events(dev, 10000);
+ if (ret)
+ return ret;
init_completion(&devpriv->eos);
devpriv->interrupt_mode = semaphore;
int counter;
int scanlist_start_on_every_entry;
int threshold;
+ int ret;
int i;
if (devpriv->stop)
DAQP_CONTROL_PACER_CLK_5MHZ | DAQP_CONTROL_FIFO_INT_ENABLE,
dev->iobase + DAQP_CONTROL);
- /* Reset any pending interrupts (my card has a tendency to require
- * require multiple reads on the status register to achieve this)
- */
- counter = 100;
- while (--counter
- && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS))
- ;
- if (!counter) {
- dev_err(dev->class_dev,
- "couldn't clear interrupts in status register\n");
- return -1;
- }
+ ret = daqp_clear_events(dev, 100);
+ if (ret)
+ return ret;
devpriv->interrupt_mode = buffer;