|
@@ -36,6 +36,13 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,
|
|
|
/* data ready? */
|
|
|
if (readl(trng->base + TRNG_ODATA) & 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;
|