Re: [PATCH 34/47 v2] staging: comedi: icp_multi: use comedi_timeout()

2014-02-12 Thread Greg KH
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 hswee...@visionengravers.com
 Cc: Ian Abbott abbo...@mev.co.uk
 Cc: Greg Kroah-Hartman gre...@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
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


RE: [PATCH 34/47 v2] staging: comedi: icp_multi: use comedi_timeout()

2014-02-12 Thread Hartley Sweeten
On Wednesday, February 12, 2014 10:15 AM, Greg KH wrote:
 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.

snip

 How come these writew() calls are removed?  Don't we still need to do
 them in failure mode?

The break causes the common exit code to be used to disable the interrupt
and clear the interrupt status when a timeout occurs.

Regards,
Hartley

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel