Re: [PATCH] iio: light: gp2ap002: Take runtime PM reference on light read
From: Jonathan Cameron
Date: Sun May 10 2020 - 06:20:52 EST
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)