[linux-yocto] [PATCH 18/21] char: hwrng: AXXIA AXM35xx TRNG driver support
Cristian Bercaru
cristian.bercaru at windriver.com
Fri May 15 05:24:59 PDT 2015
From: Sreedevi Joshi <sreedevi.joshi at intel.com>
AXXIA AXM35xx TRNG driver support added.
Signed-off-by: Sreedevi Joshi <sreedevi.joshi at intel.com>
---
arch/powerpc/boot/dts/acp35xx.dts | 10 +++++++
drivers/char/hw_random/axxia-rng.c | 56 +++++++-----------------------------
2 files changed, 20 insertions(+), 46 deletions(-)
diff --git a/arch/powerpc/boot/dts/acp35xx.dts b/arch/powerpc/boot/dts/acp35xx.dts
index d1f7863..71b8e98 100644
--- a/arch/powerpc/boot/dts/acp35xx.dts
+++ b/arch/powerpc/boot/dts/acp35xx.dts
@@ -307,6 +307,16 @@
sbb-reg = <0x00500000 0x8000>;
tzc-reg = <0x00541000 0x1000>;
};
+
+ TRNG: trng {
+ compatible = "lsi,trng";
+ enabled = <1>;
+ reg = <0x00460000 0x20000>;
+ interrupt-parent = <&MPIC>;
+ interrupts = <43>;
+ status = "ok";
+ };
+
};
};
diff --git a/drivers/char/hw_random/axxia-rng.c b/drivers/char/hw_random/axxia-rng.c
index b752e6b..c7ddb47 100644
--- a/drivers/char/hw_random/axxia-rng.c
+++ b/drivers/char/hw_random/axxia-rng.c
@@ -101,41 +101,6 @@ enum {
TRNG_AXM55xx_CMD_RESET = 0x7,
} ncp_trng_acp34xx_reg_cmds_t;
-struct ncp_trng_axm55xx_reg_sts_t {
-#ifdef NCP_BIG_ENDIAN
- unsigned data_cnt:16;
- unsigned prediction_resistance:1;
- unsigned continuous_test_off:1;
- unsigned reseed_required:1;
- unsigned ro_entropy:1;
- unsigned rdy:1;
- unsigned err:1;
- unsigned ro_test_in_progress:1;
- unsigned rng_test_in_progress:1;
- unsigned continuous_test_failed:1;
- unsigned ro_test_failed:1;
- unsigned rng_test_failed:1;
- unsigned data_valid:1;
- unsigned standby:1;
- unsigned cmd:3;
-#else
- unsigned cmd:3;
- unsigned standby:1;
- unsigned data_valid:1;
- unsigned rng_test_failed:1;
- unsigned ro_test_failed:1;
- unsigned continuous_test_failed:1;
- unsigned rng_test_in_progress:1;
- unsigned ro_test_in_progress:1;
- unsigned err:1;
- unsigned rdy:1;
- unsigned ro_entropy:1;
- unsigned reseed_required:1;
- unsigned continuous_test_off:1;
- unsigned prediction_resistance:1;
- unsigned data_cnt:16;
-#endif
-} ncp_trng_axm55xx_reg_sts_t;
#define TRNG_AXM55xx_STS_RDY_MSK (0x0800)
#define TRNG_AXM55xx_STS_ERR_MSK (0x0400)
@@ -330,10 +295,9 @@ static int axxia_trng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
{
static struct trng_dev *dev;
unsigned int j = 0, num = 0;
- u32 rword;
- u32 rsts;
- struct ncp_trng_axm55xx_reg_sts_t sts = {0};
-
+ u32 rword = 0;
+ u32 rsts = 0;
+ u32 sts = 0;
if ((!rng) || (!buf))
return -EINVAL;
@@ -367,6 +331,7 @@ static int axxia_trng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
if (trng_test_mode != -1)
return -EINVAL;
+
for (j = 0; j < max; ) {
/* Read from STS + DOUT */
if (dev->words_avail) {
@@ -396,14 +361,13 @@ static int axxia_trng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
TRNG_AXM55xx_SLEEP_USECS + 1);
} else {
/* get next data count */
- sts = *((struct ncp_trng_axm55xx_reg_sts_t *)
- &(dev->regs->sts));
-
- if (sts.err)
+ sts = readl(&dev->regs->sts);
+ if (sts & TRNG_AXM55xx_STS_ERR_MSK)
return -EIO;
- else if (sts.data_valid)
- dev->words_avail = sts.data_cnt;
- else if (sts.cmd != TRNG_AXM55xx_CMD_GENERATE)
+ else if (sts & TRNG_AXM55xx_STS_DOUT_VALID_MSK)
+ dev->words_avail = (sts >> 16) & 0xFFFF;
+ else if ((sts & TRNG_AXM55xx_STS_CMD_MSK) !=
+ TRNG_AXM55xx_CMD_GENERATE)
return -EIO;
}
}
--
1.7.9.5
More information about the linux-yocto
mailing list