Re: [STABLE REGRESSION] iio: hid-sensor-trigger: Change get poll value function order to avoid sensor properties losing after resume from S3

From: Srinivas Pandruvada
Date: Tue Apr 04 2017 - 20:44:48 EST


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