Commit d9952688 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: quatech_daqp_cs: introduce daqp_clear_events()

Introduce a helper function for the common code used to clear any
pending interrupts.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 075d5816
...@@ -154,6 +154,23 @@ static const struct comedi_lrange range_daqp_ai = { ...@@ -154,6 +154,23 @@ static const struct comedi_lrange range_daqp_ai = {
} }
}; };
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 */ /* Cancel a running acquisition */
static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s) static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
...@@ -280,8 +297,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev, ...@@ -280,8 +297,8 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
struct comedi_insn *insn, unsigned int *data) struct comedi_insn *insn, unsigned int *data)
{ {
struct daqp_private *devpriv = dev->private; struct daqp_private *devpriv = dev->private;
int ret;
int i; int i;
int counter = 10000;
if (devpriv->stop) if (devpriv->stop)
return -EIO; return -EIO;
...@@ -306,18 +323,9 @@ static int daqp_ai_insn_read(struct comedi_device *dev, ...@@ -306,18 +323,9 @@ static int daqp_ai_insn_read(struct comedi_device *dev,
DAQP_CONTROL_PACER_CLK_100KHZ | DAQP_CONTROL_EOS_INT_ENABLE, DAQP_CONTROL_PACER_CLK_100KHZ | DAQP_CONTROL_EOS_INT_ENABLE,
dev->iobase + DAQP_CONTROL); dev->iobase + DAQP_CONTROL);
/* Reset any pending interrupts (my card has a tendency to require ret = daqp_clear_events(dev, 10000);
* require multiple reads on the status register to achieve this) if (ret)
*/ return ret;
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;
}
init_completion(&devpriv->eos); init_completion(&devpriv->eos);
devpriv->interrupt_mode = semaphore; devpriv->interrupt_mode = semaphore;
...@@ -457,6 +465,7 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) ...@@ -457,6 +465,7 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
int counter; int counter;
int scanlist_start_on_every_entry; int scanlist_start_on_every_entry;
int threshold; int threshold;
int ret;
int i; int i;
if (devpriv->stop) if (devpriv->stop)
...@@ -607,18 +616,9 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) ...@@ -607,18 +616,9 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
DAQP_CONTROL_PACER_CLK_5MHZ | DAQP_CONTROL_FIFO_INT_ENABLE, DAQP_CONTROL_PACER_CLK_5MHZ | DAQP_CONTROL_FIFO_INT_ENABLE,
dev->iobase + DAQP_CONTROL); dev->iobase + DAQP_CONTROL);
/* Reset any pending interrupts (my card has a tendency to require ret = daqp_clear_events(dev, 100);
* require multiple reads on the status register to achieve this) if (ret)
*/ return ret;
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;
}
devpriv->interrupt_mode = buffer; devpriv->interrupt_mode = buffer;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment