summaryrefslogtreecommitdiffstats
path: root/bsps/riscv/riscv/start/bspstart.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/riscv/riscv/start/bspstart.c')
-rw-r--r--bsps/riscv/riscv/start/bspstart.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/bsps/riscv/riscv/start/bspstart.c b/bsps/riscv/riscv/start/bspstart.c
index d4c4e1ff7f..a462bbe6e1 100644
--- a/bsps/riscv/riscv/start/bspstart.c
+++ b/bsps/riscv/riscv/start/bspstart.c
@@ -30,6 +30,11 @@
#include <bsp/riscv.h>
#include <libfdt.h>
+#include <string.h>
+
+#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0
+unsigned int riscv_core_freq;
+#endif
void *riscv_fdt_get_address(const void *fdt, int node)
{
@@ -161,8 +166,55 @@ uint32_t riscv_get_hart_index_by_phandle(uint32_t phandle)
return UINT32_MAX;
}
+#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0
+static uint32_t get_core_frequency(void)
+{
+ uint32_t node;
+ const char *fdt=bsp_fdt_get();
+
+ char *tlclk;
+ uint32_t len;
+
+ do
+ {
+ node=fdt_node_offset_by_compatible(fdt, -1,"fixed-clock");
+ uint32_t *val=NULL;
+ if (node>0)
+ {
+ tlclk = fdt_getprop(fdt, node, "clock-output-names", &len);
+
+ if (strcmp(tlclk,"tlclk") == 0)
+ {
+ val = fdt_getprop(fdt, node, "clock-frequency", &len);
+ if(val !=NULL)
+ {
+ riscv_core_freq=fdt32_to_cpu(*val);
+ break;
+ }
+ }
+ }else
+ {
+ bsp_fatal(RISCV_FATAL_NO_TLCLOCK_FREQUENCY_IN_DEVICE_TREE);
+ }
+
+ } while (node > 0);
+
+ return riscv_core_freq;
+}
+
+inline uint32_t riscv_get_core_frequency(void)
+{
+ return riscv_core_freq;
+}
+#endif
+
void bsp_start(void)
{
riscv_find_harts();
bsp_interrupt_initialize();
+
+#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0
+ riscv_core_freq=get_core_frequency();
+#endif
+
}