1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright 2009 Alessandro Rubini
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/device.h>
10 #include <linux/amba/bus.h>
11 #include <linux/hw_random.h>
13 #include <linux/clk.h>
14 #include <linux/err.h>
16 static struct clk
*rng_clk
;
18 static int nmk_rng_read(struct hwrng
*rng
, void *data
, size_t max
, bool wait
)
20 void __iomem
*base
= (void __iomem
*)rng
->priv
;
23 * The register is 32 bits and gives 16 random bits (low half).
24 * A subsequent read will delay the core for 400ns, so we just read
25 * once and accept the very unlikely very small delay, even if wait==0.
27 *(u16
*)data
= __raw_readl(base
+ 8) & 0xffff;
31 /* we have at most one RNG per machine, granted */
32 static struct hwrng nmk_rng
= {
37 static int nmk_rng_probe(struct amba_device
*dev
, const struct amba_id
*id
)
42 rng_clk
= devm_clk_get(&dev
->dev
, NULL
);
43 if (IS_ERR(rng_clk
)) {
44 dev_err(&dev
->dev
, "could not get rng clock\n");
45 ret
= PTR_ERR(rng_clk
);
49 clk_prepare_enable(rng_clk
);
51 ret
= amba_request_regions(dev
, dev
->dev
.init_name
);
55 base
= devm_ioremap(&dev
->dev
, dev
->res
.start
,
56 resource_size(&dev
->res
));
59 nmk_rng
.priv
= (unsigned long)base
;
60 ret
= devm_hwrng_register(&dev
->dev
, &nmk_rng
);
66 amba_release_regions(dev
);
72 static int nmk_rng_remove(struct amba_device
*dev
)
74 amba_release_regions(dev
);
79 static struct amba_id nmk_rng_ids
[] = {
82 .mask
= 0x000fffff, /* top bits are rev and cfg: accept all */
87 MODULE_DEVICE_TABLE(amba
, nmk_rng_ids
);
89 static struct amba_driver nmk_rng_driver
= {
94 .probe
= nmk_rng_probe
,
95 .remove
= nmk_rng_remove
,
96 .id_table
= nmk_rng_ids
,
99 module_amba_driver(nmk_rng_driver
);
101 MODULE_LICENSE("GPL");