On Wed, Apr 24, 2024 at 07:38:05PM +0200, Marek Behún wrote: > Add support for true random number generator provided by the MCU. > New Omnia boards come without the Atmel SHA204-A chip. Instead the > crypto functionality is provided by new microcontroller, which has > a TRNG peripheral. ... > +static void omnia_irq_mapping_drop(void *res) > +{ > + irq_dispose_mapping((unsigned int)(unsigned long)res); > +} Leftover? > +int omnia_mcu_register_trng(struct omnia_mcu *mcu) > +{ > + struct device *dev = &mcu->client->dev; > + u8 irq_idx, dummy; > + int irq, err; > + > + if (!(mcu->features & FEAT_TRNG)) > + return 0; > + > + irq_idx = omnia_int_to_gpio_idx[__bf_shf(INT_TRNG)]; > + irq = gpiod_to_irq(gpiochip_get_desc(&mcu->gc, irq_idx)); > + if (irq < 0) > + return dev_err_probe(dev, irq, "Cannot get TRNG IRQ\n"); > + err = devm_add_action_or_reset(dev, omnia_irq_mapping_drop, > + (void *)(unsigned long)irq); > + if (err) > + return err; Are you sure it's correct now? > + /* If someone else cleared the TRNG interrupt but did not read the > + * entropy, a new interrupt won't be generated, and entropy collection > + * will be stuck. Ensure an interrupt will be generated by executing > + * the collect entropy command (and discarding the result). > + */ > + err = omnia_cmd_read(mcu->client, CMD_TRNG_COLLECT_ENTROPY, &dummy, 1); > + if (err) > + return err; > + > + init_completion(&mcu->trng_completion); > + > + err = devm_request_threaded_irq(dev, irq, NULL, omnia_trng_irq_handler, > + IRQF_ONESHOT, "turris-omnia-mcu-trng", > + mcu); > + if (err) > + return dev_err_probe(dev, err, "Cannot request TRNG IRQ\n"); > + > + mcu->trng.name = "turris-omnia-mcu-trng"; > + mcu->trng.read = omnia_trng_read; > + mcu->trng.priv = (unsigned long)mcu; > + > + err = devm_hwrng_register(dev, &mcu->trng); > + if (err) > + return dev_err_probe(dev, err, "Cannot register TRNG\n"); > + > + return 0; > +} -- With Best Regards, Andy Shevchenko