[PATCH v2] iio: light: vcnl4000: Don't power on/off chip in config

From: Mårten Lindahl
Date: Mon Sep 11 2023 - 17:47:45 EST


After enabling/disabling interrupts on the vcnl4040 chip the als and/or
ps sensor is powered on or off depending on the interrupt enable bits.
This is made as a last step in write_event_config.

But there is no reason to do this as the runtime PM handles the power
state of the sensors. Interfering with this may impact sensor readings.

Consider the following:
1. Userspace makes sensor data reading which triggers RPM resume
(sensor powered on) and a RPM suspend timeout. The timeout is 2000ms
before RPM suspend powers the sensor off if no new reading is made
within the timeout period.
2. Userspace disables interrupts => powers sensor off
3. Userspace reads sensor data = 0 because sensor is off and the
suspend timeout has not passed. For each new reading made within the
timeout period the timeout is renewed with 2000ms and RPM will not
make a new resume (device was not suspended). So the sensor will
not be powered on.
4. No further userspace reading for 2000ms ends RPM suspend timeout and
triggers suspend (powers off already powered off sensor).

Powering sensor off in (2) makes all consecutive readings made within
2000ms to the previous reading (3) return invalid data.

Skip setting power state when writing new event config.

Fixes: 546676121cb9 ("iio: light: vcnl4000: Add interrupt support for vcnl4040")
Fixes: bc292aaf9cb4 ("iio: light: vcnl4000: add illuminance irq vcnl4040/4200")
Signed-off-by: Mårten Lindahl <marten.lindahl@xxxxxxxx>
---
Changes in v2:
- Rephrasing of commit msg.
- Added 2 Fixes tags:
1. First tag refers to the original patch introducing the bug.
2. Second tag is for a later patch extending the faulty condition introduced in original patch.
- Link to v1: https://lore.kernel.org/r/20230907-vcnl4000-pm-fix-v1-1-58a11c1d5a6c@xxxxxxxx
---
drivers/iio/light/vcnl4000.c | 1 -
1 file changed, 1 deletion(-)

diff --git a/drivers/iio/light/vcnl4000.c b/drivers/iio/light/vcnl4000.c
index 3a52b09c2823..fdf763a04b0b 100644
--- a/drivers/iio/light/vcnl4000.c
+++ b/drivers/iio/light/vcnl4000.c
@@ -1513,7 +1513,6 @@ static int vcnl4040_write_event_config(struct iio_dev *indio_dev,

out:
mutex_unlock(&data->vcnl4000_lock);
- data->chip_spec->set_power_state(data, data->ps_int || data->als_int);

return ret;
}

---
base-commit: 7ba2090ca64ea1aa435744884124387db1fac70f
change-id: 20230907-vcnl4000-pm-fix-b58dc0dffb5c

Best regards,
--
Mårten Lindahl <marten.lindahl@xxxxxxxx>