| From 227f6dc5d95ac4b52965be919075243b758c2cd7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 9 May 2021 12:33:27 +0100 |
| Subject: iio: gyro: fxa21002c: Balance runtime pm + use |
| pm_runtime_resume_and_get(). |
| |
| From: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| |
| [ Upstream commit 41120ebbb1eb5e9dec93320e259d5b2c93226073 ] |
| |
| In both the probe() error path and remove() pm_runtime_put_noidle() |
| is called which will decrement the runtime pm reference count. |
| However, there is no matching function to have raised the reference count. |
| Not this isn't a fix as the runtime pm core will stop the reference count |
| going negative anyway. |
| |
| An alternative would have been to raise the count in these paths, but |
| it is not clear why that would be necessary. |
| |
| Whilst we are here replace some boilerplate with pm_runtime_resume_and_get() |
| Found using coccicheck script under review at: |
| https://lore.kernel.org/lkml/20210427141946.2478411-1-Julia.Lawall@inria.fr/ |
| |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Reviewed-by: Rui Miguel Silva <rui.silva@linaro.org> |
| Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Link: https://lore.kernel.org/r/20210509113354.660190-2-jic23@kernel.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iio/gyro/fxas21002c_core.c | 11 +---------- |
| 1 file changed, 1 insertion(+), 10 deletions(-) |
| |
| diff --git a/drivers/iio/gyro/fxas21002c_core.c b/drivers/iio/gyro/fxas21002c_core.c |
| index b7523357d8eb..ec6bd15bd2d4 100644 |
| --- a/drivers/iio/gyro/fxas21002c_core.c |
| +++ b/drivers/iio/gyro/fxas21002c_core.c |
| @@ -366,14 +366,7 @@ out_unlock: |
| |
| static int fxas21002c_pm_get(struct fxas21002c_data *data) |
| { |
| - struct device *dev = regmap_get_device(data->regmap); |
| - int ret; |
| - |
| - ret = pm_runtime_get_sync(dev); |
| - if (ret < 0) |
| - pm_runtime_put_noidle(dev); |
| - |
| - return ret; |
| + return pm_runtime_resume_and_get(regmap_get_device(data->regmap)); |
| } |
| |
| static int fxas21002c_pm_put(struct fxas21002c_data *data) |
| @@ -1005,7 +998,6 @@ int fxas21002c_core_probe(struct device *dev, struct regmap *regmap, int irq, |
| pm_disable: |
| pm_runtime_disable(dev); |
| pm_runtime_set_suspended(dev); |
| - pm_runtime_put_noidle(dev); |
| |
| return ret; |
| } |
| @@ -1019,7 +1011,6 @@ void fxas21002c_core_remove(struct device *dev) |
| |
| pm_runtime_disable(dev); |
| pm_runtime_set_suspended(dev); |
| - pm_runtime_put_noidle(dev); |
| } |
| EXPORT_SYMBOL_GPL(fxas21002c_core_remove); |
| |
| -- |
| 2.30.2 |
| |