
+Sean Anderson
Hi Sagar,
On Wed, Feb 19, 2020 at 12:13 AM Sagar Shrikant Kadam sagar.kadam@sifive.com wrote:
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@sifive.com Tested-by: Vincent Chen vincent.chen@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>
It's wrong to include a SoC specific header file in a generic driver.
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)
--
What you were trying to do in this patch, I believe the following 2 patches already did it.
http://patchwork.ozlabs.org/patch/1236177/ http://patchwork.ozlabs.org/patch/1236180/
Regards, Bin