Lines Matching full:rng

59  * struct stm32_rng_config - RNG configuration data
61 * @cr: RNG configuration. 0 means default hardware RNG configuration
72 struct hwrng rng; member
83 * Extracts from the STM32 RNG specification when RNG supports CONDRST.
85 * When a noise source (or seed) error occurs, the RNG stops generating
91 * Indeed, when SEIS is set and SECS is cleared it means RNG performed
98 * cleared by RNG. The random number generation is now back to normal.
102 struct device *dev = (struct device *)priv->rng.priv; in stm32_rng_conceal_seed_error_cond_reset()
112 /* RNG auto-reset (step 2.) */ in stm32_rng_conceal_seed_error_cond_reset()
140 * Extracts from the STM32 RNG specification, when CONDRST is not supported
142 * When a noise source (or seed) error occurs, the RNG stops generating
147 * error after the RNG initialization:
170 static int stm32_rng_conceal_seed_error(struct hwrng *rng) in stm32_rng_conceal_seed_error() argument
172 struct stm32_rng_private *priv = container_of(rng, struct stm32_rng_private, rng); in stm32_rng_conceal_seed_error()
174 dev_dbg((struct device *)priv->rng.priv, "Concealing seed error\n"); in stm32_rng_conceal_seed_error()
183 static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) in stm32_rng_read() argument
185 struct stm32_rng_private *priv = container_of(rng, struct stm32_rng_private, rng); in stm32_rng_read()
190 pm_runtime_get_sync((struct device *) priv->rng.priv); in stm32_rng_read()
193 stm32_rng_conceal_seed_error(rng); in stm32_rng_read()
199 * care of initial delay time when enabling the RNG. in stm32_rng_read()
207 dev_err((struct device *)priv->rng.priv, in stm32_rng_read()
218 err = stm32_rng_conceal_seed_error(rng); in stm32_rng_read()
221 dev_err((struct device *)priv->rng.priv, in stm32_rng_read()
229 if (WARN_ONCE((sr & RNG_SR_CEIS), "RNG clock too slow - %x\n", sr)) in stm32_rng_read()
236 err = stm32_rng_conceal_seed_error(rng); in stm32_rng_read()
239 dev_err((struct device *)priv->rng.priv, in stm32_rng_read()
253 pm_runtime_mark_last_busy((struct device *) priv->rng.priv); in stm32_rng_read()
254 pm_runtime_put_sync_autosuspend((struct device *) priv->rng.priv); in stm32_rng_read()
259 static uint stm32_rng_clock_freq_restrain(struct hwrng *rng) in stm32_rng_clock_freq_restrain() argument
262 container_of(rng, struct stm32_rng_private, rng); in stm32_rng_clock_freq_restrain()
276 pr_debug("RNG clk rate : %lu\n", clk_get_rate(priv->clk) >> clock_div); in stm32_rng_clock_freq_restrain()
281 static int stm32_rng_init(struct hwrng *rng) in stm32_rng_init() argument
284 container_of(rng, struct stm32_rng_private, rng); in stm32_rng_init()
298 * Keep default RNG configuration if none was specified. in stm32_rng_init()
302 uint clock_div = stm32_rng_clock_freq_restrain(rng); in stm32_rng_init()
329 dev_err((struct device *)priv->rng.priv, in stm32_rng_init()
334 /* Handle all RNG versions by checking if conditional reset should be set */ in stm32_rng_init()
358 dev_err((struct device *)priv->rng.priv, in stm32_rng_init()
393 /* Do not save that RNG is enabled as it will be handled at resume */ in stm32_rng_suspend()
458 dev_err((struct device *)priv->rng.priv, in stm32_rng_resume()
493 .compatible = "st,stm32mp13-rng",
497 .compatible = "st,stm32-rng",
531 priv->lock_conf = of_property_read_bool(np, "st,rng-lock-conf"); in stm32_rng_probe()
539 priv->rng.name = dev_driver_string(dev); in stm32_rng_probe()
540 priv->rng.init = stm32_rng_init; in stm32_rng_probe()
541 priv->rng.read = stm32_rng_read; in stm32_rng_probe()
542 priv->rng.priv = (unsigned long) dev; in stm32_rng_probe()
543 priv->rng.quality = 900; in stm32_rng_probe()
549 return devm_hwrng_register(dev, &priv->rng); in stm32_rng_probe()
554 .name = "stm32-rng",
566 MODULE_DESCRIPTION("STMicroelectronics STM32 RNG device driver");