2021-10-19 23:32:26

by Dmitry Osipenko

[permalink] [raw]
Subject: [PATCH v1] i2c: tegra: Ensure that device is suspended before driver is removed

Tegra I2C device isn't guaranteed to be suspended after removal of
the driver since driver uses pm_runtime_put() that is asynchronous and
pm_runtime_disable() cancels pending power-change requests. This means
that potentially refcount of the clocks may become unbalanced after
removal of the driver. This a very minor problem which unlikely to
happen in practice and won't cause any visible problems, nevertheless
let's replace pm_runtime_disable() with pm_runtime_force_suspend() and
use pm_runtime_put_sync() which disables RPM of the device and puts it
into suspend before driver is removed.

Signed-off-by: Dmitry Osipenko <[email protected]>
---
drivers/i2c/busses/i2c-tegra.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index c883044715f3..b3184c422826 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -1700,7 +1700,7 @@ static int tegra_i2c_init_hardware(struct tegra_i2c_dev *i2c_dev)
else
ret = tegra_i2c_init(i2c_dev);

- pm_runtime_put(i2c_dev->dev);
+ pm_runtime_put_sync(i2c_dev->dev);

return ret;
}
@@ -1819,7 +1819,7 @@ static int tegra_i2c_remove(struct platform_device *pdev)
struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev);

i2c_del_adapter(&i2c_dev->adapter);
- pm_runtime_disable(i2c_dev->dev);
+ pm_runtime_force_suspend(i2c_dev->dev);

tegra_i2c_release_dma(i2c_dev);
tegra_i2c_release_clocks(i2c_dev);
--
2.32.0


2021-10-29 19:53:18

by Wolfram Sang

[permalink] [raw]
Subject: Re: [PATCH v1] i2c: tegra: Ensure that device is suspended before driver is removed

On Wed, Oct 20, 2021 at 02:29:19AM +0300, Dmitry Osipenko wrote:
> Tegra I2C device isn't guaranteed to be suspended after removal of
> the driver since driver uses pm_runtime_put() that is asynchronous and
> pm_runtime_disable() cancels pending power-change requests. This means
> that potentially refcount of the clocks may become unbalanced after
> removal of the driver. This a very minor problem which unlikely to
> happen in practice and won't cause any visible problems, nevertheless
> let's replace pm_runtime_disable() with pm_runtime_force_suspend() and
> use pm_runtime_put_sync() which disables RPM of the device and puts it
> into suspend before driver is removed.
>
> Signed-off-by: Dmitry Osipenko <[email protected]>

Applied to for-next, thanks!


Attachments:
(No filename) (779.00 B)
signature.asc (849.00 B)
Download all attachments