blob: 3f6d3d7cee5322ba78692fdbd1f127e7b6fb0a48 [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 Procopciuceaf9cb12024-09-09 13:00:26 +030020static int setup_fxosc(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 return ret;
30}
31
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +030032static int setup_arm_pll(void)
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030033{
34 int ret;
35
36 ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030037 if (ret != 0) {
38 return ret;
39 }
40
Ghennadi Procopciuce18cf332024-06-12 11:55:32 +030041 ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
42 if (ret != 0) {
43 return ret;
44 }
45
Ghennadi Procopciuc907f6542024-06-12 12:00:15 +030046 ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
47 if (ret != 0) {
48 return ret;
49 }
50
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030051 return ret;
52}
53
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +030054static int setup_periph_pll(void)
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +030055{
56 int ret;
57
58 ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC);
59 if (ret != 0) {
60 return ret;
61 }
62
63 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL);
64 if (ret != 0) {
65 return ret;
66 }
67
68 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL);
69 if (ret != 0) {
70 return ret;
71 }
72
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +030073 return ret;
74}
75
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030076static int enable_a53_clk(void)
77{
78 int ret;
79
80 ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
Ghennadi Procopciucb390c4d2024-06-12 14:21:39 +030081 if (ret != 0) {
82 return ret;
83 }
84
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030085 ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
Ghennadi Procopciuc9efc7502024-06-12 14:30:30 +030086 if (ret != 0) {
87 return ret;
88 }
89
Ghennadi Procopciuca080f782024-06-12 14:44:47 +030090 ret = clk_enable(S32CC_CLK_A53_CORE);
91 if (ret != 0) {
92 return ret;
93 }
94
Ghennadi Procopciucf648e5d2024-06-12 09:07:16 +030095 return ret;
96}
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +030097
Ghennadi Procopciucb3950cf2024-08-05 16:51:03 +030098static int enable_xbar_clk(void)
99{
100 int ret;
101
102 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
103 if (ret != 0) {
104 return ret;
105 }
106
107 ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
108 if (ret != 0) {
109 return ret;
110 }
111
112 ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
113 if (ret != 0) {
114 return ret;
115 }
116
117 ret = clk_enable(S32CC_CLK_XBAR_2X);
118 if (ret != 0) {
119 return ret;
120 }
121
122 return ret;
123}
124
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +0300125static int enable_uart_clk(void)
126{
127 int ret;
128
129 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX8, S32CC_CLK_PERIPH_PLL_PHI3);
130 if (ret != 0) {
131 return ret;
132 }
133
134 ret = clk_enable(S32CC_CLK_LINFLEX_BAUD);
135 if (ret != 0) {
136 return ret;
137 }
138
139 return ret;
140}
141
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300142int s32cc_init_early_clks(void)
143{
144 int ret;
145
146 s32cc_clk_register_drv();
147
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300148 ret = setup_fxosc();
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300149 if (ret != 0) {
150 return ret;
151 }
152
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300153 ret = setup_arm_pll();
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300154 if (ret != 0) {
155 return ret;
156 }
157
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300158 ret = enable_a53_clk();
Ghennadi Procopciuc22f94742024-08-06 11:48:11 +0300159 if (ret != 0) {
160 return ret;
161 }
162
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300163 ret = enable_xbar_clk();
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300164 if (ret != 0) {
165 return ret;
166 }
167
Ghennadi Procopciuceaf9cb12024-09-09 13:00:26 +0300168 ret = setup_periph_pll();
Ghennadi Procopciucb3950cf2024-08-05 16:51:03 +0300169 if (ret != 0) {
170 return ret;
171 }
172
Ghennadi Procopciuc0609bcd2024-08-06 13:25:51 +0300173 ret = enable_uart_clk();
174 if (ret != 0) {
175 return ret;
176 }
177
Ghennadi Procopciuc97a30902024-07-23 12:14:02 +0300178 return ret;
179}