* [PATCH 02/12] hwrng: bcm2835-rng: Define a driver private context
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
@ 2017-11-02 1:03 ` Florian Fainelli
2017-11-02 1:03 ` [PATCH 03/12] hwrng: bcm2835-rng: Move enabling to hwrng::init Florian Fainelli
` (9 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:03 UTC (permalink / raw)
To: linux-kernel
Cc: Mark Rutland, Stefan Wahren, Florian Fainelli, Martin Kaiser,
Herbert Xu, Scott Branden,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Ray Jui, PrasannaKumar Muralidharan, Harald Freudenberger,
Krzysztof Kozlowski, Eric Anholt, Russell King, Rob Herring,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE, Sean Wang,
Matt Mackall, Steffen Trumtrar <s.
Instead of making hwrng::priv host the base register address, define a
driver private context, make it per platform device instance and pass it
down the different functions.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/bcm2835-rng.c | 55 ++++++++++++++++++++++--------------
1 file changed, 34 insertions(+), 21 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index a818418a7e4c..0d72147ab45b 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -29,6 +29,11 @@
#define RNG_INT_OFF 0x1
+struct bcm2835_rng_priv {
+ struct hwrng rng;
+ void __iomem *base;
+};
+
static void __init nsp_rng_init(void __iomem *base)
{
u32 val;
@@ -39,34 +44,34 @@ static void __init nsp_rng_init(void __iomem *base)
writel(val, base + RNG_INT_MASK);
}
+static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng)
+{
+ return container_of(rng, struct bcm2835_rng_priv, rng);
+}
+
static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
bool wait)
{
- void __iomem *rng_base = (void __iomem *)rng->priv;
+ struct bcm2835_rng_priv *priv = to_rng_priv(rng);
u32 max_words = max / sizeof(u32);
u32 num_words, count;
- while ((__raw_readl(rng_base + RNG_STATUS) >> 24) == 0) {
+ while ((__raw_readl(priv->base + RNG_STATUS) >> 24) == 0) {
if (!wait)
return 0;
cpu_relax();
}
- num_words = readl(rng_base + RNG_STATUS) >> 24;
+ num_words = readl(priv->base + RNG_STATUS) >> 24;
if (num_words > max_words)
num_words = max_words;
for (count = 0; count < num_words; count++)
- ((u32 *)buf)[count] = readl(rng_base + RNG_DATA);
+ ((u32 *)buf)[count] = readl(priv->base + RNG_DATA);
return num_words * sizeof(u32);
}
-static struct hwrng bcm2835_rng_ops = {
- .name = "bcm2835",
- .read = bcm2835_rng_read,
-};
-
static const struct of_device_id bcm2835_rng_of_match[] = {
{ .compatible = "brcm,bcm2835-rng"},
{ .compatible = "brcm,bcm-nsp-rng", .data = nsp_rng_init},
@@ -80,19 +85,27 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
struct device_node *np = dev->of_node;
void (*rng_setup)(void __iomem *base);
const struct of_device_id *rng_id;
- void __iomem *rng_base;
+ struct bcm2835_rng_priv *priv;
struct resource *r;
int err;
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, priv);
+
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
/* map peripheral */
- rng_base = devm_ioremap_resource(dev, r);
- if (IS_ERR(rng_base)) {
+ priv->base = devm_ioremap_resource(dev, r);
+ if (IS_ERR(priv->base)) {
dev_err(dev, "failed to remap rng regs");
- return PTR_ERR(rng_base);
+ return PTR_ERR(priv->base);
}
- bcm2835_rng_ops.priv = (unsigned long)rng_base;
+
+ priv->rng.name = "bcm2835-rng";
+ priv->rng.read = bcm2835_rng_read;
rng_id = of_match_node(bcm2835_rng_of_match, np);
if (!rng_id)
@@ -101,14 +114,14 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
/* Check for rng init function, execute it */
rng_setup = rng_id->data;
if (rng_setup)
- rng_setup(rng_base);
+ rng_setup(priv->base);
/* set warm-up count & enable */
- __raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
- __raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
+ __raw_writel(RNG_WARMUP_COUNT, priv->base + RNG_STATUS);
+ __raw_writel(RNG_RBGEN, priv->base + RNG_CTRL);
/* register driver */
- err = hwrng_register(&bcm2835_rng_ops);
+ err = hwrng_register(&priv->rng);
if (err)
dev_err(dev, "hwrng registration failed\n");
else
@@ -119,13 +132,13 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
static int bcm2835_rng_remove(struct platform_device *pdev)
{
- void __iomem *rng_base = (void __iomem *)bcm2835_rng_ops.priv;
+ struct bcm2835_rng_priv *priv = platform_get_drvdata(pdev);
/* disable rng hardware */
- __raw_writel(0, rng_base + RNG_CTRL);
+ __raw_writel(0, priv->base + RNG_CTRL);
/* unregister driver */
- hwrng_unregister(&bcm2835_rng_ops);
+ hwrng_unregister(&priv->rng);
return 0;
}
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 03/12] hwrng: bcm2835-rng: Move enabling to hwrng::init
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
2017-11-02 1:03 ` [PATCH 02/12] hwrng: bcm2835-rng: Define a driver private context Florian Fainelli
@ 2017-11-02 1:03 ` Florian Fainelli
2017-11-02 1:04 ` [PATCH 04/12] hwrng: bcm2835-rng: Implementation cleanup callback Florian Fainelli
` (8 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:03 UTC (permalink / raw)
To: linux-kernel
Cc: Mark Rutland, Stefan Wahren, Florian Fainelli, Martin Kaiser,
Herbert Xu, Scott Branden,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Ray Jui, PrasannaKumar Muralidharan, Harald Freudenberger,
Krzysztof Kozlowski, Eric Anholt, Russell King, Rob Herring,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE, Sean Wang,
Matt Mackall, Steffen Trumtrar <s.
We should be moving the enabling of the HWRNG into a hwrng::init
callback since we can be disabled and enabled every time a different
hwrng is selected in the system.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/bcm2835-rng.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 0d72147ab45b..82000a637504 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -72,6 +72,17 @@ static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
return num_words * sizeof(u32);
}
+static int bcm2835_rng_init(struct hwrng *rng)
+{
+ struct bcm2835_rng_priv *priv = to_rng_priv(rng);
+
+ /* set warm-up count & enable */
+ __raw_writel(RNG_WARMUP_COUNT, priv->base + RNG_STATUS);
+ __raw_writel(RNG_RBGEN, priv->base + RNG_CTRL);
+
+ return 0;
+}
+
static const struct of_device_id bcm2835_rng_of_match[] = {
{ .compatible = "brcm,bcm2835-rng"},
{ .compatible = "brcm,bcm-nsp-rng", .data = nsp_rng_init},
@@ -105,6 +116,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
}
priv->rng.name = "bcm2835-rng";
+ priv->rng.init = bcm2835_rng_init;
priv->rng.read = bcm2835_rng_read;
rng_id = of_match_node(bcm2835_rng_of_match, np);
@@ -116,10 +128,6 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
if (rng_setup)
rng_setup(priv->base);
- /* set warm-up count & enable */
- __raw_writel(RNG_WARMUP_COUNT, priv->base + RNG_STATUS);
- __raw_writel(RNG_RBGEN, priv->base + RNG_CTRL);
-
/* register driver */
err = hwrng_register(&priv->rng);
if (err)
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 04/12] hwrng: bcm2835-rng: Implementation cleanup callback
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
2017-11-02 1:03 ` [PATCH 02/12] hwrng: bcm2835-rng: Define a driver private context Florian Fainelli
2017-11-02 1:03 ` [PATCH 03/12] hwrng: bcm2835-rng: Move enabling to hwrng::init Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
2017-11-02 1:04 ` [PATCH 05/12] hwrng: bcm2835-rng: Use device managed helpers Florian Fainelli
` (7 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
We should be disabling the RNG in a hwrng::cleanup callback if we are
not longer the system selected RNG, not wait until the device driver is
removed.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/bcm2835-rng.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 82000a637504..4d0356110b1b 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -83,6 +83,14 @@ static int bcm2835_rng_init(struct hwrng *rng)
return 0;
}
+static void bcm2835_rng_cleanup(struct hwrng *rng)
+{
+ struct bcm2835_rng_priv *priv = to_rng_priv(rng);
+
+ /* disable rng hardware */
+ __raw_writel(0, priv->base + RNG_CTRL);
+}
+
static const struct of_device_id bcm2835_rng_of_match[] = {
{ .compatible = "brcm,bcm2835-rng"},
{ .compatible = "brcm,bcm-nsp-rng", .data = nsp_rng_init},
@@ -118,6 +126,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
priv->rng.name = "bcm2835-rng";
priv->rng.init = bcm2835_rng_init;
priv->rng.read = bcm2835_rng_read;
+ priv->rng.cleanup = bcm2835_rng_cleanup;
rng_id = of_match_node(bcm2835_rng_of_match, np);
if (!rng_id)
@@ -142,9 +151,6 @@ static int bcm2835_rng_remove(struct platform_device *pdev)
{
struct bcm2835_rng_priv *priv = platform_get_drvdata(pdev);
- /* disable rng hardware */
- __raw_writel(0, priv->base + RNG_CTRL);
-
/* unregister driver */
hwrng_unregister(&priv->rng);
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 05/12] hwrng: bcm2835-rng: Use device managed helpers
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
` (2 preceding siblings ...)
2017-11-02 1:04 ` [PATCH 04/12] hwrng: bcm2835-rng: Implementation cleanup callback Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
2017-11-02 1:04 ` [PATCH 07/12] hwrng: bcm2835-rng: Manage an optional clock Florian Fainelli
` (6 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
Now that we have moved the RNG disabling into a hwrng::cleanup callback,
we can use the device managed registration operation and remove our
remove callback since it won't do anything necessary.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/bcm2835-rng.c | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 4d0356110b1b..67b9bd3be28d 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -138,7 +138,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
rng_setup(priv->base);
/* register driver */
- err = hwrng_register(&priv->rng);
+ err = devm_hwrng_register(dev, &priv->rng);
if (err)
dev_err(dev, "hwrng registration failed\n");
else
@@ -147,16 +147,6 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
return err;
}
-static int bcm2835_rng_remove(struct platform_device *pdev)
-{
- struct bcm2835_rng_priv *priv = platform_get_drvdata(pdev);
-
- /* unregister driver */
- hwrng_unregister(&priv->rng);
-
- return 0;
-}
-
MODULE_DEVICE_TABLE(of, bcm2835_rng_of_match);
static struct platform_driver bcm2835_rng_driver = {
@@ -165,7 +155,6 @@ static struct platform_driver bcm2835_rng_driver = {
.of_match_table = bcm2835_rng_of_match,
},
.probe = bcm2835_rng_probe,
- .remove = bcm2835_rng_remove,
};
module_platform_driver(bcm2835_rng_driver);
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 07/12] hwrng: bcm2835-rng: Manage an optional clock
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
` (3 preceding siblings ...)
2017-11-02 1:04 ` [PATCH 05/12] hwrng: bcm2835-rng: Use device managed helpers Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
2017-11-04 13:50 ` Stefan Wahren
[not found] ` <20171102010408.27736-1-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (5 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
One of the last steps before bcm63xx-rng can be eliminated is to manage
a clock during hwrng::init and hwrng::cleanup, so fetch it in the probe
function, and manage it during these two steps when valid.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/bcm2835-rng.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index ed20e0b6b7ae..35928efb52e7 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -15,6 +15,7 @@
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/printk.h>
+#include <linux/clk.h>
#define RNG_CTRL 0x0
#define RNG_STATUS 0x4
@@ -33,6 +34,7 @@ struct bcm2835_rng_priv {
struct hwrng rng;
void __iomem *base;
bool mask_interrupts;
+ struct clk *clk;
};
static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng)
@@ -67,6 +69,11 @@ static int bcm2835_rng_init(struct hwrng *rng)
{
struct bcm2835_rng_priv *priv = to_rng_priv(rng);
u32 val;
+ int ret;
+
+ ret = clk_prepare_enable(priv->clk);
+ if (ret)
+ return ret;
if (priv->mask_interrupts) {
/* mask the interrupt */
@@ -88,6 +95,8 @@ static void bcm2835_rng_cleanup(struct hwrng *rng)
/* disable rng hardware */
__raw_writel(0, priv->base + RNG_CTRL);
+
+ clk_disable_unprepare(priv->clk);
}
struct bcm2835_rng_of_data {
@@ -130,6 +139,11 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
return PTR_ERR(priv->base);
}
+ /* Clock is optional on most platforms */
+ priv->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(priv->clk))
+ priv->clk = NULL;
+
priv->rng.name = "bcm2835-rng";
priv->rng.init = bcm2835_rng_init;
priv->rng.read = bcm2835_rng_read;
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH 07/12] hwrng: bcm2835-rng: Manage an optional clock
2017-11-02 1:04 ` [PATCH 07/12] hwrng: bcm2835-rng: Manage an optional clock Florian Fainelli
@ 2017-11-04 13:50 ` Stefan Wahren
[not found] ` <944505791.223880.1509803454887-7tX72C7vayboQLBSYMtkGA@public.gmane.org>
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Wahren @ 2017-11-04 13:50 UTC (permalink / raw)
To: Florian Fainelli
Cc: Mark Rutland,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Sean Wang, Martin Kaiser, Herbert Xu, Scott Branden, Ray Jui,
Matt Mackall, Russell King, Krzysztof Kozlowski, linux-kernel,
Eric Anholt, Harald Freudenberger, Rob Herring,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE,
PrasannaKumar Muralidharan, Steffen Trumtrar, BROADCO
Hi Florian,
> Florian Fainelli <f.fainelli@gmail.com> hat am 2. November 2017 um 02:04 geschrieben:
>
>
> One of the last steps before bcm63xx-rng can be eliminated is to manage
> a clock during hwrng::init and hwrng::cleanup, so fetch it in the probe
> function, and manage it during these two steps when valid.
>
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
> drivers/char/hw_random/bcm2835-rng.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
> index ed20e0b6b7ae..35928efb52e7 100644
> --- a/drivers/char/hw_random/bcm2835-rng.c
> +++ b/drivers/char/hw_random/bcm2835-rng.c
> @@ -15,6 +15,7 @@
> #include <linux/of_platform.h>
> #include <linux/platform_device.h>
> #include <linux/printk.h>
> +#include <linux/clk.h>
>
> #define RNG_CTRL 0x0
> #define RNG_STATUS 0x4
> @@ -33,6 +34,7 @@ struct bcm2835_rng_priv {
> struct hwrng rng;
> void __iomem *base;
> bool mask_interrupts;
> + struct clk *clk;
> };
>
> static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng)
> @@ -67,6 +69,11 @@ static int bcm2835_rng_init(struct hwrng *rng)
> {
> struct bcm2835_rng_priv *priv = to_rng_priv(rng);
> u32 val;
> + int ret;
> +
> + ret = clk_prepare_enable(priv->clk);
> + if (ret)
> + return ret;
>
> if (priv->mask_interrupts) {
> /* mask the interrupt */
> @@ -88,6 +95,8 @@ static void bcm2835_rng_cleanup(struct hwrng *rng)
>
> /* disable rng hardware */
> __raw_writel(0, priv->base + RNG_CTRL);
> +
> + clk_disable_unprepare(priv->clk);
> }
>
> struct bcm2835_rng_of_data {
> @@ -130,6 +139,11 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
> return PTR_ERR(priv->base);
> }
>
> + /* Clock is optional on most platforms */
> + priv->clk = devm_clk_get(dev, NULL);
> + if (IS_ERR(priv->clk))
> + priv->clk = NULL;
at least in case of EPROBE_DEFERED this isn't the expected behavior. Maybe we should better trigger on non-existing clock?
> +
> priv->rng.name = "bcm2835-rng";
> priv->rng.init = bcm2835_rng_init;
> priv->rng.read = bcm2835_rng_read;
> --
> 2.9.3
>
^ permalink raw reply [flat|nested] 31+ messages in thread
[parent not found: <20171102010408.27736-1-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* [PATCH 01/12] hwrng: bcm2835-rng: Obtain base register via resource
[not found] ` <20171102010408.27736-1-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2017-11-02 1:03 ` Florian Fainelli
2017-11-02 1:04 ` [PATCH 06/12] hwrng: bcm2835-rng: Rework interrupt masking Florian Fainelli
` (2 subsequent siblings)
3 siblings, 0 replies; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:03 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
In preparation for consolidating bcm63xx-rng into bcm2835-rng, make sure
that we obtain the base register via platform_get_resource() since we
need to support the non-DT enabled MIPS-based BCM63xx DSL SoCs.
Signed-off-by: Florian Fainelli <f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/char/hw_random/bcm2835-rng.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 574211a49549..a818418a7e4c 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -81,21 +81,23 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
void (*rng_setup)(void __iomem *base);
const struct of_device_id *rng_id;
void __iomem *rng_base;
+ struct resource *r;
int err;
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
/* map peripheral */
- rng_base = of_iomap(np, 0);
- if (!rng_base) {
+ rng_base = devm_ioremap_resource(dev, r);
+ if (IS_ERR(rng_base)) {
dev_err(dev, "failed to remap rng regs");
- return -ENODEV;
+ return PTR_ERR(rng_base);
}
bcm2835_rng_ops.priv = (unsigned long)rng_base;
rng_id = of_match_node(bcm2835_rng_of_match, np);
- if (!rng_id) {
- iounmap(rng_base);
+ if (!rng_id)
return -EINVAL;
- }
+
/* Check for rng init function, execute it */
rng_setup = rng_id->data;
if (rng_setup)
@@ -107,10 +109,9 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
/* register driver */
err = hwrng_register(&bcm2835_rng_ops);
- if (err) {
+ if (err)
dev_err(dev, "hwrng registration failed\n");
- iounmap(rng_base);
- } else
+ else
dev_info(dev, "hwrng registered\n");
return err;
@@ -125,7 +126,6 @@ static int bcm2835_rng_remove(struct platform_device *pdev)
/* unregister driver */
hwrng_unregister(&bcm2835_rng_ops);
- iounmap(rng_base);
return 0;
}
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 06/12] hwrng: bcm2835-rng: Rework interrupt masking
[not found] ` <20171102010408.27736-1-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-11-02 1:03 ` [PATCH 01/12] hwrng: bcm2835-rng: Obtain base register via resource Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
2017-11-02 1:04 ` [PATCH 08/12] hwrng: bcm2835-rng: Abstract I/O accessors Florian Fainelli
2017-11-02 19:00 ` [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Stefan Wahren
3 siblings, 0 replies; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
The interrupt masking done for Northstart Plus and Northstar (BCM5301X)
is moved from being a function pointer mapped to of_device_id::data into
a proper part of the hwrng::init callback. While at it, we also make the
of_data be a proper structure indicating the platform specifics, since
the day we need to add a second type of platform information, we would
have to do that anyway.
Signed-off-by: Florian Fainelli <f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/char/hw_random/bcm2835-rng.c | 39 +++++++++++++++++++++---------------
1 file changed, 23 insertions(+), 16 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 67b9bd3be28d..ed20e0b6b7ae 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -32,18 +32,9 @@
struct bcm2835_rng_priv {
struct hwrng rng;
void __iomem *base;
+ bool mask_interrupts;
};
-static void __init nsp_rng_init(void __iomem *base)
-{
- u32 val;
-
- /* mask the interrupt */
- val = readl(base + RNG_INT_MASK);
- val |= RNG_INT_OFF;
- writel(val, base + RNG_INT_MASK);
-}
-
static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng)
{
return container_of(rng, struct bcm2835_rng_priv, rng);
@@ -75,6 +66,14 @@ static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
static int bcm2835_rng_init(struct hwrng *rng)
{
struct bcm2835_rng_priv *priv = to_rng_priv(rng);
+ u32 val;
+
+ if (priv->mask_interrupts) {
+ /* mask the interrupt */
+ val = readl(priv->base + RNG_INT_MASK);
+ val |= RNG_INT_OFF;
+ writel(val, priv->base + RNG_INT_MASK);
+ }
/* set warm-up count & enable */
__raw_writel(RNG_WARMUP_COUNT, priv->base + RNG_STATUS);
@@ -91,18 +90,26 @@ static void bcm2835_rng_cleanup(struct hwrng *rng)
__raw_writel(0, priv->base + RNG_CTRL);
}
+struct bcm2835_rng_of_data {
+ bool mask_interrupts;
+};
+
+static const struct bcm2835_rng_of_data nsp_rng_of_data = {
+ .mask_interrupts = true,
+};
+
static const struct of_device_id bcm2835_rng_of_match[] = {
{ .compatible = "brcm,bcm2835-rng"},
- { .compatible = "brcm,bcm-nsp-rng", .data = nsp_rng_init},
- { .compatible = "brcm,bcm5301x-rng", .data = nsp_rng_init},
+ { .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
+ { .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
{},
};
static int bcm2835_rng_probe(struct platform_device *pdev)
{
+ const struct bcm2835_rng_of_data *of_data;
struct device *dev = &pdev->dev;
struct device_node *np = dev->of_node;
- void (*rng_setup)(void __iomem *base);
const struct of_device_id *rng_id;
struct bcm2835_rng_priv *priv;
struct resource *r;
@@ -133,9 +140,9 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
return -EINVAL;
/* Check for rng init function, execute it */
- rng_setup = rng_id->data;
- if (rng_setup)
- rng_setup(priv->base);
+ of_data = rng_id->data;
+ if (of_data)
+ priv->mask_interrupts = of_data->mask_interrupts;
/* register driver */
err = devm_hwrng_register(dev, &priv->rng);
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 08/12] hwrng: bcm2835-rng: Abstract I/O accessors
[not found] ` <20171102010408.27736-1-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-11-02 1:03 ` [PATCH 01/12] hwrng: bcm2835-rng: Obtain base register via resource Florian Fainelli
2017-11-02 1:04 ` [PATCH 06/12] hwrng: bcm2835-rng: Rework interrupt masking Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
[not found] ` <20171102010408.27736-9-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-11-02 19:00 ` [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Stefan Wahren
3 siblings, 1 reply; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
In preparation for allowing BCM63xx to use this driver, we abstract I/O
accessors such that we can easily change those later on.
Signed-off-by: Florian Fainelli <f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/char/hw_random/bcm2835-rng.c | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 35928efb52e7..500275d55044 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -42,6 +42,17 @@ static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng)
return container_of(rng, struct bcm2835_rng_priv, rng);
}
+static inline u32 rng_readl(struct bcm2835_rng_priv *priv, u32 offset)
+{
+ return readl(priv->base + offset);
+}
+
+static inline void rng_writel(struct bcm2835_rng_priv *priv, u32 val,
+ u32 offset)
+{
+ writel(val, priv->base + offset);
+}
+
static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
bool wait)
{
@@ -49,18 +60,18 @@ static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
u32 max_words = max / sizeof(u32);
u32 num_words, count;
- while ((__raw_readl(priv->base + RNG_STATUS) >> 24) == 0) {
+ while ((rng_readl(priv, RNG_STATUS) >> 24) == 0) {
if (!wait)
return 0;
cpu_relax();
}
- num_words = readl(priv->base + RNG_STATUS) >> 24;
+ num_words = rng_readl(priv, RNG_STATUS) >> 24;
if (num_words > max_words)
num_words = max_words;
for (count = 0; count < num_words; count++)
- ((u32 *)buf)[count] = readl(priv->base + RNG_DATA);
+ ((u32 *)buf)[count] = rng_readl(priv, RNG_DATA);
return num_words * sizeof(u32);
}
@@ -77,14 +88,14 @@ static int bcm2835_rng_init(struct hwrng *rng)
if (priv->mask_interrupts) {
/* mask the interrupt */
- val = readl(priv->base + RNG_INT_MASK);
+ val = rng_readl(priv, RNG_INT_MASK);
val |= RNG_INT_OFF;
- writel(val, priv->base + RNG_INT_MASK);
+ rng_writel(priv, val, RNG_INT_MASK);
}
/* set warm-up count & enable */
- __raw_writel(RNG_WARMUP_COUNT, priv->base + RNG_STATUS);
- __raw_writel(RNG_RBGEN, priv->base + RNG_CTRL);
+ rng_writel(priv, RNG_WARMUP_COUNT, RNG_STATUS);
+ rng_writel(priv, RNG_RBGEN, RNG_CTRL);
return 0;
}
@@ -94,7 +105,7 @@ static void bcm2835_rng_cleanup(struct hwrng *rng)
struct bcm2835_rng_priv *priv = to_rng_priv(rng);
/* disable rng hardware */
- __raw_writel(0, priv->base + RNG_CTRL);
+ rng_writel(priv, 0, RNG_CTRL);
clk_disable_unprepare(priv->clk);
}
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng
[not found] ` <20171102010408.27736-1-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (2 preceding siblings ...)
2017-11-02 1:04 ` [PATCH 08/12] hwrng: bcm2835-rng: Abstract I/O accessors Florian Fainelli
@ 2017-11-02 19:00 ` Stefan Wahren
3 siblings, 0 replies; 31+ messages in thread
From: Stefan Wahren @ 2017-11-02 19:00 UTC (permalink / raw)
To: Florian Fainelli
Cc: Krzysztof Kozlowski, Ray Jui, Eric Anholt, Rob Herring,
Steffen Trumtrar, Harald Freudenberger, Russell King,
moderated list:BROADCOM BCM2835 ARM ARCHITECTURE,
PrasannaKumar Muralidharan, Scott Branden,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE, Martin Kaiser,
Herbert Xu,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Matt Mackall, Mark
Hi Florian,
> Florian Fainelli <f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> hat am 2. November 2017 um 02:03 geschrieben:
>
>
> Hi,
>
> As it usually happens when there is a fair amount of HW IP block re-use,
> competing implementations show up. In that case the BCM2835 HWRNG driver and
> the BCM63xx RNG driver have exactly the same register offsets and this is
> indeed the same piece of HW.
>
> This patch series first prepares the bcm2835-rng to be more future proof and
> support newer platforms, and the last part brings in what is necessary to
> migrate the bcm63xx-rng over to bcm2835-rng. Finally we delete bcm63xx-rng
> completely.
>
> The reason why BCM2835 RNG was kept over BCM63xx RNG is because the former
> deals correctly with a warm up count and the number of words available in the
> FIFO size.
are these the same patches as in this branch [1]?
https://github.com/ffainelli/linux/commits/rng-consolidation
Regards
Stefan
>
> Thanks!
>
> Florian Fainelli (12):
> hwrng: bcm2835-rng: Obtain base register via resource
> hwrng: bcm2835-rng: Define a driver private context
> hwrng: bcm2835-rng: Move enabling to hwrng::init
> hwrng: bcm2835-rng: Implementation cleanup callback
> hwrng: bcm2835-rng: Use device managed helpers
> hwrng: bcm2835-rng: Rework interrupt masking
> hwrng: bcm2835-rng: Manage an optional clock
> hwrng: bcm2835-rng: Abstract I/O accessors
> hwrng: bcm2835-rng: Add Broadcom MIPS I/O accessors
> dt-bindings: rng: Incorporate brcm,bcm6368.txt binding
> hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms
> hwrng: bcm63xx-rng: Remove since bcm2835-rng takes over
>
> .../devicetree/bindings/rng/brcm,bcm2835.txt | 22 ++-
> .../devicetree/bindings/rng/brcm,bcm6368.txt | 17 ---
> drivers/char/hw_random/Kconfig | 20 +--
> drivers/char/hw_random/Makefile | 1 -
> drivers/char/hw_random/bcm2835-rng.c | 166 ++++++++++++++-------
> drivers/char/hw_random/bcm63xx-rng.c | 154 -------------------
> 6 files changed, 139 insertions(+), 241 deletions(-)
> delete mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm6368.txt
> delete mode 100644 drivers/char/hw_random/bcm63xx-rng.c
>
> --
> 2.9.3
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 31+ messages in thread
* [PATCH 09/12] hwrng: bcm2835-rng: Add Broadcom MIPS I/O accessors
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
` (5 preceding siblings ...)
[not found] ` <20171102010408.27736-1-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2017-11-02 1:04 ` Florian Fainelli
2017-11-02 1:04 ` [PATCH 10/12] dt-bindings: rng: Incorporate brcm,bcm6368.txt binding Florian Fainelli
` (3 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
Broadcom MIPS HW is always strapped to match the system-wide endian such
that all I/O access to this RNG block is done with the native CPU
endian, account for that.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/bcm2835-rng.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 500275d55044..650e0033c273 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -44,13 +44,22 @@ static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng)
static inline u32 rng_readl(struct bcm2835_rng_priv *priv, u32 offset)
{
- return readl(priv->base + offset);
+ /* MIPS chips strapped for BE will automagically configure the
+ * peripheral registers for CPU-native byte order.
+ */
+ if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
+ return __raw_readl(priv->base + offset);
+ else
+ return readl(priv->base + offset);
}
static inline void rng_writel(struct bcm2835_rng_priv *priv, u32 val,
u32 offset)
{
- writel(val, priv->base + offset);
+ if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
+ __raw_writel(val, priv->base + offset);
+ else
+ writel(val, priv->base + offset);
}
static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 10/12] dt-bindings: rng: Incorporate brcm,bcm6368.txt binding
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
` (6 preceding siblings ...)
2017-11-02 1:04 ` [PATCH 09/12] hwrng: bcm2835-rng: Add Broadcom MIPS I/O accessors Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
2017-11-06 21:38 ` Rob Herring
2017-11-02 1:04 ` [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms Florian Fainelli
` (2 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
Since the same block is used on BCM2835 and BCM6368, merge the bindings
and remove the brcm,bcm6368.txt binding document.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
.../devicetree/bindings/rng/brcm,bcm2835.txt | 22 +++++++++++++++++++---
.../devicetree/bindings/rng/brcm,bcm6368.txt | 17 -----------------
2 files changed, 19 insertions(+), 20 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm6368.txt
diff --git a/Documentation/devicetree/bindings/rng/brcm,bcm2835.txt b/Documentation/devicetree/bindings/rng/brcm,bcm2835.txt
index 26542690b578..627b29531a32 100644
--- a/Documentation/devicetree/bindings/rng/brcm,bcm2835.txt
+++ b/Documentation/devicetree/bindings/rng/brcm,bcm2835.txt
@@ -1,11 +1,19 @@
-BCM2835 Random number generator
+BCM2835/6368 Random number generator
Required properties:
-- compatible : should be "brcm,bcm2835-rng" or "brcm,bcm-nsp-rng" or
- "brcm,bcm5301x-rng"
+- compatible : should be one of
+ "brcm,bcm2835-rng"
+ "brcm,bcm-nsp-rng"
+ "brcm,bcm5301x-rng" or
+ "brcm,bcm6368-rng"
- reg : Specifies base physical address and size of the registers.
+Optional properties:
+
+- clocks : phandle to clock-controller plus clock-specifier pair
+- clock-names : "ipsec" as a clock name
+
Example:
rng {
@@ -17,3 +25,11 @@ rng@18033000 {
compatible = "brcm,bcm-nsp-rng";
reg = <0x18033000 0x14>;
};
+
+random: rng@10004180 {
+ compatible = "brcm,bcm6368-rng";
+ reg = <0x10004180 0x14>;
+
+ clocks = <&periph_clk 18>;
+ clock-names = "ipsec";
+};
diff --git a/Documentation/devicetree/bindings/rng/brcm,bcm6368.txt b/Documentation/devicetree/bindings/rng/brcm,bcm6368.txt
deleted file mode 100644
index 4b5ac600bfbd..000000000000
--- a/Documentation/devicetree/bindings/rng/brcm,bcm6368.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-BCM6368 Random number generator
-
-Required properties:
-
-- compatible : should be "brcm,bcm6368-rng"
-- reg : Specifies base physical address and size of the registers
-- clocks : phandle to clock-controller plus clock-specifier pair
-- clock-names : "ipsec" as a clock name
-
-Example:
- random: rng@10004180 {
- compatible = "brcm,bcm6368-rng";
- reg = <0x10004180 0x14>;
-
- clocks = <&periph_clk 18>;
- clock-names = "ipsec";
- };
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH 10/12] dt-bindings: rng: Incorporate brcm,bcm6368.txt binding
2017-11-02 1:04 ` [PATCH 10/12] dt-bindings: rng: Incorporate brcm,bcm6368.txt binding Florian Fainelli
@ 2017-11-06 21:38 ` Rob Herring
0 siblings, 0 replies; 31+ messages in thread
From: Rob Herring @ 2017-11-06 21:38 UTC (permalink / raw)
To: Florian Fainelli
Cc: linux-kernel, Matt Mackall, Herbert Xu, Mark Rutland, Ray Jui,
Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE
On Wed, Nov 01, 2017 at 06:04:06PM -0700, Florian Fainelli wrote:
> Since the same block is used on BCM2835 and BCM6368, merge the bindings
> and remove the brcm,bcm6368.txt binding document.
>
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
> .../devicetree/bindings/rng/brcm,bcm2835.txt | 22 +++++++++++++++++++---
> .../devicetree/bindings/rng/brcm,bcm6368.txt | 17 -----------------
> 2 files changed, 19 insertions(+), 20 deletions(-)
> delete mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm6368.txt
Acked-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 31+ messages in thread
* [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
` (7 preceding siblings ...)
2017-11-02 1:04 ` [PATCH 10/12] dt-bindings: rng: Incorporate brcm,bcm6368.txt binding Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
2017-11-04 18:27 ` Stefan Wahren
2017-11-02 1:04 ` [PATCH 12/12] hwrng: bcm63xx-rng: Remove since bcm2835-rng takes over Florian Fainelli
2017-11-02 19:01 ` [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Stefan Wahren
10 siblings, 1 reply; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
We have now incorporated all necessary functionality for the BCM63xx
platforms to successfully migrate over bcm2835-rng, so add the final
bits: Kconfig selection and proper platform_device device type matching
to keep the same platform device name for registration to work.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/Kconfig | 7 ++++---
drivers/char/hw_random/bcm2835-rng.c | 11 ++++++++++-
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index 95a031e9eced..d0689cc8c7fc 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -87,12 +87,13 @@ config HW_RANDOM_BCM63XX
If unusure, say Y.
config HW_RANDOM_BCM2835
- tristate "Broadcom BCM2835 Random Number Generator support"
- depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X
+ tristate "Broadcom BCM2835/BCM63xx Random Number Generator support"
+ depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X || \
+ ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC
default HW_RANDOM
---help---
This driver provides kernel-side support for the Random Number
- Generator hardware found on the Broadcom BCM2835 SoCs.
+ Generator hardware found on the Broadcom BCM2835 and BCM63xx SoCs.
To compile this driver as a module, choose M here: the
module will be called bcm2835-rng
diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
index 650e0033c273..d9ffe14f312b 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -131,6 +131,7 @@ static const struct of_device_id bcm2835_rng_of_match[] = {
{ .compatible = "brcm,bcm2835-rng"},
{ .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
{ .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
+ { .compatible = "brcm,bcm6368-rng"},
{},
};
@@ -164,7 +165,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
if (IS_ERR(priv->clk))
priv->clk = NULL;
- priv->rng.name = "bcm2835-rng";
+ priv->rng.name = pdev->id_entry->name;
priv->rng.init = bcm2835_rng_init;
priv->rng.read = bcm2835_rng_read;
priv->rng.cleanup = bcm2835_rng_cleanup;
@@ -190,12 +191,20 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
MODULE_DEVICE_TABLE(of, bcm2835_rng_of_match);
+static struct platform_device_id bcm2835_rng_devtype[] = {
+ { .name = "bcm2835-rng" },
+ { .name = "bcm63xx-rng" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(platform, bcm2835_rng_devtype);
+
static struct platform_driver bcm2835_rng_driver = {
.driver = {
.name = "bcm2835-rng",
.of_match_table = bcm2835_rng_of_match,
},
.probe = bcm2835_rng_probe,
+ .id_table = bcm2835_rng_devtype,
};
module_platform_driver(bcm2835_rng_driver);
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms
2017-11-02 1:04 ` [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms Florian Fainelli
@ 2017-11-04 18:27 ` Stefan Wahren
2017-11-06 20:16 ` Florian Fainelli
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Wahren @ 2017-11-04 18:27 UTC (permalink / raw)
To: Florian Fainelli
Cc: Mark Rutland,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Sean Wang, Martin Kaiser, Herbert Xu, Scott Branden, Ray Jui,
Matt Mackall, Russell King, Krzysztof Kozlowski, linux-kernel,
Eric Anholt, Harald Freudenberger, Rob Herring,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE,
PrasannaKumar Muralidharan, Steffen Trumtrar, BROADCO
Hi Florian
> Florian Fainelli <f.fainelli@gmail.com> hat am 2. November 2017 um 02:04 geschrieben:
>
>
> We have now incorporated all necessary functionality for the BCM63xx
> platforms to successfully migrate over bcm2835-rng, so add the final
> bits: Kconfig selection and proper platform_device device type matching
> to keep the same platform device name for registration to work.
>
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
> drivers/char/hw_random/Kconfig | 7 ++++---
> drivers/char/hw_random/bcm2835-rng.c | 11 ++++++++++-
> 2 files changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
> index 95a031e9eced..d0689cc8c7fc 100644
> --- a/drivers/char/hw_random/Kconfig
> +++ b/drivers/char/hw_random/Kconfig
> @@ -87,12 +87,13 @@ config HW_RANDOM_BCM63XX
> If unusure, say Y.
>
> config HW_RANDOM_BCM2835
> - tristate "Broadcom BCM2835 Random Number Generator support"
> - depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X
> + tristate "Broadcom BCM2835/BCM63xx Random Number Generator support"
> + depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X || \
> + ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC
> default HW_RANDOM
> ---help---
> This driver provides kernel-side support for the Random Number
> - Generator hardware found on the Broadcom BCM2835 SoCs.
> + Generator hardware found on the Broadcom BCM2835 and BCM63xx SoCs.
>
> To compile this driver as a module, choose M here: the
> module will be called bcm2835-rng
> diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
> index 650e0033c273..d9ffe14f312b 100644
> --- a/drivers/char/hw_random/bcm2835-rng.c
> +++ b/drivers/char/hw_random/bcm2835-rng.c
> @@ -131,6 +131,7 @@ static const struct of_device_id bcm2835_rng_of_match[] = {
> { .compatible = "brcm,bcm2835-rng"},
> { .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
> { .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
> + { .compatible = "brcm,bcm6368-rng"},
> {},
> };
>
> @@ -164,7 +165,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
> if (IS_ERR(priv->clk))
> priv->clk = NULL;
>
> - priv->rng.name = "bcm2835-rng";
> + priv->rng.name = pdev->id_entry->name;
this change breaks registration on bcm2835, because the name is NULL.
Regards
Stefan
> priv->rng.init = bcm2835_rng_init;
> priv->rng.read = bcm2835_rng_read;
> priv->rng.cleanup = bcm2835_rng_cleanup;
> @@ -190,12 +191,20 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
>
> MODULE_DEVICE_TABLE(of, bcm2835_rng_of_match);
>
> +static struct platform_device_id bcm2835_rng_devtype[] = {
> + { .name = "bcm2835-rng" },
> + { .name = "bcm63xx-rng" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(platform, bcm2835_rng_devtype);
> +
> static struct platform_driver bcm2835_rng_driver = {
> .driver = {
> .name = "bcm2835-rng",
> .of_match_table = bcm2835_rng_of_match,
> },
> .probe = bcm2835_rng_probe,
> + .id_table = bcm2835_rng_devtype,
> };
> module_platform_driver(bcm2835_rng_driver);
>
> --
> 2.9.3
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms
2017-11-04 18:27 ` Stefan Wahren
@ 2017-11-06 20:16 ` Florian Fainelli
2017-11-07 6:45 ` Stefan Wahren
0 siblings, 1 reply; 31+ messages in thread
From: Florian Fainelli @ 2017-11-06 20:16 UTC (permalink / raw)
To: Stefan Wahren, Florian Fainelli
Cc: Krzysztof Kozlowski, Ray Jui, Eric Anholt, Rob Herring,
Steffen Trumtrar, Harald Freudenberger, Russell King,
moderated list:BROADCOM BCM2835 ARM ARCHITECTURE,
PrasannaKumar Muralidharan, Scott Branden,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE, Martin Kaiser,
Herbert Xu,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Matt Mackall, Mark
On 11/04/2017 11:27 AM, Stefan Wahren wrote:
> Hi Florian
>
>> Florian Fainelli <f.fainelli@gmail.com> hat am 2. November 2017 um 02:04 geschrieben:
>>
>>
>> We have now incorporated all necessary functionality for the BCM63xx
>> platforms to successfully migrate over bcm2835-rng, so add the final
>> bits: Kconfig selection and proper platform_device device type matching
>> to keep the same platform device name for registration to work.
>>
>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>> ---
>> drivers/char/hw_random/Kconfig | 7 ++++---
>> drivers/char/hw_random/bcm2835-rng.c | 11 ++++++++++-
>> 2 files changed, 14 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
>> index 95a031e9eced..d0689cc8c7fc 100644
>> --- a/drivers/char/hw_random/Kconfig
>> +++ b/drivers/char/hw_random/Kconfig
>> @@ -87,12 +87,13 @@ config HW_RANDOM_BCM63XX
>> If unusure, say Y.
>>
>> config HW_RANDOM_BCM2835
>> - tristate "Broadcom BCM2835 Random Number Generator support"
>> - depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X
>> + tristate "Broadcom BCM2835/BCM63xx Random Number Generator support"
>> + depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X || \
>> + ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC
>> default HW_RANDOM
>> ---help---
>> This driver provides kernel-side support for the Random Number
>> - Generator hardware found on the Broadcom BCM2835 SoCs.
>> + Generator hardware found on the Broadcom BCM2835 and BCM63xx SoCs.
>>
>> To compile this driver as a module, choose M here: the
>> module will be called bcm2835-rng
>> diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
>> index 650e0033c273..d9ffe14f312b 100644
>> --- a/drivers/char/hw_random/bcm2835-rng.c
>> +++ b/drivers/char/hw_random/bcm2835-rng.c
>> @@ -131,6 +131,7 @@ static const struct of_device_id bcm2835_rng_of_match[] = {
>> { .compatible = "brcm,bcm2835-rng"},
>> { .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
>> { .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
>> + { .compatible = "brcm,bcm6368-rng"},
>> {},
>> };
>>
>> @@ -164,7 +165,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
>> if (IS_ERR(priv->clk))
>> priv->clk = NULL;
>>
>> - priv->rng.name = "bcm2835-rng";
>> + priv->rng.name = pdev->id_entry->name;
>
> this change breaks registration on bcm2835, because the name is NULL.
OH right, I will fix that in v2, I am assuming that if you did something
like this, things still work correctly for you on 2835:
if (!priv->id_entry->name)
priv->rng.name = "bcm2835-rng";
else
priv->rng.name = priv->id_entry->name;
?
>
> Regards
> Stefan
>
>> priv->rng.init = bcm2835_rng_init;
>> priv->rng.read = bcm2835_rng_read;
>> priv->rng.cleanup = bcm2835_rng_cleanup;
>> @@ -190,12 +191,20 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
>>
>> MODULE_DEVICE_TABLE(of, bcm2835_rng_of_match);
>>
>> +static struct platform_device_id bcm2835_rng_devtype[] = {
>> + { .name = "bcm2835-rng" },
>> + { .name = "bcm63xx-rng" },
>> + { /* sentinel */ }
>> +};
>> +MODULE_DEVICE_TABLE(platform, bcm2835_rng_devtype);
>> +
>> static struct platform_driver bcm2835_rng_driver = {
>> .driver = {
>> .name = "bcm2835-rng",
>> .of_match_table = bcm2835_rng_of_match,
>> },
>> .probe = bcm2835_rng_probe,
>> + .id_table = bcm2835_rng_devtype,
>> };
>> module_platform_driver(bcm2835_rng_driver);
>>
>> --
>> 2.9.3
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
Florian
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms
2017-11-06 20:16 ` Florian Fainelli
@ 2017-11-07 6:45 ` Stefan Wahren
2017-11-07 23:27 ` Stefan Wahren
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Wahren @ 2017-11-07 6:45 UTC (permalink / raw)
To: Florian Fainelli
Cc: Krzysztof Kozlowski, Ray Jui, Eric Anholt, Rob Herring,
Steffen Trumtrar, Harald Freudenberger, Russell King,
moderated list:BROADCOM BCM2835 ARM ARCHITECTURE,
PrasannaKumar Muralidharan, Scott Branden,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE, Martin Kaiser,
Herbert Xu, linux-kernel, Matt Mackall,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...
> Florian Fainelli <f.fainelli@gmail.com> hat am 6. November 2017 um 21:16 geschrieben:
>
>
> On 11/04/2017 11:27 AM, Stefan Wahren wrote:
> > Hi Florian
> >
> >> Florian Fainelli <f.fainelli@gmail.com> hat am 2. November 2017 um 02:04 geschrieben:
> >>
> >>
> >> We have now incorporated all necessary functionality for the BCM63xx
> >> platforms to successfully migrate over bcm2835-rng, so add the final
> >> bits: Kconfig selection and proper platform_device device type matching
> >> to keep the same platform device name for registration to work.
> >>
> >> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> >> ---
> >> drivers/char/hw_random/Kconfig | 7 ++++---
> >> drivers/char/hw_random/bcm2835-rng.c | 11 ++++++++++-
> >> 2 files changed, 14 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
> >> index 95a031e9eced..d0689cc8c7fc 100644
> >> --- a/drivers/char/hw_random/Kconfig
> >> +++ b/drivers/char/hw_random/Kconfig
> >> @@ -87,12 +87,13 @@ config HW_RANDOM_BCM63XX
> >> If unusure, say Y.
> >>
> >> config HW_RANDOM_BCM2835
> >> - tristate "Broadcom BCM2835 Random Number Generator support"
> >> - depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X
> >> + tristate "Broadcom BCM2835/BCM63xx Random Number Generator support"
> >> + depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X || \
> >> + ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC
> >> default HW_RANDOM
> >> ---help---
> >> This driver provides kernel-side support for the Random Number
> >> - Generator hardware found on the Broadcom BCM2835 SoCs.
> >> + Generator hardware found on the Broadcom BCM2835 and BCM63xx SoCs.
> >>
> >> To compile this driver as a module, choose M here: the
> >> module will be called bcm2835-rng
> >> diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
> >> index 650e0033c273..d9ffe14f312b 100644
> >> --- a/drivers/char/hw_random/bcm2835-rng.c
> >> +++ b/drivers/char/hw_random/bcm2835-rng.c
> >> @@ -131,6 +131,7 @@ static const struct of_device_id bcm2835_rng_of_match[] = {
> >> { .compatible = "brcm,bcm2835-rng"},
> >> { .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
> >> { .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
> >> + { .compatible = "brcm,bcm6368-rng"},
> >> {},
> >> };
> >>
> >> @@ -164,7 +165,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
> >> if (IS_ERR(priv->clk))
> >> priv->clk = NULL;
> >>
> >> - priv->rng.name = "bcm2835-rng";
> >> + priv->rng.name = pdev->id_entry->name;
> >
> > this change breaks registration on bcm2835, because the name is NULL.
>
> OH right, I will fix that in v2, I am assuming that if you did something
> like this, things still work correctly for you on 2835:
>
> if (!priv->id_entry->name)
> priv->rng.name = "bcm2835-rng";
> else
> priv->rng.name = priv->id_entry->name;
>
> ?
I think that should work, but i'm not really happy about it. I prefer a more general solution. Looking at the other rng drivers shows the following pattern:
priv->rng.name = pdev->name;
I need to verify this on bcm2835.
>
> >
> > Regards
> > Stefan
> >
> >> priv->rng.init = bcm2835_rng_init;
> >> priv->rng.read = bcm2835_rng_read;
> >> priv->rng.cleanup = bcm2835_rng_cleanup;
> >> @@ -190,12 +191,20 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
> >>
> >> MODULE_DEVICE_TABLE(of, bcm2835_rng_of_match);
> >>
> >> +static struct platform_device_id bcm2835_rng_devtype[] = {
> >> + { .name = "bcm2835-rng" },
> >> + { .name = "bcm63xx-rng" },
> >> + { /* sentinel */ }
> >> +};
> >> +MODULE_DEVICE_TABLE(platform, bcm2835_rng_devtype);
> >> +
> >> static struct platform_driver bcm2835_rng_driver = {
> >> .driver = {
> >> .name = "bcm2835-rng",
> >> .of_match_table = bcm2835_rng_of_match,
> >> },
> >> .probe = bcm2835_rng_probe,
> >> + .id_table = bcm2835_rng_devtype,
> >> };
> >> module_platform_driver(bcm2835_rng_driver);
> >>
> >> --
> >> 2.9.3
> >>
> >>
> >> _______________________________________________
> >> linux-arm-kernel mailing list
> >> linux-arm-kernel@lists.infradead.org
> >> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
>
> --
> Florian
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms
2017-11-07 6:45 ` Stefan Wahren
@ 2017-11-07 23:27 ` Stefan Wahren
0 siblings, 0 replies; 31+ messages in thread
From: Stefan Wahren @ 2017-11-07 23:27 UTC (permalink / raw)
To: Florian Fainelli
Cc: Mark Rutland,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Sean Wang, Martin Kaiser, Herbert Xu, Scott Branden, Ray Jui,
Matt Mackall, Russell King, Krzysztof Kozlowski, linux-kernel,
Eric Anholt, Harald Freudenberger, Rob Herring,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE,
PrasannaKumar Muralidharan, Steffen Trumtrar, BROADCO
> Stefan Wahren <stefan.wahren@i2se.com> hat am 7. November 2017 um 07:45 geschrieben:
>
>
> > Florian Fainelli <f.fainelli@gmail.com> hat am 6. November 2017 um 21:16 geschrieben:
> >
> >
> > On 11/04/2017 11:27 AM, Stefan Wahren wrote:
> > > Hi Florian
> > >
> > >> Florian Fainelli <f.fainelli@gmail.com> hat am 2. November 2017 um 02:04 geschrieben:
> > >>
> > >>
> > >> We have now incorporated all necessary functionality for the BCM63xx
> > >> platforms to successfully migrate over bcm2835-rng, so add the final
> > >> bits: Kconfig selection and proper platform_device device type matching
> > >> to keep the same platform device name for registration to work.
> > >>
> > >> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> > >> ---
> > >> drivers/char/hw_random/Kconfig | 7 ++++---
> > >> drivers/char/hw_random/bcm2835-rng.c | 11 ++++++++++-
> > >> 2 files changed, 14 insertions(+), 4 deletions(-)
> > >>
> > >> diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
> > >> index 95a031e9eced..d0689cc8c7fc 100644
> > >> --- a/drivers/char/hw_random/Kconfig
> > >> +++ b/drivers/char/hw_random/Kconfig
> > >> @@ -87,12 +87,13 @@ config HW_RANDOM_BCM63XX
> > >> If unusure, say Y.
> > >>
> > >> config HW_RANDOM_BCM2835
> > >> - tristate "Broadcom BCM2835 Random Number Generator support"
> > >> - depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X
> > >> + tristate "Broadcom BCM2835/BCM63xx Random Number Generator support"
> > >> + depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X || \
> > >> + ARCH_BCM_63XX || BCM63XX || BMIPS_GENERIC
> > >> default HW_RANDOM
> > >> ---help---
> > >> This driver provides kernel-side support for the Random Number
> > >> - Generator hardware found on the Broadcom BCM2835 SoCs.
> > >> + Generator hardware found on the Broadcom BCM2835 and BCM63xx SoCs.
> > >>
> > >> To compile this driver as a module, choose M here: the
> > >> module will be called bcm2835-rng
> > >> diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c
> > >> index 650e0033c273..d9ffe14f312b 100644
> > >> --- a/drivers/char/hw_random/bcm2835-rng.c
> > >> +++ b/drivers/char/hw_random/bcm2835-rng.c
> > >> @@ -131,6 +131,7 @@ static const struct of_device_id bcm2835_rng_of_match[] = {
> > >> { .compatible = "brcm,bcm2835-rng"},
> > >> { .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
> > >> { .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
> > >> + { .compatible = "brcm,bcm6368-rng"},
> > >> {},
> > >> };
> > >>
> > >> @@ -164,7 +165,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
> > >> if (IS_ERR(priv->clk))
> > >> priv->clk = NULL;
> > >>
> > >> - priv->rng.name = "bcm2835-rng";
> > >> + priv->rng.name = pdev->id_entry->name;
> > >
> > > this change breaks registration on bcm2835, because the name is NULL.
> >
> > OH right, I will fix that in v2, I am assuming that if you did something
> > like this, things still work correctly for you on 2835:
> >
> > if (!priv->id_entry->name)
> > priv->rng.name = "bcm2835-rng";
> > else
> > priv->rng.name = priv->id_entry->name;
> >
> > ?
>
> I think that should work, but i'm not really happy about it. I prefer a more general solution. Looking at the other rng drivers shows the following pattern:
>
> priv->rng.name = pdev->name;
>
> I need to verify this on bcm2835.
Okay pdev->name works for bcm2835
^ permalink raw reply [flat|nested] 31+ messages in thread
* [PATCH 12/12] hwrng: bcm63xx-rng: Remove since bcm2835-rng takes over
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
` (8 preceding siblings ...)
2017-11-02 1:04 ` [PATCH 11/12] hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms Florian Fainelli
@ 2017-11-02 1:04 ` Florian Fainelli
[not found] ` <20171102010408.27736-13-f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-11-02 19:01 ` [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Stefan Wahren
10 siblings, 1 reply; 31+ messages in thread
From: Florian Fainelli @ 2017-11-02 1:04 UTC (permalink / raw)
To: linux-kernel
Cc: Florian Fainelli, Matt Mackall, Herbert Xu, Rob Herring,
Mark Rutland, Ray Jui, Scott Branden,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
Eric Anholt, Stefan Wahren, PrasannaKumar Muralidharan,
Russell King, Krzysztof Kozlowski, Harald Freudenberger,
Sean Wang, Martin Kaiser, Steffen Trumtrar, linux-crypto
bcm2835-rng is now capable of supporting the BCM63xx hardware, so remove
the driver which duplicates the same functionality.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/char/hw_random/Kconfig | 13 ---
drivers/char/hw_random/Makefile | 1 -
drivers/char/hw_random/bcm63xx-rng.c | 154 -----------------------------------
3 files changed, 168 deletions(-)
delete mode 100644 drivers/char/hw_random/bcm63xx-rng.c
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index d0689cc8c7fc..2d3775b9c0c7 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -73,19 +73,6 @@ config HW_RANDOM_ATMEL
If unsure, say Y.
-config HW_RANDOM_BCM63XX
- tristate "Broadcom BCM63xx Random Number Generator support"
- depends on BCM63XX || BMIPS_GENERIC
- 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_BCM2835
tristate "Broadcom BCM2835/BCM63xx Random Number Generator support"
depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X || \
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index 39a67defac67..470ea14ed6b7 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -8,7 +8,6 @@ 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
deleted file mode 100644
index 5132c9cde50d..000000000000
--- a/drivers/char/hw_random/bcm63xx-rng.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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 <linux/of.h>
-
-#define RNG_CTRL 0x00
-#define RNG_EN (1 << 0)
-
-#define RNG_STAT 0x04
-#define RNG_AVAIL_MASK (0xff000000)
-
-#define RNG_DATA 0x08
-#define RNG_THRES 0x0c
-#define RNG_MASK 0x10
-
-struct bcm63xx_rng_priv {
- struct hwrng rng;
- struct clk *clk;
- void __iomem *regs;
-};
-
-#define to_rng_priv(rng) container_of(rng, struct bcm63xx_rng_priv, rng)
-
-static int bcm63xx_rng_init(struct hwrng *rng)
-{
- struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
- u32 val;
- int error;
-
- error = clk_prepare_enable(priv->clk);
- if (error)
- return error;
-
- val = __raw_readl(priv->regs + RNG_CTRL);
- val |= RNG_EN;
- __raw_writel(val, priv->regs + RNG_CTRL);
-
- return 0;
-}
-
-static void bcm63xx_rng_cleanup(struct hwrng *rng)
-{
- struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
- u32 val;
-
- val = __raw_readl(priv->regs + RNG_CTRL);
- val &= ~RNG_EN;
- __raw_writel(val, priv->regs + RNG_CTRL);
-
- clk_disable_unprepare(priv->clk);
-}
-
-static int bcm63xx_rng_data_present(struct hwrng *rng, int wait)
-{
- struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
-
- return __raw_readl(priv->regs + RNG_STAT) & RNG_AVAIL_MASK;
-}
-
-static int bcm63xx_rng_data_read(struct hwrng *rng, u32 *data)
-{
- struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
-
- *data = __raw_readl(priv->regs + RNG_DATA);
-
- return 4;
-}
-
-static int bcm63xx_rng_probe(struct platform_device *pdev)
-{
- struct resource *r;
- int ret;
- struct bcm63xx_rng_priv *priv;
-
- r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!r) {
- dev_err(&pdev->dev, "no iomem resource\n");
- return -ENXIO;
- }
-
- priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
-
- priv->rng.name = pdev->name;
- priv->rng.init = bcm63xx_rng_init;
- priv->rng.cleanup = bcm63xx_rng_cleanup;
- priv->rng.data_present = bcm63xx_rng_data_present;
- priv->rng.data_read = bcm63xx_rng_data_read;
-
- priv->clk = devm_clk_get(&pdev->dev, "ipsec");
- if (IS_ERR(priv->clk)) {
- ret = PTR_ERR(priv->clk);
- dev_err(&pdev->dev, "no clock for device: %d\n", ret);
- return ret;
- }
-
- if (!devm_request_mem_region(&pdev->dev, r->start,
- resource_size(r), pdev->name)) {
- dev_err(&pdev->dev, "request mem failed");
- return -EBUSY;
- }
-
- priv->regs = devm_ioremap_nocache(&pdev->dev, r->start,
- resource_size(r));
- if (!priv->regs) {
- dev_err(&pdev->dev, "ioremap failed");
- return -ENOMEM;
- }
-
- ret = devm_hwrng_register(&pdev->dev, &priv->rng);
- if (ret) {
- dev_err(&pdev->dev, "failed to register rng device: %d\n",
- ret);
- return ret;
- }
-
- dev_info(&pdev->dev, "registered RNG driver\n");
-
- return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id bcm63xx_rng_of_match[] = {
- { .compatible = "brcm,bcm6368-rng", },
- {},
-};
-MODULE_DEVICE_TABLE(of, bcm63xx_rng_of_match);
-#endif
-
-static struct platform_driver bcm63xx_rng_driver = {
- .probe = bcm63xx_rng_probe,
- .driver = {
- .name = "bcm63xx-rng",
- .of_match_table = of_match_ptr(bcm63xx_rng_of_match),
- },
-};
-
-module_platform_driver(bcm63xx_rng_driver);
-
-MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
-MODULE_DESCRIPTION("Broadcom BCM63xx RNG driver");
-MODULE_LICENSE("GPL");
--
2.9.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng
2017-11-02 1:03 [PATCH 00/12] bcm63xx-rng conversion to bcm2835-rng Florian Fainelli
` (9 preceding siblings ...)
2017-11-02 1:04 ` [PATCH 12/12] hwrng: bcm63xx-rng: Remove since bcm2835-rng takes over Florian Fainelli
@ 2017-11-02 19:01 ` Stefan Wahren
[not found] ` <1329593033.127526.1509649260041-7tX72C7vayboQLBSYMtkGA@public.gmane.org>
10 siblings, 1 reply; 31+ messages in thread
From: Stefan Wahren @ 2017-11-02 19:01 UTC (permalink / raw)
To: Florian Fainelli
Cc: Mark Rutland,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Sean Wang, Martin Kaiser, Herbert Xu, Scott Branden, Ray Jui,
Matt Mackall, Russell King, Krzysztof Kozlowski, linux-kernel,
Eric Anholt, Harald Freudenberger, Rob Herring,
maintainer:BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITE...,
open list:HARDWARE RANDOM NUMBER GENERATOR CORE,
PrasannaKumar Muralidharan, Steffen Trumtrar, BROADCO
Hi Florian,
> Florian Fainelli <f.fainelli@gmail.com> hat am 2. November 2017 um 02:03 geschrieben:
>
>
> Hi,
>
> As it usually happens when there is a fair amount of HW IP block re-use,
> competing implementations show up. In that case the BCM2835 HWRNG driver and
> the BCM63xx RNG driver have exactly the same register offsets and this is
> indeed the same piece of HW.
>
> This patch series first prepares the bcm2835-rng to be more future proof and
> support newer platforms, and the last part brings in what is necessary to
> migrate the bcm63xx-rng over to bcm2835-rng. Finally we delete bcm63xx-rng
> completely.
>
> The reason why BCM2835 RNG was kept over BCM63xx RNG is because the former
> deals correctly with a warm up count and the number of words available in the
> FIFO size.
are these the same patches as in this branch [1]?
https://github.com/ffainelli/linux/commits/rng-consolidation
Regards
Stefan
>
> Thanks!
>
> Florian Fainelli (12):
> hwrng: bcm2835-rng: Obtain base register via resource
> hwrng: bcm2835-rng: Define a driver private context
> hwrng: bcm2835-rng: Move enabling to hwrng::init
> hwrng: bcm2835-rng: Implementation cleanup callback
> hwrng: bcm2835-rng: Use device managed helpers
> hwrng: bcm2835-rng: Rework interrupt masking
> hwrng: bcm2835-rng: Manage an optional clock
> hwrng: bcm2835-rng: Abstract I/O accessors
> hwrng: bcm2835-rng: Add Broadcom MIPS I/O accessors
> dt-bindings: rng: Incorporate brcm,bcm6368.txt binding
> hwrng: bcm2835-rng: Enable BCM2835 RNG to work on BCM63xx platforms
> hwrng: bcm63xx-rng: Remove since bcm2835-rng takes over
>
> .../devicetree/bindings/rng/brcm,bcm2835.txt | 22 ++-
> .../devicetree/bindings/rng/brcm,bcm6368.txt | 17 ---
> drivers/char/hw_random/Kconfig | 20 +--
> drivers/char/hw_random/Makefile | 1 -
> drivers/char/hw_random/bcm2835-rng.c | 166 ++++++++++++++-------
> drivers/char/hw_random/bcm63xx-rng.c | 154 -------------------
> 6 files changed, 139 insertions(+), 241 deletions(-)
> delete mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm6368.txt
> delete mode 100644 drivers/char/hw_random/bcm63xx-rng.c
>
> --
> 2.9.3
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 31+ messages in thread