rng: msm: keep core clock disabled when PRNG not in use
authorSam Day <me@samcday.com>
Wed, 12 Feb 2025 07:01:55 +0000 (07:01 +0000)
committerCaleb Connolly <caleb.connolly@linaro.org>
Mon, 17 Mar 2025 13:38:18 +0000 (13:38 +0000)
This is how the kernel does it. APQ8016E TRM also states that this clock
can be turned off when no random numbers are needed.

Signed-off-by: Sam Day <me@samcday.com>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: Caleb Connolly <caleb.connolly@linaro.org>
Link: https://lore.kernel.org/r/20250212-msm-rng-fixes-v2-5-645cf8d3fd3c@samcday.com
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
drivers/rng/msm_rng.c

index 0150550..aab602c 100644 (file)
@@ -44,6 +44,11 @@ static int msm_rng_read(struct udevice *dev, void *data, size_t len)
        u32 *retdata = data;
        size_t maxsize;
        u32 val;
+       int ret;
+
+       ret = clk_enable(&priv->clk);
+       if (ret < 0)
+               return ret;
 
        /* calculate max size bytes to transfer back to caller */
        maxsize = min_t(size_t, MAX_HW_FIFO_SIZE, len);
@@ -66,6 +71,8 @@ static int msm_rng_read(struct udevice *dev, void *data, size_t len)
                        break;
        } while (currsize < maxsize);
 
+       clk_disable(&priv->clk);
+
        return 0;
 }
 
@@ -118,7 +125,9 @@ static int msm_rng_probe(struct udevice *dev)
        if (ret < 0)
                return ret;
 
-       return msm_rng_enable(priv, 1);
+       ret = msm_rng_enable(priv, 1);
+       clk_disable(&priv->clk);
+       return ret;
 }
 
 static int msm_rng_remove(struct udevice *dev)