diff --git a/drivers/nxp/clk/s32cc/s32cc_clk_drv.c b/drivers/nxp/clk/s32cc/s32cc_clk_drv.c index 9b5760753..ed331bf1c 100644 --- a/drivers/nxp/clk/s32cc/s32cc_clk_drv.c +++ b/drivers/nxp/clk/s32cc/s32cc_clk_drv.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -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); } diff --git a/drivers/nxp/clk/s32cc/s32cc_early_clks.c b/drivers/nxp/clk/s32cc/s32cc_early_clks.c index 02b9df93c..06936a573 100644 --- a/drivers/nxp/clk/s32cc/s32cc_early_clks.c +++ b/drivers/nxp/clk/s32cc/s32cc_early_clks.c @@ -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) { diff --git a/include/drivers/nxp/clk/s32cc/s32cc-clk-utils.h b/include/drivers/nxp/clk/s32cc/s32cc-clk-utils.h index e6adeccd7..1d08f736b 100644 --- a/include/drivers/nxp/clk/s32cc/s32cc-clk-utils.h +++ b/include/drivers/nxp/clk/s32cc/s32cc-clk-utils.h @@ -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 */