* [PATCH 1/5] MIPS: BCM63XX: fix BCM6368 IPSec clock bit
2011-12-09 19:01 [PATCH 0/5] Broadcom BCM63xx RNG support Florian Fainelli
@ 2011-12-09 19:01 ` Florian Fainelli
2011-12-09 19:01 ` [PATCH 2/5] MIPS: BCM63XX: add support for "ipsec" clock Florian Fainelli
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Florian Fainelli @ 2011-12-09 19:01 UTC (permalink / raw)
To: Matt Mackall; +Cc: Herbert Xu, ralf, linux-mips, Florian Fainelli
The IPsec clock bit is 18 and not 17.
Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
index 94d4faa..fdcd78c 100644
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
@@ -99,7 +99,7 @@
#define CKCTL_6368_USBH_CLK_EN (1 << 15)
#define CKCTL_6368_DISABLE_GLESS_EN (1 << 16)
#define CKCTL_6368_NAND_CLK_EN (1 << 17)
-#define CKCTL_6368_IPSEC_CLK_EN (1 << 17)
+#define CKCTL_6368_IPSEC_CLK_EN (1 << 18)
#define CKCTL_6368_ALL_SAFE_EN (CKCTL_6368_SWPKT_USB_EN | \
CKCTL_6368_SWPKT_SAR_EN | \
--
1.7.5.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/5] MIPS: BCM63XX: add support for "ipsec" clock
2011-12-09 19:01 [PATCH 0/5] Broadcom BCM63xx RNG support Florian Fainelli
2011-12-09 19:01 ` [PATCH 1/5] MIPS: BCM63XX: fix BCM6368 IPSec clock bit Florian Fainelli
@ 2011-12-09 19:01 ` Florian Fainelli
2011-12-09 19:01 ` [PATCH 3/5] MIPS: BCM63XX: add TRNG peripheral definitions Florian Fainelli
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Florian Fainelli @ 2011-12-09 19:01 UTC (permalink / raw)
To: Matt Mackall; +Cc: Herbert Xu, ralf, linux-mips, Florian Fainelli
This module is only available on BCM6368 so far and does not require
resetting the block.
Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
arch/mips/bcm63xx/clk.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c
index 9d57c71..28137d5 100644
--- a/arch/mips/bcm63xx/clk.c
+++ b/arch/mips/bcm63xx/clk.c
@@ -222,6 +222,18 @@ static struct clk clk_xtm = {
};
/*
+ * IPsec clock
+ */
+static void ipsec_set(struct clk *clk, int enable)
+{
+ bcm_hwclock_set(CKCTL_6368_IPSEC_CLK_EN, enable);
+}
+
+static struct clk clk_ipsec = {
+ .set = ipsec_set,
+};
+
+/*
* Internal peripheral clock
*/
static struct clk clk_periph = {
@@ -278,6 +290,8 @@ struct clk *clk_get(struct device *dev, const char *id)
return &clk_periph;
if (BCMCPU_IS_6358() && !strcmp(id, "pcm"))
return &clk_pcm;
+ if (BCMCPU_IS_6368() && !strcmp(id, "ipsec"))
+ return &clk_ipsec;
return ERR_PTR(-ENOENT);
}
--
1.7.5.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 3/5] MIPS: BCM63XX: add TRNG peripheral definitions
2011-12-09 19:01 [PATCH 0/5] Broadcom BCM63xx RNG support Florian Fainelli
2011-12-09 19:01 ` [PATCH 1/5] MIPS: BCM63XX: fix BCM6368 IPSec clock bit Florian Fainelli
2011-12-09 19:01 ` [PATCH 2/5] MIPS: BCM63XX: add support for "ipsec" clock Florian Fainelli
@ 2011-12-09 19:01 ` Florian Fainelli
2011-12-09 19:01 ` [PATCH 4/5] MIPS: BCM63XX: add RNG driver platform_device stub Florian Fainelli
2011-12-09 19:01 ` [PATCH 5/5] hw_random: add Broadcom BCM63xx RNG driver Florian Fainelli
4 siblings, 0 replies; 8+ messages in thread
From: Florian Fainelli @ 2011-12-09 19:01 UTC (permalink / raw)
To: Matt Mackall; +Cc: Herbert Xu, ralf, linux-mips, Florian Fainelli
Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h | 9 +++++++++
arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | 13 +++++++++++++
2 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h
index 5b8d15b..f0ab172 100644
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h
@@ -130,6 +130,7 @@ enum bcm63xx_regs_set {
RSET_PCMDMA,
RSET_PCMDMAC,
RSET_PCMDMAS,
+ RSET_TRNG
};
#define RSET_DSL_LMEM_SIZE (64 * 1024 * 4)
@@ -149,6 +150,7 @@ enum bcm63xx_regs_set {
#define RSET_XTMDMA_SIZE 256
#define RSET_XTMDMAC_SIZE(chans) (16 * (chans))
#define RSET_XTMDMAS_SIZE(chans) (16 * (chans))
+#define RSET_TRNG_SIZE 20
/*
* 6338 register sets base address
@@ -193,6 +195,7 @@ enum bcm63xx_regs_set {
#define BCM_6338_PCMDMA_BASE (0xdeadbeef)
#define BCM_6338_PCMDMAC_BASE (0xdeadbeef)
#define BCM_6338_PCMDMAS_BASE (0xdeadbeef)
+#define BCM_6338_TRNG_BASE (0xdeadbeef)
/*
* 6345 register sets base address
@@ -237,6 +240,7 @@ enum bcm63xx_regs_set {
#define BCM_6345_PCMDMA_BASE (0xdeadbeef)
#define BCM_6345_PCMDMAC_BASE (0xdeadbeef)
#define BCM_6345_PCMDMAS_BASE (0xdeadbeef)
+#define BCM_6345_TRNG_BASE (0xdeadbeef)
/*
* 6348 register sets base address
@@ -278,6 +282,7 @@ enum bcm63xx_regs_set {
#define BCM_6348_PCMDMA_BASE (0xdeadbeef)
#define BCM_6348_PCMDMAC_BASE (0xdeadbeef)
#define BCM_6348_PCMDMAS_BASE (0xdeadbeef)
+#define BCM_6348_TRNG_BASE (0xdeadbeef)
/*
* 6358 register sets base address
@@ -319,6 +324,7 @@ enum bcm63xx_regs_set {
#define BCM_6358_PCMDMA_BASE (0xfffe1800)
#define BCM_6358_PCMDMAC_BASE (0xfffe1900)
#define BCM_6358_PCMDMAS_BASE (0xfffe1a00)
+#define BCM_6358_TRNG_BASE (0xdeadbeef)
/*
@@ -361,6 +367,7 @@ enum bcm63xx_regs_set {
#define BCM_6368_PCMDMA_BASE (0xb0005800)
#define BCM_6368_PCMDMAC_BASE (0xb0005a00)
#define BCM_6368_PCMDMAS_BASE (0xb0005c00)
+#define BCM_6368_TRNG_BASE (0xb0004180)
extern const unsigned long *bcm63xx_regs_base;
@@ -407,6 +414,7 @@ extern const unsigned long *bcm63xx_regs_base;
__GEN_RSET_BASE(__cpu, PCMDMA) \
__GEN_RSET_BASE(__cpu, PCMDMAC) \
__GEN_RSET_BASE(__cpu, PCMDMAS) \
+ __GEN_RSET_BASE(__cpu, TRNG) \
}
#define __GEN_CPU_REGS_TABLE(__cpu) \
@@ -446,6 +454,7 @@ extern const unsigned long *bcm63xx_regs_base;
[RSET_PCMDMA] = BCM_## __cpu ##_PCMDMA_BASE, \
[RSET_PCMDMAC] = BCM_## __cpu ##_PCMDMAC_BASE, \
[RSET_PCMDMAS] = BCM_## __cpu ##_PCMDMAS_BASE, \
+ [RSET_TRNG] = BCM_## __cpu ##_TRNG_BASE, \
static inline unsigned long bcm63xx_regset_address(enum bcm63xx_regs_set set)
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
index fdcd78c..0de0bd9 100644
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
@@ -973,4 +973,17 @@
#define M2M_SRCID_REG(x) ((x) * 0x40 + 0x14)
#define M2M_DSTID_REG(x) ((x) * 0x40 + 0x18)
+/*************************************************************************
+ * _REG relative to RSET_TRNG
+ *************************************************************************/
+#define TRNG_CTRL 0x00
+#define TRNG_EN (1 << 0)
+
+#define TRNG_STAT 0x04
+#define TRNG_AVAIL_MASK (0xff000000)
+
+#define TRNG_DATA 0x08
+#define TRNG_THRES 0x0c
+#define TRNG_MASK 0x10
+
#endif /* BCM63XX_REGS_H_ */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 4/5] MIPS: BCM63XX: add RNG driver platform_device stub
2011-12-09 19:01 [PATCH 0/5] Broadcom BCM63xx RNG support Florian Fainelli
` (2 preceding siblings ...)
2011-12-09 19:01 ` [PATCH 3/5] MIPS: BCM63XX: add TRNG peripheral definitions Florian Fainelli
@ 2011-12-09 19:01 ` Florian Fainelli
2011-12-10 14:46 ` Sergei Shtylyov
2011-12-09 19:01 ` [PATCH 5/5] hw_random: add Broadcom BCM63xx RNG driver Florian Fainelli
4 siblings, 1 reply; 8+ messages in thread
From: Florian Fainelli @ 2011-12-09 19:01 UTC (permalink / raw)
To: Matt Mackall; +Cc: Herbert Xu, ralf, linux-mips, Florian Fainelli
Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
arch/mips/bcm63xx/Makefile | 3 ++-
arch/mips/bcm63xx/dev-trng.c | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletions(-)
create mode 100644 arch/mips/bcm63xx/dev-trng.c
diff --git a/arch/mips/bcm63xx/Makefile b/arch/mips/bcm63xx/Makefile
index 6dfdc69..95c45b5 100644
--- a/arch/mips/bcm63xx/Makefile
+++ b/arch/mips/bcm63xx/Makefile
@@ -1,5 +1,6 @@
obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \
- dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o dev-wdt.o
+ dev-dsp.o dev-enet.o dev-pcmcia.o dev-trng.o dev-uart.o \
+ dev-wdt.o
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
obj-y += boards/
diff --git a/arch/mips/bcm63xx/dev-trng.c b/arch/mips/bcm63xx/dev-trng.c
new file mode 100644
index 0000000..19ccfbf
--- /dev/null
+++ b/arch/mips/bcm63xx/dev-trng.c
@@ -0,0 +1,40 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2011 Florian Fainelli <florian@openwrt.org>
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <bcm63xx_cpu.h>
+
+static struct resource trng_resources[] = {
+ {
+ .start = -1, /* filled at runtime */
+ .end = -1, /* filled at runtime */
+ .flags = IORESOURCE_MEM,
+ },
+};
+
+static struct platform_device bcm63xx_trng_device = {
+ .name = "bcm63xx-trng",
+ .id = 0,
+ .num_resources = ARRAY_SIZE(trng_resources),
+ .resource = trng_resources,
+};
+
+int __init bcm63xx_trng_register(void)
+{
+ if (!BCMCPU_IS_6368())
+ return -ENODEV;
+
+ trng_resources[0].start = bcm63xx_regset_address(RSET_TRNG);
+ trng_resources[0].end = trng_resources[0].start;
+ trng_resources[0].end += RSET_TRNG_SIZE - 1;
+
+ return platform_device_register(&bcm63xx_trng_device);
+}
+arch_initcall(bcm63xx_trng_register);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 4/5] MIPS: BCM63XX: add RNG driver platform_device stub
2011-12-09 19:01 ` [PATCH 4/5] MIPS: BCM63XX: add RNG driver platform_device stub Florian Fainelli
@ 2011-12-10 14:46 ` Sergei Shtylyov
2011-12-16 15:03 ` Florian Fainelli
0 siblings, 1 reply; 8+ messages in thread
From: Sergei Shtylyov @ 2011-12-10 14:46 UTC (permalink / raw)
To: Florian Fainelli; +Cc: Matt Mackall, Herbert Xu, ralf, linux-mips
Hello.
On 09-12-2011 23:01, Florian Fainelli wrote:
> Signed-off-by: Florian Fainelli<florian@openwrt.org>
[...]
> diff --git a/arch/mips/bcm63xx/dev-trng.c b/arch/mips/bcm63xx/dev-trng.c
> new file mode 100644
> index 0000000..19ccfbf
> --- /dev/null
> +++ b/arch/mips/bcm63xx/dev-trng.c
> @@ -0,0 +1,40 @@
[...]
> +static struct resource trng_resources[] = {
> + {
> + .start = -1, /* filled at runtime */
> + .end = -1, /* filled at runtime */
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
> +static struct platform_device bcm63xx_trng_device = {
> + .name = "bcm63xx-trng",
> + .id = 0,
Why not -1? Isn't there only single device of this sort?
WBR, Sergei
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 4/5] MIPS: BCM63XX: add RNG driver platform_device stub
2011-12-10 14:46 ` Sergei Shtylyov
@ 2011-12-16 15:03 ` Florian Fainelli
0 siblings, 0 replies; 8+ messages in thread
From: Florian Fainelli @ 2011-12-16 15:03 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: Matt Mackall, Herbert Xu, ralf, linux-mips
Hello Sergei,
On 12/10/11 15:46, Sergei Shtylyov wrote:
> Hello.
>
> On 09-12-2011 23:01, Florian Fainelli wrote:
>
>> Signed-off-by: Florian Fainelli<florian@openwrt.org>
> [...]
>
>> diff --git a/arch/mips/bcm63xx/dev-trng.c b/arch/mips/bcm63xx/dev-trng.c
>> new file mode 100644
>> index 0000000..19ccfbf
>> --- /dev/null
>> +++ b/arch/mips/bcm63xx/dev-trng.c
>> @@ -0,0 +1,40 @@
> [...]
>> +static struct resource trng_resources[] = {
>> + {
>> + .start = -1, /* filled at runtime */
>> + .end = -1, /* filled at runtime */
>> + .flags = IORESOURCE_MEM,
>> + },
>> +};
>> +
>> +static struct platform_device bcm63xx_trng_device = {
>> + .name = "bcm63xx-trng",
>> + .id = 0,
>
> Why not -1? Isn't there only single device of this sort?
There is a single device, I will fix that in a second version of the
patchset.
--
Florian
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 5/5] hw_random: add Broadcom BCM63xx RNG driver
2011-12-09 19:01 [PATCH 0/5] Broadcom BCM63xx RNG support Florian Fainelli
` (3 preceding siblings ...)
2011-12-09 19:01 ` [PATCH 4/5] MIPS: BCM63XX: add RNG driver platform_device stub Florian Fainelli
@ 2011-12-09 19:01 ` Florian Fainelli
4 siblings, 0 replies; 8+ messages in thread
From: Florian Fainelli @ 2011-12-09 19:01 UTC (permalink / raw)
To: Matt Mackall; +Cc: Herbert Xu, ralf, linux-mips, Florian Fainelli
Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
drivers/char/hw_random/Kconfig | 14 +++
drivers/char/hw_random/Makefile | 1 +
drivers/char/hw_random/bcm63xx-rng.c | 175 ++++++++++++++++++++++++++++++++++
3 files changed, 190 insertions(+), 0 deletions(-)
create mode 100644 drivers/char/hw_random/bcm63xx-rng.c
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index 0689bf6..f29d1bc 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -73,6 +73,20 @@ config HW_RANDOM_ATMEL
If unsure, say Y.
+config HW_RANDOM_BCM63XX
+ tristate "Broadcom BCM63xx Random Number Generator support"
+ depends on HW_RANDOM && BCM63XX
+ default HW_RANDOM
+ ---help---
+ This driver provides kernel-side support for the Random Number
+ Generator hardware found on the Broadcom BCM63xx SoCs.
+
+ To compile this driver as a module, choose M here: the
+ module will be called bcm63xx-rng
+
+ If unusure, say Y.
+
+
config HW_RANDOM_GEODE
tristate "AMD Geode HW Random Number Generator support"
depends on HW_RANDOM && X86_32 && PCI
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index b2ff526..8cfac60 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_HW_RANDOM_TIMERIOMEM) += timeriomem-rng.o
obj-$(CONFIG_HW_RANDOM_INTEL) += intel-rng.o
obj-$(CONFIG_HW_RANDOM_AMD) += amd-rng.o
obj-$(CONFIG_HW_RANDOM_ATMEL) += atmel-rng.o
+obj-$(CONFIG_HW_RANDOM_BCM63XX) += bcm63xx-rng.o
obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o
obj-$(CONFIG_HW_RANDOM_N2RNG) += n2-rng.o
n2-rng-y := n2-drv.o n2-asm.o
diff --git a/drivers/char/hw_random/bcm63xx-rng.c b/drivers/char/hw_random/bcm63xx-rng.c
new file mode 100644
index 0000000..80e282d
--- /dev/null
+++ b/drivers/char/hw_random/bcm63xx-rng.c
@@ -0,0 +1,175 @@
+/*
+ * Broadcom BCM63xx Random Number Generator support
+ *
+ * Copyright (C) 2011, Florian Fainelli <florian@openwrt.org>
+ * Copyright (C) 2009, Broadcom Corporation
+ *
+ */
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/platform_device.h>
+#include <linux/hw_random.h>
+
+#include <bcm63xx_io.h>
+#include <bcm63xx_regs.h>
+
+struct bcm63xx_trng_priv {
+ struct clk *clk;
+ void __iomem *regs;
+};
+
+#define to_trng_priv(rng) ((struct bcm63xx_trng_priv *)rng->priv)
+
+static int bcm63xx_trng_init(struct hwrng *rng)
+{
+ struct bcm63xx_trng_priv *priv = to_trng_priv(rng);
+ u32 val;
+
+ val = bcm_readl(priv->regs + TRNG_CTRL);
+ val |= TRNG_EN;
+ bcm_writel(val, priv->regs + TRNG_CTRL);
+
+ return 0;
+}
+
+static void bcm63xx_trng_cleanup(struct hwrng *rng)
+{
+ struct bcm63xx_trng_priv *priv = to_trng_priv(rng);
+ u32 val;
+
+ val = bcm_readl(priv->regs + TRNG_CTRL);
+ val &= ~TRNG_EN;
+ bcm_writel(val, priv->regs + TRNG_CTRL);
+}
+
+static int bcm63xx_trng_data_present(struct hwrng *rng, int wait)
+{
+ struct bcm63xx_trng_priv *priv = to_trng_priv(rng);
+
+ return bcm_readl(priv->regs + TRNG_STAT) & TRNG_AVAIL_MASK;
+}
+
+static int bcm63xx_trng_data_read(struct hwrng *rng, u32 *data)
+{
+ struct bcm63xx_trng_priv *priv = to_trng_priv(rng);
+
+ *data = bcm_readl(priv->regs + TRNG_DATA);
+
+ return 4;
+}
+
+static int __init bcm63xx_trng_probe(struct platform_device *pdev)
+{
+ struct resource *r;
+ struct clk *clk;
+ int ret;
+ struct bcm63xx_trng_priv *priv;
+ struct hwrng *rng;
+
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!r) {
+ dev_err(&pdev->dev, "no iomem resource\n");
+ ret = -ENXIO;
+ goto out;
+ }
+
+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ if (!priv) {
+ dev_err(&pdev->dev, "no memory for private structure\n");
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ rng = kzalloc(sizeof(*rng), GFP_KERNEL);
+ if (!rng) {
+ dev_err(&pdev->dev, "no memory for rng structure\n");
+ ret = -ENOMEM;
+ goto out_free_priv;
+ }
+
+ platform_set_drvdata(pdev, rng);
+ rng->priv = (unsigned long)priv;
+ rng->name = pdev->name;
+ rng->init = bcm63xx_trng_init;
+ rng->cleanup = bcm63xx_trng_cleanup;
+ rng->data_present = bcm63xx_trng_data_present;
+ rng->data_read = bcm63xx_trng_data_read;
+
+ clk = clk_get(&pdev->dev, "ipsec");
+ if (IS_ERR(clk)) {
+ dev_err(&pdev->dev, "no clock for device\n");
+ ret = PTR_ERR(clk);
+ goto out_free_rng;
+ }
+
+ priv->clk = clk;
+
+ if (!devm_request_mem_region(&pdev->dev, r->start,
+ resource_size(r), pdev->name)) {
+ dev_err(&pdev->dev, "request mem failed");
+ ret = -ENOMEM;
+ goto out_free_rng;
+ }
+
+ priv->regs = devm_ioremap_nocache(&pdev->dev, r->start,
+ resource_size(r));
+ if (!priv->regs) {
+ dev_err(&pdev->dev, "ioremap failed");
+ ret = -ENOMEM;
+ goto out_free_rng;
+ }
+
+ clk_enable(clk);
+
+ ret = hwrng_register(rng);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to register rng device\n");
+ goto out_clk_disable;
+ }
+
+ dev_info(&pdev->dev, "registered RNG driver\n");
+
+ return 0;
+
+out_clk_disable:
+ clk_disable(clk);
+out_free_rng:
+ platform_set_drvdata(pdev, NULL);
+ kfree(rng);
+out_free_priv:
+ kfree(priv);
+out:
+ return ret;
+}
+
+static int __devexit bcm63xx_trng_remove(struct platform_device *pdev)
+{
+ struct hwrng *rng = platform_get_drvdata(pdev);
+ struct bcm63xx_trng_priv *priv = to_trng_priv(rng);
+
+ hwrng_unregister(rng);
+ clk_disable(priv->clk);
+ kfree(priv);
+ kfree(rng);
+ platform_set_drvdata(pdev, NULL);
+
+ return 0;
+}
+
+static struct platform_driver bcm63xx_trng_driver = {
+ .probe = bcm63xx_trng_probe,
+ .remove = __devexit_p(bcm63xx_trng_remove),
+ .driver = {
+ .name = "bcm63xx-trng",
+ .owner = THIS_MODULE,
+ },
+};
+
+module_platform_driver(bcm63xx_trng_driver);
+
+MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
+MODULE_DESCRIPTION("Broadcom BCM63xx RNG driver");
+MODULE_LICENSE("GPL");
--
1.7.5.4
^ permalink raw reply related [flat|nested] 8+ messages in thread