hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/crypto/qcom-rng.c
....@@ -7,6 +7,8 @@
77 #include <linux/acpi.h>
88 #include <linux/clk.h>
99 #include <linux/crypto.h>
10
+#include <linux/io.h>
11
+#include <linux/iopoll.h>
1012 #include <linux/module.h>
1113 #include <linux/of.h>
1214 #include <linux/platform_device.h>
....@@ -42,16 +44,19 @@
4244 {
4345 unsigned int currsize = 0;
4446 u32 val;
47
+ int ret;
4548
4649 /* read random data from hardware */
4750 do {
48
- val = readl_relaxed(rng->base + PRNG_STATUS);
49
- if (!(val & PRNG_STATUS_DATA_AVAIL))
50
- 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;
5156
5257 val = readl_relaxed(rng->base + PRNG_DATA_OUT);
5358 if (!val)
54
- break;
59
+ return -EINVAL;
5560
5661 if ((max - currsize) >= WORD_SZ) {
5762 memcpy(data, &val, WORD_SZ);
....@@ -64,7 +69,7 @@
6469 }
6570 } while (currsize < max);
6671
67
- return currsize;
72
+ return 0;
6873 }
6974
7075 static int qcom_rng_generate(struct crypto_rng *tfm,
....@@ -86,7 +91,7 @@
8691 mutex_unlock(&rng->lock);
8792 clk_disable_unprepare(rng->clk);
8893
89
- return 0;
94
+ return ret;
9095 }
9196
9297 static int qcom_rng_seed(struct crypto_rng *tfm, const u8 *seed,
....@@ -153,7 +158,6 @@
153158
154159 static int qcom_rng_probe(struct platform_device *pdev)
155160 {
156
- struct resource *res;
157161 struct qcom_rng *rng;
158162 int ret;
159163
....@@ -164,8 +168,7 @@
164168 platform_set_drvdata(pdev, rng);
165169 mutex_init(&rng->lock);
166170
167
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
168
- rng->base = devm_ioremap_resource(&pdev->dev, res);
171
+ rng->base = devm_platform_ioremap_resource(pdev, 0);
169172 if (IS_ERR(rng->base))
170173 return PTR_ERR(rng->base);
171174