aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/applicom.c1
-rw-r--r--drivers/char/hw_random/Kconfig101
-rw-r--r--drivers/char/hw_random/Makefile1
-rw-r--r--drivers/char/hw_random/core.c47
-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
-rw-r--r--drivers/char/hw_random/virtio-rng.c115
-rw-r--r--drivers/char/i8k.c4
-rw-r--r--drivers/char/ipmi/ipmi_si_intf.c2
-rw-r--r--drivers/char/random.c36
-rw-r--r--drivers/char/raw.c8
-rw-r--r--drivers/char/tpm/tpm_acpi.c4
-rw-r--r--drivers/char/tpm/tpm_ppi.c8
15 files changed, 213 insertions, 327 deletions
diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c
index 974321a2508d..14790304b84b 100644
--- a/drivers/char/applicom.c
+++ b/drivers/char/applicom.c
@@ -345,7 +345,6 @@ out:
345 free_irq(apbs[i].irq, &dummy); 345 free_irq(apbs[i].irq, &dummy);
346 iounmap(apbs[i].RamIO); 346 iounmap(apbs[i].RamIO);
347 } 347 }
348 pci_disable_device(dev);
349 return ret; 348 return ret;
350} 349}
351 350
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/core.c b/drivers/char/hw_random/core.c
index 334601cc81cf..c4419ea1ab07 100644
--- a/drivers/char/hw_random/core.c
+++ b/drivers/char/hw_random/core.c
@@ -55,16 +55,41 @@ static DEFINE_MUTEX(rng_mutex);
55static int data_avail; 55static int data_avail;
56static u8 *rng_buffer; 56static u8 *rng_buffer;
57 57
58static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
59 int wait);
60
58static size_t rng_buffer_size(void) 61static size_t rng_buffer_size(void)
59{ 62{
60 return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES; 63 return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
61} 64}
62 65
66static void add_early_randomness(struct hwrng *rng)
67{
68 unsigned char bytes[16];
69 int bytes_read;
70
71 /*
72 * Currently only virtio-rng cannot return data during device
73 * probe, and that's handled in virtio-rng.c itself. If there
74 * are more such devices, this call to rng_get_data can be
75 * made conditional here instead of doing it per-device.
76 */
77 bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1);
78 if (bytes_read > 0)
79 add_device_randomness(bytes, bytes_read);
80}
81
63static inline int hwrng_init(struct hwrng *rng) 82static inline int hwrng_init(struct hwrng *rng)
64{ 83{
65 if (!rng->init) 84 if (rng->init) {
66 return 0; 85 int ret;
67 return rng->init(rng); 86
87 ret = rng->init(rng);
88 if (ret)
89 return ret;
90 }
91 add_early_randomness(rng);
92 return 0;
68} 93}
69 94
70static inline void hwrng_cleanup(struct hwrng *rng) 95static inline void hwrng_cleanup(struct hwrng *rng)
@@ -304,8 +329,6 @@ int hwrng_register(struct hwrng *rng)
304{ 329{
305 int err = -EINVAL; 330 int err = -EINVAL;
306 struct hwrng *old_rng, *tmp; 331 struct hwrng *old_rng, *tmp;
307 unsigned char bytes[16];
308 int bytes_read;
309 332
310 if (rng->name == NULL || 333 if (rng->name == NULL ||
311 (rng->data_read == NULL && rng->read == NULL)) 334 (rng->data_read == NULL && rng->read == NULL))
@@ -347,9 +370,17 @@ int hwrng_register(struct hwrng *rng)
347 INIT_LIST_HEAD(&rng->list); 370 INIT_LIST_HEAD(&rng->list);
348 list_add_tail(&rng->list, &rng_list); 371 list_add_tail(&rng->list, &rng_list);
349 372
350 bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); 373 if (old_rng && !rng->init) {
351 if (bytes_read > 0) 374 /*
352 add_device_randomness(bytes, bytes_read); 375 * Use a new device's input to add some randomness to
376 * the system. If this rng device isn't going to be
377 * used right away, its init function hasn't been
378 * called yet; so only use the randomness from devices
379 * that don't need an init callback.
380 */
381 add_early_randomness(rng);
382 }
383
353out_unlock: 384out_unlock:
354 mutex_unlock(&rng_mutex); 385 mutex_unlock(&rng_mutex);
355out: 386out:
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
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
index 2ce0e225e58c..e9b15bc18b4d 100644
--- a/drivers/char/hw_random/virtio-rng.c
+++ b/drivers/char/hw_random/virtio-rng.c
@@ -25,101 +25,140 @@
25#include <linux/virtio_rng.h> 25#include <linux/virtio_rng.h>
26#include <linux/module.h> 26#include <linux/module.h>
27 27
28static struct virtqueue *vq; 28static DEFINE_IDA(rng_index_ida);
29static unsigned int data_avail; 29
30static DECLARE_COMPLETION(have_data); 30struct virtrng_info {
31static bool busy; 31 struct virtio_device *vdev;
32 struct hwrng hwrng;
33 struct virtqueue *vq;
34 unsigned int data_avail;
35 struct completion have_data;
36 bool busy;
37 char name[25];
38 int index;
39};
40
41static bool probe_done;
32 42
33static void random_recv_done(struct virtqueue *vq) 43static void random_recv_done(struct virtqueue *vq)
34{ 44{
45 struct virtrng_info *vi = vq->vdev->priv;
46
35 /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */ 47 /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */
36 if (!virtqueue_get_buf(vq, &data_avail)) 48 if (!virtqueue_get_buf(vi->vq, &vi->data_avail))
37 return; 49 return;
38 50
39 complete(&have_data); 51 complete(&vi->have_data);
40} 52}
41 53
42/* The host will fill any buffer we give it with sweet, sweet randomness. */ 54/* The host will fill any buffer we give it with sweet, sweet randomness. */
43static void register_buffer(u8 *buf, size_t size) 55static void register_buffer(struct virtrng_info *vi, u8 *buf, size_t size)
44{ 56{
45 struct scatterlist sg; 57 struct scatterlist sg;
46 58
47 sg_init_one(&sg, buf, size); 59 sg_init_one(&sg, buf, size);
48 60
49 /* There should always be room for one buffer. */ 61 /* There should always be room for one buffer. */
50 virtqueue_add_inbuf(vq, &sg, 1, buf, GFP_KERNEL); 62 virtqueue_add_inbuf(vi->vq, &sg, 1, buf, GFP_KERNEL);
51 63
52 virtqueue_kick(vq); 64 virtqueue_kick(vi->vq);
53} 65}
54 66
55static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) 67static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait)
56{ 68{
57 int ret; 69 int ret;
70 struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
58 71
59 if (!busy) { 72 /*
60 busy = true; 73 * Don't ask host for data till we're setup. This call can
61 init_completion(&have_data); 74 * happen during hwrng_register(), after commit d9e7972619.
62 register_buffer(buf, size); 75 */
76 if (unlikely(!probe_done))
77 return 0;
78
79 if (!vi->busy) {
80 vi->busy = true;
81 init_completion(&vi->have_data);
82 register_buffer(vi, buf, size);
63 } 83 }
64 84
65 if (!wait) 85 if (!wait)
66 return 0; 86 return 0;
67 87
68 ret = wait_for_completion_killable(&have_data); 88 ret = wait_for_completion_killable(&vi->have_data);
69 if (ret < 0) 89 if (ret < 0)
70 return ret; 90 return ret;
71 91
72 busy = false; 92 vi->busy = false;
73 93
74 return data_avail; 94 return vi->data_avail;
75} 95}
76 96
77static void virtio_cleanup(struct hwrng *rng) 97static void virtio_cleanup(struct hwrng *rng)
78{ 98{
79 if (busy) 99 struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
80 wait_for_completion(&have_data);
81}
82 100
83 101 if (vi->busy)
84static struct hwrng virtio_hwrng = { 102 wait_for_completion(&vi->have_data);
85 .name = "virtio", 103}
86 .cleanup = virtio_cleanup,
87 .read = virtio_read,
88};
89 104
90static int probe_common(struct virtio_device *vdev) 105static int probe_common(struct virtio_device *vdev)
91{ 106{
92 int err; 107 int err, index;
108 struct virtrng_info *vi = NULL;
93 109
94 if (vq) { 110 vi = kzalloc(sizeof(struct virtrng_info), GFP_KERNEL);
95 /* We only support one device for now */ 111 if (!vi)
96 return -EBUSY; 112 return -ENOMEM;
113
114 vi->index = index = ida_simple_get(&rng_index_ida, 0, 0, GFP_KERNEL);
115 if (index < 0) {
116 kfree(vi);
117 return index;
97 } 118 }
119 sprintf(vi->name, "virtio_rng.%d", index);
120 init_completion(&vi->have_data);
121
122 vi->hwrng = (struct hwrng) {
123 .read = virtio_read,
124 .cleanup = virtio_cleanup,
125 .priv = (unsigned long)vi,
126 .name = vi->name,
127 };
128 vdev->priv = vi;
129
98 /* We expect a single virtqueue. */ 130 /* We expect a single virtqueue. */
99 vq = virtio_find_single_vq(vdev, random_recv_done, "input"); 131 vi->vq = virtio_find_single_vq(vdev, random_recv_done, "input");
100 if (IS_ERR(vq)) { 132 if (IS_ERR(vi->vq)) {
101 err = PTR_ERR(vq); 133 err = PTR_ERR(vi->vq);
102 vq = NULL; 134 vi->vq = NULL;
135 kfree(vi);
136 ida_simple_remove(&rng_index_ida, index);
103 return err; 137 return err;
104 } 138 }
105 139
106 err = hwrng_register(&virtio_hwrng); 140 err = hwrng_register(&vi->hwrng);
107 if (err) { 141 if (err) {
108 vdev->config->del_vqs(vdev); 142 vdev->config->del_vqs(vdev);
109 vq = NULL; 143 vi->vq = NULL;
144 kfree(vi);
145 ida_simple_remove(&rng_index_ida, index);
110 return err; 146 return err;
111 } 147 }
112 148
149 probe_done = true;
113 return 0; 150 return 0;
114} 151}
115 152
116static void remove_common(struct virtio_device *vdev) 153static void remove_common(struct virtio_device *vdev)
117{ 154{
155 struct virtrng_info *vi = vdev->priv;
118 vdev->config->reset(vdev); 156 vdev->config->reset(vdev);
119 busy = false; 157 vi->busy = false;
120 hwrng_unregister(&virtio_hwrng); 158 hwrng_unregister(&vi->hwrng);
121 vdev->config->del_vqs(vdev); 159 vdev->config->del_vqs(vdev);
122 vq = NULL; 160 ida_simple_remove(&rng_index_ida, vi->index);
161 kfree(vi);
123} 162}
124 163
125static int virtrng_probe(struct virtio_device *vdev) 164static int virtrng_probe(struct virtio_device *vdev)
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c
index d915707d2ba1..93dcad0c1cbe 100644
--- a/drivers/char/i8k.c
+++ b/drivers/char/i8k.c
@@ -138,7 +138,9 @@ static int i8k_smm(struct smm_regs *regs)
138 if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) 138 if (!alloc_cpumask_var(&old_mask, GFP_KERNEL))
139 return -ENOMEM; 139 return -ENOMEM;
140 cpumask_copy(old_mask, &current->cpus_allowed); 140 cpumask_copy(old_mask, &current->cpus_allowed);
141 set_cpus_allowed_ptr(current, cpumask_of(0)); 141 rc = set_cpus_allowed_ptr(current, cpumask_of(0));
142 if (rc)
143 goto out;
142 if (smp_processor_id() != 0) { 144 if (smp_processor_id() != 0) {
143 rc = -EBUSY; 145 rc = -EBUSY;
144 goto out; 146 goto out;
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
index 1c4bb4f6ce93..5d665680ae33 100644
--- a/drivers/char/ipmi/ipmi_si_intf.c
+++ b/drivers/char/ipmi/ipmi_si_intf.c
@@ -1007,7 +1007,7 @@ static int ipmi_thread(void *data)
1007 struct timespec busy_until; 1007 struct timespec busy_until;
1008 1008
1009 ipmi_si_set_not_busy(&busy_until); 1009 ipmi_si_set_not_busy(&busy_until);
1010 set_user_nice(current, 19); 1010 set_user_nice(current, MAX_NICE);
1011 while (!kthread_should_stop()) { 1011 while (!kthread_should_stop()) {
1012 int busy_wait; 1012 int busy_wait;
1013 1013
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 6b75713d953a..71529e196b84 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -641,7 +641,7 @@ retry:
641 } while (unlikely(entropy_count < pool_size-2 && pnfrac)); 641 } while (unlikely(entropy_count < pool_size-2 && pnfrac));
642 } 642 }
643 643
644 if (entropy_count < 0) { 644 if (unlikely(entropy_count < 0)) {
645 pr_warn("random: negative entropy/overflow: pool %s count %d\n", 645 pr_warn("random: negative entropy/overflow: pool %s count %d\n",
646 r->name, entropy_count); 646 r->name, entropy_count);
647 WARN_ON(1); 647 WARN_ON(1);
@@ -902,6 +902,7 @@ void add_disk_randomness(struct gendisk *disk)
902 add_timer_randomness(disk->random, 0x100 + disk_devt(disk)); 902 add_timer_randomness(disk->random, 0x100 + disk_devt(disk));
903 trace_add_disk_randomness(disk_devt(disk), ENTROPY_BITS(&input_pool)); 903 trace_add_disk_randomness(disk_devt(disk), ENTROPY_BITS(&input_pool));
904} 904}
905EXPORT_SYMBOL_GPL(add_disk_randomness);
905#endif 906#endif
906 907
907/********************************************************************* 908/*********************************************************************
@@ -979,24 +980,38 @@ static void push_to_pool(struct work_struct *work)
979static size_t account(struct entropy_store *r, size_t nbytes, int min, 980static size_t account(struct entropy_store *r, size_t nbytes, int min,
980 int reserved) 981 int reserved)
981{ 982{
982 int have_bytes;
983 int entropy_count, orig; 983 int entropy_count, orig;
984 size_t ibytes; 984 size_t ibytes, nfrac;
985 985
986 BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); 986 BUG_ON(r->entropy_count > r->poolinfo->poolfracbits);
987 987
988 /* Can we pull enough? */ 988 /* Can we pull enough? */
989retry: 989retry:
990 entropy_count = orig = ACCESS_ONCE(r->entropy_count); 990 entropy_count = orig = ACCESS_ONCE(r->entropy_count);
991 have_bytes = entropy_count >> (ENTROPY_SHIFT + 3);
992 ibytes = nbytes; 991 ibytes = nbytes;
993 /* If limited, never pull more than available */ 992 /* If limited, never pull more than available */
994 if (r->limit) 993 if (r->limit) {
995 ibytes = min_t(size_t, ibytes, have_bytes - reserved); 994 int have_bytes = entropy_count >> (ENTROPY_SHIFT + 3);
995
996 if ((have_bytes -= reserved) < 0)
997 have_bytes = 0;
998 ibytes = min_t(size_t, ibytes, have_bytes);
999 }
996 if (ibytes < min) 1000 if (ibytes < min)
997 ibytes = 0; 1001 ibytes = 0;
998 entropy_count = max_t(int, 0, 1002
999 entropy_count - (ibytes << (ENTROPY_SHIFT + 3))); 1003 if (unlikely(entropy_count < 0)) {
1004 pr_warn("random: negative entropy count: pool %s count %d\n",
1005 r->name, entropy_count);
1006 WARN_ON(1);
1007 entropy_count = 0;
1008 }
1009 nfrac = ibytes << (ENTROPY_SHIFT + 3);
1010 if ((size_t) entropy_count > nfrac)
1011 entropy_count -= nfrac;
1012 else
1013 entropy_count = 0;
1014
1000 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) 1015 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
1001 goto retry; 1016 goto retry;
1002 1017
@@ -1371,6 +1386,7 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
1371 "with %d bits of entropy available\n", 1386 "with %d bits of entropy available\n",
1372 current->comm, nonblocking_pool.entropy_total); 1387 current->comm, nonblocking_pool.entropy_total);
1373 1388
1389 nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
1374 ret = extract_entropy_user(&nonblocking_pool, buf, nbytes); 1390 ret = extract_entropy_user(&nonblocking_pool, buf, nbytes);
1375 1391
1376 trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool), 1392 trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool),
@@ -1578,10 +1594,10 @@ static int proc_do_uuid(struct ctl_table *table, int write,
1578/* 1594/*
1579 * Return entropy available scaled to integral bits 1595 * Return entropy available scaled to integral bits
1580 */ 1596 */
1581static int proc_do_entropy(ctl_table *table, int write, 1597static int proc_do_entropy(struct ctl_table *table, int write,
1582 void __user *buffer, size_t *lenp, loff_t *ppos) 1598 void __user *buffer, size_t *lenp, loff_t *ppos)
1583{ 1599{
1584 ctl_table fake_table; 1600 struct ctl_table fake_table;
1585 int entropy_count; 1601 int entropy_count;
1586 1602
1587 entropy_count = *(int *)table->data >> ENTROPY_SHIFT; 1603 entropy_count = *(int *)table->data >> ENTROPY_SHIFT;
diff --git a/drivers/char/raw.c b/drivers/char/raw.c
index 6e8d65e9b1d3..0102dc788608 100644
--- a/drivers/char/raw.c
+++ b/drivers/char/raw.c
@@ -284,10 +284,10 @@ static long raw_ctl_compat_ioctl(struct file *file, unsigned int cmd,
284#endif 284#endif
285 285
286static const struct file_operations raw_fops = { 286static const struct file_operations raw_fops = {
287 .read = do_sync_read, 287 .read = new_sync_read,
288 .aio_read = generic_file_aio_read, 288 .read_iter = generic_file_read_iter,
289 .write = do_sync_write, 289 .write = new_sync_write,
290 .aio_write = blkdev_aio_write, 290 .write_iter = blkdev_write_iter,
291 .fsync = blkdev_fsync, 291 .fsync = blkdev_fsync,
292 .open = raw_open, 292 .open = raw_open,
293 .release = raw_release, 293 .release = raw_release,
diff --git a/drivers/char/tpm/tpm_acpi.c b/drivers/char/tpm/tpm_acpi.c
index b9a57fa4b710..565a9478cb94 100644
--- a/drivers/char/tpm/tpm_acpi.c
+++ b/drivers/char/tpm/tpm_acpi.c
@@ -95,7 +95,7 @@ int read_log(struct tpm_bios_log *log)
95 95
96 log->bios_event_log_end = log->bios_event_log + len; 96 log->bios_event_log_end = log->bios_event_log + len;
97 97
98 virt = acpi_os_map_memory(start, len); 98 virt = acpi_os_map_iomem(start, len);
99 if (!virt) { 99 if (!virt) {
100 kfree(log->bios_event_log); 100 kfree(log->bios_event_log);
101 printk("%s: ERROR - Unable to map memory\n", __func__); 101 printk("%s: ERROR - Unable to map memory\n", __func__);
@@ -104,6 +104,6 @@ int read_log(struct tpm_bios_log *log)
104 104
105 memcpy_fromio(log->bios_event_log, virt, len); 105 memcpy_fromio(log->bios_event_log, virt, len);
106 106
107 acpi_os_unmap_memory(virt, len); 107 acpi_os_unmap_iomem(virt, len);
108 return 0; 108 return 0;
109} 109}
diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c
index b3ea223585bd..61dcc8011ec7 100644
--- a/drivers/char/tpm/tpm_ppi.c
+++ b/drivers/char/tpm/tpm_ppi.c
@@ -328,13 +328,11 @@ int tpm_add_ppi(struct kobject *parent)
328 /* Cache TPM ACPI handle and version string */ 328 /* Cache TPM ACPI handle and version string */
329 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 329 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
330 ppi_callback, NULL, NULL, &tpm_ppi_handle); 330 ppi_callback, NULL, NULL, &tpm_ppi_handle);
331 if (tpm_ppi_handle == NULL) 331 return tpm_ppi_handle ? sysfs_create_group(parent, &ppi_attr_grp) : 0;
332 return -ENODEV;
333
334 return sysfs_create_group(parent, &ppi_attr_grp);
335} 332}
336 333
337void tpm_remove_ppi(struct kobject *parent) 334void tpm_remove_ppi(struct kobject *parent)
338{ 335{
339 sysfs_remove_group(parent, &ppi_attr_grp); 336 if (tpm_ppi_handle)
337 sysfs_remove_group(parent, &ppi_attr_grp);
340} 338}