OSDN Git Service

i2c: imx-lpi2c: avoid taking clk_prepare mutex in PM callbacks
authorAlexander Stein <alexander.stein@ew.tq-group.com>
Mon, 24 Apr 2023 08:06:27 +0000 (10:06 +0200)
committerWolfram Sang <wsa@kernel.org>
Wed, 3 May 2023 15:27:29 +0000 (17:27 +0200)
This is unsafe, as the runtime PM callbacks are called from the PM
workqueue, so this may deadlock when handling an i2c attached clock,
which may already hold the clk_prepare mutex from another context.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-imx-lpi2c.c

index a49b14d..1af0a63 100644 (file)
@@ -639,7 +639,7 @@ static int __maybe_unused lpi2c_runtime_suspend(struct device *dev)
 {
        struct lpi2c_imx_struct *lpi2c_imx = dev_get_drvdata(dev);
 
-       clk_bulk_disable_unprepare(lpi2c_imx->num_clks, lpi2c_imx->clks);
+       clk_bulk_disable(lpi2c_imx->num_clks, lpi2c_imx->clks);
        pinctrl_pm_select_sleep_state(dev);
 
        return 0;
@@ -651,7 +651,7 @@ static int __maybe_unused lpi2c_runtime_resume(struct device *dev)
        int ret;
 
        pinctrl_pm_select_default_state(dev);
-       ret = clk_bulk_prepare_enable(lpi2c_imx->num_clks, lpi2c_imx->clks);
+       ret = clk_bulk_enable(lpi2c_imx->num_clks, lpi2c_imx->clks);
        if (ret) {
                dev_err(dev, "failed to enable I2C clock, ret=%d\n", ret);
                return ret;