Commit b9957fc9 authored by Martin Kaiser's avatar Martin Kaiser Committed by Herbert Xu

hwrng: imx-rngc - check the rng type

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.
Reviewed-by: default avatarPrasannaKumar Muralidharan <prasannatsmkumar@gmail.com>
Signed-off-by: default avatarMartin Kaiser <martin@kaiser.cx>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent f7d79450
...@@ -18,12 +18,22 @@ ...@@ -18,12 +18,22 @@
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/io.h> #include <linux/io.h>
#define RNGC_VER_ID 0x0000
#define RNGC_COMMAND 0x0004 #define RNGC_COMMAND 0x0004
#define RNGC_CONTROL 0x0008 #define RNGC_CONTROL 0x0008
#define RNGC_STATUS 0x000C #define RNGC_STATUS 0x000C
#define RNGC_ERROR 0x0010 #define RNGC_ERROR 0x0010
#define RNGC_FIFO 0x0014 #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_ERR 0x00000020
#define RNGC_CMD_CLR_INT 0x00000010 #define RNGC_CMD_CLR_INT 0x00000010
#define RNGC_CMD_SEED 0x00000002 #define RNGC_CMD_SEED 0x00000002
...@@ -212,6 +222,8 @@ static int imx_rngc_probe(struct platform_device *pdev) ...@@ -212,6 +222,8 @@ static int imx_rngc_probe(struct platform_device *pdev)
struct imx_rngc *rngc; struct imx_rngc *rngc;
int ret; int ret;
int irq; int irq;
u32 ver_id;
u8 rng_type;
rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL); rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL);
if (!rngc) if (!rngc)
...@@ -237,6 +249,17 @@ static int imx_rngc_probe(struct platform_device *pdev) ...@@ -237,6 +249,17 @@ static int imx_rngc_probe(struct platform_device *pdev)
if (ret) if (ret)
return 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, ret = devm_request_irq(&pdev->dev,
irq, imx_rngc_irq, 0, pdev->name, (void *)rngc); irq, imx_rngc_irq, 0, pdev->name, (void *)rngc);
if (ret) { if (ret) {
...@@ -269,7 +292,10 @@ static int imx_rngc_probe(struct platform_device *pdev) ...@@ -269,7 +292,10 @@ static int imx_rngc_probe(struct platform_device *pdev)
goto err; 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; return 0;
err: err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment