feat(nxp-clk): dynamic map of the clock modules

Add all clock modules as entries in MMU using dynamic regions.

Change-Id: I56f724ced4bd024554c7b38afd14ea420de80cc6
Signed-off-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
This commit is contained in:
Ghennadi Procopciuc 2024-11-26 16:39:41 +02:00
parent 008925861f
commit 514c738045
3 changed files with 47 additions and 3 deletions

View file

@ -7,6 +7,7 @@
#include <common/debug.h>
#include <drivers/clk.h>
#include <lib/mmio.h>
#include <lib/xlat_tables/xlat_tables_v2.h>
#include <s32cc-clk-ids.h>
#include <s32cc-clk-modules.h>
#include <s32cc-clk-regs.h>
@ -1464,7 +1465,39 @@ static int s32cc_clk_set_parent(unsigned long id, unsigned long parent_id)
return 0;
}
void s32cc_clk_register_drv(void)
static int s32cc_clk_mmap_regs(const struct s32cc_clk_drv *drv)
{
const uintptr_t base_addrs[11] = {
drv->fxosc_base,
drv->armpll_base,
drv->periphpll_base,
drv->armdfs_base,
drv->cgm0_base,
drv->cgm1_base,
drv->cgm5_base,
drv->ddrpll_base,
drv->mc_me,
drv->mc_rgm,
drv->rdc,
};
size_t i;
int ret;
for (i = 0U; i < ARRAY_SIZE(base_addrs); i++) {
ret = mmap_add_dynamic_region(base_addrs[i], base_addrs[i],
PAGE_SIZE,
MT_DEVICE | MT_RW | MT_SECURE);
if (ret != 0) {
ERROR("Failed to map clock module 0x%" PRIuPTR "\n",
base_addrs[i]);
return ret;
}
}
return 0;
}
int s32cc_clk_register_drv(void)
{
static const struct clk_ops s32cc_clk_ops = {
.enable = s32cc_clk_enable,
@ -1475,7 +1508,15 @@ void s32cc_clk_register_drv(void)
.get_parent = s32cc_clk_get_parent,
.set_parent = s32cc_clk_set_parent,
};
const struct s32cc_clk_drv *drv;
clk_register(&s32cc_clk_ops);
drv = get_drv();
if (drv == NULL) {
return -EINVAL;
}
return s32cc_clk_mmap_regs(drv);
}

View file

@ -184,7 +184,10 @@ int s32cc_init_early_clks(void)
{
int ret;
s32cc_clk_register_drv();
ret = s32cc_clk_register_drv();
if (ret != 0) {
return ret;
}
ret = setup_fxosc();
if (ret != 0) {

View file

@ -18,6 +18,6 @@ int s32cc_get_id_from_table(const struct s32cc_clk_array *const *clk_arr,
struct s32cc_clk *s32cc_get_arch_clk(unsigned long id);
int s32cc_get_clk_id(const struct s32cc_clk *clk, unsigned long *id);
void s32cc_clk_register_drv(void);
int s32cc_clk_register_drv(void);
#endif /* S32CC_CLK_UTILS_H */