xref: /rk3399_ARM-atf/drivers/nxp/clk/s32cc/s32cc_early_clks.c (revision d3869455a619877a0d7e3a3cae09311c50f1dd38)
166af5425SGhennadi Procopciuc /*
266af5425SGhennadi Procopciuc  * Copyright 2024 NXP
366af5425SGhennadi Procopciuc  *
466af5425SGhennadi Procopciuc  * SPDX-License-Identifier: BSD-3-Clause
566af5425SGhennadi Procopciuc  */
666af5425SGhennadi Procopciuc #include <drivers/clk.h>
766af5425SGhennadi Procopciuc #include <s32cc-clk-drv.h>
866af5425SGhennadi Procopciuc #include <s32cc-clk-ids.h>
966af5425SGhennadi Procopciuc #include <s32cc-clk-utils.h>
1066af5425SGhennadi Procopciuc 
1166af5425SGhennadi Procopciuc #define S32CC_FXOSC_FREQ	(40U * MHZ)
127ad4e231SGhennadi Procopciuc #define S32CC_ARM_PLL_VCO_FREQ	(2U * GHZ)
13de950ef0SGhennadi Procopciuc #define S32CC_ARM_PLL_PHI0_FREQ	(1U * GHZ)
1464e0c226SGhennadi Procopciuc #define S32CC_A53_FREQ		(1U * GHZ)
1566af5425SGhennadi Procopciuc 
16*d3869455SGhennadi Procopciuc static int enable_fxosc_clk(void)
1766af5425SGhennadi Procopciuc {
1866af5425SGhennadi Procopciuc 	int ret;
1966af5425SGhennadi Procopciuc 
20*d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
21*d3869455SGhennadi Procopciuc 	if (ret != 0) {
22*d3869455SGhennadi Procopciuc 		return ret;
23*d3869455SGhennadi Procopciuc 	}
24*d3869455SGhennadi Procopciuc 
25*d3869455SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_FXOSC);
26*d3869455SGhennadi Procopciuc 	if (ret != 0) {
27*d3869455SGhennadi Procopciuc 		return ret;
28*d3869455SGhennadi Procopciuc 	}
29*d3869455SGhennadi Procopciuc 
30*d3869455SGhennadi Procopciuc 	return ret;
31*d3869455SGhennadi Procopciuc }
32*d3869455SGhennadi Procopciuc 
33*d3869455SGhennadi Procopciuc static int enable_arm_pll(void)
34*d3869455SGhennadi Procopciuc {
35*d3869455SGhennadi Procopciuc 	int ret;
3666af5425SGhennadi Procopciuc 
3783af4504SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
3883af4504SGhennadi Procopciuc 	if (ret != 0) {
3983af4504SGhennadi Procopciuc 		return ret;
4083af4504SGhennadi Procopciuc 	}
4183af4504SGhennadi Procopciuc 
427ad4e231SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
437ad4e231SGhennadi Procopciuc 	if (ret != 0) {
447ad4e231SGhennadi Procopciuc 		return ret;
457ad4e231SGhennadi Procopciuc 	}
467ad4e231SGhennadi Procopciuc 
47de950ef0SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
48de950ef0SGhennadi Procopciuc 	if (ret != 0) {
49de950ef0SGhennadi Procopciuc 		return ret;
50de950ef0SGhennadi Procopciuc 	}
51de950ef0SGhennadi Procopciuc 
52b5101c45SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
53b5101c45SGhennadi Procopciuc 	if (ret != 0) {
54b5101c45SGhennadi Procopciuc 		return ret;
55b5101c45SGhennadi Procopciuc 	}
56b5101c45SGhennadi Procopciuc 
5784e82085SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
5884e82085SGhennadi Procopciuc 	if (ret != 0) {
5984e82085SGhennadi Procopciuc 		return ret;
6084e82085SGhennadi Procopciuc 	}
6184e82085SGhennadi Procopciuc 
62*d3869455SGhennadi Procopciuc 	return ret;
63*d3869455SGhennadi Procopciuc }
64*d3869455SGhennadi Procopciuc 
65*d3869455SGhennadi Procopciuc static int enable_a53_clk(void)
66*d3869455SGhennadi Procopciuc {
67*d3869455SGhennadi Procopciuc 	int ret;
68*d3869455SGhennadi Procopciuc 
69*d3869455SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
70*d3869455SGhennadi Procopciuc 	if (ret != 0) {
71*d3869455SGhennadi Procopciuc 		return ret;
72*d3869455SGhennadi Procopciuc 	}
73*d3869455SGhennadi Procopciuc 
74*d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
75*d3869455SGhennadi Procopciuc 	if (ret != 0) {
76*d3869455SGhennadi Procopciuc 		return ret;
77*d3869455SGhennadi Procopciuc 	}
78*d3869455SGhennadi Procopciuc 
797004f678SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_A53_CORE);
807004f678SGhennadi Procopciuc 	if (ret != 0) {
817004f678SGhennadi Procopciuc 		return ret;
827004f678SGhennadi Procopciuc 	}
837004f678SGhennadi Procopciuc 
8466af5425SGhennadi Procopciuc 	return ret;
8566af5425SGhennadi Procopciuc }
86*d3869455SGhennadi Procopciuc 
87*d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void)
88*d3869455SGhennadi Procopciuc {
89*d3869455SGhennadi Procopciuc 	int ret;
90*d3869455SGhennadi Procopciuc 
91*d3869455SGhennadi Procopciuc 	s32cc_clk_register_drv();
92*d3869455SGhennadi Procopciuc 
93*d3869455SGhennadi Procopciuc 	ret = enable_fxosc_clk();
94*d3869455SGhennadi Procopciuc 	if (ret != 0) {
95*d3869455SGhennadi Procopciuc 		return ret;
96*d3869455SGhennadi Procopciuc 	}
97*d3869455SGhennadi Procopciuc 
98*d3869455SGhennadi Procopciuc 	ret = enable_arm_pll();
99*d3869455SGhennadi Procopciuc 	if (ret != 0) {
100*d3869455SGhennadi Procopciuc 		return ret;
101*d3869455SGhennadi Procopciuc 	}
102*d3869455SGhennadi Procopciuc 
103*d3869455SGhennadi Procopciuc 	ret = enable_a53_clk();
104*d3869455SGhennadi Procopciuc 	if (ret != 0) {
105*d3869455SGhennadi Procopciuc 		return ret;
106*d3869455SGhennadi Procopciuc 	}
107*d3869455SGhennadi Procopciuc 
108*d3869455SGhennadi Procopciuc 	return ret;
109*d3869455SGhennadi Procopciuc }
110