xref: /rk3399_ARM-atf/drivers/nxp/clk/s32cc/s32cc_early_clks.c (revision 5300040bfd0acf0e839a9828a1a5341afc936e36)
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>
7e4462daeSGhennadi 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)
18e4462daeSGhennadi Procopciuc #define S32CC_PERIPH_PLL_PHI3_FREQ	UART_CLOCK_HZ
1966af5425SGhennadi Procopciuc 
20*5300040bSGhennadi Procopciuc static int setup_fxosc(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 	return ret;
30d3869455SGhennadi Procopciuc }
31d3869455SGhennadi Procopciuc 
32*5300040bSGhennadi Procopciuc static int setup_arm_pll(void)
33d3869455SGhennadi Procopciuc {
34d3869455SGhennadi Procopciuc 	int ret;
3566af5425SGhennadi Procopciuc 
3683af4504SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
3783af4504SGhennadi Procopciuc 	if (ret != 0) {
3883af4504SGhennadi Procopciuc 		return ret;
3983af4504SGhennadi Procopciuc 	}
4083af4504SGhennadi Procopciuc 
417ad4e231SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
427ad4e231SGhennadi Procopciuc 	if (ret != 0) {
437ad4e231SGhennadi Procopciuc 		return ret;
447ad4e231SGhennadi Procopciuc 	}
457ad4e231SGhennadi Procopciuc 
46de950ef0SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
47de950ef0SGhennadi Procopciuc 	if (ret != 0) {
48de950ef0SGhennadi Procopciuc 		return ret;
49de950ef0SGhennadi Procopciuc 	}
50de950ef0SGhennadi Procopciuc 
51b5101c45SGhennadi Procopciuc 	return ret;
52b5101c45SGhennadi Procopciuc }
53b5101c45SGhennadi Procopciuc 
54*5300040bSGhennadi Procopciuc static int setup_periph_pll(void)
558653352aSGhennadi Procopciuc {
568653352aSGhennadi Procopciuc 	int ret;
578653352aSGhennadi Procopciuc 
588653352aSGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC);
598653352aSGhennadi Procopciuc 	if (ret != 0) {
608653352aSGhennadi Procopciuc 		return ret;
618653352aSGhennadi Procopciuc 	}
628653352aSGhennadi Procopciuc 
638653352aSGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL);
648653352aSGhennadi Procopciuc 	if (ret != 0) {
658653352aSGhennadi Procopciuc 		return ret;
668653352aSGhennadi Procopciuc 	}
678653352aSGhennadi Procopciuc 
688653352aSGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL);
698653352aSGhennadi Procopciuc 	if (ret != 0) {
708653352aSGhennadi Procopciuc 		return ret;
718653352aSGhennadi Procopciuc 	}
728653352aSGhennadi Procopciuc 
738653352aSGhennadi Procopciuc 	return ret;
748653352aSGhennadi Procopciuc }
758653352aSGhennadi Procopciuc 
76d3869455SGhennadi Procopciuc static int enable_a53_clk(void)
77d3869455SGhennadi Procopciuc {
78d3869455SGhennadi Procopciuc 	int ret;
79d3869455SGhennadi Procopciuc 
80d3869455SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
81d3869455SGhennadi Procopciuc 	if (ret != 0) {
82d3869455SGhennadi Procopciuc 		return ret;
83d3869455SGhennadi Procopciuc 	}
84d3869455SGhennadi Procopciuc 
85d3869455SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
86d3869455SGhennadi Procopciuc 	if (ret != 0) {
87d3869455SGhennadi Procopciuc 		return ret;
88d3869455SGhennadi Procopciuc 	}
89d3869455SGhennadi Procopciuc 
907004f678SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_A53_CORE);
917004f678SGhennadi Procopciuc 	if (ret != 0) {
927004f678SGhennadi Procopciuc 		return ret;
937004f678SGhennadi Procopciuc 	}
947004f678SGhennadi Procopciuc 
9566af5425SGhennadi Procopciuc 	return ret;
9666af5425SGhennadi Procopciuc }
97d3869455SGhennadi Procopciuc 
98b8ad8800SGhennadi Procopciuc static int enable_xbar_clk(void)
99b8ad8800SGhennadi Procopciuc {
100b8ad8800SGhennadi Procopciuc 	int ret;
101b8ad8800SGhennadi Procopciuc 
102b8ad8800SGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
103b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
104b8ad8800SGhennadi Procopciuc 		return ret;
105b8ad8800SGhennadi Procopciuc 	}
106b8ad8800SGhennadi Procopciuc 
107b8ad8800SGhennadi Procopciuc 	ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
108b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
109b8ad8800SGhennadi Procopciuc 		return ret;
110b8ad8800SGhennadi Procopciuc 	}
111b8ad8800SGhennadi Procopciuc 
112b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
113b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
114b8ad8800SGhennadi Procopciuc 		return ret;
115b8ad8800SGhennadi Procopciuc 	}
116b8ad8800SGhennadi Procopciuc 
117b8ad8800SGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_XBAR_2X);
118b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
119b8ad8800SGhennadi Procopciuc 		return ret;
120b8ad8800SGhennadi Procopciuc 	}
121b8ad8800SGhennadi Procopciuc 
122b8ad8800SGhennadi Procopciuc 	return ret;
123b8ad8800SGhennadi Procopciuc }
124b8ad8800SGhennadi Procopciuc 
125e4462daeSGhennadi Procopciuc static int enable_uart_clk(void)
126e4462daeSGhennadi Procopciuc {
127e4462daeSGhennadi Procopciuc 	int ret;
128e4462daeSGhennadi Procopciuc 
129e4462daeSGhennadi Procopciuc 	ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX8, S32CC_CLK_PERIPH_PLL_PHI3);
130e4462daeSGhennadi Procopciuc 	if (ret != 0) {
131e4462daeSGhennadi Procopciuc 		return ret;
132e4462daeSGhennadi Procopciuc 	}
133e4462daeSGhennadi Procopciuc 
134e4462daeSGhennadi Procopciuc 	ret = clk_enable(S32CC_CLK_LINFLEX_BAUD);
135e4462daeSGhennadi Procopciuc 	if (ret != 0) {
136e4462daeSGhennadi Procopciuc 		return ret;
137e4462daeSGhennadi Procopciuc 	}
138e4462daeSGhennadi Procopciuc 
139e4462daeSGhennadi Procopciuc 	return ret;
140e4462daeSGhennadi Procopciuc }
141e4462daeSGhennadi Procopciuc 
142d3869455SGhennadi Procopciuc int s32cc_init_early_clks(void)
143d3869455SGhennadi Procopciuc {
144d3869455SGhennadi Procopciuc 	int ret;
145d3869455SGhennadi Procopciuc 
146d3869455SGhennadi Procopciuc 	s32cc_clk_register_drv();
147d3869455SGhennadi Procopciuc 
148*5300040bSGhennadi Procopciuc 	ret = setup_fxosc();
149d3869455SGhennadi Procopciuc 	if (ret != 0) {
150d3869455SGhennadi Procopciuc 		return ret;
151d3869455SGhennadi Procopciuc 	}
152d3869455SGhennadi Procopciuc 
153*5300040bSGhennadi Procopciuc 	ret = setup_arm_pll();
1548653352aSGhennadi Procopciuc 	if (ret != 0) {
1558653352aSGhennadi Procopciuc 		return ret;
1568653352aSGhennadi Procopciuc 	}
1578653352aSGhennadi Procopciuc 
158d3869455SGhennadi Procopciuc 	ret = enable_a53_clk();
159d3869455SGhennadi Procopciuc 	if (ret != 0) {
160d3869455SGhennadi Procopciuc 		return ret;
161d3869455SGhennadi Procopciuc 	}
162d3869455SGhennadi Procopciuc 
163b8ad8800SGhennadi Procopciuc 	ret = enable_xbar_clk();
164b8ad8800SGhennadi Procopciuc 	if (ret != 0) {
165b8ad8800SGhennadi Procopciuc 		return ret;
166b8ad8800SGhennadi Procopciuc 	}
167b8ad8800SGhennadi Procopciuc 
168*5300040bSGhennadi Procopciuc 	ret = setup_periph_pll();
169*5300040bSGhennadi Procopciuc 	if (ret != 0) {
170*5300040bSGhennadi Procopciuc 		return ret;
171*5300040bSGhennadi Procopciuc 	}
172*5300040bSGhennadi Procopciuc 
173e4462daeSGhennadi Procopciuc 	ret = enable_uart_clk();
174e4462daeSGhennadi Procopciuc 	if (ret != 0) {
175e4462daeSGhennadi Procopciuc 		return ret;
176e4462daeSGhennadi Procopciuc 	}
177e4462daeSGhennadi Procopciuc 
178d3869455SGhennadi Procopciuc 	return ret;
179d3869455SGhennadi Procopciuc }
180