On Fri, 8 May 2020 18:42:21 -0700 Jonathan Bakker <xc-racer2@xxxxxxx> wrote: > The light sensor needs the regulators to be enabled which means > the runtime PM needs to be on. This only happened when the > proximity part of the chip was enabled. > > As fallout from this change, only report changes to the prox > state in the interrupt handler when it is explicitly enabled. > > Signed-off-by: Jonathan Bakker <xc-racer2@xxxxxxx> Looks good to me, but needs a fixes tag as we'll want to fix this up in all kernels where it applies (just the current RCs I think..) Thanks, Jonathan > --- > drivers/iio/light/gp2ap002.c | 19 ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/light/gp2ap002.c b/drivers/iio/light/gp2ap002.c > index b7ef16b28280..7a2679bdc987 100644 > --- a/drivers/iio/light/gp2ap002.c > +++ b/drivers/iio/light/gp2ap002.c > @@ -158,6 +158,9 @@ static irqreturn_t gp2ap002_prox_irq(int irq, void *d) > int val; > int ret; > > + if (!gp2ap002->enabled) > + goto err_retrig; > + > ret = regmap_read(gp2ap002->map, GP2AP002_PROX, &val); > if (ret) { > dev_err(gp2ap002->dev, "error reading proximity\n"); > @@ -247,6 +250,8 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev, > struct gp2ap002 *gp2ap002 = iio_priv(indio_dev); > int ret; > > + pm_runtime_get_sync(gp2ap002->dev); > + > switch (mask) { > case IIO_CHAN_INFO_RAW: > switch (chan->type) { > @@ -255,13 +260,21 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev, > if (ret < 0) > return ret; > *val = ret; > - return IIO_VAL_INT; > + ret = IIO_VAL_INT; > + goto out; > default: > - return -EINVAL; > + ret = -EINVAL; > + goto out; > } > default: > - return -EINVAL; > + ret = -EINVAL; > } > + > +out: > + pm_runtime_mark_last_busy(gp2ap002->dev); > + pm_runtime_put_autosuspend(gp2ap002->dev); > + > + return ret; > } > > static int gp2ap002_init(struct gp2ap002 *gp2ap002)