sashiko complained about early usage of the device while probe isn't
completed. This can be mitigated by delaying the pm_runtime_enable()
into the removal path instead doing it early. This ensures that in an
error case the device is removed (and imx_mu_shutdown()) before
pm_runtime_disable() so we don't have to do this manually.

For the order to work, lets move devm_mbox_controller_register() until
after the pm-runtime part. So the reverse order will be mbox-controller
removal followed by disabling pm runtime.

Use devm_pm_runtime_enable(), remove manual pm_runtime_disable()
invocations and move the pm_runtime handling in probe before
devm_mbox_controller_register().

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
---
 drivers/mailbox/imx-mailbox.c | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c
index 34edc2f31dcb5..24cf704b4f9bd 100644
--- a/drivers/mailbox/imx-mailbox.c
+++ b/drivers/mailbox/imx-mailbox.c
@@ -965,28 +965,28 @@ static int imx_mu_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, priv);
 
+       ret = devm_pm_runtime_enable(dev);
+       if (ret < 0)
+               goto disable_clk;
+
+       ret = pm_runtime_resume_and_get(dev);
+       if (ret < 0)
+               goto disable_clk;
+
+       ret = pm_runtime_put_sync(dev);
+       if (ret < 0)
+               goto disable_clk;
+
+       clk_disable_unprepare(priv->clk);
+
        ret = devm_mbox_controller_register(dev, &priv->mbox);
        if (ret)
                goto disable_clk;
 
        of_platform_populate(dev->of_node, NULL, NULL, dev);
 
-       pm_runtime_enable(dev);
-
-       ret = pm_runtime_resume_and_get(dev);
-       if (ret < 0)
-               goto disable_runtime_pm;
-
-       ret = pm_runtime_put_sync(dev);
-       if (ret < 0)
-               goto disable_runtime_pm;
-
-       clk_disable_unprepare(priv->clk);
-
        return 0;
 
-disable_runtime_pm:
-       pm_runtime_disable(dev);
 disable_clk:
        clk_disable_unprepare(priv->clk);
        return ret;
@@ -994,9 +994,6 @@ static int imx_mu_probe(struct platform_device *pdev)
 
 static void imx_mu_remove(struct platform_device *pdev)
 {
-       struct imx_mu_priv *priv = platform_get_drvdata(pdev);
-
-       pm_runtime_disable(priv->dev);
 }
 
 static const struct imx_mu_dcfg imx_mu_cfg_imx6sx = {

-- 
2.53.0


Reply via email to