|
@@ -90,6 +90,7 @@ static int exynos_read(struct hwrng *rng, void *buf,
|
|
struct exynos_rng, rng);
|
|
struct exynos_rng, rng);
|
|
u32 *data = buf;
|
|
u32 *data = buf;
|
|
int retry = 100;
|
|
int retry = 100;
|
|
|
|
+ int ret = 4;
|
|
|
|
|
|
pm_runtime_get_sync(exynos_rng->dev);
|
|
pm_runtime_get_sync(exynos_rng->dev);
|
|
|
|
|
|
@@ -98,17 +99,20 @@ static int exynos_read(struct hwrng *rng, void *buf,
|
|
while (!(exynos_rng_readl(exynos_rng,
|
|
while (!(exynos_rng_readl(exynos_rng,
|
|
EXYNOS_PRNG_STATUS_OFFSET) & PRNG_DONE) && --retry)
|
|
EXYNOS_PRNG_STATUS_OFFSET) & PRNG_DONE) && --retry)
|
|
cpu_relax();
|
|
cpu_relax();
|
|
- if (!retry)
|
|
|
|
- return -ETIMEDOUT;
|
|
|
|
|
|
+ if (!retry) {
|
|
|
|
+ ret = -ETIMEDOUT;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
|
|
exynos_rng_writel(exynos_rng, PRNG_DONE, EXYNOS_PRNG_STATUS_OFFSET);
|
|
exynos_rng_writel(exynos_rng, PRNG_DONE, EXYNOS_PRNG_STATUS_OFFSET);
|
|
|
|
|
|
*data = exynos_rng_readl(exynos_rng, EXYNOS_PRNG_OUT1_OFFSET);
|
|
*data = exynos_rng_readl(exynos_rng, EXYNOS_PRNG_OUT1_OFFSET);
|
|
|
|
|
|
|
|
+out:
|
|
pm_runtime_mark_last_busy(exynos_rng->dev);
|
|
pm_runtime_mark_last_busy(exynos_rng->dev);
|
|
pm_runtime_put_sync_autosuspend(exynos_rng->dev);
|
|
pm_runtime_put_sync_autosuspend(exynos_rng->dev);
|
|
|
|
|
|
- return 4;
|
|
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static int exynos_rng_probe(struct platform_device *pdev)
|
|
static int exynos_rng_probe(struct platform_device *pdev)
|