Lines Matching +full:jz4780 +full:- +full:rng

1 // SPDX-License-Identifier: GPL-2.0
18 /* RNG register offsets */
36 struct hwrng rng; member
39 static int ingenic_rng_init(struct hwrng *rng) in ingenic_rng_init() argument
41 struct ingenic_rng *priv = container_of(rng, struct ingenic_rng, rng); in ingenic_rng_init()
43 writel(ERNG_ENABLE, priv->base + RNG_REG_ERNG_OFFSET); in ingenic_rng_init()
48 static void ingenic_rng_cleanup(struct hwrng *rng) in ingenic_rng_cleanup() argument
50 struct ingenic_rng *priv = container_of(rng, struct ingenic_rng, rng); in ingenic_rng_cleanup()
52 writel(0, priv->base + RNG_REG_ERNG_OFFSET); in ingenic_rng_cleanup()
55 static int ingenic_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) in ingenic_rng_read() argument
57 struct ingenic_rng *priv = container_of(rng, struct ingenic_rng, rng); in ingenic_rng_read()
62 if (priv->version >= ID_X1000) { in ingenic_rng_read()
63 ret = readl_poll_timeout(priv->base + RNG_REG_ERNG_OFFSET, status, in ingenic_rng_read()
65 if (ret == -ETIMEDOUT) { in ingenic_rng_read()
66 pr_err("%s: Wait for RNG data ready timeout\n", __func__); in ingenic_rng_read()
71 * A delay is required so that the current RNG data is not bit shifted in ingenic_rng_read()
72 * version of previous RNG data which could happen if random data is in ingenic_rng_read()
78 *data = readl(priv->base + RNG_REG_RNG_OFFSET); in ingenic_rng_read()
88 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in ingenic_rng_probe()
90 return -ENOMEM; in ingenic_rng_probe()
92 priv->base = devm_platform_ioremap_resource(pdev, 0); in ingenic_rng_probe()
93 if (IS_ERR(priv->base)) { in ingenic_rng_probe()
94 pr_err("%s: Failed to map RNG registers\n", __func__); in ingenic_rng_probe()
95 return PTR_ERR(priv->base); in ingenic_rng_probe()
98 priv->version = (enum ingenic_rng_version)of_device_get_match_data(&pdev->dev); in ingenic_rng_probe()
100 priv->rng.name = pdev->name; in ingenic_rng_probe()
101 priv->rng.init = ingenic_rng_init; in ingenic_rng_probe()
102 priv->rng.cleanup = ingenic_rng_cleanup; in ingenic_rng_probe()
103 priv->rng.read = ingenic_rng_read; in ingenic_rng_probe()
105 ret = hwrng_register(&priv->rng); in ingenic_rng_probe()
107 dev_err(&pdev->dev, "Failed to register hwrng\n"); in ingenic_rng_probe()
113 dev_info(&pdev->dev, "Ingenic RNG driver registered\n"); in ingenic_rng_probe()
121 hwrng_unregister(&priv->rng); in ingenic_rng_remove()
123 writel(0, priv->base + RNG_REG_ERNG_OFFSET); in ingenic_rng_remove()
129 { .compatible = "ingenic,jz4780-rng", .data = (void *) ID_JZ4780 },
130 { .compatible = "ingenic,x1000-rng", .data = (void *) ID_X1000 },
139 .name = "ingenic-rng",