On 03/03/16 08:24, Martin Kepplinger wrote:
> The devices' config registers can only be changed in standby mode.
> Up until now the driver just held the device *always* active, so for
> changing a config it was *always* necessary to switch to standby.
> 
> For upcoming support for runtime pm, the device can as well be in standby
> mode. Instead of putting runtime pm functions in there, just keep the
> device in standby if it already is. This section is protected by a lock
> after all.
> 
> Signed-off-by: Martin Kepplinger <[email protected]>
> Signed-off-by: Christoph Muellner <[email protected]>
Applied to the togreg branch of iio.git - initially pushed out as testing

Thanks,

Jonathan
> ---
>  drivers/iio/accel/mma8452.c | 35 +++++++++++++++++++++++++++++------
>  1 file changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
> index 17d72bc..9c4a84a 100644
> --- a/drivers/iio/accel/mma8452.c
> +++ b/drivers/iio/accel/mma8452.c
> @@ -393,24 +393,47 @@ static int mma8452_active(struct mma8452_data *data)
>                                        data->ctrl_reg1);
>  }
>  
> +/* returns >0 if active, 0 if in standby and <0 on error */
> +static int mma8452_is_active(struct mma8452_data *data)
> +{
> +     int reg;
> +
> +     reg = i2c_smbus_read_byte_data(data->client, MMA8452_CTRL_REG1);
> +     if (reg < 0)
> +             return reg;
> +
> +     return reg & MMA8452_CTRL_ACTIVE;
> +}
> +
>  static int mma8452_change_config(struct mma8452_data *data, u8 reg, u8 val)
>  {
>       int ret;
> +     int is_active;
>  
>       mutex_lock(&data->lock);
>  
> -     /* config can only be changed when in standby */
> -     ret = mma8452_standby(data);
> -     if (ret < 0)
> +     is_active = mma8452_is_active(data);
> +     if (is_active < 0) {
> +             ret = is_active;
>               goto fail;
> +     }
> +
> +     /* config can only be changed when in standby */
> +     if (is_active > 0) {
> +             ret = mma8452_standby(data);
> +             if (ret < 0)
> +                     goto fail;
> +     }
>  
>       ret = i2c_smbus_write_byte_data(data->client, reg, val);
>       if (ret < 0)
>               goto fail;
>  
> -     ret = mma8452_active(data);
> -     if (ret < 0)
> -             goto fail;
> +     if (is_active > 0) {
> +             ret = mma8452_active(data);
> +             if (ret < 0)
> +                     goto fail;
> +     }
>  
>       ret = 0;
>  fail:
> 

Reply via email to