From: Sreedevi Joshi <sreedevi.jo...@intel.com>

AXXIA AXM35xx TRNG driver support added.

Signed-off-by: Sreedevi Joshi <sreedevi.jo...@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

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to