Lines Matching +full:safexcel +full:- +full:eip76

2  * omap-rng.c - RNG driver for TI OMAP CPU family
68 * EIP76 RNG takes approx. 700us to produce 16 bytes of output data
137 * struct omap_rng_pdata - RNG IP block-specific data
163 return __raw_readl(priv->base + priv->pdata->regs[reg]); in omap_rng_read()
169 __raw_writel(val, priv->base + priv->pdata->regs[reg]); in omap_rng_write()
179 priv = (struct omap_rng_dev *)rng->priv; in omap_rng_do_read()
181 if (max < priv->pdata->data_size) in omap_rng_do_read()
185 present = priv->pdata->data_present(priv); in omap_rng_do_read()
194 memcpy_fromio(data, priv->base + priv->pdata->regs[RNG_OUTPUT_0_REG], in omap_rng_do_read()
195 priv->pdata->data_size); in omap_rng_do_read()
197 if (priv->pdata->regs[RNG_INTACK_REG]) in omap_rng_do_read()
200 return priv->pdata->data_size; in omap_rng_do_read()
207 priv = (struct omap_rng_dev *)rng->priv; in omap_rng_init()
208 return priv->pdata->init(priv); in omap_rng_init()
215 priv = (struct omap_rng_dev *)rng->priv; in omap_rng_cleanup()
216 priv->pdata->cleanup(priv); in omap_rng_cleanup()
259 * SP 800-90 DRBG ‘BC_DF’ functionality to yield a ‘full entropy’ in eip76_rng_init()
264 /* Number of FRO samples that are XOR-ed together into one bit to be in eip76_rng_init()
360 .compatible = "ti,omap2-rng",
364 .compatible = "ti,omap4-rng",
368 .compatible = "inside-secure,safexcel-eip76",
378 struct device *dev = &pdev->dev; in of_get_omap_rng_device_details()
381 priv->pdata = of_device_get_match_data(dev); in of_get_omap_rng_device_details()
382 if (!priv->pdata) in of_get_omap_rng_device_details()
383 return -ENODEV; in of_get_omap_rng_device_details()
386 if (of_device_is_compatible(dev->of_node, "ti,omap4-rng") || in of_get_omap_rng_device_details()
387 of_device_is_compatible(dev->of_node, "inside-secure,safexcel-eip76")) { in of_get_omap_rng_device_details()
403 * such register on EIP76, and it's enabled by the in of_get_omap_rng_device_details()
406 if (priv->pdata->regs[RNG_INTMASK_REG]) in of_get_omap_rng_device_details()
418 /* Only OMAP2/3 can be non-DT */ in get_omap_rng_device_details()
419 omap_rng->pdata = &omap2_rng_pdata; in get_omap_rng_device_details()
426 struct device *dev = &pdev->dev; in omap_rng_probe()
431 return -ENOMEM; in omap_rng_probe()
433 priv->rng.read = omap_rng_do_read; in omap_rng_probe()
434 priv->rng.init = omap_rng_init; in omap_rng_probe()
435 priv->rng.cleanup = omap_rng_cleanup; in omap_rng_probe()
436 priv->rng.quality = 900; in omap_rng_probe()
438 priv->rng.priv = (unsigned long)priv; in omap_rng_probe()
440 priv->dev = dev; in omap_rng_probe()
442 priv->base = devm_platform_ioremap_resource(pdev, 0); in omap_rng_probe()
443 if (IS_ERR(priv->base)) { in omap_rng_probe()
444 ret = PTR_ERR(priv->base); in omap_rng_probe()
448 priv->rng.name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL); in omap_rng_probe()
449 if (!priv->rng.name) { in omap_rng_probe()
450 ret = -ENOMEM; in omap_rng_probe()
454 pm_runtime_enable(&pdev->dev); in omap_rng_probe()
455 ret = pm_runtime_resume_and_get(&pdev->dev); in omap_rng_probe()
457 dev_err(&pdev->dev, "Failed to runtime_get device: %d\n", ret); in omap_rng_probe()
461 priv->clk = devm_clk_get(&pdev->dev, NULL); in omap_rng_probe()
462 if (PTR_ERR(priv->clk) == -EPROBE_DEFER) in omap_rng_probe()
463 return -EPROBE_DEFER; in omap_rng_probe()
464 if (!IS_ERR(priv->clk)) { in omap_rng_probe()
465 ret = clk_prepare_enable(priv->clk); in omap_rng_probe()
467 dev_err(&pdev->dev, in omap_rng_probe()
473 priv->clk_reg = devm_clk_get(&pdev->dev, "reg"); in omap_rng_probe()
474 if (PTR_ERR(priv->clk_reg) == -EPROBE_DEFER) in omap_rng_probe()
475 return -EPROBE_DEFER; in omap_rng_probe()
476 if (!IS_ERR(priv->clk_reg)) { in omap_rng_probe()
477 ret = clk_prepare_enable(priv->clk_reg); in omap_rng_probe()
479 dev_err(&pdev->dev, in omap_rng_probe()
486 ret = (dev->of_node) ? of_get_omap_rng_device_details(priv, pdev) : in omap_rng_probe()
491 ret = devm_hwrng_register(&pdev->dev, &priv->rng); in omap_rng_probe()
495 dev_info(&pdev->dev, "Random Number Generator ver. %02x\n", in omap_rng_probe()
501 priv->base = NULL; in omap_rng_probe()
502 pm_runtime_put_sync(&pdev->dev); in omap_rng_probe()
503 pm_runtime_disable(&pdev->dev); in omap_rng_probe()
505 clk_disable_unprepare(priv->clk_reg); in omap_rng_probe()
506 clk_disable_unprepare(priv->clk); in omap_rng_probe()
517 priv->pdata->cleanup(priv); in omap_rng_remove()
519 pm_runtime_put_sync(&pdev->dev); in omap_rng_remove()
520 pm_runtime_disable(&pdev->dev); in omap_rng_remove()
522 clk_disable_unprepare(priv->clk); in omap_rng_remove()
523 clk_disable_unprepare(priv->clk_reg); in omap_rng_remove()
530 priv->pdata->cleanup(priv); in omap_rng_suspend()
547 priv->pdata->init(priv); in omap_rng_resume()