diff options
| -rw-r--r-- | drivers/char/hw_random/atmel-rng.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c index f518b99f53f5..6289f0eee24c 100644 --- a/drivers/char/hw_random/atmel-rng.c +++ b/drivers/char/hw_random/atmel-rng.c | |||
| @@ -36,6 +36,13 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max, | |||
| 36 | /* data ready? */ | 36 | /* data ready? */ |
| 37 | if (readl(trng->base + TRNG_ODATA) & 1) { | 37 | if (readl(trng->base + TRNG_ODATA) & 1) { |
| 38 | *data = readl(trng->base + TRNG_ODATA); | 38 | *data = readl(trng->base + TRNG_ODATA); |
| 39 | /* | ||
| 40 | ensure data ready is only set again AFTER the next data | ||
| 41 | word is ready in case it got set between checking ISR | ||
| 42 | and reading ODATA, so we don't risk re-reading the | ||
| 43 | same word | ||
| 44 | */ | ||
| 45 | readl(trng->base + TRNG_ISR); | ||
| 39 | return 4; | 46 | return 4; |
| 40 | } else | 47 | } else |
| 41 | return 0; | 48 | return 0; |
