88#include <linux/clk.h>
99#include <linux/crypto.h>
1010#include <linux/io.h>
11+ #include <linux/iopoll.h>
1112#include <linux/module.h>
1213#include <linux/of.h>
1314#include <linux/platform_device.h>
@@ -43,16 +44,19 @@ static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max)
4344{
4445 unsigned int currsize = 0 ;
4546 u32 val ;
47+ int ret ;
4648
4749 /* read random data from hardware */
4850 do {
49- val = readl_relaxed (rng -> base + PRNG_STATUS );
50- if (!(val & PRNG_STATUS_DATA_AVAIL ))
51- break ;
51+ ret = readl_poll_timeout (rng -> base + PRNG_STATUS , val ,
52+ val & PRNG_STATUS_DATA_AVAIL ,
53+ 200 , 10000 );
54+ if (ret )
55+ return ret ;
5256
5357 val = readl_relaxed (rng -> base + PRNG_DATA_OUT );
5458 if (!val )
55- break ;
59+ return - EINVAL ;
5660
5761 if ((max - currsize ) >= WORD_SZ ) {
5862 memcpy (data , & val , WORD_SZ );
@@ -61,11 +65,10 @@ static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max)
6165 } else {
6266 /* copy only remaining bytes */
6367 memcpy (data , & val , max - currsize );
64- break ;
6568 }
6669 } while (currsize < max );
6770
68- return currsize ;
71+ return 0 ;
6972}
7073
7174static int qcom_rng_generate (struct crypto_rng * tfm ,
@@ -87,7 +90,7 @@ static int qcom_rng_generate(struct crypto_rng *tfm,
8790 mutex_unlock (& rng -> lock );
8891 clk_disable_unprepare (rng -> clk );
8992
90- return 0 ;
93+ return ret ;
9194}
9295
9396static int qcom_rng_seed (struct crypto_rng * tfm , const u8 * seed ,
0 commit comments