xref: /optee_os/core/arch/arm/plat-sam/freq.c (revision f496f2c40c7cfad27e0596070b126b86ef46ae8d)
175786993SClément Léger // SPDX-License-Identifier: BSD-2-Clause
275786993SClément Léger /*
375786993SClément Léger  * Copyright 2022 Microchip
475786993SClément Léger  */
575786993SClément Léger 
675786993SClément Léger #include <assert.h>
7*f496f2c4STony Han #include <at91_clk.h>
8c6a18428SThomas Perrot #include <config.h>
975786993SClément Léger #include <drivers/clk.h>
1075786993SClément Léger #include <drivers/clk_dt.h>
1175786993SClément Léger #include <kernel/boot.h>
12e6027f48SAlvin Chang #include <kernel/dt.h>
1375786993SClément Léger #include <kernel/panic.h>
1475786993SClément Léger #include <libfdt.h>
1575786993SClément Léger 
1675786993SClément Léger static unsigned long freq;
1775786993SClément Léger 
get_freq_from_dt(void)1875786993SClément Léger static TEE_Result get_freq_from_dt(void)
1975786993SClément Léger {
2075786993SClément Léger 	int node;
2175786993SClément Léger 	struct clk *clk;
2275786993SClément Léger 	const void *fdt = get_embedded_dt();
2375786993SClément Léger 
2475786993SClément Léger 	if (!fdt)
2575786993SClément Léger 		panic();
2675786993SClément Léger 
27c6a18428SThomas Perrot 	if (IS_ENABLED(CFG_SAMA7G5))
28c6a18428SThomas Perrot 		node = fdt_node_offset_by_compatible(fdt, -1, "arm,cortex-a7");
29c6a18428SThomas Perrot 	else
3075786993SClément Léger 		node = fdt_node_offset_by_compatible(fdt, -1, "arm,cortex-a5");
31c6a18428SThomas Perrot 
3275786993SClément Léger 	if (!node)
3375786993SClément Léger 		panic();
3475786993SClément Léger 
3575786993SClément Léger 	if (clk_dt_get_by_name(fdt, node, "cpu", &clk))
3675786993SClément Léger 		panic();
3775786993SClément Léger 
3875786993SClément Léger 	freq = clk_get_rate(clk);
3975786993SClément Léger 
40*f496f2c4STony Han 	return at91_clk_register_cpu_opp(fdt, node, clk);
4175786993SClément Léger }
4275786993SClément Léger early_init_late(get_freq_from_dt);
4375786993SClément Léger 
plat_get_freq(void)4475786993SClément Léger unsigned long plat_get_freq(void)
4575786993SClément Léger {
4675786993SClément Léger 	assert(freq);
4775786993SClément Léger 
4875786993SClément Léger 	return freq;
4975786993SClément Léger }
50