Skip to content

Commit

Permalink
hwrng: atmel - disable TRNG during suspend
Browse files Browse the repository at this point in the history
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: Wenyou Yang <wenyou.yang@atmel.com>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
wenyouya authored and herbertx committed Nov 1, 2016
1 parent 6c0f400 commit a1fa98d
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions drivers/char/hw_random/atmel-rng.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,16 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,
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)
{
struct atmel_trng *trng;
Expand All @@ -71,7 +81,7 @@ static int atmel_trng_probe(struct platform_device *pdev)
if (ret)
return ret;

writel(TRNG_KEY | 1, trng->base + TRNG_CR);
atmel_trng_enable(trng);
trng->rng.name = pdev->name;
trng->rng.read = atmel_trng_read;

Expand All @@ -94,7 +104,7 @@ static int atmel_trng_remove(struct platform_device *pdev)

hwrng_unregister(&trng->rng);

writel(TRNG_KEY, trng->base + TRNG_CR);
atmel_trng_disable(trng);
clk_disable_unprepare(trng->clk);

return 0;
Expand All @@ -105,6 +115,7 @@ static int atmel_trng_suspend(struct device *dev)
{
struct atmel_trng *trng = dev_get_drvdata(dev);

atmel_trng_disable(trng);
clk_disable_unprepare(trng->clk);

return 0;
Expand All @@ -113,8 +124,15 @@ static int atmel_trng_suspend(struct device *dev)
static int atmel_trng_resume(struct device *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 = {
Expand Down

0 comments on commit a1fa98d

Please sign in to comment.