crypto: qat - remove dma_free_coherent() for RSA
[platform/kernel/linux-rpi.git] / drivers / crypto / qcom-rng.c
index 99ba8d5..031b5f7 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/clk.h>
 #include <linux/crypto.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
@@ -43,16 +44,19 @@ static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max)
 {
        unsigned int currsize = 0;
        u32 val;
+       int ret;
 
        /* read random data from hardware */
        do {
-               val = readl_relaxed(rng->base + PRNG_STATUS);
-               if (!(val & PRNG_STATUS_DATA_AVAIL))
-                       break;
+               ret = readl_poll_timeout(rng->base + PRNG_STATUS, val,
+                                        val & PRNG_STATUS_DATA_AVAIL,
+                                        200, 10000);
+               if (ret)
+                       return ret;
 
                val = readl_relaxed(rng->base + PRNG_DATA_OUT);
                if (!val)
-                       break;
+                       return -EINVAL;
 
                if ((max - currsize) >= WORD_SZ) {
                        memcpy(data, &val, WORD_SZ);
@@ -65,7 +69,7 @@ static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max)
                }
        } while (currsize < max);
 
-       return currsize;
+       return 0;
 }
 
 static int qcom_rng_generate(struct crypto_rng *tfm,
@@ -87,7 +91,7 @@ static int qcom_rng_generate(struct crypto_rng *tfm,
        mutex_unlock(&rng->lock);
        clk_disable_unprepare(rng->clk);
 
-       return 0;
+       return ret;
 }
 
 static int qcom_rng_seed(struct crypto_rng *tfm, const u8 *seed,