xref: /rk3399_ARM-atf/drivers/nxp/clk/s32cc/s32cc_early_clks.c (revision e4462dae81d0674eaf07ad8fa61b25b28a209d0b)
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>
7*e4462daeSGhennadi Procopciuc #include <platform_def.h>
866af5425SGhennadi Procopciuc #include <s32cc-clk-drv.h>
966af5425SGhennadi Procopciuc #include <s32cc-clk-ids.h>
1066af5425SGhennadi Procopciuc #include <s32cc-clk-utils.h>
1166af5425SGhennadi Procopciuc 
1266af5425SGhennadi Procopciuc #define S32CC_FXOSC_FREQ		(40U * MHZ)
137ad4e231SGhennadi Procopciuc #define S32CC_ARM_PLL_VCO_FREQ		(2U * GHZ)
14de950ef0SGhennadi Procopciuc #define S32CC_ARM_PLL_PHI0_FREQ		(1U * GHZ)
1564e0c226SGhennadi Procopciuc #define S32CC_A53_FREQ			(1U * GHZ)
16b8ad8800SGhennadi Procopciuc #define S32CC_XBAR_2X_FREQ		(800U * MHZ)
178653352aSGhennadi Procopciuc #define S32CC_PERIPH_PLL_VCO_FREQ	(2U * GHZ)
18*e4462daeSGhennadi Procopciuc #define S32CC_PERIPH_PLL_PHI3_FREQ	UART_CLOCK_HZ
1966af5425SGhennadi Procopciuc 
20d3869455SGhennadi Procopciuc static int enable_fxosc_clk(void)
2166af5425SGhennadi Procopciuc {
2266af5425SGhennadi Procopciuc 	int ret;
2366af5425SGhennadi Procopciuc 
24d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
25d3869455SGhennadi Procopciuc 	if (ret != 0) {
26d3869455SGhennadi Procopciuc 		return ret;
27d3869455SGhennadi Procopciuc 	}
28d3869455SGhennadi Procopciuc 
29d3869455SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_FXOSC);
30d3869455SGhennadi Procopciuc 	if (ret != 0) {
31d3869455SGhennadi Procopciuc 		return ret;
32d3869455SGhennadi Procopciuc 	}
33d3869455SGhennadi Procopciuc 
34d3869455SGhennadi Procopciuc 	return ret;
35d3869455SGhennadi Procopciuc }
36d3869455SGhennadi Procopciuc 
37d3869455SGhennadi Procopciuc static int enable_arm_pll(void)
38d3869455SGhennadi Procopciuc {
39d3869455SGhennadi Procopciuc 	int ret;
4066af5425SGhennadi Procopciuc 
4183af4504SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
4283af4504SGhennadi Procopciuc 	if (ret != 0) {
4383af4504SGhennadi Procopciuc 		return ret;
4483af4504SGhennadi Procopciuc 	}
4583af4504SGhennadi Procopciuc 
467ad4e231SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
477ad4e231SGhennadi Procopciuc 	if (ret != 0) {
487ad4e231SGhennadi Procopciuc 		return ret;
497ad4e231SGhennadi Procopciuc 	}
507ad4e231SGhennadi Procopciuc 
51de950ef0SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
52de950ef0SGhennadi Procopciuc 	if (ret != 0) {
53de950ef0SGhennadi Procopciuc 		return ret;
54de950ef0SGhennadi Procopciuc 	}
55de950ef0SGhennadi Procopciuc 
56b5101c45SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
57b5101c45SGhennadi Procopciuc 	if (ret != 0) {
58b5101c45SGhennadi Procopciuc 		return ret;
59b5101c45SGhennadi Procopciuc 	}
60b5101c45SGhennadi Procopciuc 
6184e82085SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
6284e82085SGhennadi Procopciuc 	if (ret != 0) {
6384e82085SGhennadi Procopciuc 		return ret;
6484e82085SGhennadi Procopciuc 	}
6584e82085SGhennadi Procopciuc 
66d3869455SGhennadi Procopciuc 	return ret;
67d3869455SGhennadi Procopciuc }
68d3869455SGhennadi Procopciuc 
698653352aSGhennadi Procopciuc static int enable_periph_pll(void)
708653352aSGhennadi Procopciuc {
718653352aSGhennadi Procopciuc 	int ret;
728653352aSGhennadi Procopciuc 
738653352aSGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC);
748653352aSGhennadi Procopciuc 	if (ret != 0) {
758653352aSGhennadi Procopciuc 		return ret;
768653352aSGhennadi Procopciuc 	}
778653352aSGhennadi Procopciuc 
788653352aSGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL);
798653352aSGhennadi Procopciuc 	if (ret != 0) {
808653352aSGhennadi Procopciuc 		return ret;
818653352aSGhennadi Procopciuc 	}
828653352aSGhennadi Procopciuc 
838653352aSGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL);
848653352aSGhennadi Procopciuc 	if (ret != 0) {
858653352aSGhennadi Procopciuc 		return ret;
868653352aSGhennadi Procopciuc 	}
878653352aSGhennadi Procopciuc 
888653352aSGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_PERIPH_PLL_VCO);
898653352aSGhennadi Procopciuc 	if (ret != 0) {
908653352aSGhennadi Procopciuc 		return ret;
918653352aSGhennadi Procopciuc 	}
928653352aSGhennadi Procopciuc 
938653352aSGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_PERIPH_PLL_PHI3);
948653352aSGhennadi Procopciuc 	if (ret != 0) {
958653352aSGhennadi Procopciuc 		return ret;
968653352aSGhennadi Procopciuc 	}
978653352aSGhennadi Procopciuc 
988653352aSGhennadi Procopciuc 	return ret;
998653352aSGhennadi Procopciuc }
1008653352aSGhennadi Procopciuc 
101d3869455SGhennadi Procopciuc static int enable_a53_clk(void)
102d3869455SGhennadi Procopciuc {
103d3869455SGhennadi Procopciuc 	int ret;
104d3869455SGhennadi Procopciuc 
105d3869455SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
106d3869455SGhennadi Procopciuc 	if (ret != 0) {
107d3869455SGhennadi Procopciuc 		return ret;
108d3869455SGhennadi Procopciuc 	}
109d3869455SGhennadi Procopciuc 
110d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
111d3869455SGhennadi Procopciuc 	if (ret != 0) {
112d3869455SGhennadi Procopciuc 		return ret;
113d3869455SGhennadi Procopciuc 	}
114d3869455SGhennadi Procopciuc 
1157004f678SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_A53_CORE);
1167004f678SGhennadi Procopciuc 	if (ret != 0) {
1177004f678SGhennadi Procopciuc 		return ret;
1187004f678SGhennadi Procopciuc 	}
1197004f678SGhennadi Procopciuc 
12066af5425SGhennadi Procopciuc 	return ret;
12166af5425SGhennadi Procopciuc }
122d3869455SGhennadi Procopciuc 
123b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void)
124b8ad8800SGhennadi Procopciuc {
125b8ad8800SGhennadi Procopciuc 	int ret;
126b8ad8800SGhennadi Procopciuc 
127b8ad8800SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
128b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
129b8ad8800SGhennadi Procopciuc 		return ret;
130b8ad8800SGhennadi Procopciuc 	}
131b8ad8800SGhennadi Procopciuc 
132b8ad8800SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
133b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
134b8ad8800SGhennadi Procopciuc 		return ret;
135b8ad8800SGhennadi Procopciuc 	}
136b8ad8800SGhennadi Procopciuc 
137b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
138b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
139b8ad8800SGhennadi Procopciuc 		return ret;
140b8ad8800SGhennadi Procopciuc 	}
141b8ad8800SGhennadi Procopciuc 
142b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_XBAR_2X);
143b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
144b8ad8800SGhennadi Procopciuc 		return ret;
145b8ad8800SGhennadi Procopciuc 	}
146b8ad8800SGhennadi Procopciuc 
147b8ad8800SGhennadi Procopciuc 	return ret;
148b8ad8800SGhennadi Procopciuc }
149b8ad8800SGhennadi Procopciuc 
150*e4462daeSGhennadi Procopciuc static int enable_uart_clk(void)
151*e4462daeSGhennadi Procopciuc {
152*e4462daeSGhennadi Procopciuc 	int ret;
153*e4462daeSGhennadi Procopciuc 
154*e4462daeSGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX8, S32CC_CLK_PERIPH_PLL_PHI3);
155*e4462daeSGhennadi Procopciuc 	if (ret != 0) {
156*e4462daeSGhennadi Procopciuc 		return ret;
157*e4462daeSGhennadi Procopciuc 	}
158*e4462daeSGhennadi Procopciuc 
159*e4462daeSGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_LINFLEX_BAUD);
160*e4462daeSGhennadi Procopciuc 	if (ret != 0) {
161*e4462daeSGhennadi Procopciuc 		return ret;
162*e4462daeSGhennadi Procopciuc 	}
163*e4462daeSGhennadi Procopciuc 
164*e4462daeSGhennadi Procopciuc 	return ret;
165*e4462daeSGhennadi Procopciuc }
166*e4462daeSGhennadi Procopciuc 
167d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void)
168d3869455SGhennadi Procopciuc {
169d3869455SGhennadi Procopciuc 	int ret;
170d3869455SGhennadi Procopciuc 
171d3869455SGhennadi Procopciuc 	s32cc_clk_register_drv();
172d3869455SGhennadi Procopciuc 
173d3869455SGhennadi Procopciuc 	ret = enable_fxosc_clk();
174d3869455SGhennadi Procopciuc 	if (ret != 0) {
175d3869455SGhennadi Procopciuc 		return ret;
176d3869455SGhennadi Procopciuc 	}
177d3869455SGhennadi Procopciuc 
178d3869455SGhennadi Procopciuc 	ret = enable_arm_pll();
179d3869455SGhennadi Procopciuc 	if (ret != 0) {
180d3869455SGhennadi Procopciuc 		return ret;
181d3869455SGhennadi Procopciuc 	}
182d3869455SGhennadi Procopciuc 
1838653352aSGhennadi Procopciuc 	ret = enable_periph_pll();
1848653352aSGhennadi Procopciuc 	if (ret != 0) {
1858653352aSGhennadi Procopciuc 		return ret;
1868653352aSGhennadi Procopciuc 	}
1878653352aSGhennadi Procopciuc 
188d3869455SGhennadi Procopciuc 	ret = enable_a53_clk();
189d3869455SGhennadi Procopciuc 	if (ret != 0) {
190d3869455SGhennadi Procopciuc 		return ret;
191d3869455SGhennadi Procopciuc 	}
192d3869455SGhennadi Procopciuc 
193b8ad8800SGhennadi Procopciuc 	ret = enable_xbar_clk();
194b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
195b8ad8800SGhennadi Procopciuc 		return ret;
196b8ad8800SGhennadi Procopciuc 	}
197b8ad8800SGhennadi Procopciuc 
198*e4462daeSGhennadi Procopciuc 	ret = enable_uart_clk();
199*e4462daeSGhennadi Procopciuc 	if (ret != 0) {
200*e4462daeSGhennadi Procopciuc 		return ret;
201*e4462daeSGhennadi Procopciuc 	}
202*e4462daeSGhennadi Procopciuc 
203d3869455SGhennadi Procopciuc 	return ret;
204d3869455SGhennadi Procopciuc }
205