brcm2708: update to v3.18
[openwrt/staging/wigyori.git] / target / linux / brcm2708 / patches-3.18 / 0014-Add-hwrng-hardware-random-number-generator-driver.patch
1 From 225e1250dfcec7b09493b6a86bdeaab9f2669221 Mon Sep 17 00:00:00 2001
2 From: popcornmix <popcornmix@gmail.com>
3 Date: Wed, 3 Jul 2013 00:51:55 +0100
4 Subject: [PATCH 014/114] Add hwrng (hardware random number generator) driver
5
6 ---
7 drivers/char/hw_random/Kconfig | 11 ++++
8 drivers/char/hw_random/Makefile | 1 +
9 drivers/char/hw_random/bcm2708-rng.c | 118 +++++++++++++++++++++++++++++++++++
10 3 files changed, 130 insertions(+)
11 create mode 100755 drivers/char/hw_random/bcm2708-rng.c
12
13 diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
14 index 91a04ae..0d2ca0d 100644
15 --- a/drivers/char/hw_random/Kconfig
16 +++ b/drivers/char/hw_random/Kconfig
17 @@ -320,6 +320,17 @@ config HW_RANDOM_TPM
18
19 If unsure, say Y.
20
21 +config HW_RANDOM_BCM2708
22 + tristate "BCM2708 generic true random number generator support"
23 + depends on HW_RANDOM && ARCH_BCM2708
24 + ---help---
25 + This driver provides the kernel-side support for the BCM2708 hardware.
26 +
27 + To compile this driver as a module, choose M here: the
28 + module will be called bcm2708-rng.
29 +
30 + If unsure, say N.
31 +
32 config HW_RANDOM_MSM
33 tristate "Qualcomm SoCs Random Number Generator support"
34 depends on HW_RANDOM && ARCH_QCOM
35 diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
36 index 0b4cd57..78b019c 100644
37 --- a/drivers/char/hw_random/Makefile
38 +++ b/drivers/char/hw_random/Makefile
39 @@ -28,5 +28,6 @@ obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o
40 obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-rng.o
41 obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o
42 obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o
43 +obj-$(CONFIG_HW_RANDOM_BCM2708) += bcm2708-rng.o
44 obj-$(CONFIG_HW_RANDOM_MSM) += msm-rng.o
45 obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o
46 diff --git a/drivers/char/hw_random/bcm2708-rng.c b/drivers/char/hw_random/bcm2708-rng.c
47 new file mode 100755
48 index 0000000..340f004
49 --- /dev/null
50 +++ b/drivers/char/hw_random/bcm2708-rng.c
51 @@ -0,0 +1,118 @@
52 +/**
53 + * Copyright (c) 2010-2012 Broadcom. All rights reserved.
54 + *
55 + * Redistribution and use in source and binary forms, with or without
56 + * modification, are permitted provided that the following conditions
57 + * are met:
58 + * 1. Redistributions of source code must retain the above copyright
59 + * notice, this list of conditions, and the following disclaimer,
60 + * without modification.
61 + * 2. Redistributions in binary form must reproduce the above copyright
62 + * notice, this list of conditions and the following disclaimer in the
63 + * documentation and/or other materials provided with the distribution.
64 + * 3. The names of the above-listed copyright holders may not be used
65 + * to endorse or promote products derived from this software without
66 + * specific prior written permission.
67 + *
68 + * ALTERNATIVELY, this software may be distributed under the terms of the
69 + * GNU General Public License ("GPL") version 2, as published by the Free
70 + * Software Foundation.
71 + *
72 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
73 + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
74 + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
75 + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
76 + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
77 + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
78 + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
79 + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
80 + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
81 + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
82 + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
83 + */
84 +
85 +#include <linux/kernel.h>
86 +#include <linux/module.h>
87 +#include <linux/init.h>
88 +#include <linux/hw_random.h>
89 +#include <linux/printk.h>
90 +
91 +#include <asm/io.h>
92 +#include <mach/hardware.h>
93 +#include <mach/platform.h>
94 +
95 +#define RNG_CTRL (0x0)
96 +#define RNG_STATUS (0x4)
97 +#define RNG_DATA (0x8)
98 +#define RNG_FF_THRESHOLD (0xc)
99 +
100 +/* enable rng */
101 +#define RNG_RBGEN 0x1
102 +/* double speed, less random mode */
103 +#define RNG_RBG2X 0x2
104 +
105 +/* the initial numbers generated are "less random" so will be discarded */
106 +#define RNG_WARMUP_COUNT 0x40000
107 +
108 +static int bcm2708_rng_data_read(struct hwrng *rng, u32 *buffer)
109 +{
110 + void __iomem *rng_base = (void __iomem *)rng->priv;
111 + unsigned words;
112 + /* wait for a random number to be in fifo */
113 + do {
114 + words = __raw_readl(rng_base + RNG_STATUS)>>24;
115 + }
116 + while (words == 0);
117 + /* read the random number */
118 + *buffer = __raw_readl(rng_base + RNG_DATA);
119 + return 4;
120 +}
121 +
122 +static struct hwrng bcm2708_rng_ops = {
123 + .name = "bcm2708",
124 + .data_read = bcm2708_rng_data_read,
125 +};
126 +
127 +static int __init bcm2708_rng_init(void)
128 +{
129 + void __iomem *rng_base;
130 + int err;
131 +
132 + /* map peripheral */
133 + rng_base = ioremap(RNG_BASE, 0x10);
134 + pr_info("bcm2708_rng_init=%p\n", rng_base);
135 + if (!rng_base) {
136 + pr_err("bcm2708_rng_init failed to ioremap\n");
137 + return -ENOMEM;
138 + }
139 + bcm2708_rng_ops.priv = (unsigned long)rng_base;
140 +
141 + /* set warm-up count & enable */
142 + __raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
143 + __raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
144 +
145 + /* register driver */
146 + err = hwrng_register(&bcm2708_rng_ops);
147 + if (err) {
148 + pr_err("bcm2708_rng_init hwrng_register()=%d\n", err);
149 + iounmap(rng_base);
150 + }
151 + return err;
152 +}
153 +
154 +static void __exit bcm2708_rng_exit(void)
155 +{
156 + void __iomem *rng_base = (void __iomem *)bcm2708_rng_ops.priv;
157 + pr_info("bcm2708_rng_exit\n");
158 + /* disable rng hardware */
159 + __raw_writel(0, rng_base + RNG_CTRL);
160 + /* unregister driver */
161 + hwrng_unregister(&bcm2708_rng_ops);
162 + iounmap(rng_base);
163 +}
164 +
165 +module_init(bcm2708_rng_init);
166 +module_exit(bcm2708_rng_exit);
167 +
168 +MODULE_DESCRIPTION("BCM2708 H/W Random Number Generator (RNG) driver");
169 +MODULE_LICENSE("GPL and additional rights");
170 --
171 1.8.3.2
172