| From 70abf5cd76caa9763e7a0fd83965a0a94fc936ef Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 9 May 2021 12:33:37 +0100 |
| Subject: iio: magn: bmc150: Balance runtime pm + use |
| pm_runtime_resume_and_get() |
| |
| From: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| |
| [ Upstream commit 264da512431495e542fcaf56ffe75e7df0e7db74 ] |
| |
| probe() error paths after runtime pm is enabled, should disable it. |
| remove() should not call pm_runtime_put_noidle() as there is no |
| matching get() to have raised the reference count. This case |
| has no affect a the runtime pm core protects against going negative. |
| |
| Whilst here use pm_runtime_resume_and_get() to tidy things up a little. |
| coccicheck script didn't get this one due to complex code structure so |
| found by inspection. |
| |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Cc: Linus Walleij <linus.walleij@linaro.org> |
| Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Link: https://lore.kernel.org/r/20210509113354.660190-12-jic23@kernel.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iio/magnetometer/bmc150_magn.c | 10 ++++------ |
| 1 file changed, 4 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/iio/magnetometer/bmc150_magn.c b/drivers/iio/magnetometer/bmc150_magn.c |
| index 20a0842f0e3a..26c6400cb08c 100644 |
| --- a/drivers/iio/magnetometer/bmc150_magn.c |
| +++ b/drivers/iio/magnetometer/bmc150_magn.c |
| @@ -265,7 +265,7 @@ static int bmc150_magn_set_power_state(struct bmc150_magn_data *data, bool on) |
| int ret; |
| |
| if (on) { |
| - ret = pm_runtime_get_sync(data->dev); |
| + ret = pm_runtime_resume_and_get(data->dev); |
| } else { |
| pm_runtime_mark_last_busy(data->dev); |
| ret = pm_runtime_put_autosuspend(data->dev); |
| @@ -274,9 +274,6 @@ static int bmc150_magn_set_power_state(struct bmc150_magn_data *data, bool on) |
| if (ret < 0) { |
| dev_err(data->dev, |
| "failed to change power state to %d\n", on); |
| - if (on) |
| - pm_runtime_put_noidle(data->dev); |
| - |
| return ret; |
| } |
| #endif |
| @@ -967,12 +964,14 @@ int bmc150_magn_probe(struct device *dev, struct regmap *regmap, |
| ret = iio_device_register(indio_dev); |
| if (ret < 0) { |
| dev_err(dev, "unable to register iio device\n"); |
| - goto err_buffer_cleanup; |
| + goto err_disable_runtime_pm; |
| } |
| |
| dev_dbg(dev, "Registered device %s\n", name); |
| return 0; |
| |
| +err_disable_runtime_pm: |
| + pm_runtime_disable(dev); |
| err_buffer_cleanup: |
| iio_triggered_buffer_cleanup(indio_dev); |
| err_free_irq: |
| @@ -996,7 +995,6 @@ int bmc150_magn_remove(struct device *dev) |
| |
| pm_runtime_disable(dev); |
| pm_runtime_set_suspended(dev); |
| - pm_runtime_put_noidle(dev); |
| |
| iio_triggered_buffer_cleanup(indio_dev); |
| |
| -- |
| 2.30.2 |
| |