[PATCH 34/47 v2] staging: comedi: icp_multi: use comedi_timeout()
Greg KH
gregkh at linuxfoundation.org
Wed Feb 12 17:14:51 UTC 2014
On Mon, Feb 10, 2014 at 11:49:33AM -0700, H Hartley Sweeten wrote:
> Use comedi_timeout() to wait for the analog input and output end-of-
> conversion.
>
> Use break to exit the loop when a timeout occurs during the analog
> input read so that common code can be used to disable the device.
>
> Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
> Cc: Ian Abbott <abbotti at mev.co.uk>
> Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
> ---
> drivers/staging/comedi/drivers/icp_multi.c | 104 +++++++++++++++--------------
> 1 file changed, 54 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/staging/comedi/drivers/icp_multi.c b/drivers/staging/comedi/drivers/icp_multi.c
> index 19c586b..7fb6ca0 100644
> --- a/drivers/staging/comedi/drivers/icp_multi.c
> +++ b/drivers/staging/comedi/drivers/icp_multi.c
> @@ -171,12 +171,27 @@ static void setup_channel_list(struct comedi_device *dev,
> }
> }
>
> +static int icp_multi_ai_eoc(struct comedi_device *dev,
> + struct comedi_subdevice *s,
> + struct comedi_insn *insn,
> + unsigned long context)
> +{
> + struct icp_multi_private *devpriv = dev->private;
> + unsigned int status;
> +
> + status = readw(devpriv->io_addr + ICP_MULTI_ADC_CSR);
> + if ((status & ADC_BSY) == 0)
> + return 0;
> + return -EBUSY;
> +}
> +
> static int icp_multi_insn_read_ai(struct comedi_device *dev,
> struct comedi_subdevice *s,
> struct comedi_insn *insn, unsigned int *data)
> {
> struct icp_multi_private *devpriv = dev->private;
> - int n, timeout;
> + int ret = 0;
> + int n;
>
> /* Disable A/D conversion ready interrupt */
> devpriv->IntEnable &= ~ADC_READY;
> @@ -199,33 +214,14 @@ static int icp_multi_insn_read_ai(struct comedi_device *dev,
> udelay(1);
>
> /* Wait for conversion to complete, or get fed up waiting */
> - timeout = 100;
> - while (timeout--) {
> - if (!(readw(devpriv->io_addr +
> - ICP_MULTI_ADC_CSR) & ADC_BSY))
> - goto conv_finish;
> -
> - udelay(1);
> + ret = comedi_timeout(dev, s, insn, icp_multi_ai_eoc, 0);
> + if (ret) {
> + comedi_error(dev, "A/D insn timeout");
> + /* Clear data received */
> + data[n] = 0;
> + break;
> }
>
> - /* If we reach here, a timeout has occurred */
> - comedi_error(dev, "A/D insn timeout");
> -
> - /* Disable interrupt */
> - devpriv->IntEnable &= ~ADC_READY;
> - writew(devpriv->IntEnable, devpriv->io_addr + ICP_MULTI_INT_EN);
> -
> - /* Clear interrupt status */
> - devpriv->IntStatus |= ADC_READY;
> - writew(devpriv->IntStatus,
> - devpriv->io_addr + ICP_MULTI_INT_STAT);
> -
How come these writew() calls are removed? Don't we still need to do
them in failure mode?
thanks,
greg k-h
More information about the devel
mailing list