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