mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
iio: light: gp2ap002: Fix unbalanced runtime PM on repeated event writes
The IIO core does not filter duplicate writes to the event enable
attribute, so writing the same value twice invokes
write_event_config() twice. Enabling twice leaks a runtime PM
reference, preventing the device from ever suspending again;
disabling twice underflows the usage count and triggers a
"Runtime PM usage count underflow" warning.
Bail out early when the requested state matches the current state.
While at it, switch to pm_runtime_resume_and_get() so a failed
resume is propagated to userspace instead of silently marking the
event enabled.
Fixes: 97d642e230 ("iio: light: Add a driver for Sharp GP2AP002x00F")
Signed-off-by: Nikhil Gautam <nikhilgtr@gmail.com>
Signed-off-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
This commit is contained in:
parent
d378fceaaf
commit
579c049b4c
|
|
@ -342,6 +342,10 @@ static int gp2ap002_write_event_config(struct iio_dev *indio_dev,
|
|||
bool state)
|
||||
{
|
||||
struct gp2ap002 *gp2ap002 = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
if (state == gp2ap002->enabled)
|
||||
return 0;
|
||||
|
||||
if (state) {
|
||||
/*
|
||||
|
|
@ -349,13 +353,16 @@ static int gp2ap002_write_event_config(struct iio_dev *indio_dev,
|
|||
* already) and reintialize the sensor by using runtime_pm
|
||||
* callbacks.
|
||||
*/
|
||||
pm_runtime_get_sync(gp2ap002->dev);
|
||||
gp2ap002->enabled = true;
|
||||
ret = pm_runtime_resume_and_get(gp2ap002->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
} else {
|
||||
pm_runtime_put_autosuspend(gp2ap002->dev);
|
||||
gp2ap002->enabled = false;
|
||||
}
|
||||
|
||||
gp2ap002->enabled = state;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user