Fetch core clock frequency from prci if clock-frequency for CPU nodes
is missing in device tree, so that the cmd "#cpu detail" will show the
correct CPU frequency.

U-Boot command "#cpu detail" is showing wrong frequency values.
This patch fixes this issue by getting the core clock set in prci driver
if clock-frequency is not added to CPU nodes in device tree.
It is tested on HiFive Unleashed A00 board.

Signed-off-by: Sagar Shrikant Kadam <sagar.ka...@sifive.com>
Tested-by: Vincent Chen <vincent.c...@sifive.com>
---
 drivers/cpu/riscv_cpu.c | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/drivers/cpu/riscv_cpu.c b/drivers/cpu/riscv_cpu.c
index 28ad0aa..eb5491f 100644
--- a/drivers/cpu/riscv_cpu.c
+++ b/drivers/cpu/riscv_cpu.c
@@ -9,6 +9,8 @@
 #include <errno.h>
 #include <dm/device-internal.h>
 #include <dm/lists.h>
+#include <clk-uclass.h>
+#include <dt-bindings/clock/sifive-fu540-prci.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -25,11 +27,46 @@ static int riscv_cpu_get_desc(struct udevice *dev, char 
*buf, int size)
        return 0;
 }
 
+static ulong riscv_get_clkrate(int clk_index)
+{
+       int ret;
+       struct udevice *dev;
+       struct clk clk;
+       ulong rate;
+
+       ret = uclass_get_device_by_driver(UCLASS_CLK,
+                                         DM_GET_DRIVER(sifive_fu540_prci),
+                                         &dev);
+       if (ret < 0) {
+               pr_err("%s: Could not get device driver\n", __func__);
+               return ret;
+       }
+
+       clk.id = clk_index;
+       ret = clk_request(dev, &clk);
+       if (ret < 0) {
+               pr_err("%s: request to clock device failed...\n", __func__);
+               return ret;
+       }
+
+       rate = clk_get_rate(&clk);
+
+       clk_free(&clk);
+
+       return rate;
+}
+
 static int riscv_cpu_get_info(struct udevice *dev, struct cpu_info *info)
 {
        const char *mmu;
+       int ret;
 
-       dev_read_u32(dev, "clock-frequency", (u32 *)&info->cpu_freq);
+       ret = dev_read_u32(dev, "clock-frequency", (u32 *)&info->cpu_freq);
+       if (ret) {
+               /* if clock-frequency is missing in DT, read it from prci */
+               debug("Fetch core clk configured by prci\n");
+               info->cpu_freq = riscv_get_clkrate(PRCI_CLK_COREPLL);
+       }
 
        mmu = dev_read_string(dev, "mmu-type");
        if (!mmu)
-- 
2.7.4

Reply via email to