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