diff mbox series

[v1] i2c: tegra: Ensure that device is suspended before driver is removed

Message ID 20211019232919.21916-1-digetx@gmail.com
State Handled Elsewhere
Headers show
Series [v1] i2c: tegra: Ensure that device is suspended before driver is removed | expand

Commit Message

Dmitry Osipenko Oct. 19, 2021, 11:29 p.m. UTC
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 <digetx@gmail.com>
---
 drivers/i2c/busses/i2c-tegra.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Wolfram Sang Oct. 29, 2021, 7:52 p.m. UTC | #1
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 <digetx@gmail.com>

Applied to for-next, thanks!
diff mbox series

Patch

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);