]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: sun8i-ce - undo runtime PM changes during driver removal
authorOvidiu Panait <ovidiu.panait.oss@gmail.com>
Thu, 1 May 2025 19:06:50 +0000 (22:06 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 5 May 2025 10:20:45 +0000 (18:20 +0800)
The pm_runtime_use_autosuspend() call must be undone with
pm_runtime_dont_use_autosuspend() at driver exit, but this is not
currently handled in the driver.

To fix this issue and at the same time simplify error handling, switch
to devm_pm_runtime_enable(). It will call both pm_runtime_disable() and
pm_runtime_dont_use_autosuspend() during driver removal.

Fixes: 06f751b61329 ("crypto: allwinner - Add sun8i-ce Crypto Engine")
Signed-off-by: Ovidiu Panait <ovidiu.panait.oss@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c

index ec1ffda9ea32e0ea662850dd345b760938c065e7..658f520cee0caaac77359196616eec5e6daa5ec0 100644 (file)
@@ -832,13 +832,12 @@ static int sun8i_ce_pm_init(struct sun8i_ce_dev *ce)
        err = pm_runtime_set_suspended(ce->dev);
        if (err)
                return err;
-       pm_runtime_enable(ce->dev);
-       return err;
-}
 
-static void sun8i_ce_pm_exit(struct sun8i_ce_dev *ce)
-{
-       pm_runtime_disable(ce->dev);
+       err = devm_pm_runtime_enable(ce->dev);
+       if (err)
+               return err;
+
+       return 0;
 }
 
 static int sun8i_ce_get_clks(struct sun8i_ce_dev *ce)
@@ -1041,7 +1040,7 @@ static int sun8i_ce_probe(struct platform_device *pdev)
                               "sun8i-ce-ns", ce);
        if (err) {
                dev_err(ce->dev, "Cannot request CryptoEngine Non-secure IRQ (err=%d)\n", err);
-               goto error_irq;
+               goto error_pm;
        }
 
        err = sun8i_ce_register_algs(ce);
@@ -1082,8 +1081,6 @@ static int sun8i_ce_probe(struct platform_device *pdev)
        return 0;
 error_alg:
        sun8i_ce_unregister_algs(ce);
-error_irq:
-       sun8i_ce_pm_exit(ce);
 error_pm:
        sun8i_ce_free_chanlist(ce, MAXFLOW - 1);
        return err;
@@ -1104,8 +1101,6 @@ static void sun8i_ce_remove(struct platform_device *pdev)
 #endif
 
        sun8i_ce_free_chanlist(ce, MAXFLOW - 1);
-
-       sun8i_ce_pm_exit(ce);
 }
 
 static const struct of_device_id sun8i_ce_crypto_of_match_table[] = {