On 07/07/15 23:35, Reinette Chatre wrote:
> From: Srinivas Pandruvada <[email protected]>
> 
> By default all the sensors are runtime suspended state (lowest power
> state). During Linux suspend process, all the run time suspended
> devices are resumed and then suspended. This caused all sensors to
> power up and introduced delay in suspend time, when we introduced
> runtime PM for HID sensors. The opposite process happens during resume
> process.
> 
> To fix this, we do powerup process of the sensors only when the request
> is issued from user (raw or tiggerred). In this way when runtime,
> resume calls for powerup it will simply return as this will not match
> user requested state.
> 
> Note this is a regression fix as the increase in suspend / resume
> times can be substantial (report of 8 seconds on Len's laptop!)
> 
> Signed-off-by: Srinivas Pandruvada <[email protected]>
> Tested-by: Len Brown <[email protected]>
> Cc: <[email protected]>
> Signed-off-by: Jonathan Cameron <[email protected]>
been queued up for a while, but various day job issues mean I am somewhat
behind with sending pull requests.  Will get one out in the next day or so.

Jonathan
> ---
>  drivers/iio/common/hid-sensors/hid-sensor-trigger.c | 11 ++++++++++-
>  include/linux/hid-sensor-hub.h                      |  1 +
>  2 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c 
> b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c
> index 610fc98..5955110 100644
> --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c
> +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c
> @@ -36,6 +36,8 @@ static int _hid_sensor_power_state(struct hid_sensor_common 
> *st, bool state)
>       s32 poll_value = 0;
>  
>       if (state) {
> +             if (!atomic_read(&st->user_requested_state))
> +                     return 0;
>               if (sensor_hub_device_open(st->hsdev))
>                       return -EIO;
>  
> @@ -52,8 +54,12 @@ static int _hid_sensor_power_state(struct 
> hid_sensor_common *st, bool state)
>  
>               poll_value = hid_sensor_read_poll_value(st);
>       } else {
> -             if (!atomic_dec_and_test(&st->data_ready))
> +             int val;
> +
> +             val = atomic_dec_if_positive(&st->data_ready);
> +             if (val < 0)
>                       return 0;
> +
>               sensor_hub_device_close(st->hsdev);
>               state_val = hid_sensor_get_usage_index(st->hsdev,
>                       st->power_state.report_id,
> @@ -92,9 +98,11 @@ EXPORT_SYMBOL(hid_sensor_power_state);
>  
>  int hid_sensor_power_state(struct hid_sensor_common *st, bool state)
>  {
> +
>  #ifdef CONFIG_PM
>       int ret;
>  
> +     atomic_set(&st->user_requested_state, state);
>       if (state)
>               ret = pm_runtime_get_sync(&st->pdev->dev);
>       else {
> @@ -109,6 +117,7 @@ int hid_sensor_power_state(struct hid_sensor_common *st, 
> bool state)
>  
>       return 0;
>  #else
> +     atomic_set(&st->user_requested_state, state);
>       return _hid_sensor_power_state(st, state);
>  #endif
>  }
> diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h
> index 0408421..cd224df 100644
> --- a/include/linux/hid-sensor-hub.h
> +++ b/include/linux/hid-sensor-hub.h
> @@ -230,6 +230,7 @@ struct hid_sensor_common {
>       struct platform_device *pdev;
>       unsigned usage_id;
>       atomic_t data_ready;
> +     atomic_t user_requested_state;
>       struct iio_trigger *trigger;
>       struct hid_sensor_hub_attribute_info poll;
>       struct hid_sensor_hub_attribute_info report_state;
> 

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to