| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Mikko Koivunen <mikko.koivunen@fi.rohmeurope.com> |
| Date: Thu, 18 May 2017 15:12:50 +0300 |
| Subject: iio: light: rpr0521 poweroff for probe fails |
| |
| From: Mikko Koivunen <mikko.koivunen@fi.rohmeurope.com> |
| |
| |
| [ Upstream commit 12d74949133e2450533894ea01ce0c56646ce006 ] |
| |
| Set sensor measurement off after probe fail in pm_runtime_set_active() or |
| iio_device_register(). Without this change sensor measurement stays on |
| even though probe fails on these calls. |
| |
| This is maybe rare case, but causes constant power drain without any |
| benefits when it happens. Power drain is 20-500uA, typically 180uA. |
| |
| Signed-off-by: Mikko Koivunen <mikko.koivunen@fi.rohmeurope.com> |
| Acked-by: Daniel Baluta <daniel.baluta@nxp.com> |
| Signed-off-by: Jonathan Cameron <jic23@kernel.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iio/light/rpr0521.c | 17 +++++++++++++++-- |
| 1 file changed, 15 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/iio/light/rpr0521.c |
| +++ b/drivers/iio/light/rpr0521.c |
| @@ -510,13 +510,26 @@ static int rpr0521_probe(struct i2c_clie |
| |
| ret = pm_runtime_set_active(&client->dev); |
| if (ret < 0) |
| - return ret; |
| + goto err_poweroff; |
| |
| pm_runtime_enable(&client->dev); |
| pm_runtime_set_autosuspend_delay(&client->dev, RPR0521_SLEEP_DELAY_MS); |
| pm_runtime_use_autosuspend(&client->dev); |
| |
| - return iio_device_register(indio_dev); |
| + ret = iio_device_register(indio_dev); |
| + if (ret) |
| + goto err_pm_disable; |
| + |
| + return 0; |
| + |
| +err_pm_disable: |
| + pm_runtime_disable(&client->dev); |
| + pm_runtime_set_suspended(&client->dev); |
| + pm_runtime_put_noidle(&client->dev); |
| +err_poweroff: |
| + rpr0521_poweroff(data); |
| + |
| + return ret; |
| } |
| |
| static int rpr0521_remove(struct i2c_client *client) |