+Sean Anderson

Hi Sagar,

On Wed, Feb 19, 2020 at 12:13 AM Sagar Shrikant Kadam
<sagar.ka...@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.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>

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

Reply via email to