This patch fixes a regression starting in Linux-4.0, and thus should also be targeted to -stable. I do not recommend that distros ship Linux Linux-4.0 or Linux-4.1 to users until this regression is fixed -- as some users will much prefer the kernel without the regression. thanks, -Len > -----Original Message----- > From: gregkh@xxxxxxxxxxxxxxxxxxx [mailto:gregkh@xxxxxxxxxxxxxxxxxxx] > Sent: Monday, July 13, 2015 5:19 PM > To: srinivas.pandruvada@xxxxxxxxxxxxxxx; Stable@xxxxxxxxxxxxxxx; > jic23@xxxxxxxxxx; Brown, Len > Subject: patch "hid-sensor: Fix suspend/resume delay" added to staging- > linus > > > This is a note to let you know that I've just added the patch titled > > hid-sensor: Fix suspend/resume delay > > to my staging git tree which can be found at > git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git > in the staging-linus branch. > > The patch will show up in the next release of the linux-next tree > (usually sometime within the next 24 hours during the week.) > > The patch will hopefully also be merged in Linus's tree for the > next -rc kernel release. > > If you have any questions about this process, please let me know. > > > From 1e25aa9641e8f3fa39cd5e46b4afcafd7f12a44b Mon Sep 17 00:00:00 2001 > From: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx> > Date: Mon, 1 Jun 2015 16:36:27 -0700 > Subject: hid-sensor: Fix suspend/resume delay > > 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> > --- > 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 610fc98f88ef..595511022795 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 0408421d885f..cd224dfd94d8 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; > -- > 2.4.5 > -- 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