xref: /rk3399_ARM-atf/drivers/nxp/clk/s32cc/s32cc_early_clks.c (revision 8653352ad72e0f95dfd44f2ef9d1b2406dd8dca5)
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)
15b8ad8800SGhennadi Procopciuc #define S32CC_XBAR_2X_FREQ		(800U * MHZ)
16*8653352aSGhennadi Procopciuc #define S32CC_PERIPH_PLL_VCO_FREQ	(2U * GHZ)
17*8653352aSGhennadi Procopciuc #define S32CC_PERIPH_PLL_PHI3_FREQ	(125U * MHZ)
1866af5425SGhennadi Procopciuc 
19d3869455SGhennadi Procopciuc static int enable_fxosc_clk(void)
2066af5425SGhennadi Procopciuc {
2166af5425SGhennadi Procopciuc 	int ret;
2266af5425SGhennadi Procopciuc 
23d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
24d3869455SGhennadi Procopciuc 	if (ret != 0) {
25d3869455SGhennadi Procopciuc 		return ret;
26d3869455SGhennadi Procopciuc 	}
27d3869455SGhennadi Procopciuc 
28d3869455SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_FXOSC);
29d3869455SGhennadi Procopciuc 	if (ret != 0) {
30d3869455SGhennadi Procopciuc 		return ret;
31d3869455SGhennadi Procopciuc 	}
32d3869455SGhennadi Procopciuc 
33d3869455SGhennadi Procopciuc 	return ret;
34d3869455SGhennadi Procopciuc }
35d3869455SGhennadi Procopciuc 
36d3869455SGhennadi Procopciuc static int enable_arm_pll(void)
37d3869455SGhennadi Procopciuc {
38d3869455SGhennadi Procopciuc 	int ret;
3966af5425SGhennadi Procopciuc 
4083af4504SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
4183af4504SGhennadi Procopciuc 	if (ret != 0) {
4283af4504SGhennadi Procopciuc 		return ret;
4383af4504SGhennadi Procopciuc 	}
4483af4504SGhennadi Procopciuc 
457ad4e231SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
467ad4e231SGhennadi Procopciuc 	if (ret != 0) {
477ad4e231SGhennadi Procopciuc 		return ret;
487ad4e231SGhennadi Procopciuc 	}
497ad4e231SGhennadi Procopciuc 
50de950ef0SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
51de950ef0SGhennadi Procopciuc 	if (ret != 0) {
52de950ef0SGhennadi Procopciuc 		return ret;
53de950ef0SGhennadi Procopciuc 	}
54de950ef0SGhennadi Procopciuc 
55b5101c45SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
56b5101c45SGhennadi Procopciuc 	if (ret != 0) {
57b5101c45SGhennadi Procopciuc 		return ret;
58b5101c45SGhennadi Procopciuc 	}
59b5101c45SGhennadi Procopciuc 
6084e82085SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
6184e82085SGhennadi Procopciuc 	if (ret != 0) {
6284e82085SGhennadi Procopciuc 		return ret;
6384e82085SGhennadi Procopciuc 	}
6484e82085SGhennadi Procopciuc 
65d3869455SGhennadi Procopciuc 	return ret;
66d3869455SGhennadi Procopciuc }
67d3869455SGhennadi Procopciuc 
68*8653352aSGhennadi Procopciuc static int enable_periph_pll(void)
69*8653352aSGhennadi Procopciuc {
70*8653352aSGhennadi Procopciuc 	int ret;
71*8653352aSGhennadi Procopciuc 
72*8653352aSGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC);
73*8653352aSGhennadi Procopciuc 	if (ret != 0) {
74*8653352aSGhennadi Procopciuc 		return ret;
75*8653352aSGhennadi Procopciuc 	}
76*8653352aSGhennadi Procopciuc 
77*8653352aSGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL);
78*8653352aSGhennadi Procopciuc 	if (ret != 0) {
79*8653352aSGhennadi Procopciuc 		return ret;
80*8653352aSGhennadi Procopciuc 	}
81*8653352aSGhennadi Procopciuc 
82*8653352aSGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL);
83*8653352aSGhennadi Procopciuc 	if (ret != 0) {
84*8653352aSGhennadi Procopciuc 		return ret;
85*8653352aSGhennadi Procopciuc 	}
86*8653352aSGhennadi Procopciuc 
87*8653352aSGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_PERIPH_PLL_VCO);
88*8653352aSGhennadi Procopciuc 	if (ret != 0) {
89*8653352aSGhennadi Procopciuc 		return ret;
90*8653352aSGhennadi Procopciuc 	}
91*8653352aSGhennadi Procopciuc 
92*8653352aSGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_PERIPH_PLL_PHI3);
93*8653352aSGhennadi Procopciuc 	if (ret != 0) {
94*8653352aSGhennadi Procopciuc 		return ret;
95*8653352aSGhennadi Procopciuc 	}
96*8653352aSGhennadi Procopciuc 
97*8653352aSGhennadi Procopciuc 	return ret;
98*8653352aSGhennadi Procopciuc }
99*8653352aSGhennadi Procopciuc 
100d3869455SGhennadi Procopciuc static int enable_a53_clk(void)
101d3869455SGhennadi Procopciuc {
102d3869455SGhennadi Procopciuc 	int ret;
103d3869455SGhennadi Procopciuc 
104d3869455SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
105d3869455SGhennadi Procopciuc 	if (ret != 0) {
106d3869455SGhennadi Procopciuc 		return ret;
107d3869455SGhennadi Procopciuc 	}
108d3869455SGhennadi Procopciuc 
109d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
110d3869455SGhennadi Procopciuc 	if (ret != 0) {
111d3869455SGhennadi Procopciuc 		return ret;
112d3869455SGhennadi Procopciuc 	}
113d3869455SGhennadi Procopciuc 
1147004f678SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_A53_CORE);
1157004f678SGhennadi Procopciuc 	if (ret != 0) {
1167004f678SGhennadi Procopciuc 		return ret;
1177004f678SGhennadi Procopciuc 	}
1187004f678SGhennadi Procopciuc 
11966af5425SGhennadi Procopciuc 	return ret;
12066af5425SGhennadi Procopciuc }
121d3869455SGhennadi Procopciuc 
122b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void)
123b8ad8800SGhennadi Procopciuc {
124b8ad8800SGhennadi Procopciuc 	int ret;
125b8ad8800SGhennadi Procopciuc 
126b8ad8800SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
127b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
128b8ad8800SGhennadi Procopciuc 		return ret;
129b8ad8800SGhennadi Procopciuc 	}
130b8ad8800SGhennadi Procopciuc 
131b8ad8800SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
132b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
133b8ad8800SGhennadi Procopciuc 		return ret;
134b8ad8800SGhennadi Procopciuc 	}
135b8ad8800SGhennadi Procopciuc 
136b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
137b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
138b8ad8800SGhennadi Procopciuc 		return ret;
139b8ad8800SGhennadi Procopciuc 	}
140b8ad8800SGhennadi Procopciuc 
141b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_XBAR_2X);
142b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
143b8ad8800SGhennadi Procopciuc 		return ret;
144b8ad8800SGhennadi Procopciuc 	}
145b8ad8800SGhennadi Procopciuc 
146b8ad8800SGhennadi Procopciuc 	return ret;
147b8ad8800SGhennadi Procopciuc }
148b8ad8800SGhennadi Procopciuc 
149d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void)
150d3869455SGhennadi Procopciuc {
151d3869455SGhennadi Procopciuc 	int ret;
152d3869455SGhennadi Procopciuc 
153d3869455SGhennadi Procopciuc 	s32cc_clk_register_drv();
154d3869455SGhennadi Procopciuc 
155d3869455SGhennadi Procopciuc 	ret = enable_fxosc_clk();
156d3869455SGhennadi Procopciuc 	if (ret != 0) {
157d3869455SGhennadi Procopciuc 		return ret;
158d3869455SGhennadi Procopciuc 	}
159d3869455SGhennadi Procopciuc 
160d3869455SGhennadi Procopciuc 	ret = enable_arm_pll();
161d3869455SGhennadi Procopciuc 	if (ret != 0) {
162d3869455SGhennadi Procopciuc 		return ret;
163d3869455SGhennadi Procopciuc 	}
164d3869455SGhennadi Procopciuc 
165*8653352aSGhennadi Procopciuc 	ret = enable_periph_pll();
166*8653352aSGhennadi Procopciuc 	if (ret != 0) {
167*8653352aSGhennadi Procopciuc 		return ret;
168*8653352aSGhennadi Procopciuc 	}
169*8653352aSGhennadi Procopciuc 
170d3869455SGhennadi Procopciuc 	ret = enable_a53_clk();
171d3869455SGhennadi Procopciuc 	if (ret != 0) {
172d3869455SGhennadi Procopciuc 		return ret;
173d3869455SGhennadi Procopciuc 	}
174d3869455SGhennadi Procopciuc 
175b8ad8800SGhennadi Procopciuc 	ret = enable_xbar_clk();
176b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
177b8ad8800SGhennadi Procopciuc 		return ret;
178b8ad8800SGhennadi Procopciuc 	}
179b8ad8800SGhennadi Procopciuc 
180d3869455SGhennadi Procopciuc 	return ret;
181d3869455SGhennadi Procopciuc }
182