Hi Ritesh, Does the attached patch helps? Thanks, Srinivas On Tue, 2017-04-04 at 00:44 +0530, Ritesh Raj Sarraf wrote: > Adding Stable, LKML and IIO MLs. > > Hello Hongyan, > > Do you have any feedback ? With the bisected commit reverted, I've > been > successfully running the machine without any issues. > > Ritesh > > > On Sat, 2017-04-01 at 08:14 -0700, Srinivas Pandruvada wrote: > > Hello Hongyan, > > > > Can you check the findings of Ritesh? > > > > Thanks, > > Srinivas > > > > On Sat, 2017-04-01 at 14:07 +0530, Ritesh Raj Sarraf wrote: > > > Hello Srinivas, > > > > > > With the Linux 4.10.7 release, I have encountered a regression > > > introduced on my > > > Lenovo Yoga 2 13, for the ITE Rotation Sensor. > > > > > > > > > rrs@learner:~$ lsusb > > > Bus 001 Device 002: ID 8087:8000 Intel Corp. > > > Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub > > > Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub > > > Bus 002 Device 006: ID 048d:8350 Integrated Technology Express, > > > Inc. > > > Bus 002 Device 005: ID 0bda:b728 Realtek Semiconductor Corp. > > > Bus 002 Device 004: ID 04f2:b40f Chicony Electronics Co., Ltd > > > Bus 002 Device 003: ID 04f3:0303 Elan Microelectronics Corp. > > > Bus 002 Device 002: ID 0bda:0129 Realtek Semiconductor Corp. > > > RTS5129 > > > Card Reader > > > Controller > > > Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub > > > 2017-04-01 / 14:04:49 ♒♒♒ ☺ > > > > > > > > > The ITE sensors do not feed any data on the 4.10.7 kernel. > > > Reverting > > > back to > > > 4.10.5, everything works back. > > > > > > > > > After a git bisect, the culprit reported is: > > > > > > Bisecting: 0 revisions left to test after this (roughly 0 steps) > > > [6c2aab07d12436af1cd8d9ac1d117a442cc91eec] iio: hid-sensor- > > > trigger: > > > Change get > > > poll value function order to avoid sensor properties losing after > > > resume from S3 > > > 1 > > > > > > Can you please review my findings to confirm that it really is a > > > regression bug > > > ? > > > > > > > > > Thanks, > > > Ritesh > > >
From 81a55bd9e6dfb4aec15da37a3a3ff8213d788f62 Mon Sep 17 00:00:00 2001 From: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx> Date: Tue, 4 Apr 2017 16:50:59 -0700 Subject: [PATCH] iio: hid-sensor: Store restore poll and hysteresis Instead of relying on HW for restoring poll and hysteresis, store in driver and restore on resume. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx> --- .../iio/common/hid-sensors/hid-sensor-attributes.c | 17 +++++++++++++++++ drivers/iio/common/hid-sensors/hid-sensor-trigger.c | 20 +++++++++++++++++--- include/linux/hid-sensor-hub.h | 2 ++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c index 7afdac42..aa8cacf 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c @@ -221,6 +221,14 @@ int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st, if (ret < 0 || value < 0) ret = -EINVAL; + ret = sensor_hub_get_feature(st->hsdev, + st->poll.report_id, + st->poll.index, sizeof(value), &value); + if (ret < 0 || value < 0) + return -EINVAL; + + st->poll_interval = value; + return ret; } EXPORT_SYMBOL(hid_sensor_write_samp_freq_value); @@ -266,6 +274,15 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, if (ret < 0 || value < 0) ret = -EINVAL; + ret = sensor_hub_get_feature(st->hsdev, + st->sensitivity.report_id, + st->sensitivity.index, sizeof(value), + &value); + if (ret < 0 || value < 0) + return -EINVAL; + + st->raw_hystersis = value; + return ret; } EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value); diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c index ecf592d..be7011e 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c @@ -51,6 +51,8 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) st->report_state.report_id, st->report_state.index, HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM); + + poll_value = hid_sensor_read_poll_value(st); } else { int val; @@ -87,9 +89,7 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) sensor_hub_get_feature(st->hsdev, st->power_state.report_id, st->power_state.index, sizeof(state_val), &state_val); - if (state) - poll_value = hid_sensor_read_poll_value(st); - if (poll_value > 0) + if (state && poll_value) msleep_interruptible(poll_value * 2); return 0; @@ -127,6 +127,20 @@ static void hid_sensor_set_power_work(struct work_struct *work) struct hid_sensor_common *attrb = container_of(work, struct hid_sensor_common, work); + + if (attrb->poll_interval) + sensor_hub_set_feature(attrb->hsdev, attrb->poll.report_id, + attrb->poll.index, + sizeof(attrb->poll_interval), + &attrb->poll_interval); + + if (attrb->raw_hystersis) + sensor_hub_set_feature(attrb->hsdev, + attrb->sensitivity.report_id, + attrb->sensitivity.index, + sizeof(attrb->raw_hystersis), + &attrb->raw_hystersis); + _hid_sensor_power_state(attrb, true); } diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h index 7ef111d..f32d7c3 100644 --- a/include/linux/hid-sensor-hub.h +++ b/include/linux/hid-sensor-hub.h @@ -231,6 +231,8 @@ struct hid_sensor_common { unsigned usage_id; atomic_t data_ready; atomic_t user_requested_state; + int poll_interval; + int raw_hystersis; struct iio_trigger *trigger; int timestamp_ns_scale; struct hid_sensor_hub_attribute_info poll; -- 2.9.3