[PATCH v1 2/2] cpu: clk: riscv: populate proper CPU core clk frequency
Sagar Shrikant Kadam
sagar.kadam at sifive.com
Tue Feb 18 17:13:24 CET 2020
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.kadam at sifive.com>
Tested-by: Vincent Chen <vincent.chen at 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
More information about the U-Boot
mailing list