aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-07 22:44:40 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-07 22:44:40 -0400
commit639b4ac691c6f6e48921dc576379c176f82f3250 (patch)
tree6cf521ae7d46ca8dfa139ca67dd32545de8d2a75 /drivers/char
parent9d2cd01b15d0782adb81e40094b67904d77b03df (diff)
parent5208ed2ca16526cdbec25abe594a3cc3aea210f4 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6 into next
Pull crypto updates from Herbert Xu: "Here is the crypto update for 3.16: - Added test vectors for SHA/AES-CCM/DES-CBC/3DES-CBC. - Fixed a number of error-path memory leaks in tcrypt. - Fixed error-path memory leak in caam. - Removed unnecessary global mutex from mxs-dcp. - Added ahash walk interface that can actually be asynchronous. - Cleaned up caam error reporting. - Allow crypto_user get operation to be used by non-root users. - Add support for SSS module on Exynos. - Misc fixes" * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6: (60 commits) crypto: testmgr - add aead cbc des, des3_ede tests crypto: testmgr - Fix DMA-API warning crypto: cesa - tfm->__crt_alg->cra_type directly crypto: sahara - tfm->__crt_alg->cra_name directly crypto: padlock - tfm->__crt_alg->cra_name directly crypto: n2 - tfm->__crt_alg->cra_name directly crypto: dcp - tfm->__crt_alg->cra_name directly crypto: cesa - tfm->__crt_alg->cra_name directly crypto: ccp - tfm->__crt_alg->cra_name directly crypto: geode - Don't use tfm->__crt_alg->cra_name directly crypto: geode - Weed out printk() from probe() crypto: geode - Consistently use AES_KEYSIZE_128 crypto: geode - Kill AES_IV_LENGTH crypto: geode - Kill AES_MIN_BLOCK_SIZE crypto: mxs-dcp - Remove global mutex crypto: hash - Add real ahash walk interface hwrng: n2-drv - Introduce the use of the managed version of kzalloc crypto: caam - reinitialize keys_fit_inline for decrypt and givencrypt crypto: s5p-sss - fix multiplatform build hwrng: timeriomem - remove unnecessary OOM messages ...
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/hw_random/Kconfig101
-rw-r--r--drivers/char/hw_random/Makefile1
-rw-r--r--drivers/char/hw_random/n2-drv.c24
-rw-r--r--drivers/char/hw_random/omap-rng.c4
-rw-r--r--drivers/char/hw_random/picoxcell-rng.c181
-rw-r--r--drivers/char/hw_random/timeriomem-rng.c4
6 files changed, 58 insertions, 257 deletions
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index 244759bbd7b7..836b061ced35 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -2,7 +2,7 @@
2# Hardware Random Number Generator (RNG) configuration 2# Hardware Random Number Generator (RNG) configuration
3# 3#
4 4
5config HW_RANDOM 5menuconfig HW_RANDOM
6 tristate "Hardware Random Number Generator Core support" 6 tristate "Hardware Random Number Generator Core support"
7 default m 7 default m
8 ---help--- 8 ---help---
@@ -20,9 +20,11 @@ config HW_RANDOM
20 20
21 If unsure, say Y. 21 If unsure, say Y.
22 22
23if HW_RANDOM
24
23config HW_RANDOM_TIMERIOMEM 25config HW_RANDOM_TIMERIOMEM
24 tristate "Timer IOMEM HW Random Number Generator support" 26 tristate "Timer IOMEM HW Random Number Generator support"
25 depends on HW_RANDOM && HAS_IOMEM 27 depends on HAS_IOMEM
26 ---help--- 28 ---help---
27 This driver provides kernel-side support for a generic Random 29 This driver provides kernel-side support for a generic Random
28 Number Generator used by reading a 'dumb' iomem address that 30 Number Generator used by reading a 'dumb' iomem address that
@@ -36,7 +38,7 @@ config HW_RANDOM_TIMERIOMEM
36 38
37config HW_RANDOM_INTEL 39config HW_RANDOM_INTEL
38 tristate "Intel HW Random Number Generator support" 40 tristate "Intel HW Random Number Generator support"
39 depends on HW_RANDOM && (X86 || IA64) && PCI 41 depends on (X86 || IA64) && PCI
40 default HW_RANDOM 42 default HW_RANDOM
41 ---help--- 43 ---help---
42 This driver provides kernel-side support for the Random Number 44 This driver provides kernel-side support for the Random Number
@@ -49,7 +51,7 @@ config HW_RANDOM_INTEL
49 51
50config HW_RANDOM_AMD 52config HW_RANDOM_AMD
51 tristate "AMD HW Random Number Generator support" 53 tristate "AMD HW Random Number Generator support"
52 depends on HW_RANDOM && (X86 || PPC_MAPLE) && PCI 54 depends on (X86 || PPC_MAPLE) && PCI
53 default HW_RANDOM 55 default HW_RANDOM
54 ---help--- 56 ---help---
55 This driver provides kernel-side support for the Random Number 57 This driver provides kernel-side support for the Random Number
@@ -62,8 +64,8 @@ config HW_RANDOM_AMD
62 64
63config HW_RANDOM_ATMEL 65config HW_RANDOM_ATMEL
64 tristate "Atmel Random Number Generator support" 66 tristate "Atmel Random Number Generator support"
65 depends on HW_RANDOM && HAVE_CLK 67 depends on ARCH_AT91 && HAVE_CLK
66 default (HW_RANDOM && ARCH_AT91) 68 default HW_RANDOM
67 ---help--- 69 ---help---
68 This driver provides kernel-side support for the Random Number 70 This driver provides kernel-side support for the Random Number
69 Generator hardware found on Atmel AT91 devices. 71 Generator hardware found on Atmel AT91 devices.
@@ -75,7 +77,7 @@ config HW_RANDOM_ATMEL
75 77
76config HW_RANDOM_BCM63XX 78config HW_RANDOM_BCM63XX
77 tristate "Broadcom BCM63xx Random Number Generator support" 79 tristate "Broadcom BCM63xx Random Number Generator support"
78 depends on HW_RANDOM && BCM63XX 80 depends on BCM63XX
79 default HW_RANDOM 81 default HW_RANDOM
80 ---help--- 82 ---help---
81 This driver provides kernel-side support for the Random Number 83 This driver provides kernel-side support for the Random Number
@@ -88,7 +90,7 @@ config HW_RANDOM_BCM63XX
88 90
89config HW_RANDOM_BCM2835 91config HW_RANDOM_BCM2835
90 tristate "Broadcom BCM2835 Random Number Generator support" 92 tristate "Broadcom BCM2835 Random Number Generator support"
91 depends on HW_RANDOM && ARCH_BCM2835 93 depends on ARCH_BCM2835
92 default HW_RANDOM 94 default HW_RANDOM
93 ---help--- 95 ---help---
94 This driver provides kernel-side support for the Random Number 96 This driver provides kernel-side support for the Random Number
@@ -101,7 +103,7 @@ config HW_RANDOM_BCM2835
101 103
102config HW_RANDOM_GEODE 104config HW_RANDOM_GEODE
103 tristate "AMD Geode HW Random Number Generator support" 105 tristate "AMD Geode HW Random Number Generator support"
104 depends on HW_RANDOM && X86_32 && PCI 106 depends on X86_32 && PCI
105 default HW_RANDOM 107 default HW_RANDOM
106 ---help--- 108 ---help---
107 This driver provides kernel-side support for the Random Number 109 This driver provides kernel-side support for the Random Number
@@ -114,7 +116,7 @@ config HW_RANDOM_GEODE
114 116
115config HW_RANDOM_N2RNG 117config HW_RANDOM_N2RNG
116 tristate "Niagara2 Random Number Generator support" 118 tristate "Niagara2 Random Number Generator support"
117 depends on HW_RANDOM && SPARC64 119 depends on SPARC64
118 default HW_RANDOM 120 default HW_RANDOM
119 ---help--- 121 ---help---
120 This driver provides kernel-side support for the Random Number 122 This driver provides kernel-side support for the Random Number
@@ -127,7 +129,7 @@ config HW_RANDOM_N2RNG
127 129
128config HW_RANDOM_VIA 130config HW_RANDOM_VIA
129 tristate "VIA HW Random Number Generator support" 131 tristate "VIA HW Random Number Generator support"
130 depends on HW_RANDOM && X86 132 depends on X86
131 default HW_RANDOM 133 default HW_RANDOM
132 ---help--- 134 ---help---
133 This driver provides kernel-side support for the Random Number 135 This driver provides kernel-side support for the Random Number
@@ -140,7 +142,7 @@ config HW_RANDOM_VIA
140 142
141config HW_RANDOM_IXP4XX 143config HW_RANDOM_IXP4XX
142 tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support" 144 tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support"
143 depends on HW_RANDOM && ARCH_IXP4XX 145 depends on ARCH_IXP4XX
144 default HW_RANDOM 146 default HW_RANDOM
145 ---help--- 147 ---help---
146 This driver provides kernel-side support for the Pseudo-Random 148 This driver provides kernel-side support for the Pseudo-Random
@@ -153,7 +155,7 @@ config HW_RANDOM_IXP4XX
153 155
154config HW_RANDOM_OMAP 156config HW_RANDOM_OMAP
155 tristate "OMAP Random Number Generator support" 157 tristate "OMAP Random Number Generator support"
156 depends on HW_RANDOM && (ARCH_OMAP16XX || ARCH_OMAP2PLUS) 158 depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS
157 default HW_RANDOM 159 default HW_RANDOM
158 ---help--- 160 ---help---
159 This driver provides kernel-side support for the Random Number 161 This driver provides kernel-side support for the Random Number
@@ -167,7 +169,7 @@ config HW_RANDOM_OMAP
167 169
168config HW_RANDOM_OMAP3_ROM 170config HW_RANDOM_OMAP3_ROM
169 tristate "OMAP3 ROM Random Number Generator support" 171 tristate "OMAP3 ROM Random Number Generator support"
170 depends on HW_RANDOM && ARCH_OMAP3 172 depends on ARCH_OMAP3
171 default HW_RANDOM 173 default HW_RANDOM
172 ---help--- 174 ---help---
173 This driver provides kernel-side support for the Random Number 175 This driver provides kernel-side support for the Random Number
@@ -180,7 +182,7 @@ config HW_RANDOM_OMAP3_ROM
180 182
181config HW_RANDOM_OCTEON 183config HW_RANDOM_OCTEON
182 tristate "Octeon Random Number Generator support" 184 tristate "Octeon Random Number Generator support"
183 depends on HW_RANDOM && CAVIUM_OCTEON_SOC 185 depends on CAVIUM_OCTEON_SOC
184 default HW_RANDOM 186 default HW_RANDOM
185 ---help--- 187 ---help---
186 This driver provides kernel-side support for the Random Number 188 This driver provides kernel-side support for the Random Number
@@ -193,7 +195,7 @@ config HW_RANDOM_OCTEON
193 195
194config HW_RANDOM_PASEMI 196config HW_RANDOM_PASEMI
195 tristate "PA Semi HW Random Number Generator support" 197 tristate "PA Semi HW Random Number Generator support"
196 depends on HW_RANDOM && PPC_PASEMI 198 depends on PPC_PASEMI
197 default HW_RANDOM 199 default HW_RANDOM
198 ---help--- 200 ---help---
199 This driver provides kernel-side support for the Random Number 201 This driver provides kernel-side support for the Random Number
@@ -206,7 +208,7 @@ config HW_RANDOM_PASEMI
206 208
207config HW_RANDOM_VIRTIO 209config HW_RANDOM_VIRTIO
208 tristate "VirtIO Random Number Generator support" 210 tristate "VirtIO Random Number Generator support"
209 depends on HW_RANDOM && VIRTIO 211 depends on VIRTIO
210 ---help--- 212 ---help---
211 This driver provides kernel-side support for the virtual Random Number 213 This driver provides kernel-side support for the virtual Random Number
212 Generator hardware. 214 Generator hardware.
@@ -216,7 +218,7 @@ config HW_RANDOM_VIRTIO
216 218
217config HW_RANDOM_TX4939 219config HW_RANDOM_TX4939
218 tristate "TX4939 Random Number Generator support" 220 tristate "TX4939 Random Number Generator support"
219 depends on HW_RANDOM && SOC_TX4939 221 depends on SOC_TX4939
220 default HW_RANDOM 222 default HW_RANDOM
221 ---help--- 223 ---help---
222 This driver provides kernel-side support for the Random Number 224 This driver provides kernel-side support for the Random Number
@@ -229,7 +231,8 @@ config HW_RANDOM_TX4939
229 231
230config HW_RANDOM_MXC_RNGA 232config HW_RANDOM_MXC_RNGA
231 tristate "Freescale i.MX RNGA Random Number Generator" 233 tristate "Freescale i.MX RNGA Random Number Generator"
232 depends on HW_RANDOM && ARCH_HAS_RNGA 234 depends on ARCH_HAS_RNGA
235 default HW_RANDOM
233 ---help--- 236 ---help---
234 This driver provides kernel-side support for the Random Number 237 This driver provides kernel-side support for the Random Number
235 Generator hardware found on Freescale i.MX processors. 238 Generator hardware found on Freescale i.MX processors.
@@ -241,7 +244,8 @@ config HW_RANDOM_MXC_RNGA
241 244
242config HW_RANDOM_NOMADIK 245config HW_RANDOM_NOMADIK
243 tristate "ST-Ericsson Nomadik Random Number Generator support" 246 tristate "ST-Ericsson Nomadik Random Number Generator support"
244 depends on HW_RANDOM && ARCH_NOMADIK 247 depends on ARCH_NOMADIK
248 default HW_RANDOM
245 ---help--- 249 ---help---
246 This driver provides kernel-side support for the Random Number 250 This driver provides kernel-side support for the Random Number
247 Generator hardware found on ST-Ericsson SoCs (8815 and 8500). 251 Generator hardware found on ST-Ericsson SoCs (8815 and 8500).
@@ -251,21 +255,10 @@ config HW_RANDOM_NOMADIK
251 255
252 If unsure, say Y. 256 If unsure, say Y.
253 257
254config HW_RANDOM_PICOXCELL
255 tristate "Picochip picoXcell true random number generator support"
256 depends on HW_RANDOM && ARCH_PICOXCELL && PICOXCELL_PC3X3
257 ---help---
258 This driver provides kernel-side support for the Random Number
259 Generator hardware found on Picochip PC3x3 and later devices.
260
261 To compile this driver as a module, choose M here: the
262 module will be called picoxcell-rng.
263
264 If unsure, say Y.
265
266config HW_RANDOM_PPC4XX 258config HW_RANDOM_PPC4XX
267 tristate "PowerPC 4xx generic true random number generator support" 259 tristate "PowerPC 4xx generic true random number generator support"
268 depends on HW_RANDOM && PPC && 4xx 260 depends on PPC && 4xx
261 default HW_RANDOM
269 ---help--- 262 ---help---
270 This driver provides the kernel-side support for the TRNG hardware 263 This driver provides the kernel-side support for the TRNG hardware
271 found in the security function of some PowerPC 4xx SoCs. 264 found in the security function of some PowerPC 4xx SoCs.
@@ -275,24 +268,9 @@ config HW_RANDOM_PPC4XX
275 268
276 If unsure, say N. 269 If unsure, say N.
277 270
278config UML_RANDOM
279 depends on UML
280 tristate "Hardware random number generator"
281 help
282 This option enables UML's "hardware" random number generator. It
283 attaches itself to the host's /dev/random, supplying as much entropy
284 as the host has, rather than the small amount the UML gets from its
285 own drivers. It registers itself as a standard hardware random number
286 generator, major 10, minor 183, and the canonical device name is
287 /dev/hwrng.
288 The way to make use of this is to install the rng-tools package
289 (check your distro, or download from
290 http://sourceforge.net/projects/gkernel/). rngd periodically reads
291 /dev/hwrng and injects the entropy into /dev/random.
292
293config HW_RANDOM_PSERIES 271config HW_RANDOM_PSERIES
294 tristate "pSeries HW Random Number Generator support" 272 tristate "pSeries HW Random Number Generator support"
295 depends on HW_RANDOM && PPC64 && IBMVIO 273 depends on PPC64 && IBMVIO
296 default HW_RANDOM 274 default HW_RANDOM
297 ---help--- 275 ---help---
298 This driver provides kernel-side support for the Random Number 276 This driver provides kernel-side support for the Random Number
@@ -305,7 +283,7 @@ config HW_RANDOM_PSERIES
305 283
306config HW_RANDOM_POWERNV 284config HW_RANDOM_POWERNV
307 tristate "PowerNV Random Number Generator support" 285 tristate "PowerNV Random Number Generator support"
308 depends on HW_RANDOM && PPC_POWERNV 286 depends on PPC_POWERNV
309 default HW_RANDOM 287 default HW_RANDOM
310 ---help--- 288 ---help---
311 This is the driver for Random Number Generator hardware found 289 This is the driver for Random Number Generator hardware found
@@ -318,7 +296,8 @@ config HW_RANDOM_POWERNV
318 296
319config HW_RANDOM_EXYNOS 297config HW_RANDOM_EXYNOS
320 tristate "EXYNOS HW random number generator support" 298 tristate "EXYNOS HW random number generator support"
321 depends on HW_RANDOM && HAS_IOMEM && HAVE_CLK 299 depends on ARCH_EXYNOS
300 default HW_RANDOM
322 ---help--- 301 ---help---
323 This driver provides kernel-side support for the Random Number 302 This driver provides kernel-side support for the Random Number
324 Generator hardware found on EXYNOS SOCs. 303 Generator hardware found on EXYNOS SOCs.
@@ -330,7 +309,7 @@ config HW_RANDOM_EXYNOS
330 309
331config HW_RANDOM_TPM 310config HW_RANDOM_TPM
332 tristate "TPM HW Random Number Generator support" 311 tristate "TPM HW Random Number Generator support"
333 depends on HW_RANDOM && TCG_TPM 312 depends on TCG_TPM
334 default HW_RANDOM 313 default HW_RANDOM
335 ---help--- 314 ---help---
336 This driver provides kernel-side support for the Random Number 315 This driver provides kernel-side support for the Random Number
@@ -344,6 +323,7 @@ config HW_RANDOM_TPM
344config HW_RANDOM_MSM 323config HW_RANDOM_MSM
345 tristate "Qualcomm SoCs Random Number Generator support" 324 tristate "Qualcomm SoCs Random Number Generator support"
346 depends on HW_RANDOM && ARCH_QCOM 325 depends on HW_RANDOM && ARCH_QCOM
326 default HW_RANDOM
347 ---help--- 327 ---help---
348 This driver provides kernel-side support for the Random Number 328 This driver provides kernel-side support for the Random Number
349 Generator hardware found on Qualcomm SoCs. 329 Generator hardware found on Qualcomm SoCs.
@@ -352,3 +332,20 @@ config HW_RANDOM_MSM
352 module will be called msm-rng. 332 module will be called msm-rng.
353 333
354 If unsure, say Y. 334 If unsure, say Y.
335
336endif # HW_RANDOM
337
338config UML_RANDOM
339 depends on UML
340 tristate "Hardware random number generator"
341 help
342 This option enables UML's "hardware" random number generator. It
343 attaches itself to the host's /dev/random, supplying as much entropy
344 as the host has, rather than the small amount the UML gets from its
345 own drivers. It registers itself as a standard hardware random number
346 generator, major 10, minor 183, and the canonical device name is
347 /dev/hwrng.
348 The way to make use of this is to install the rng-tools package
349 (check your distro, or download from
350 http://sourceforge.net/projects/gkernel/). rngd periodically reads
351 /dev/hwrng and injects the entropy into /dev/random.
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index 3ae7755a52e7..199ed283e149 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -22,7 +22,6 @@ obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
22obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o 22obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o
23obj-$(CONFIG_HW_RANDOM_OCTEON) += octeon-rng.o 23obj-$(CONFIG_HW_RANDOM_OCTEON) += octeon-rng.o
24obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o 24obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o
25obj-$(CONFIG_HW_RANDOM_PICOXCELL) += picoxcell-rng.o
26obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o 25obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o
27obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o 26obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o
28obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o 27obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o
diff --git a/drivers/char/hw_random/n2-drv.c b/drivers/char/hw_random/n2-drv.c
index 432232eefe05..292a5889f675 100644
--- a/drivers/char/hw_random/n2-drv.c
+++ b/drivers/char/hw_random/n2-drv.c
@@ -632,7 +632,7 @@ static int n2rng_probe(struct platform_device *op)
632 multi_capable = (match->data != NULL); 632 multi_capable = (match->data != NULL);
633 633
634 n2rng_driver_version(); 634 n2rng_driver_version();
635 np = kzalloc(sizeof(*np), GFP_KERNEL); 635 np = devm_kzalloc(&op->dev, sizeof(*np), GFP_KERNEL);
636 if (!np) 636 if (!np)
637 goto out; 637 goto out;
638 np->op = op; 638 np->op = op;
@@ -653,7 +653,7 @@ static int n2rng_probe(struct platform_device *op)
653 &np->hvapi_minor)) { 653 &np->hvapi_minor)) {
654 dev_err(&op->dev, "Cannot register suitable " 654 dev_err(&op->dev, "Cannot register suitable "
655 "HVAPI version.\n"); 655 "HVAPI version.\n");
656 goto out_free; 656 goto out;
657 } 657 }
658 } 658 }
659 659
@@ -676,15 +676,16 @@ static int n2rng_probe(struct platform_device *op)
676 dev_info(&op->dev, "Registered RNG HVAPI major %lu minor %lu\n", 676 dev_info(&op->dev, "Registered RNG HVAPI major %lu minor %lu\n",
677 np->hvapi_major, np->hvapi_minor); 677 np->hvapi_major, np->hvapi_minor);
678 678
679 np->units = kzalloc(sizeof(struct n2rng_unit) * np->num_units, 679 np->units = devm_kzalloc(&op->dev,
680 GFP_KERNEL); 680 sizeof(struct n2rng_unit) * np->num_units,
681 GFP_KERNEL);
681 err = -ENOMEM; 682 err = -ENOMEM;
682 if (!np->units) 683 if (!np->units)
683 goto out_hvapi_unregister; 684 goto out_hvapi_unregister;
684 685
685 err = n2rng_init_control(np); 686 err = n2rng_init_control(np);
686 if (err) 687 if (err)
687 goto out_free_units; 688 goto out_hvapi_unregister;
688 689
689 dev_info(&op->dev, "Found %s RNG, units: %d\n", 690 dev_info(&op->dev, "Found %s RNG, units: %d\n",
690 ((np->flags & N2RNG_FLAG_MULTI) ? 691 ((np->flags & N2RNG_FLAG_MULTI) ?
@@ -697,7 +698,7 @@ static int n2rng_probe(struct platform_device *op)
697 698
698 err = hwrng_register(&np->hwrng); 699 err = hwrng_register(&np->hwrng);
699 if (err) 700 if (err)
700 goto out_free_units; 701 goto out_hvapi_unregister;
701 702
702 platform_set_drvdata(op, np); 703 platform_set_drvdata(op, np);
703 704
@@ -705,15 +706,9 @@ static int n2rng_probe(struct platform_device *op)
705 706
706 return 0; 707 return 0;
707 708
708out_free_units:
709 kfree(np->units);
710 np->units = NULL;
711
712out_hvapi_unregister: 709out_hvapi_unregister:
713 sun4v_hvapi_unregister(HV_GRP_RNG); 710 sun4v_hvapi_unregister(HV_GRP_RNG);
714 711
715out_free:
716 kfree(np);
717out: 712out:
718 return err; 713 return err;
719} 714}
@@ -730,11 +725,6 @@ static int n2rng_remove(struct platform_device *op)
730 725
731 sun4v_hvapi_unregister(HV_GRP_RNG); 726 sun4v_hvapi_unregister(HV_GRP_RNG);
732 727
733 kfree(np->units);
734 np->units = NULL;
735
736 kfree(np);
737
738 return 0; 728 return 0;
739} 729}
740 730
diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c
index 9b89ff4881de..f66ea258382f 100644
--- a/drivers/char/hw_random/omap-rng.c
+++ b/drivers/char/hw_random/omap-rng.c
@@ -369,10 +369,8 @@ static int omap_rng_probe(struct platform_device *pdev)
369 int ret; 369 int ret;
370 370
371 priv = devm_kzalloc(dev, sizeof(struct omap_rng_dev), GFP_KERNEL); 371 priv = devm_kzalloc(dev, sizeof(struct omap_rng_dev), GFP_KERNEL);
372 if (!priv) { 372 if (!priv)
373 dev_err(&pdev->dev, "could not allocate memory\n");
374 return -ENOMEM; 373 return -ENOMEM;
375 };
376 374
377 omap_rng_ops.priv = (unsigned long)priv; 375 omap_rng_ops.priv = (unsigned long)priv;
378 platform_set_drvdata(pdev, priv); 376 platform_set_drvdata(pdev, priv);
diff --git a/drivers/char/hw_random/picoxcell-rng.c b/drivers/char/hw_random/picoxcell-rng.c
deleted file mode 100644
index eab5448ad56f..000000000000
--- a/drivers/char/hw_random/picoxcell-rng.c
+++ /dev/null
@@ -1,181 +0,0 @@
1/*
2 * Copyright (c) 2010-2011 Picochip Ltd., Jamie Iles
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * All enquiries to support@picochip.com
9 */
10#include <linux/clk.h>
11#include <linux/delay.h>
12#include <linux/err.h>
13#include <linux/hw_random.h>
14#include <linux/io.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/platform_device.h>
18
19#define DATA_REG_OFFSET 0x0200
20#define CSR_REG_OFFSET 0x0278
21#define CSR_OUT_EMPTY_MASK (1 << 24)
22#define CSR_FAULT_MASK (1 << 1)
23#define TRNG_BLOCK_RESET_MASK (1 << 0)
24#define TAI_REG_OFFSET 0x0380
25
26/*
27 * The maximum amount of time in microseconds to spend waiting for data if the
28 * core wants us to wait. The TRNG should generate 32 bits every 320ns so a
29 * timeout of 20us seems reasonable. The TRNG does builtin tests of the data
30 * for randomness so we can't always assume there is data present.
31 */
32#define PICO_TRNG_TIMEOUT 20
33
34static void __iomem *rng_base;
35static struct clk *rng_clk;
36static struct device *rng_dev;
37
38static inline u32 picoxcell_trng_read_csr(void)
39{
40 return __raw_readl(rng_base + CSR_REG_OFFSET);
41}
42
43static inline bool picoxcell_trng_is_empty(void)
44{
45 return picoxcell_trng_read_csr() & CSR_OUT_EMPTY_MASK;
46}
47
48/*
49 * Take the random number generator out of reset and make sure the interrupts
50 * are masked. We shouldn't need to get large amounts of random bytes so just
51 * poll the status register. The hardware generates 32 bits every 320ns so we
52 * shouldn't have to wait long enough to warrant waiting for an IRQ.
53 */
54static void picoxcell_trng_start(void)
55{
56 __raw_writel(0, rng_base + TAI_REG_OFFSET);
57 __raw_writel(0, rng_base + CSR_REG_OFFSET);
58}
59
60static void picoxcell_trng_reset(void)
61{
62 __raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + CSR_REG_OFFSET);
63 __raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + TAI_REG_OFFSET);
64 picoxcell_trng_start();
65}
66
67/*
68 * Get some random data from the random number generator. The hw_random core
69 * layer provides us with locking.
70 */
71static int picoxcell_trng_read(struct hwrng *rng, void *buf, size_t max,
72 bool wait)
73{
74 int i;
75
76 /* Wait for some data to become available. */
77 for (i = 0; i < PICO_TRNG_TIMEOUT && picoxcell_trng_is_empty(); ++i) {
78 if (!wait)
79 return 0;
80
81 udelay(1);
82 }
83
84 if (picoxcell_trng_read_csr() & CSR_FAULT_MASK) {
85 dev_err(rng_dev, "fault detected, resetting TRNG\n");
86 picoxcell_trng_reset();
87 return -EIO;
88 }
89
90 if (i == PICO_TRNG_TIMEOUT)
91 return 0;
92
93 *(u32 *)buf = __raw_readl(rng_base + DATA_REG_OFFSET);
94 return sizeof(u32);
95}
96
97static struct hwrng picoxcell_trng = {
98 .name = "picoxcell",
99 .read = picoxcell_trng_read,
100};
101
102static int picoxcell_trng_probe(struct platform_device *pdev)
103{
104 int ret;
105 struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
106
107 rng_base = devm_ioremap_resource(&pdev->dev, mem);
108 if (IS_ERR(rng_base))
109 return PTR_ERR(rng_base);
110
111 rng_clk = devm_clk_get(&pdev->dev, NULL);
112 if (IS_ERR(rng_clk)) {
113 dev_warn(&pdev->dev, "no clk\n");
114 return PTR_ERR(rng_clk);
115 }
116
117 ret = clk_enable(rng_clk);
118 if (ret) {
119 dev_warn(&pdev->dev, "unable to enable clk\n");
120 return ret;
121 }
122
123 picoxcell_trng_start();
124 ret = hwrng_register(&picoxcell_trng);
125 if (ret)
126 goto err_register;
127
128 rng_dev = &pdev->dev;
129 dev_info(&pdev->dev, "pixoxcell random number generator active\n");
130
131 return 0;
132
133err_register:
134 clk_disable(rng_clk);
135 return ret;
136}
137
138static int picoxcell_trng_remove(struct platform_device *pdev)
139{
140 hwrng_unregister(&picoxcell_trng);
141 clk_disable(rng_clk);
142
143 return 0;
144}
145
146#ifdef CONFIG_PM
147static int picoxcell_trng_suspend(struct device *dev)
148{
149 clk_disable(rng_clk);
150
151 return 0;
152}
153
154static int picoxcell_trng_resume(struct device *dev)
155{
156 return clk_enable(rng_clk);
157}
158
159static const struct dev_pm_ops picoxcell_trng_pm_ops = {
160 .suspend = picoxcell_trng_suspend,
161 .resume = picoxcell_trng_resume,
162};
163#endif /* CONFIG_PM */
164
165static struct platform_driver picoxcell_trng_driver = {
166 .probe = picoxcell_trng_probe,
167 .remove = picoxcell_trng_remove,
168 .driver = {
169 .name = "picoxcell-trng",
170 .owner = THIS_MODULE,
171#ifdef CONFIG_PM
172 .pm = &picoxcell_trng_pm_ops,
173#endif /* CONFIG_PM */
174 },
175};
176
177module_platform_driver(picoxcell_trng_driver);
178
179MODULE_LICENSE("GPL");
180MODULE_AUTHOR("Jamie Iles");
181MODULE_DESCRIPTION("Picochip picoXcell TRNG driver");
diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c
index 439ff8b28c43..b6ab9ac3f34d 100644
--- a/drivers/char/hw_random/timeriomem-rng.c
+++ b/drivers/char/hw_random/timeriomem-rng.c
@@ -120,10 +120,8 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
120 /* Allocate memory for the device structure (and zero it) */ 120 /* Allocate memory for the device structure (and zero it) */
121 priv = devm_kzalloc(&pdev->dev, 121 priv = devm_kzalloc(&pdev->dev,
122 sizeof(struct timeriomem_rng_private_data), GFP_KERNEL); 122 sizeof(struct timeriomem_rng_private_data), GFP_KERNEL);
123 if (!priv) { 123 if (!priv)
124 dev_err(&pdev->dev, "failed to allocate device structure.\n");
125 return -ENOMEM; 124 return -ENOMEM;
126 }
127 125
128 platform_set_drvdata(pdev, priv); 126 platform_set_drvdata(pdev, priv);
129 127