History

iio: cros_ec: Reapply range at resume

EC does not currently preserve range across sensor reinit. If sensor is powered down at suspend, it will default to the EC default range at resume, not the range set by the host. Save range if modified, and apply at resume.

Gwendal Grignou committed 6 years ago

Commit e7e3b9d1 parent 79846e35 files · +47 −4Browse files

Unified · Split

5 files
  1. drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c +5 −0
  2. drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c +21 −0
  3. drivers/iio/light/cros_ec_light_prox.c +5 −1
  4. drivers/iio/pressure/cros_ec_baro.c +6 −2
  5. include/linux/iio/common/cros_ec_sensors_core.h +10 −1
drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c+5−0
@@ -200,6 +200,10 @@ static int cros_ec_sensors_write(struct iio_dev *indio_dev, · 199 unmodified lines
200 st->core.param.sensor_range.roundup = 1;200 st->core.param.sensor_range.roundup = 1;
201 201
202 ret = cros_ec_motion_send_host_cmd(&st->core, 0);202 ret = cros_ec_motion_send_host_cmd(&st->core, 0);
203 if (ret == 0) {
204 st->core.range_updated = true;
205 st->core.curr_range = val;
206 }
203 break;207 break;
204 default:208 default:
205 ret = cros_ec_sensors_core_write(209 ret = cros_ec_sensors_core_write(
@@ -315,6 +319,7 @@ MODULE_DEVICE_TABLE(platform, cros_ec_sensors_ids); · 109 unmodified lines
315static struct platform_driver cros_ec_sensors_platform_driver = {319static struct platform_driver cros_ec_sensors_platform_driver = {
316 .driver = {320 .driver = {
317 .name = "cros-ec-sensors",321 .name = "cros-ec-sensors",
322 .pm = &cros_ec_sensors_pm_ops,
318 },323 },
319 .probe = cros_ec_sensors_probe,324 .probe = cros_ec_sensors_probe,
320 .id_table = cros_ec_sensors_ids,325 .id_table = cros_ec_sensors_ids,
drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c+21−0
@@ -824,5 +824,26 @@ int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st, · 823 unmodified lines
824}824}
825EXPORT_SYMBOL_GPL(cros_ec_sensors_core_write);825EXPORT_SYMBOL_GPL(cros_ec_sensors_core_write);
826 826
827static int __maybe_unused cros_ec_sensors_resume(struct device *dev)
828{
829 struct platform_device *pdev = to_platform_device(dev);
830 struct iio_dev *indio_dev = platform_get_drvdata(pdev);
831 struct cros_ec_sensors_core_state *st = iio_priv(indio_dev);
832 int ret = 0;
833
834 if (st->range_updated) {
835 mutex_lock(&st->cmd_lock);
836 st->param.cmd = MOTIONSENSE_CMD_SENSOR_RANGE;
837 st->param.sensor_range.data = st->curr_range;
838 st->param.sensor_range.roundup = 1;
839 ret = cros_ec_motion_send_host_cmd(st, 0);
840 mutex_unlock(&st->cmd_lock);
841 }
842 return ret;
843}
844
845SIMPLE_DEV_PM_OPS(cros_ec_sensors_pm_ops, NULL, cros_ec_sensors_resume);
846EXPORT_SYMBOL_GPL(cros_ec_sensors_pm_ops);
847
827MODULE_DESCRIPTION("ChromeOS EC sensor hub core functions");848MODULE_DESCRIPTION("ChromeOS EC sensor hub core functions");
828MODULE_LICENSE("GPL v2");849MODULE_LICENSE("GPL v2");
drivers/iio/light/cros_ec_light_prox.c+5−1
@@ -145,8 +145,11 @@ static int cros_ec_light_prox_write(struct iio_dev *indio_dev, · 144 unmodified lines
145 break;145 break;
146 case IIO_CHAN_INFO_CALIBSCALE:146 case IIO_CHAN_INFO_CALIBSCALE:
147 st->core.param.cmd = MOTIONSENSE_CMD_SENSOR_RANGE;147 st->core.param.cmd = MOTIONSENSE_CMD_SENSOR_RANGE;
148 st->core.param.sensor_range.data = (val << 16) | (val2 / 100);148 st->core.curr_range = (val << 16) | (val2 / 100);
149 st->core.param.sensor_range.data = st->core.curr_range;
149 ret = cros_ec_motion_send_host_cmd(&st->core, 0);150 ret = cros_ec_motion_send_host_cmd(&st->core, 0);
151 if (ret == 0)
152 st->core.range_updated = true;
150 break;153 break;
151 default:154 default:
152 ret = cros_ec_sensors_core_write(&st->core, chan, val, val2,155 ret = cros_ec_sensors_core_write(&st->core, chan, val, val2,
@@ -256,6 +259,7 @@ MODULE_DEVICE_TABLE(platform, cros_ec_light_prox_ids); · 103 unmodified lines
256static struct platform_driver cros_ec_light_prox_platform_driver = {259static struct platform_driver cros_ec_light_prox_platform_driver = {
257 .driver = {260 .driver = {
258 .name = "cros-ec-light-prox",261 .name = "cros-ec-light-prox",
262 .pm = &cros_ec_sensors_pm_ops,
259 },263 },
260 .probe = cros_ec_light_prox_probe,264 .probe = cros_ec_light_prox_probe,
261 .id_table = cros_ec_light_prox_ids,265 .id_table = cros_ec_light_prox_ids,
drivers/iio/pressure/cros_ec_baro.c+6−2
@@ -96,8 +96,11 @@ static int cros_ec_baro_write(struct iio_dev *indio_dev, · 95 unmodified lines
96 /* Always roundup, so caller gets at least what it asks for. */96 /* Always roundup, so caller gets at least what it asks for. */
97 st->core.param.sensor_range.roundup = 1;97 st->core.param.sensor_range.roundup = 1;
98 98
99 if (cros_ec_motion_send_host_cmd(&st->core, 0))99 ret = cros_ec_motion_send_host_cmd(&st->core, 0);
100 ret = -EIO;100 if (ret == 0) {
101 st->core.range_updated = true;
102 st->core.curr_range = val;
103 }
101 break;104 break;
102 default:105 default:
103 ret = cros_ec_sensors_core_write(&st->core, chan, val, val2,106 ret = cros_ec_sensors_core_write(&st->core, chan, val, val2,
@@ -199,6 +202,7 @@ MODULE_DEVICE_TABLE(platform, cros_ec_baro_ids); · 95 unmodified lines
199static struct platform_driver cros_ec_baro_platform_driver = {202static struct platform_driver cros_ec_baro_platform_driver = {
200 .driver = {203 .driver = {
201 .name = "cros-ec-baro",204 .name = "cros-ec-baro",
205 .pm = &cros_ec_sensors_pm_ops,
202 },206 },
203 .probe = cros_ec_baro_probe,207 .probe = cros_ec_baro_probe,
204 .id_table = cros_ec_baro_ids,208 .id_table = cros_ec_baro_ids,
include/linux/iio/common/cros_ec_sensors_core.h+10−1
@@ -42,6 +42,10 @@ typedef irqreturn_t (*cros_ec_sensors_capture_t)(int irq, void *p); · 41 unmodified lines
42 * @resp: motion sensor response structure42 * @resp: motion sensor response structure
43 * @type: type of motion sensor43 * @type: type of motion sensor
44 * @loc: location where the motion sensor is placed44 * @loc: location where the motion sensor is placed
45 * @range_updated: True if the range of the sensor has been
46 * updated.
47 * @curr_range: If updated, the current range value.
48 * It will be reapplied at every resume.
45 * @calib: calibration parameters. Note that trigger49 * @calib: calibration parameters. Note that trigger
46 * captured data will always provide the calibrated50 * captured data will always provide the calibrated
47 * data51 * data
@@ -65,6 +69,9 @@ struct cros_ec_sensors_core_state { · 17 unmodified lines
65 enum motionsensor_type type;69 enum motionsensor_type type;
66 enum motionsensor_location loc;70 enum motionsensor_location loc;
67 71
72 bool range_updated;
73 int curr_range;
74
68 struct calib_data {75 struct calib_data {
69 s16 offset;76 s16 offset;
70 u16 scale;77 u16 scale;
@@ -114,7 +121,9 @@ int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st, · 43 unmodified lines
114 struct iio_chan_spec const *chan,121 struct iio_chan_spec const *chan,
115 int val, int val2, long mask);122 int val, int val2, long mask);
116 123
117/* List of extended channel specification for all sensors */124extern const struct dev_pm_ops cros_ec_sensors_pm_ops;
125
126/* List of extended channel specification for all sensors. */
118extern const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[];127extern const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[];
119extern const struct attribute *cros_ec_sensor_fifo_attributes[];128extern const struct attribute *cros_ec_sensor_fifo_attributes[];
120 129