Lines Matching +full:safexcel +full:- +full:eip76
2 * omap-rng.c - RNG driver for TI OMAP CPU family
71 * EIP76 RNG takes approx. 700us to produce 16 bytes of output data
140 * struct omap_rng_pdata - RNG IP block-specific data
166 return __raw_readl(priv->base + priv->pdata->regs[reg]); in omap_rng_read()
172 __raw_writel(val, priv->base + priv->pdata->regs[reg]); in omap_rng_write()
182 priv = (struct omap_rng_dev *)rng->priv; in omap_rng_do_read()
184 if (max < priv->pdata->data_size) in omap_rng_do_read()
188 present = priv->pdata->data_present(priv); in omap_rng_do_read()
197 memcpy_fromio(data, priv->base + priv->pdata->regs[RNG_OUTPUT_0_REG], in omap_rng_do_read()
198 priv->pdata->data_size); in omap_rng_do_read()
200 if (priv->pdata->regs[RNG_INTACK_REG]) in omap_rng_do_read()
203 return priv->pdata->data_size; in omap_rng_do_read()
210 priv = (struct omap_rng_dev *)rng->priv; in omap_rng_init()
211 return priv->pdata->init(priv); in omap_rng_init()
218 priv = (struct omap_rng_dev *)rng->priv; in omap_rng_cleanup()
219 priv->pdata->cleanup(priv); in omap_rng_cleanup()
262 * SP 800-90 DRBG ‘BC_DF’ functionality to yield a ‘full entropy’ in eip76_rng_init()
267 /* Number of FRO samples that are XOR-ed together into one bit to be in eip76_rng_init()
363 .compatible = "ti,omap2-rng",
367 .compatible = "ti,omap4-rng",
371 .compatible = "inside-secure,safexcel-eip76",
382 struct device *dev = &pdev->dev; in of_get_omap_rng_device_details()
388 return -EINVAL; in of_get_omap_rng_device_details()
390 priv->pdata = match->data; in of_get_omap_rng_device_details()
392 if (of_device_is_compatible(dev->of_node, "ti,omap4-rng") || in of_get_omap_rng_device_details()
393 of_device_is_compatible(dev->of_node, "inside-secure,safexcel-eip76")) { in of_get_omap_rng_device_details()
409 * such register on EIP76, and it's enabled by the in of_get_omap_rng_device_details()
412 if (priv->pdata->regs[RNG_INTMASK_REG]) in of_get_omap_rng_device_details()
424 /* Only OMAP2/3 can be non-DT */ in get_omap_rng_device_details()
425 omap_rng->pdata = &omap2_rng_pdata; in get_omap_rng_device_details()
432 struct device *dev = &pdev->dev; in omap_rng_probe()
437 return -ENOMEM; in omap_rng_probe()
439 priv->rng.read = omap_rng_do_read; in omap_rng_probe()
440 priv->rng.init = omap_rng_init; in omap_rng_probe()
441 priv->rng.cleanup = omap_rng_cleanup; in omap_rng_probe()
442 priv->rng.quality = 900; in omap_rng_probe()
444 priv->rng.priv = (unsigned long)priv; in omap_rng_probe()
446 priv->dev = dev; in omap_rng_probe()
448 priv->base = devm_platform_ioremap_resource(pdev, 0); in omap_rng_probe()
449 if (IS_ERR(priv->base)) { in omap_rng_probe()
450 ret = PTR_ERR(priv->base); in omap_rng_probe()
454 priv->rng.name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL); in omap_rng_probe()
455 if (!priv->rng.name) { in omap_rng_probe()
456 ret = -ENOMEM; in omap_rng_probe()
460 pm_runtime_enable(&pdev->dev); in omap_rng_probe()
461 ret = pm_runtime_get_sync(&pdev->dev); in omap_rng_probe()
463 dev_err(&pdev->dev, "Failed to runtime_get device: %d\n", ret); in omap_rng_probe()
464 pm_runtime_put_noidle(&pdev->dev); in omap_rng_probe()
468 priv->clk = devm_clk_get(&pdev->dev, NULL); in omap_rng_probe()
469 if (PTR_ERR(priv->clk) == -EPROBE_DEFER) in omap_rng_probe()
470 return -EPROBE_DEFER; in omap_rng_probe()
471 if (!IS_ERR(priv->clk)) { in omap_rng_probe()
472 ret = clk_prepare_enable(priv->clk); in omap_rng_probe()
474 dev_err(&pdev->dev, in omap_rng_probe()
480 priv->clk_reg = devm_clk_get(&pdev->dev, "reg"); in omap_rng_probe()
481 if (PTR_ERR(priv->clk_reg) == -EPROBE_DEFER) in omap_rng_probe()
482 return -EPROBE_DEFER; in omap_rng_probe()
483 if (!IS_ERR(priv->clk_reg)) { in omap_rng_probe()
484 ret = clk_prepare_enable(priv->clk_reg); in omap_rng_probe()
486 dev_err(&pdev->dev, in omap_rng_probe()
493 ret = (dev->of_node) ? of_get_omap_rng_device_details(priv, pdev) : in omap_rng_probe()
498 ret = devm_hwrng_register(&pdev->dev, &priv->rng); in omap_rng_probe()
502 dev_info(&pdev->dev, "Random Number Generator ver. %02x\n", in omap_rng_probe()
508 priv->base = NULL; in omap_rng_probe()
509 pm_runtime_put_sync(&pdev->dev); in omap_rng_probe()
510 pm_runtime_disable(&pdev->dev); in omap_rng_probe()
512 clk_disable_unprepare(priv->clk_reg); in omap_rng_probe()
513 clk_disable_unprepare(priv->clk); in omap_rng_probe()
524 priv->pdata->cleanup(priv); in omap_rng_remove()
526 pm_runtime_put_sync(&pdev->dev); in omap_rng_remove()
527 pm_runtime_disable(&pdev->dev); in omap_rng_remove()
529 clk_disable_unprepare(priv->clk); in omap_rng_remove()
530 clk_disable_unprepare(priv->clk_reg); in omap_rng_remove()
539 priv->pdata->cleanup(priv); in omap_rng_suspend()
557 priv->pdata->init(priv); in omap_rng_resume()