[PATCH 1/2] hwrng: stm32 - use pm_runtime_resume_and_get()

Gatien CHEVALLIER gatien.chevallier at foss.st.com
Thu May 16 01:12:55 PDT 2024


On 5/16/24 03:20, Marek Vasut wrote:
> 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.
> 
> Signed-off-by: Marek Vasut <marex at denx.de>
> ---
> Cc: "Uwe Kleine-König" <u.kleine-koenig at pengutronix.de>
> Cc: Alexandre Torgue <alexandre.torgue at foss.st.com>
> Cc: Gatien Chevallier <gatien.chevallier at foss.st.com>
> Cc: Herbert Xu <herbert at gondor.apana.org.au>
> Cc: Marek Vasut <marex at denx.de>
> Cc: Maxime Coquelin <mcoquelin.stm32 at gmail.com>
> Cc: Olivia Mackall <olivia at selenic.com>
> Cc: Rob Herring <robh at kernel.org>
> Cc: Yang Yingliang <yangyingliang at huawei.com>
> Cc: kernel at dh-electronics.com
> Cc: linux-arm-kernel at lists.infradead.org
> Cc: linux-crypto at vger.kernel.org
> Cc: linux-stm32 at st-md-mailman.stormreply.com
> ---
>   drivers/char/hw_random/stm32-rng.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c
> index 0e903d6e22e30..6dec4adc49853 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);

Hi Marek,

I'll check in other stm32 drivers as well.

Acked-by: Gatien Chevallier <gatien.chevallier at foss.st.com>

Thanks,
Gatien



More information about the linux-arm-kernel mailing list