]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[PATCH] ARM: OMAP: OMAP16xx RNG
authorJuha Yrjola <juha.yrjola@nokia.com>
Tue, 6 Sep 2005 13:08:08 +0000 (16:08 +0300)
committerTony Lindgren <tony@atomide.com>
Tue, 6 Sep 2005 13:08:08 +0000 (16:08 +0300)
Minimal hardware RNG support for 16xx

drivers/char/Kconfig
drivers/char/Makefile
drivers/char/omap16xx-rng.c [new file with mode: 0644]

index c1bf5f6022ec6065ca659fd52281282a52383bf7..629e46e5e620360755e0bbe75d6f8382db56de6f 100644 (file)
@@ -659,6 +659,18 @@ config HW_RANDOM
 
          If unsure, say N.
 
+config OMAP16XX_RNG
+       tristate "OMAP16xx Random Number Generator support"
+       depends on ARCH_OMAP16XX
+       ---help---
+         This driver provides kernel-side support for the Random Number
+         Generator hardware found on OMAP16xx multimedia processors.
+
+         To compile this driver as a module, choose M here: the
+         module will be called hw_random.
+
+         If unsure, say N.
+
 config NVRAM
        tristate "/dev/nvram support"
        depends on ATARI || X86 || X86_64 || ARM || GENERIC_NVRAM
index dc6db246e6cad8a95adcbd7ecc3749c16f7bc182..d7d8df647dba5cfa668709d511dbaa404a33d8ba 100644 (file)
@@ -75,6 +75,7 @@ obj-$(CONFIG_TOSHIBA) += toshiba.o
 obj-$(CONFIG_I8K) += i8k.o
 obj-$(CONFIG_DS1620) += ds1620.o
 obj-$(CONFIG_HW_RANDOM) += hw_random.o
+obj-$(CONFIG_OMAP16XX_RNG) += omap16xx-rng.o
 obj-$(CONFIG_FTAPE) += ftape/
 obj-$(CONFIG_COBALT_LCD) += lcd.o
 obj-$(CONFIG_PPDEV) += ppdev.o
diff --git a/drivers/char/omap16xx-rng.c b/drivers/char/omap16xx-rng.c
new file mode 100644 (file)
index 0000000..0638eaa
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * drivers/char/omap16xx-rng.c
+ *
+ * Copyright (C) 2005 Nokia Corporation
+ * Author: Juha Yrjölä <juha.yrjola@nokia.com>
+ *
+ * OMAP16xx Random Number Generator driver
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/random.h>
+#include <asm/io.h>
+
+#define RNG_BASE       0xfffe5000
+#define RNG_OUT_REG    0x00
+#define RNG_STAT_REG   0x04
+#define RNG_REV_REG    0x3c
+#define RNG_MASK_REG   0x40
+
+#define ENTROPY_WORD_COUNT 128
+
+static u32 rng_base = io_p2v(RNG_BASE);
+
+static u32 rng_read_reg(int reg)
+{
+       return __raw_readl(rng_base + reg);
+}
+
+static void rng_write_reg(int reg, u32 val)
+{
+       __raw_writel(val, rng_base + reg);
+}
+
+static void rng_feed_entropy(int count)
+{
+       u32 l;
+
+       while (count--) {
+               while (rng_read_reg(RNG_STAT_REG));
+               l = rng_read_reg(RNG_OUT_REG);
+               add_input_randomness(0, 0, l);
+       }
+}
+
+static int __init rng_init(void)
+{
+       if (!cpu_is_omap16xx())
+               return -ENODEV;
+
+       printk("OMAP16xx Random Number Generator ver. %02x\n",
+       rng_read_reg(RNG_REV_REG));
+       rng_write_reg(RNG_MASK_REG, 0x00000001);
+       rng_feed_entropy(ENTROPY_WORD_COUNT);
+       rng_write_reg(RNG_MASK_REG, 0x00000000);
+       printk("%d words of entropy generated\n", ENTROPY_WORD_COUNT);
+
+       return 0;
+}
+
+static void __exit rng_cleanup(void)
+{
+}
+
+MODULE_AUTHOR("Juha Yrjölä");
+MODULE_DESCRIPTION("OMAP16xx H/W Random Number Generator (RNG) driver");
+MODULE_LICENSE("GPL");
+
+module_init(rng_init);
+module_exit(rng_cleanup);