xref: /rk3399_ARM-atf/drivers/nxp/clk/s32cc/s32cc_early_clks.c (revision b8ad8800b2b13d40a6ea1e997e6feb573744665b)
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)
15*b8ad8800SGhennadi Procopciuc #define S32CC_XBAR_2X_FREQ	(800U * MHZ)
1666af5425SGhennadi Procopciuc 
17d3869455SGhennadi Procopciuc static int enable_fxosc_clk(void)
1866af5425SGhennadi Procopciuc {
1966af5425SGhennadi Procopciuc 	int ret;
2066af5425SGhennadi Procopciuc 
21d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
22d3869455SGhennadi Procopciuc 	if (ret != 0) {
23d3869455SGhennadi Procopciuc 		return ret;
24d3869455SGhennadi Procopciuc 	}
25d3869455SGhennadi Procopciuc 
26d3869455SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_FXOSC);
27d3869455SGhennadi Procopciuc 	if (ret != 0) {
28d3869455SGhennadi Procopciuc 		return ret;
29d3869455SGhennadi Procopciuc 	}
30d3869455SGhennadi Procopciuc 
31d3869455SGhennadi Procopciuc 	return ret;
32d3869455SGhennadi Procopciuc }
33d3869455SGhennadi Procopciuc 
34d3869455SGhennadi Procopciuc static int enable_arm_pll(void)
35d3869455SGhennadi Procopciuc {
36d3869455SGhennadi Procopciuc 	int ret;
3766af5425SGhennadi Procopciuc 
3883af4504SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
3983af4504SGhennadi Procopciuc 	if (ret != 0) {
4083af4504SGhennadi Procopciuc 		return ret;
4183af4504SGhennadi Procopciuc 	}
4283af4504SGhennadi Procopciuc 
437ad4e231SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
447ad4e231SGhennadi Procopciuc 	if (ret != 0) {
457ad4e231SGhennadi Procopciuc 		return ret;
467ad4e231SGhennadi Procopciuc 	}
477ad4e231SGhennadi Procopciuc 
48de950ef0SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
49de950ef0SGhennadi Procopciuc 	if (ret != 0) {
50de950ef0SGhennadi Procopciuc 		return ret;
51de950ef0SGhennadi Procopciuc 	}
52de950ef0SGhennadi Procopciuc 
53b5101c45SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
54b5101c45SGhennadi Procopciuc 	if (ret != 0) {
55b5101c45SGhennadi Procopciuc 		return ret;
56b5101c45SGhennadi Procopciuc 	}
57b5101c45SGhennadi Procopciuc 
5884e82085SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
5984e82085SGhennadi Procopciuc 	if (ret != 0) {
6084e82085SGhennadi Procopciuc 		return ret;
6184e82085SGhennadi Procopciuc 	}
6284e82085SGhennadi Procopciuc 
63d3869455SGhennadi Procopciuc 	return ret;
64d3869455SGhennadi Procopciuc }
65d3869455SGhennadi Procopciuc 
66d3869455SGhennadi Procopciuc static int enable_a53_clk(void)
67d3869455SGhennadi Procopciuc {
68d3869455SGhennadi Procopciuc 	int ret;
69d3869455SGhennadi Procopciuc 
70d3869455SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
71d3869455SGhennadi Procopciuc 	if (ret != 0) {
72d3869455SGhennadi Procopciuc 		return ret;
73d3869455SGhennadi Procopciuc 	}
74d3869455SGhennadi Procopciuc 
75d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
76d3869455SGhennadi Procopciuc 	if (ret != 0) {
77d3869455SGhennadi Procopciuc 		return ret;
78d3869455SGhennadi Procopciuc 	}
79d3869455SGhennadi Procopciuc 
807004f678SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_A53_CORE);
817004f678SGhennadi Procopciuc 	if (ret != 0) {
827004f678SGhennadi Procopciuc 		return ret;
837004f678SGhennadi Procopciuc 	}
847004f678SGhennadi Procopciuc 
8566af5425SGhennadi Procopciuc 	return ret;
8666af5425SGhennadi Procopciuc }
87d3869455SGhennadi Procopciuc 
88*b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void)
89*b8ad8800SGhennadi Procopciuc {
90*b8ad8800SGhennadi Procopciuc 	int ret;
91*b8ad8800SGhennadi Procopciuc 
92*b8ad8800SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
93*b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
94*b8ad8800SGhennadi Procopciuc 		return ret;
95*b8ad8800SGhennadi Procopciuc 	}
96*b8ad8800SGhennadi Procopciuc 
97*b8ad8800SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
98*b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
99*b8ad8800SGhennadi Procopciuc 		return ret;
100*b8ad8800SGhennadi Procopciuc 	}
101*b8ad8800SGhennadi Procopciuc 
102*b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
103*b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
104*b8ad8800SGhennadi Procopciuc 		return ret;
105*b8ad8800SGhennadi Procopciuc 	}
106*b8ad8800SGhennadi Procopciuc 
107*b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_XBAR_2X);
108*b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
109*b8ad8800SGhennadi Procopciuc 		return ret;
110*b8ad8800SGhennadi Procopciuc 	}
111*b8ad8800SGhennadi Procopciuc 
112*b8ad8800SGhennadi Procopciuc 	return ret;
113*b8ad8800SGhennadi Procopciuc }
114*b8ad8800SGhennadi Procopciuc 
115d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void)
116d3869455SGhennadi Procopciuc {
117d3869455SGhennadi Procopciuc 	int ret;
118d3869455SGhennadi Procopciuc 
119d3869455SGhennadi Procopciuc 	s32cc_clk_register_drv();
120d3869455SGhennadi Procopciuc 
121d3869455SGhennadi Procopciuc 	ret = enable_fxosc_clk();
122d3869455SGhennadi Procopciuc 	if (ret != 0) {
123d3869455SGhennadi Procopciuc 		return ret;
124d3869455SGhennadi Procopciuc 	}
125d3869455SGhennadi Procopciuc 
126d3869455SGhennadi Procopciuc 	ret = enable_arm_pll();
127d3869455SGhennadi Procopciuc 	if (ret != 0) {
128d3869455SGhennadi Procopciuc 		return ret;
129d3869455SGhennadi Procopciuc 	}
130d3869455SGhennadi Procopciuc 
131d3869455SGhennadi Procopciuc 	ret = enable_a53_clk();
132d3869455SGhennadi Procopciuc 	if (ret != 0) {
133d3869455SGhennadi Procopciuc 		return ret;
134d3869455SGhennadi Procopciuc 	}
135d3869455SGhennadi Procopciuc 
136*b8ad8800SGhennadi Procopciuc 	ret = enable_xbar_clk();
137*b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
138*b8ad8800SGhennadi Procopciuc 		return ret;
139*b8ad8800SGhennadi Procopciuc 	}
140*b8ad8800SGhennadi Procopciuc 
141d3869455SGhennadi Procopciuc 	return ret;
142d3869455SGhennadi Procopciuc }
143