Lines Matching +full:bcm +full:- +full:nsp +full:- +full:rng

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2010-2012 Broadcom. All rights reserved.
22 /* enable rng */
31 struct hwrng rng; member
37 static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng) in to_rng_priv() argument
39 return container_of(rng, struct bcm2835_rng_priv, rng); in to_rng_priv()
45 * peripheral registers for CPU-native byte order. in rng_readl()
48 return __raw_readl(priv->base + offset); in rng_readl()
50 return readl(priv->base + offset); in rng_readl()
57 __raw_writel(val, priv->base + offset); in rng_writel()
59 writel(val, priv->base + offset); in rng_writel()
62 static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max, in bcm2835_rng_read() argument
65 struct bcm2835_rng_priv *priv = to_rng_priv(rng); in bcm2835_rng_read()
85 static int bcm2835_rng_init(struct hwrng *rng) in bcm2835_rng_init() argument
87 struct bcm2835_rng_priv *priv = to_rng_priv(rng); in bcm2835_rng_init()
91 if (!IS_ERR(priv->clk)) { in bcm2835_rng_init()
92 ret = clk_prepare_enable(priv->clk); in bcm2835_rng_init()
97 if (priv->mask_interrupts) { in bcm2835_rng_init()
104 /* set warm-up count & enable */ in bcm2835_rng_init()
111 static void bcm2835_rng_cleanup(struct hwrng *rng) in bcm2835_rng_cleanup() argument
113 struct bcm2835_rng_priv *priv = to_rng_priv(rng); in bcm2835_rng_cleanup()
115 /* disable rng hardware */ in bcm2835_rng_cleanup()
118 if (!IS_ERR(priv->clk)) in bcm2835_rng_cleanup()
119 clk_disable_unprepare(priv->clk); in bcm2835_rng_cleanup()
131 { .compatible = "brcm,bcm2835-rng"},
132 { .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
133 { .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
134 { .compatible = "brcm,bcm6368-rng"},
141 struct device *dev = &pdev->dev; in bcm2835_rng_probe()
148 return -ENOMEM; in bcm2835_rng_probe()
153 priv->base = devm_platform_ioremap_resource(pdev, 0); in bcm2835_rng_probe()
154 if (IS_ERR(priv->base)) in bcm2835_rng_probe()
155 return PTR_ERR(priv->base); in bcm2835_rng_probe()
158 priv->clk = devm_clk_get(dev, NULL); in bcm2835_rng_probe()
159 if (PTR_ERR(priv->clk) == -EPROBE_DEFER) in bcm2835_rng_probe()
160 return -EPROBE_DEFER; in bcm2835_rng_probe()
162 priv->rng.name = pdev->name; in bcm2835_rng_probe()
163 priv->rng.init = bcm2835_rng_init; in bcm2835_rng_probe()
164 priv->rng.read = bcm2835_rng_read; in bcm2835_rng_probe()
165 priv->rng.cleanup = bcm2835_rng_cleanup; in bcm2835_rng_probe()
168 rng_id = of_match_node(bcm2835_rng_of_match, dev->of_node); in bcm2835_rng_probe()
170 return -EINVAL; in bcm2835_rng_probe()
172 /* Check for rng init function, execute it */ in bcm2835_rng_probe()
173 of_data = rng_id->data; in bcm2835_rng_probe()
175 priv->mask_interrupts = of_data->mask_interrupts; in bcm2835_rng_probe()
179 err = devm_hwrng_register(dev, &priv->rng); in bcm2835_rng_probe()
191 { .name = "bcm2835-rng" },
192 { .name = "bcm63xx-rng" },
199 .name = "bcm2835-rng",
208 MODULE_DESCRIPTION("BCM2835 Random Number Generator (RNG) driver");