Re: [PATCH v5 5/5] iio: humidity: si7020: add No Hold read mode

2015-12-05 Thread Jonathan Cameron
On 30/11/15 17:33, Wolfram Sang wrote:
> On Sat, Oct 31, 2015 at 10:21:56AM +, Jonathan Cameron wrote:
>> On 29/10/15 11:34, Nicola Corna wrote:
>>> The Si7013/20/21 modules support 2 read modes:
>>>  * Hold mode (blocking), where the device stretches the clock until the end
>>> of the measurement
>>>  * No Hold mode (non-blocking), where the device replies NACK for every I2C
>>> call during the measurement
>>> Here the No Hold mode is implemented, selectable with the blocking_io
>>> variable within si7020_platform_data. The default mode is Hold, unless the
>>> adapter does not support clock stretching, in which case the No Hold mode
>>> is used.
>>>
>>> Signed-off-by: Nicola Corna 
>> I'm fine with this.  The dependency below should I think show up in the
>> coming merge window, so this lot might as well go via Wolfram.
>>
>> Acked-by: Jonathan Cameron 
> 
> Not sure, will think about it...
> 
Nicola,

If Wolfram doesn't pick this up, please ping me after the next merge window.
Whilst I'll still have it in my queue, it'll be so long ago by then I'll 
probably
miss it!

Jonathan
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v5 5/5] iio: humidity: si7020: add No Hold read mode

2015-12-05 Thread Wolfram Sang

> If Wolfram doesn't pick this up, please ping me after the next merge window.

I tried to pick it a second ago, but it could not be applied (my branch
is based on 4.4-rc3). So, I really think it's better you pick it and
handle the conflicts.


signature.asc
Description: Digital signature


Re: [PATCH v5 5/5] iio: humidity: si7020: add No Hold read mode

2015-11-30 Thread Wolfram Sang
On Sat, Oct 31, 2015 at 10:21:56AM +, Jonathan Cameron wrote:
> On 29/10/15 11:34, Nicola Corna wrote:
> > The Si7013/20/21 modules support 2 read modes:
> >  * Hold mode (blocking), where the device stretches the clock until the end
> > of the measurement
> >  * No Hold mode (non-blocking), where the device replies NACK for every I2C
> > call during the measurement
> > Here the No Hold mode is implemented, selectable with the blocking_io
> > variable within si7020_platform_data. The default mode is Hold, unless the
> > adapter does not support clock stretching, in which case the No Hold mode
> > is used.
> > 
> > Signed-off-by: Nicola Corna 
> I'm fine with this.  The dependency below should I think show up in the
> coming merge window, so this lot might as well go via Wolfram.
> 
> Acked-by: Jonathan Cameron 

Not sure, will think about it...



signature.asc
Description: Digital signature


Re: [PATCH v5 5/5] iio: humidity: si7020: add No Hold read mode

2015-10-31 Thread Jonathan Cameron
On 29/10/15 11:34, Nicola Corna wrote:
> The Si7013/20/21 modules support 2 read modes:
>  * Hold mode (blocking), where the device stretches the clock until the end
> of the measurement
>  * No Hold mode (non-blocking), where the device replies NACK for every I2C
> call during the measurement
> Here the No Hold mode is implemented, selectable with the blocking_io
> variable within si7020_platform_data. The default mode is Hold, unless the
> adapter does not support clock stretching, in which case the No Hold mode
> is used.
> 
> Signed-off-by: Nicola Corna 
I'm fine with this.  The dependency below should I think show up in the
coming merge window, so this lot might as well go via Wolfram.

Acked-by: Jonathan Cameron 
> ---
> This patch depends on patch "[PATCH v4 1/2] iio: humidity: si7020: replaced
> bitmask on humidity values with range check"
>  drivers/iio/humidity/si7020.c| 75 
> 
>  include/linux/platform_data/si7020.h | 21 ++
>  2 files changed, 89 insertions(+), 7 deletions(-)
>  create mode 100644 include/linux/platform_data/si7020.h
> 
> diff --git a/drivers/iio/humidity/si7020.c b/drivers/iio/humidity/si7020.c
> index 12128d1..674a61a 100644
> --- a/drivers/iio/humidity/si7020.c
> +++ b/drivers/iio/humidity/si7020.c
> @@ -2,6 +2,7 @@
>   * si7020.c - Silicon Labs Si7013/20/21 Relative Humidity and Temp Sensors
>   * Copyright (c) 2013,2014  Uplogix, Inc.
>   * David Barksdale 
> + * Copyright (c) 2015 Nicola Corna 
>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms and conditions of the GNU General Public License,
> @@ -30,33 +31,78 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include 
>  #include 
> +#include 
>  
>  /* Measure Relative Humidity, Hold Master Mode */
>  #define SI7020CMD_RH_HOLD0xE5
> +/* Measure Relative Humidity, No Hold Master Mode */
> +#define SI7020CMD_RH_NO_HOLD 0xF5
>  /* Measure Temperature, Hold Master Mode */
>  #define SI7020CMD_TEMP_HOLD  0xE3
> +/* Measure Temperature, No Hold Master Mode */
> +#define SI7020CMD_TEMP_NO_HOLD   0xF3
>  /* Software Reset */
>  #define SI7020CMD_RESET  0xFE
> +/* Relative humidity measurement timeout (us) */
> +#define SI7020_RH_TIMEOUT22800
> +/* Temperature measurement timeout (us) */
> +#define SI7020_TEMP_TIMEOUT  10800
> +/* Minimum delay between retries (No Hold Mode) in us */
> +#define SI7020_NOHOLD_SLEEP_MIN  2000
> +/* Maximum delay between retries (No Hold Mode) in us */
> +#define SI7020_NOHOLD_SLEEP_MAX  6000
>  
>  static int si7020_read_raw(struct iio_dev *indio_dev,
>  struct iio_chan_spec const *chan, int *val,
>  int *val2, long mask)
>  {
>   struct i2c_client **client = iio_priv(indio_dev);
> + struct si7020_platform_data *pdata;
>   int ret;
> + bool holdmode;
> + unsigned char buf[2];
> + unsigned long start;
>  
>   switch (mask) {
>   case IIO_CHAN_INFO_RAW:
> - ret = i2c_smbus_read_word_data(*client,
> -chan->type == IIO_TEMP ?
> -SI7020CMD_TEMP_HOLD :
> -SI7020CMD_RH_HOLD);
> - if (ret < 0)
> - return ret;
> - *val = ret >> 2;
> + pdata = dev_get_platdata(&(*client)->dev);
> + if (pdata)
> + holdmode = pdata->blocking_io;
> + else
> + holdmode = !i2c_check_quirks((*client)->adapter,
> +I2C_AQ_NO_CLK_STRETCH);
> + if (holdmode) {
> + ret = i2c_smbus_read_word_data(*client,
> +chan->type == IIO_TEMP ?
> +SI7020CMD_TEMP_HOLD :
> +SI7020CMD_RH_HOLD);
> + if (ret < 0)
> + return ret;
> + *val = ret >> 2;
> + } else {
> + ret = i2c_smbus_write_byte(*client,
> +chan->type == IIO_TEMP ?
> +SI7020CMD_TEMP_NO_HOLD :
> +SI7020CMD_RH_NO_HOLD);
> + if (ret < 0)
> + return ret;
> + start = jiffies;
> + while ((ret = i2c_master_recv(*client, buf, 2)) < 0) {
> + if (time_after(jiffies, start +
> +usecs_to_jiffies(
> + chan->type == IIO_TEMP ?
> +