RE: [PATCH] iio: adc: max11410: fix read_poll_timeout() usage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> Even though we are passing 'ret' as stop condition for
> read_poll_timeout(), that return code is still being ignored. The reason
> is that the poll will stop if the passed condition is true which will
> happen if the passed op() returns error. However, read_poll_timeout()
> returns 0 if the *complete* condition evaluates to true. Therefore, the
> error code returned by op() will be ignored.
> 
> To fix this we need to check for both error codes:
>  * The one returned by read_poll_timeout() which is either 0 or
> ETIMEDOUT.
>  * The one returned by the passed op().
> 
> Fixes: a44ef7c46097 ("iio: adc: add max11410 adc driver")
> Signed-off-by: Nuno Sá <nuno.sa@xxxxxxxxxx>

Acked-by: Ibrahim Tilki <Ibrahim.Tilki@xxxxxxxxxx>


> ---
>  drivers/iio/adc/max11410.c | 22 +++++++++++++++-------
>  1 file changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/iio/adc/max11410.c b/drivers/iio/adc/max11410.c
> index 237b2ce3f264..6af829349b4e 100644
> --- a/drivers/iio/adc/max11410.c
> +++ b/drivers/iio/adc/max11410.c
> @@ -414,13 +414,17 @@ static int max11410_sample(struct max11410_state *st, int *sample_raw,
>  		if (!ret)
>  			return -ETIMEDOUT;
>  	} else {
> +		int ret2;
> +
>  		/* Wait for status register Conversion Ready flag */
> -		ret = read_poll_timeout(max11410_read_reg, ret,
> -					ret || (val & MAX11410_STATUS_CONV_READY_BIT),
> +		ret = read_poll_timeout(max11410_read_reg, ret2,
> +					ret2 || (val & MAX11410_STATUS_CONV_READY_BIT),
>  					5000, MAX11410_CONVERSION_TIMEOUT_MS * 1000,
>  					true, st, MAX11410_REG_STATUS, &val);
>  		if (ret)
>  			return ret;
> +		if (ret2)
> +			return ret2;
>  	}
>  
>  	/* Read ADC Data */
> @@ -851,17 +855,21 @@ static int max11410_init_vref(struct device *dev,
>  
>  static int max11410_calibrate(struct max11410_state *st, u32 cal_type)
>  {
> -	int ret, val;
> +	int ret, ret2, val;
>  
>  	ret = max11410_write_reg(st, MAX11410_REG_CAL_START, cal_type);
>  	if (ret)
>  		return ret;
>  
>  	/* Wait for status register Calibration Ready flag */
> -	return read_poll_timeout(max11410_read_reg, ret,
> -				 ret || (val & MAX11410_STATUS_CAL_READY_BIT),
> -				 50000, MAX11410_CALIB_TIMEOUT_MS * 1000, true,
> -				 st, MAX11410_REG_STATUS, &val);
> +	ret = read_poll_timeout(max11410_read_reg, ret2,
> +				ret2 || (val & MAX11410_STATUS_CAL_READY_BIT),
> +				50000, MAX11410_CALIB_TIMEOUT_MS * 1000, true,
> +				st, MAX11410_REG_STATUS, &val);
> +	if (ret)
> +		return ret;
> +
> +	return ret2;
>  }
>  
>  static int max11410_self_calibrate(struct max11410_state *st)




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux