diff options
| author | Florian Fainelli <f.fainelli@gmail.com> | 2017-11-07 19:44:41 -0500 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-11-29 00:43:44 -0500 |
| commit | ec94bca7be6b29c1aebf2e1e95855ee6ca0d5d62 (patch) | |
| tree | 22eff73ef690d437161463ec16d0a52c0c951670 /drivers/char/hw_random/bcm2835-rng.c | |
| parent | a815777553826079929e0910fcf3fda9a1e8438b (diff) | |
hwrng: bcm2835 - Implementation cleanup callback
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>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/char/hw_random/bcm2835-rng.c')
| -rw-r--r-- | drivers/char/hw_random/bcm2835-rng.c | 12 |
1 files 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) | |||
| 83 | return 0; | 83 | return 0; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | static void bcm2835_rng_cleanup(struct hwrng *rng) | ||
| 87 | { | ||
| 88 | struct bcm2835_rng_priv *priv = to_rng_priv(rng); | ||
| 89 | |||
| 90 | /* disable rng hardware */ | ||
| 91 | __raw_writel(0, priv->base + RNG_CTRL); | ||
| 92 | } | ||
| 93 | |||
| 86 | static const struct of_device_id bcm2835_rng_of_match[] = { | 94 | static const struct of_device_id bcm2835_rng_of_match[] = { |
| 87 | { .compatible = "brcm,bcm2835-rng"}, | 95 | { .compatible = "brcm,bcm2835-rng"}, |
| 88 | { .compatible = "brcm,bcm-nsp-rng", .data = nsp_rng_init}, | 96 | { .compatible = "brcm,bcm-nsp-rng", .data = nsp_rng_init}, |
| @@ -118,6 +126,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev) | |||
| 118 | priv->rng.name = "bcm2835-rng"; | 126 | priv->rng.name = "bcm2835-rng"; |
| 119 | priv->rng.init = bcm2835_rng_init; | 127 | priv->rng.init = bcm2835_rng_init; |
| 120 | priv->rng.read = bcm2835_rng_read; | 128 | priv->rng.read = bcm2835_rng_read; |
| 129 | priv->rng.cleanup = bcm2835_rng_cleanup; | ||
| 121 | 130 | ||
| 122 | rng_id = of_match_node(bcm2835_rng_of_match, np); | 131 | rng_id = of_match_node(bcm2835_rng_of_match, np); |
| 123 | if (!rng_id) | 132 | if (!rng_id) |
| @@ -142,9 +151,6 @@ static int bcm2835_rng_remove(struct platform_device *pdev) | |||
| 142 | { | 151 | { |
| 143 | struct bcm2835_rng_priv *priv = platform_get_drvdata(pdev); | 152 | struct bcm2835_rng_priv *priv = platform_get_drvdata(pdev); |
| 144 | 153 | ||
| 145 | /* disable rng hardware */ | ||
| 146 | __raw_writel(0, priv->base + RNG_CTRL); | ||
| 147 | |||
| 148 | /* unregister driver */ | 154 | /* unregister driver */ |
| 149 | hwrng_unregister(&priv->rng); | 155 | hwrng_unregister(&priv->rng); |
| 150 | 156 | ||
