blob: 8c4a9e81bc1e36c335f2cd49ea62b366d14a71b0 [file] [log] [blame]
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +03001/*
2 * Copyright 2024 NXP
3 *
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 Procopciucf648e5d2024-06-12 09:07:16 +030019
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030020static int enable_fxosc_clk(void)
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030021{
22 int ret;
23
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030024 ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
Ghennadi Procopciuc4e4786d2024-06-12 11:17:37 +030025 if (ret != 0) {
26 return ret;
27 }
28
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030029 ret = clk_enable(S32CC_CLK_FXOSC);
Ghennadi Procopciuc4e4786d2024-06-12 11:17:37 +030030 if (ret != 0) {
31 return ret;
32 }
33
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030034 return ret;
35}
36
37static int enable_arm_pll(void)
38{
39 int ret;
40
41 ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030042 if (ret != 0) {
43 return ret;
44 }
45
Ghennadi Procopciuce18cf332024-06-12 11:55:32 +030046 ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
47 if (ret != 0) {
48 return ret;
49 }
50
Ghennadi Procopciuc907f6542024-06-12 12:00:15 +030051 ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
52 if (ret != 0) {
53 return ret;
54 }
55
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030056 ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
Ghennadi Procopciuca6a39e82024-06-12 13:05:05 +030057 if (ret != 0) {
58 return ret;
59 }
60
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030061 ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
Ghennadi Procopciuc9dee8e42024-06-12 09:25:17 +030062 if (ret != 0) {
63 return ret;
64 }
65
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030066 return ret;
67}
68
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +030069static int enable_periph_pll(void)
70{
71 int ret;
72
73 ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC);
74 if (ret != 0) {
75 return ret;
76 }
77
78 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL);
79 if (ret != 0) {
80 return ret;
81 }
82
83 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL);
84 if (ret != 0) {
85 return ret;
86 }
87
88 ret = clk_enable(S32CC_CLK_PERIPH_PLL_VCO);
89 if (ret != 0) {
90 return ret;
91 }
92
93 ret = clk_enable(S32CC_CLK_PERIPH_PLL_PHI3);
94 if (ret != 0) {
95 return ret;
96 }
97
98 return ret;
99}
100
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300101static int enable_a53_clk(void)
102{
103 int ret;
104
105 ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
Ghennadi Procopciucb390c4d2024-06-12 14:21:39 +0300106 if (ret != 0) {
107 return ret;
108 }
109
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300110 ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
Ghennadi Procopciuc9efc7502024-06-12 14:30:30 +0300111 if (ret != 0) {
112 return ret;
113 }
114
Ghennadi Procopciuca080f782024-06-12 14:44:47 +0300115 ret = clk_enable(S32CC_CLK_A53_CORE);
116 if (ret != 0) {
117 return ret;
118 }
119
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +0300120 return ret;
121}
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300122
Ghennadi Procopciucb3950cf2024-08-05 16:51:03 +0300123static int enable_xbar_clk(void)
124{
125 int ret;
126
127 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
128 if (ret != 0) {
129 return ret;
130 }
131
132 ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
133 if (ret != 0) {
134 return ret;
135 }
136
137 ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
138 if (ret != 0) {
139 return ret;
140 }
141
142 ret = clk_enable(S32CC_CLK_XBAR_2X);
143 if (ret != 0) {
144 return ret;
145 }
146
147 return ret;
148}
149
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +0300150static int enable_uart_clk(void)
151{
152 int ret;
153
154 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX8, S32CC_CLK_PERIPH_PLL_PHI3);
155 if (ret != 0) {
156 return ret;
157 }
158
159 ret = clk_enable(S32CC_CLK_LINFLEX_BAUD);
160 if (ret != 0) {
161 return ret;
162 }
163
164 return ret;
165}
166
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300167int s32cc_init_early_clks(void)
168{
169 int ret;
170
171 s32cc_clk_register_drv();
172
173 ret = enable_fxosc_clk();
174 if (ret != 0) {
175 return ret;
176 }
177
178 ret = enable_arm_pll();
179 if (ret != 0) {
180 return ret;
181 }
182
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +0300183 ret = enable_periph_pll();
184 if (ret != 0) {
185 return ret;
186 }
187
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300188 ret = enable_a53_clk();
189 if (ret != 0) {
190 return ret;
191 }
192
Ghennadi Procopciucb3950cf2024-08-05 16:51:03 +0300193 ret = enable_xbar_clk();
194 if (ret != 0) {
195 return ret;
196 }
197
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +0300198 ret = enable_uart_clk();
199 if (ret != 0) {
200 return ret;
201 }
202
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300203 return ret;
204}