summaryrefslogtreecommitdiffstats
path: root/drivers/char/hw_random/stm32-rng.c
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2024-04-19 07:01:13 +0200
committerHerbert Xu <herbert@gondor.apana.org.au>2024-04-26 11:26:09 +0200
commitda62ed5c019cc48648f37c7a07e6a56cf637a795 (patch)
treedebefe87d1e9ee8c086b6823e9998deca96692a2 /drivers/char/hw_random/stm32-rng.c
parenthwrng: stm32 - use logical OR in conditional (diff)
downloadlinux-da62ed5c019cc48648f37c7a07e6a56cf637a795.tar.xz
linux-da62ed5c019cc48648f37c7a07e6a56cf637a795.zip
hwrng: stm32 - put IP into RPM suspend on failure
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>
Diffstat (limited to 'drivers/char/hw_random/stm32-rng.c')
-rw-r--r--drivers/char/hw_random/stm32-rng.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c
index 1cc61ef8ee54..b6182f86d8a4 100644
--- a/drivers/char/hw_random/stm32-rng.c
+++ b/drivers/char/hw_random/stm32-rng.c
@@ -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);