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().

Reviewed-by: Peng Fan <[email protected]>
Reviewed-by: Mathieu Poirier <[email protected]>
Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
---
 drivers/mailbox/imx-mailbox.c | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c
index e261b382d5c90..516a05b64daa1 100644
--- a/drivers/mailbox/imx-mailbox.c
+++ b/drivers/mailbox/imx-mailbox.c
@@ -966,38 +966,36 @@ static int imx_mu_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, priv);
 
-       ret = devm_mbox_controller_register(dev, &priv->mbox);
-       if (ret)
+       ret = devm_pm_runtime_enable(dev);
+       if (ret < 0)
                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;
+               goto disable_clk;
 
        ret = pm_runtime_put_sync(dev);
        if (ret < 0)
-               goto disable_runtime_pm;
+               goto disable_clk;
 
        clk_disable_unprepare(priv->clk);
 
+       ret = devm_mbox_controller_register(dev, &priv->mbox);
+       if (ret)
+               goto err_out;
+
+       of_platform_populate(dev->of_node, NULL, NULL, dev);
+
        return 0;
 
-disable_runtime_pm:
-       pm_runtime_disable(dev);
 disable_clk:
        clk_disable_unprepare(priv->clk);
+err_out:
        return ret;
 }
 
 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