diff options
Diffstat (limited to 'drivers/char/hw_random/atmel-rng.c')
| -rw-r--r-- | drivers/char/hw_random/atmel-rng.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c index f518b99f53f..731c9046cf7 100644 --- a/drivers/char/hw_random/atmel-rng.c +++ b/drivers/char/hw_random/atmel-rng.c @@ -34,8 +34,15 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,  	u32 *data = buf;  	/* data ready? */ -	if (readl(trng->base + TRNG_ODATA) & 1) { +	if (readl(trng->base + TRNG_ISR) & 1) {  		*data = readl(trng->base + TRNG_ODATA); +		/* +		  ensure data ready is only set again AFTER the next data +		  word is ready in case it got set between checking ISR +		  and reading ODATA, so we don't risk re-reading the +		  same word +		*/ +		readl(trng->base + TRNG_ISR);  		return 4;  	} else  		return 0;  |