hwrng: stm32 - put IP into RPM suspend on failure
authorMarek Vasut <marex@denx.de>
Fri, 19 Apr 2024 05:01:13 +0000 (07:01 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 26 Apr 2024 09:26:09 +0000 (17:26 +0800)
In case of an irrecoverable failure, put the IP into RPM suspend
to avoid RPM imbalance. I did not trigger this case, but it seems
it should be done based on reading the code.

Fixes: b17bc6eb7c2b ("hwrng: stm32 - rework error handling in stm32_rng_read()")
Signed-off-by: Marek Vasut <marex@denx.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/char/hw_random/stm32-rng.c

index 1cc61ef8ee54c92449bcf43a793bb5cd15a5b98d..b6182f86d8a4b3052443e6f588ae996e014eb994 100644 (file)
@@ -220,7 +220,8 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
                                if (err && i > RNG_NB_RECOVER_TRIES) {
                                        dev_err((struct device *)priv->rng.priv,
                                                "Couldn't recover from seed error\n");
-                                       return -ENOTRECOVERABLE;
+                                       retval = -ENOTRECOVERABLE;
+                                       goto exit_rpm;
                                }
 
                                continue;
@@ -238,7 +239,8 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
                        if (err && i > RNG_NB_RECOVER_TRIES) {
                                dev_err((struct device *)priv->rng.priv,
                                        "Couldn't recover from seed error");
-                               return -ENOTRECOVERABLE;
+                               retval = -ENOTRECOVERABLE;
+                               goto exit_rpm;
                        }
 
                        continue;
@@ -250,6 +252,7 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
                max -= sizeof(u32);
        }
 
+exit_rpm:
        pm_runtime_mark_last_busy((struct device *) priv->rng.priv);
        pm_runtime_put_sync_autosuspend((struct device *) priv->rng.priv);