Commit f6dbf83c authored by Jonathan Bakker's avatar Jonathan Bakker Committed by Jonathan Cameron

iio: light: gp2ap002: Take runtime PM reference on light read

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.

Fixes: 97d642e2 ("iio: light: Add a driver for Sharp GP2AP002x00F")
Signed-off-by: default avatarJonathan Bakker <xc-racer2@live.ca>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 1ecca8a9
...@@ -158,6 +158,9 @@ static irqreturn_t gp2ap002_prox_irq(int irq, void *d) ...@@ -158,6 +158,9 @@ static irqreturn_t gp2ap002_prox_irq(int irq, void *d)
int val; int val;
int ret; int ret;
if (!gp2ap002->enabled)
goto err_retrig;
ret = regmap_read(gp2ap002->map, GP2AP002_PROX, &val); ret = regmap_read(gp2ap002->map, GP2AP002_PROX, &val);
if (ret) { if (ret) {
dev_err(gp2ap002->dev, "error reading proximity\n"); dev_err(gp2ap002->dev, "error reading proximity\n");
...@@ -247,6 +250,8 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev, ...@@ -247,6 +250,8 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev,
struct gp2ap002 *gp2ap002 = iio_priv(indio_dev); struct gp2ap002 *gp2ap002 = iio_priv(indio_dev);
int ret; int ret;
pm_runtime_get_sync(gp2ap002->dev);
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_RAW:
switch (chan->type) { switch (chan->type) {
...@@ -255,13 +260,21 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev, ...@@ -255,13 +260,21 @@ static int gp2ap002_read_raw(struct iio_dev *indio_dev,
if (ret < 0) if (ret < 0)
return ret; return ret;
*val = ret; *val = ret;
return IIO_VAL_INT; ret = IIO_VAL_INT;
goto out;
default: default:
return -EINVAL; ret = -EINVAL;
goto out;
} }
default: 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) static int gp2ap002_init(struct gp2ap002 *gp2ap002)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment