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

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

 



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


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