Re: [PATCH] crypto: amcc - check ppc4xx_trng_probe() return value

From: Rosen Penev

Date: Mon Jun 01 2026 - 22:08:08 EST


On Mon, Jun 1, 2026 at 6:46 PM Rosen Penev <rosenp@xxxxxxxxx> wrote:
>
> ppc4xx_trng_probe() can fail for several reasons (missing TRNG node,
> iomap failure, allocation failure, hwrng registration failure). Change
> its return type from void to int and propagate error codes back to the
> caller in crypto4xx_probe() so that probe failures are handled properly.
This was prematurely sent. Please ignore.
>
> Assisted-by: opencode:big-pickle
> Signed-off-by: Rosen Penev <rosenp@xxxxxxxxx>
> ---
> drivers/crypto/amcc/crypto4xx_core.c | 5 ++++-
> drivers/crypto/amcc/crypto4xx_trng.c | 12 ++++++------
> drivers/crypto/amcc/crypto4xx_trng.h | 6 +++---
> 3 files changed, 13 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/crypto/amcc/crypto4xx_core.c b/drivers/crypto/amcc/crypto4xx_core.c
> index 0f1b2653769c..596a90af2c90 100644
> --- a/drivers/crypto/amcc/crypto4xx_core.c
> +++ b/drivers/crypto/amcc/crypto4xx_core.c
> @@ -1346,7 +1346,10 @@ static int crypto4xx_probe(struct platform_device *ofdev)
> if (rc)
> goto err_tasklet;
>
> - ppc4xx_trng_probe(core_dev);
> + rc = ppc4xx_trng_probe(core_dev);
> + if (rc)
> + goto err_tasklet;
> +
> return 0;
>
> err_tasklet:
> diff --git a/drivers/crypto/amcc/crypto4xx_trng.c b/drivers/crypto/amcc/crypto4xx_trng.c
> index 031dd2bf8598..f762f92dd03e 100644
> --- a/drivers/crypto/amcc/crypto4xx_trng.c
> +++ b/drivers/crypto/amcc/crypto4xx_trng.c
> @@ -68,7 +68,7 @@ static const struct of_device_id ppc4xx_trng_match[] = {
> {},
> };
>
> -void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev)
> +int ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev)
> {
> struct crypto4xx_device *dev = core_dev->dev;
> struct device_node *trng = NULL;
> @@ -79,17 +79,17 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev)
> trng = of_find_matching_node(NULL, ppc4xx_trng_match);
> if (!trng || !of_device_is_available(trng)) {
> of_node_put(trng);
> - return;
> + return -ENODEV;
> }
>
> dev->trng_base = devm_of_iomap(core_dev->device, trng, 0, NULL);
> of_node_put(trng);
> if (IS_ERR(dev->trng_base))
> - return;
> + return PTR_ERR(dev->trng_base);
>
> rng = devm_kzalloc(core_dev->device, sizeof(*rng), GFP_KERNEL);
> if (!rng)
> - return;
> + return -ENOMEM;
>
> rng->name = KBUILD_MODNAME;
> rng->data_present = ppc4xx_trng_data_present;
> @@ -103,9 +103,9 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev)
> ppc4xx_trng_enable(dev, false);
> dev_err(core_dev->device, "failed to register hwrng (%d).\n",
> err);
> - return;
> + return err;
> }
> - return;
> + return 0;
> }
>
> void ppc4xx_trng_remove(struct crypto4xx_core_device *core_dev)
> diff --git a/drivers/crypto/amcc/crypto4xx_trng.h b/drivers/crypto/amcc/crypto4xx_trng.h
> index 7356716274cb..7c6f426ab275 100644
> --- a/drivers/crypto/amcc/crypto4xx_trng.h
> +++ b/drivers/crypto/amcc/crypto4xx_trng.h
> @@ -13,11 +13,11 @@
> #define __CRYPTO4XX_TRNG_H__
>
> #ifdef CONFIG_HW_RANDOM_PPC4XX
> -void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev);
> +int ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev);
> void ppc4xx_trng_remove(struct crypto4xx_core_device *core_dev);
> #else
> -static inline void ppc4xx_trng_probe(
> - struct crypto4xx_core_device *dev __maybe_unused) { }
> +static inline int ppc4xx_trng_probe(
> + struct crypto4xx_core_device *dev __maybe_unused) { return -ENODEV; }
> static inline void ppc4xx_trng_remove(
> struct crypto4xx_core_device *dev __maybe_unused) { }
> #endif
> --
> 2.54.0
>