Re: [PATCH 1/3] hid-sensor: Fix suspend/resume delay

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

 



On 07/07/15 23:35, Reinette Chatre wrote:
> From: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>
> 
> 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 <srinivas.pandruvada@xxxxxxxxxxxxxxx>
> Tested-by: Len Brown <len.brown@xxxxxxxxx>
> Cc: <Stable@xxxxxxxxxxxxxxx>
> Signed-off-by: Jonathan Cameron <jic23@xxxxxxxxxx>
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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]