Commit a1fa98d8 authored by Wenyou Yang's avatar Wenyou Yang Committed by Herbert Xu

hwrng: atmel - disable TRNG during suspend

To fix the over consumption on the VDDCore due to the TRNG enabled,
disable the TRNG during suspend, not only disable the user interface
clock (which is controlled by PMC). Because the user interface clock
is independent from any clock that may be used in the entropy source
logic circuitry.
Signed-off-by: default avatarWenyou Yang <wenyou.yang@atmel.com>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 6c0f4000
...@@ -48,6 +48,16 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max, ...@@ -48,6 +48,16 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,
return 0; return 0;
} }
static void atmel_trng_enable(struct atmel_trng *trng)
{
writel(TRNG_KEY | 1, trng->base + TRNG_CR);
}
static void atmel_trng_disable(struct atmel_trng *trng)
{
writel(TRNG_KEY, trng->base + TRNG_CR);
}
static int atmel_trng_probe(struct platform_device *pdev) static int atmel_trng_probe(struct platform_device *pdev)
{ {
struct atmel_trng *trng; struct atmel_trng *trng;
...@@ -71,7 +81,7 @@ static int atmel_trng_probe(struct platform_device *pdev) ...@@ -71,7 +81,7 @@ static int atmel_trng_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
writel(TRNG_KEY | 1, trng->base + TRNG_CR); atmel_trng_enable(trng);
trng->rng.name = pdev->name; trng->rng.name = pdev->name;
trng->rng.read = atmel_trng_read; trng->rng.read = atmel_trng_read;
...@@ -94,7 +104,7 @@ static int atmel_trng_remove(struct platform_device *pdev) ...@@ -94,7 +104,7 @@ static int atmel_trng_remove(struct platform_device *pdev)
hwrng_unregister(&trng->rng); hwrng_unregister(&trng->rng);
writel(TRNG_KEY, trng->base + TRNG_CR); atmel_trng_disable(trng);
clk_disable_unprepare(trng->clk); clk_disable_unprepare(trng->clk);
return 0; return 0;
...@@ -105,6 +115,7 @@ static int atmel_trng_suspend(struct device *dev) ...@@ -105,6 +115,7 @@ static int atmel_trng_suspend(struct device *dev)
{ {
struct atmel_trng *trng = dev_get_drvdata(dev); struct atmel_trng *trng = dev_get_drvdata(dev);
atmel_trng_disable(trng);
clk_disable_unprepare(trng->clk); clk_disable_unprepare(trng->clk);
return 0; return 0;
...@@ -113,8 +124,15 @@ static int atmel_trng_suspend(struct device *dev) ...@@ -113,8 +124,15 @@ static int atmel_trng_suspend(struct device *dev)
static int atmel_trng_resume(struct device *dev) static int atmel_trng_resume(struct device *dev)
{ {
struct atmel_trng *trng = dev_get_drvdata(dev); struct atmel_trng *trng = dev_get_drvdata(dev);
int ret;
ret = clk_prepare_enable(trng->clk);
if (ret)
return ret;
return clk_prepare_enable(trng->clk); atmel_trng_enable(trng);
return 0;
} }
static const struct dev_pm_ops atmel_trng_pm_ops = { static const struct dev_pm_ops atmel_trng_pm_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment