summaryrefslogtreecommitdiff
path: root/drivers/char
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2024-05-31 11:53:22 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2024-06-07 14:46:39 +0300
commitf134d5dce9c1f70fb522712b306644deb1e6eccd (patch)
tree6ea25392c686ee879d1c5d6e68851d303fb93ab8 /drivers/char
parent3aeb1da092e875255c24c6a26be097448d70a756 (diff)
downloadlinux-f134d5dce9c1f70fb522712b306644deb1e6eccd.tar.xz
hwrng: stm32 - use pm_runtime_resume_and_get()
include/linux/pm_runtime.h pm_runtime_get_sync() description suggests to ... consider using pm_runtime_resume_and_get() instead of it, especially if its return value is checked by the caller, as this is likely to result in cleaner code. This is indeed better, switch to pm_runtime_resume_and_get() which correctly suspends the device again in case of failure. Also add error checking into the RNG driver in case pm_runtime_resume_and_get() does fail, which is currently not done, and it does detect sporadic -EACCES error return after resume, which would otherwise lead to a hang due to register access on un-resumed hardware. Now the read simply errors out and the system does not hang. Acked-by: Gatien Chevallier <gatien.chevallier@foss.st.com> Signed-off-by: Marek Vasut <marex@denx.de> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/hw_random/stm32-rng.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c
index 0e903d6e22e3..6dec4adc4985 100644
--- a/drivers/char/hw_random/stm32-rng.c
+++ b/drivers/char/hw_random/stm32-rng.c
@@ -187,7 +187,9 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
int retval = 0, err = 0;
u32 sr;
- pm_runtime_get_sync((struct device *) priv->rng.priv);
+ retval = pm_runtime_resume_and_get((struct device *)priv->rng.priv);
+ if (retval)
+ return retval;
if (readl_relaxed(priv->base + RNG_SR) & RNG_SR_SEIS)
stm32_rng_conceal_seed_error(rng);