diff mbox series

[5/6] hwrng: imx-rngc - check the rng type

Message ID 20200128110102.11522-6-martin@kaiser.cx (mailing list archive)
State New, archived
Headers show
Series imx-rngc - several small fixes | expand

Commit Message

Martin Kaiser Jan. 28, 2020, 11:01 a.m. UTC
Read the rng type and hardware revision during probe. Fail the probe
operation if the type is not one of rngc or rngb.
(There's also an rnga type, which needs a different driver.)

Display the type and revision in a debug print if probe was successful.

Signed-off-by: Martin Kaiser <martin@kaiser.cx>
---
 drivers/char/hw_random/imx-rngc.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

Comments

PrasannaKumar Muralidharan Feb. 12, 2020, 4:23 p.m. UTC | #1
On Tue, 28 Jan 2020 at 16:31, Martin Kaiser <martin@kaiser.cx> wrote:
>
> Read the rng type and hardware revision during probe. Fail the probe
> operation if the type is not one of rngc or rngb.
> (There's also an rnga type, which needs a different driver.)
>
> Display the type and revision in a debug print if probe was successful.
>
> Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> ---
>  drivers/char/hw_random/imx-rngc.c | 28 +++++++++++++++++++++++++++-
>  1 file changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/char/hw_random/imx-rngc.c b/drivers/char/hw_random/imx-rngc.c
> index 8222055b9e9b..27d85fced30b 100644
> --- a/drivers/char/hw_random/imx-rngc.c
> +++ b/drivers/char/hw_random/imx-rngc.c
> @@ -18,12 +18,22 @@
>  #include <linux/completion.h>
>  #include <linux/io.h>
>
> +#define RNGC_VER_ID                    0x0000
>  #define RNGC_COMMAND                   0x0004
>  #define RNGC_CONTROL                   0x0008
>  #define RNGC_STATUS                    0x000C
>  #define RNGC_ERROR                     0x0010
>  #define RNGC_FIFO                      0x0014
>
> +/* the fields in the ver id register */
> +#define RNGC_TYPE_SHIFT                28
> +#define RNGC_VER_MAJ_SHIFT             8
> +
> +/* the rng_type field */
> +#define RNGC_TYPE_RNGB                 0x1
> +#define RNGC_TYPE_RNGC                 0x2
> +
> +
>  #define RNGC_CMD_CLR_ERR               0x00000020
>  #define RNGC_CMD_CLR_INT               0x00000010
>  #define RNGC_CMD_SEED                  0x00000002
> @@ -212,6 +222,8 @@ static int imx_rngc_probe(struct platform_device *pdev)
>         struct imx_rngc *rngc;
>         int ret;
>         int irq;
> +       u32 ver_id;
> +       u8  rng_type;
>
>         rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL);
>         if (!rngc)
> @@ -237,6 +249,17 @@ static int imx_rngc_probe(struct platform_device *pdev)
>         if (ret)
>                 return ret;
>
> +       ver_id = readl(rngc->base + RNGC_VER_ID);
> +       rng_type = ver_id >> RNGC_TYPE_SHIFT;
> +       /*
> +        * This driver supports only RNGC and RNGB. (There's a different
> +        * driver for RNGA.)
> +        */
> +       if (rng_type != RNGC_TYPE_RNGC && rng_type != RNGC_TYPE_RNGB) {
> +               ret = -ENODEV;
> +               goto err;
> +       }
> +
>         ret = devm_request_irq(&pdev->dev,
>                         irq, imx_rngc_irq, 0, pdev->name, (void *)rngc);
>         if (ret) {
> @@ -269,7 +292,10 @@ static int imx_rngc_probe(struct platform_device *pdev)
>                 goto err;
>         }
>
> -       dev_info(&pdev->dev, "Freescale RNGC registered.\n");
> +       dev_info(&pdev->dev,
> +               "Freescale RNG%c registered (HW revision %d.%02d)\n",
> +               rng_type == RNGC_TYPE_RNGB ? 'B' : 'C',
> +               (ver_id >> RNGC_VER_MAJ_SHIFT) & 0xff, ver_id & 0xff);
>         return 0;
>
>  err:
> --
> 2.20.1
>

Reviewed-by: PrasannaKumar Muralidharan <prasannatsmkumar@gmail.com>
diff mbox series

Patch

diff --git a/drivers/char/hw_random/imx-rngc.c b/drivers/char/hw_random/imx-rngc.c
index 8222055b9e9b..27d85fced30b 100644
--- a/drivers/char/hw_random/imx-rngc.c
+++ b/drivers/char/hw_random/imx-rngc.c
@@ -18,12 +18,22 @@ 
 #include <linux/completion.h>
 #include <linux/io.h>
 
+#define RNGC_VER_ID			0x0000
 #define RNGC_COMMAND			0x0004
 #define RNGC_CONTROL			0x0008
 #define RNGC_STATUS			0x000C
 #define RNGC_ERROR			0x0010
 #define RNGC_FIFO			0x0014
 
+/* the fields in the ver id register */
+#define RNGC_TYPE_SHIFT		28
+#define RNGC_VER_MAJ_SHIFT		8
+
+/* the rng_type field */
+#define RNGC_TYPE_RNGB			0x1
+#define RNGC_TYPE_RNGC			0x2
+
+
 #define RNGC_CMD_CLR_ERR		0x00000020
 #define RNGC_CMD_CLR_INT		0x00000010
 #define RNGC_CMD_SEED			0x00000002
@@ -212,6 +222,8 @@  static int imx_rngc_probe(struct platform_device *pdev)
 	struct imx_rngc *rngc;
 	int ret;
 	int irq;
+	u32 ver_id;
+	u8  rng_type;
 
 	rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL);
 	if (!rngc)
@@ -237,6 +249,17 @@  static int imx_rngc_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
+	ver_id = readl(rngc->base + RNGC_VER_ID);
+	rng_type = ver_id >> RNGC_TYPE_SHIFT;
+	/*
+	 * This driver supports only RNGC and RNGB. (There's a different
+	 * driver for RNGA.)
+	 */
+	if (rng_type != RNGC_TYPE_RNGC && rng_type != RNGC_TYPE_RNGB) {
+		ret = -ENODEV;
+		goto err;
+	}
+
 	ret = devm_request_irq(&pdev->dev,
 			irq, imx_rngc_irq, 0, pdev->name, (void *)rngc);
 	if (ret) {
@@ -269,7 +292,10 @@  static int imx_rngc_probe(struct platform_device *pdev)
 		goto err;
 	}
 
-	dev_info(&pdev->dev, "Freescale RNGC registered.\n");
+	dev_info(&pdev->dev,
+		"Freescale RNG%c registered (HW revision %d.%02d)\n",
+		rng_type == RNGC_TYPE_RNGB ? 'B' : 'C',
+		(ver_id >> RNGC_VER_MAJ_SHIFT) & 0xff, ver_id & 0xff);
 	return 0;
 
 err: