blob: ac9d99a2ff253310f6b513c1a8bc4571a9fca899 [file] [log] [blame]
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +03001/*
Ghennadi Procopciuc18df8c92025-01-28 12:06:16 +02002 * Copyright 2024-2025 NXP
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +03003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <drivers/clk.h>
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +03007#include <platform_def.h>
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +03008#include <s32cc-clk-drv.h>
9#include <s32cc-clk-ids.h>
10#include <s32cc-clk-utils.h>
11
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +030012#define S32CC_FXOSC_FREQ (40U * MHZ)
13#define S32CC_ARM_PLL_VCO_FREQ (2U * GHZ)
14#define S32CC_ARM_PLL_PHI0_FREQ (1U * GHZ)
15#define S32CC_A53_FREQ (1U * GHZ)
16#define S32CC_XBAR_2X_FREQ (800U * MHZ)
17#define S32CC_PERIPH_PLL_VCO_FREQ (2U * GHZ)
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +030018#define S32CC_PERIPH_PLL_PHI3_FREQ UART_CLOCK_HZ
Ghennadi Procopciuc74dde092024-09-09 10:24:35 +030019#define S32CC_DDR_PLL_VCO_FREQ (1600U * MHZ)
20#define S32CC_DDR_PLL_PHI0_FREQ (800U * MHZ)
Ghennadi Procopciuc18df8c92025-01-28 12:06:16 +020021#define S32CC_PERIPH_DFS_PHI3_FREQ (800U * MHZ)
Ghennadi Procopciuc1ce8d8e2025-03-28 09:02:42 +020022#define S32CC_USDHC_FREQ (200U * MHZ)
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030023
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +030024static int setup_fxosc(void)
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030025{
26 int ret;
27
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030028 ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
Ghennadi Procopciuc4e4786d2024-06-12 11:17:37 +030029 if (ret != 0) {
30 return ret;
31 }
32
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030033 return ret;
34}
35
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +030036static int setup_arm_pll(void)
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030037{
38 int ret;
39
40 ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030041 if (ret != 0) {
42 return ret;
43 }
44
Ghennadi Procopciuce18cf332024-06-12 11:55:32 +030045 ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
46 if (ret != 0) {
47 return ret;
48 }
49
Ghennadi Procopciuc907f6542024-06-12 12:00:15 +030050 ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
51 if (ret != 0) {
52 return ret;
53 }
54
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030055 return ret;
56}
57
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +030058static int setup_periph_pll(void)
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +030059{
60 int ret;
61
62 ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC);
63 if (ret != 0) {
64 return ret;
65 }
66
67 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL);
68 if (ret != 0) {
69 return ret;
70 }
71
72 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL);
73 if (ret != 0) {
74 return ret;
75 }
76
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +030077 return ret;
78}
79
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030080static int enable_a53_clk(void)
81{
82 int ret;
83
84 ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
Ghennadi Procopciucb390c4d2024-06-12 14:21:39 +030085 if (ret != 0) {
86 return ret;
87 }
88
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030089 ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
Ghennadi Procopciuc9efc7502024-06-12 14:30:30 +030090 if (ret != 0) {
91 return ret;
92 }
93
Ghennadi Procopciuca080f782024-06-12 14:44:47 +030094 ret = clk_enable(S32CC_CLK_A53_CORE);
95 if (ret != 0) {
96 return ret;
97 }
98
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030099 return ret;
100}
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300101
Ghennadi Procopciucb3950cf2024-08-05 16:51:03 +0300102static int enable_xbar_clk(void)
103{
104 int ret;
105
106 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
107 if (ret != 0) {
108 return ret;
109 }
110
111 ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
112 if (ret != 0) {
113 return ret;
114 }
115
116 ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
117 if (ret != 0) {
118 return ret;
119 }
120
121 ret = clk_enable(S32CC_CLK_XBAR_2X);
122 if (ret != 0) {
123 return ret;
124 }
125
126 return ret;
127}
128
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +0300129static int enable_uart_clk(void)
130{
131 int ret;
132
133 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX8, S32CC_CLK_PERIPH_PLL_PHI3);
134 if (ret != 0) {
135 return ret;
136 }
137
138 ret = clk_enable(S32CC_CLK_LINFLEX_BAUD);
139 if (ret != 0) {
140 return ret;
141 }
142
143 return ret;
144}
145
Ghennadi Procopciuc74dde092024-09-09 10:24:35 +0300146static int setup_ddr_pll(void)
147{
148 int ret;
149
150 ret = clk_set_parent(S32CC_CLK_DDR_PLL_MUX, S32CC_CLK_FXOSC);
151 if (ret != 0) {
152 return ret;
153 }
154
155 ret = clk_set_rate(S32CC_CLK_DDR_PLL_VCO, S32CC_DDR_PLL_VCO_FREQ, NULL);
156 if (ret != 0) {
157 return ret;
158 }
159
160 ret = clk_set_rate(S32CC_CLK_DDR_PLL_PHI0, S32CC_DDR_PLL_PHI0_FREQ, NULL);
161 if (ret != 0) {
162 return ret;
163 }
164
165 return ret;
166}
167
Ghennadi Procopciucd89e32f2024-09-17 11:22:30 +0300168static int enable_ddr_clk(void)
169{
170 int ret;
171
172 ret = clk_set_parent(S32CC_CLK_MC_CGM5_MUX0, S32CC_CLK_DDR_PLL_PHI0);
173 if (ret != 0) {
174 return ret;
175 }
176
177 ret = clk_enable(S32CC_CLK_DDR);
178 if (ret != 0) {
179 return ret;
180 }
181
182 return ret;
183}
184
Ghennadi Procopciuc18df8c92025-01-28 12:06:16 +0200185static int enable_usdhc_clk(void)
186{
187 int ret;
188
189 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX14,
190 S32CC_CLK_PERIPH_PLL_DFS3);
191 if (ret != 0) {
192 return ret;
193 }
194
195 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_DFS3,
196 S32CC_PERIPH_DFS_PHI3_FREQ, NULL);
197 if (ret != 0) {
198 return ret;
199 }
200
201 ret = clk_set_rate(S32CC_CLK_USDHC, S32CC_USDHC_FREQ, NULL);
202 if (ret != 0) {
203 return ret;
204 }
205
206 ret = clk_enable(S32CC_CLK_USDHC);
207 if (ret != 0) {
208 return ret;
209 }
210
211 return ret;
212}
213
Ghennadi Procopciuce83c8c62024-11-27 12:33:26 +0200214int s32cc_init_core_clocks(void)
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300215{
216 int ret;
217
Ghennadi Procopciuce83c8c62024-11-27 12:33:26 +0200218 ret = s32cc_clk_register_drv(false);
Ghennadi Procopciucbdd85872024-11-26 16:39:41 +0200219 if (ret != 0) {
220 return ret;
221 }
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300222
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300223 ret = setup_fxosc();
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300224 if (ret != 0) {
225 return ret;
226 }
227
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300228 ret = setup_arm_pll();
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300229 if (ret != 0) {
230 return ret;
231 }
232
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300233 ret = enable_a53_clk();
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +0300234 if (ret != 0) {
235 return ret;
236 }
237
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300238 ret = enable_xbar_clk();
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300239 if (ret != 0) {
240 return ret;
241 }
242
Ghennadi Procopciuce83c8c62024-11-27 12:33:26 +0200243 return ret;
244}
245
246int s32cc_init_early_clks(void)
247{
248 int ret;
249
250 ret = s32cc_clk_register_drv(true);
251 if (ret != 0) {
252 return ret;
253 }
254
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300255 ret = setup_periph_pll();
Ghennadi Procopciucb3950cf2024-08-05 16:51:03 +0300256 if (ret != 0) {
257 return ret;
258 }
259
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +0300260 ret = enable_uart_clk();
261 if (ret != 0) {
262 return ret;
263 }
264
Ghennadi Procopciuc74dde092024-09-09 10:24:35 +0300265 ret = setup_ddr_pll();
266 if (ret != 0) {
267 return ret;
268 }
269
Ghennadi Procopciucd89e32f2024-09-17 11:22:30 +0300270 ret = enable_ddr_clk();
271 if (ret != 0) {
272 return ret;
273 }
274
Ghennadi Procopciuc18df8c92025-01-28 12:06:16 +0200275 ret = enable_usdhc_clk();
276 if (ret != 0) {
277 return ret;
278 }
279
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300280 return ret;
281}