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

staging: comedi: rtd520: use comedi_handle_events()

Use comedi_handle_events() to automatically (*cancel) the async command
for an end-of-acquisition or if an error/overflow occurs.

The code to cancel the async command can then be removed from rtd_interrupt().

Since the (*cancel) will also clear the FIFO, the ai_read_dregs() function
can also be removed.
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 351a7bff
...@@ -632,35 +632,6 @@ static int ai_read_n(struct comedi_device *dev, struct comedi_subdevice *s, ...@@ -632,35 +632,6 @@ static int ai_read_n(struct comedi_device *dev, struct comedi_subdevice *s,
return 0; return 0;
} }
/*
unknown amout of data is waiting in fifo.
*/
static int ai_read_dregs(struct comedi_device *dev, struct comedi_subdevice *s)
{
struct rtd_private *devpriv = dev->private;
while (readl(dev->mmio + LAS0_ADC) & FS_ADC_NOT_EMPTY) {
unsigned short d = readw(devpriv->las1 + LAS1_ADC_FIFO);
if (0 == devpriv->ai_count) { /* done */
continue; /* read rest */
}
d = d >> 3; /* low 3 bits are marker lines */
if (test_bit(s->async->cur_chan, devpriv->chan_is_bipolar))
/* convert to comedi unsigned data */
d = comedi_offset_munge(s, d);
d &= s->maxdata;
if (!comedi_buf_put(s, d))
return -1;
if (devpriv->ai_count > 0) /* < 0, means read forever */
devpriv->ai_count--;
}
return 0;
}
/* /*
Handle all rtd520 interrupts. Handle all rtd520 interrupts.
Runs atomically and is never re-entered. Runs atomically and is never re-entered.
...@@ -703,8 +674,6 @@ static irqreturn_t rtd_interrupt(int irq, void *d) ...@@ -703,8 +674,6 @@ static irqreturn_t rtd_interrupt(int irq, void *d)
if (0 == devpriv->ai_count) if (0 == devpriv->ai_count)
goto xfer_done; goto xfer_done;
comedi_event(dev, s);
} else if (devpriv->xfer_count > 0) { } else if (devpriv->xfer_count > 0) {
if (fifo_status & FS_ADC_NOT_EMPTY) { if (fifo_status & FS_ADC_NOT_EMPTY) {
/* FIFO not empty */ /* FIFO not empty */
...@@ -713,8 +682,6 @@ static irqreturn_t rtd_interrupt(int irq, void *d) ...@@ -713,8 +682,6 @@ static irqreturn_t rtd_interrupt(int irq, void *d)
if (0 == devpriv->ai_count) if (0 == devpriv->ai_count)
goto xfer_done; goto xfer_done;
comedi_event(dev, s);
} }
} }
} }
...@@ -726,28 +693,16 @@ static irqreturn_t rtd_interrupt(int irq, void *d) ...@@ -726,28 +693,16 @@ static irqreturn_t rtd_interrupt(int irq, void *d)
/* clear the interrupt */ /* clear the interrupt */
writew(status, dev->mmio + LAS0_CLEAR); writew(status, dev->mmio + LAS0_CLEAR);
readw(dev->mmio + LAS0_CLEAR); readw(dev->mmio + LAS0_CLEAR);
comedi_handle_events(dev, s);
return IRQ_HANDLED; return IRQ_HANDLED;
xfer_abort: xfer_abort:
writel(0, dev->mmio + LAS0_ADC_FIFO_CLEAR);
s->async->events |= COMEDI_CB_ERROR; s->async->events |= COMEDI_CB_ERROR;
devpriv->ai_count = 0; /* stop and don't transfer any more */
/* fall into xfer_done */
xfer_done: xfer_done:
/* pacer stop source: SOFTWARE */ s->async->events |= COMEDI_CB_EOA;
writel(0, dev->mmio + LAS0_PACER_STOP);
writel(0, dev->mmio + LAS0_PACER); /* stop pacer */
writel(0, dev->mmio + LAS0_ADC_CONVERSION);
writew(0, dev->mmio + LAS0_IT);
if (devpriv->ai_count > 0) { /* there shouldn't be anything left */
fifo_status = readl(dev->mmio + LAS0_ADC);
ai_read_dregs(dev, s); /* read anything left in FIFO */
}
s->async->events |= COMEDI_CB_EOA; /* signal end to comedi */
comedi_event(dev, s);
/* clear the interrupt */ /* clear the interrupt */
status = readw(dev->mmio + LAS0_IT); status = readw(dev->mmio + LAS0_IT);
...@@ -757,6 +712,8 @@ static irqreturn_t rtd_interrupt(int irq, void *d) ...@@ -757,6 +712,8 @@ static irqreturn_t rtd_interrupt(int irq, void *d)
fifo_status = readl(dev->mmio + LAS0_ADC); fifo_status = readl(dev->mmio + LAS0_ADC);
overrun = readl(dev->mmio + LAS0_OVERRUN) & 0xffff; overrun = readl(dev->mmio + LAS0_OVERRUN) & 0xffff;
comedi_handle_events(dev, s);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
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