summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2013-09-05 09:29:18 +0200
committerTony Lindgren <tony@atomide.com>2013-10-03 20:08:56 +0200
commitde26804b60d460a5ad13400d86c367ed16c6393d (patch)
tree0a832fd2a7e6b0df0eded4e7a65be7bd358f8203 /arch
parentLinux 3.12-rc3 (diff)
downloadlinux-de26804b60d460a5ad13400d86c367ed16c6393d.tar.xz
linux-de26804b60d460a5ad13400d86c367ed16c6393d.zip
ARM: OMAP2+: throw the die id into the entropy pool
At least eight bytes of this number are totally unique for the device it seems, so this is a perfect candidate for feeding the entropy pool. One byte more or less of constants does not matter so feed in the entire OID struct. This fixes the issue of similar devices initializing to the same state initially. Further registers could be added too, such as OMAP4 CONTROL_STD_FUSE_OPP* and CONTROL_DPLL_NWELL_TRIM* registers, but those vary based on the SoC generation. Cc: Theodore Ts'o <tytso@mit.edu> Cc: Paul Walmsley <paul@pwsan.com> Reviewed-by: Kevin Hilman <khilman@linaro.org> Reviewed-by: Paul Walmsley <paul@pwsan.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> [tony@atomide.com: updated comments per mailing list discussion] Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-omap2/id.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 0289adcb6efb..ef32d11c4bca 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -18,6 +18,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/random.h>
#include <linux/slab.h>
#ifdef CONFIG_SOC_BUS
@@ -130,6 +131,17 @@ void omap_get_die_id(struct omap_die_id *odi)
odi->id_3 = read_tap_reg(OMAP_TAP_DIE_ID_3);
}
+static int __init omap_feed_randpool(void)
+{
+ struct omap_die_id odi;
+
+ /* Throw the die ID into the entropy pool at boot */
+ omap_get_die_id(&odi);
+ add_device_randomness(&odi, sizeof(odi));
+ return 0;
+}
+omap_device_initcall(omap_feed_randpool);
+
void __init omap2xxx_check_revision(void)
{
int i, j;