[PATCH v1 2/2] cpu: clk: riscv: populate proper CPU core clk frequency
Bin Meng
bmeng.cn at gmail.com
Wed Feb 19 17:09:49 CET 2020
+Sean Anderson
Hi Sagar,
On Wed, Feb 19, 2020 at 12:13 AM Sagar Shrikant Kadam
<sagar.kadam at 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 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>
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
More information about the U-Boot
mailing list