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>
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user