Lines Matching +full:rng +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Generic PowerPC 44x RNG driver
28 static int ppc4xx_trng_data_present(struct hwrng *rng, int wait) in ppc4xx_trng_data_present() argument
30 struct crypto4xx_device *dev = (void *)rng->priv; in ppc4xx_trng_data_present()
34 busy = (in_le32(dev->trng_base + PPC4XX_TRNG_STAT) & in ppc4xx_trng_data_present()
45 static int ppc4xx_trng_data_read(struct hwrng *rng, u32 *data) in ppc4xx_trng_data_read() argument
47 struct crypto4xx_device *dev = (void *)rng->priv; in ppc4xx_trng_data_read()
48 *data = in_le32(dev->trng_base + PPC4XX_TRNG_DATA); in ppc4xx_trng_data_read()
56 device_ctrl = readl(dev->ce_base + CRYPTO4XX_DEVICE_CTRL); in ppc4xx_trng_enable()
61 writel(device_ctrl, dev->ce_base + CRYPTO4XX_DEVICE_CTRL); in ppc4xx_trng_enable()
65 { .compatible = "ppc4xx-rng", },
66 { .compatible = "amcc,ppc460ex-rng", },
67 { .compatible = "amcc,ppc440epx-rng", },
73 struct crypto4xx_device *dev = core_dev->dev; in ppc4xx_trng_probe()
75 struct hwrng *rng = NULL; in ppc4xx_trng_probe() local
85 dev->trng_base = of_iomap(trng, 0); in ppc4xx_trng_probe()
87 if (!dev->trng_base) in ppc4xx_trng_probe()
90 rng = kzalloc(sizeof(*rng), GFP_KERNEL); in ppc4xx_trng_probe()
91 if (!rng) in ppc4xx_trng_probe()
94 rng->name = KBUILD_MODNAME; in ppc4xx_trng_probe()
95 rng->data_present = ppc4xx_trng_data_present; in ppc4xx_trng_probe()
96 rng->data_read = ppc4xx_trng_data_read; in ppc4xx_trng_probe()
97 rng->priv = (unsigned long) dev; in ppc4xx_trng_probe()
98 core_dev->trng = rng; in ppc4xx_trng_probe()
100 out_le32(dev->trng_base + PPC4XX_TRNG_CTRL, PPC4XX_TRNG_CTRL_DALM); in ppc4xx_trng_probe()
101 err = devm_hwrng_register(core_dev->device, core_dev->trng); in ppc4xx_trng_probe()
104 dev_err(core_dev->device, "failed to register hwrng (%d).\n", in ppc4xx_trng_probe()
111 iounmap(dev->trng_base); in ppc4xx_trng_probe()
112 kfree(rng); in ppc4xx_trng_probe()
113 dev->trng_base = NULL; in ppc4xx_trng_probe()
114 core_dev->trng = NULL; in ppc4xx_trng_probe()
119 if (core_dev && core_dev->trng) { in ppc4xx_trng_remove()
120 struct crypto4xx_device *dev = core_dev->dev; in ppc4xx_trng_remove()
122 devm_hwrng_unregister(core_dev->device, core_dev->trng); in ppc4xx_trng_remove()
124 iounmap(dev->trng_base); in ppc4xx_trng_remove()
125 kfree(core_dev->trng); in ppc4xx_trng_remove()