hwrng: rockchip: fix bugs on read trng output regs

memcpy_fromio requrie 8 byte align on arm64 while crypto v1 trng output
regs offset is 0x204.

Change-Id: Ida2239a3d493bd9910c63ae4c4be1c23f9cc1212
Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com>
This commit is contained in:
Lin Jinhan 2019-10-15 09:49:31 +08:00 committed by Tao Huang
commit 689282bdce

View file

@ -84,6 +84,11 @@ static void rk_rng_writel(struct rk_rng *rng, u32 val, u32 offset)
__raw_writel(val, rng->mem + offset);
}
static u32 rk_rng_readl(struct rk_rng *rng, u32 offset)
{
return __raw_readl(rng->mem + offset);
}
static int rk_rng_init(struct hwrng *rng)
{
int ret;
@ -108,6 +113,15 @@ static void rk_rng_cleanup(struct hwrng *rng)
clk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks);
}
static void rk_rng_read_regs(struct rk_rng *rng, u32 offset, void *buf,
size_t size)
{
u32 i;
for (i = 0; i < size; i += 4)
*(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i));
}
static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)
{
int ret = 0;
@ -133,7 +147,7 @@ static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)
ret = min_t(size_t, max, RK_MAX_RNG_BYTE);
memcpy_fromio(buf, rk_rng->mem + CRYPTO_V1_TRNG_DOUT_0, ret);
rk_rng_read_regs(rk_rng, CRYPTO_V1_TRNG_DOUT_0, buf, ret);
out:
/* close TRNG */
@ -174,7 +188,7 @@ static int rk_rng_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)
ret = min_t(size_t, max, RK_MAX_RNG_BYTE);
memcpy_fromio(buf, rk_rng->mem + CRYPTO_V2_RNG_DOUT_0, ret);
rk_rng_read_regs(rk_rng, CRYPTO_V2_RNG_DOUT_0, buf, ret);
out:
/* close TRNG */