blob: 496724f4464a9edfa90075805df7d55c9151e273 [file] [log] [blame]
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +03001/*
2 * Copyright 2024 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <drivers/clk.h>
7#include <s32cc-clk-drv.h>
8#include <s32cc-clk-ids.h>
9#include <s32cc-clk-utils.h>
10
Ghennadi Procopciuc86533522024-08-06 11:48:11 +030011#define S32CC_FXOSC_FREQ (40U * MHZ)
12#define S32CC_ARM_PLL_VCO_FREQ (2U * GHZ)
13#define S32CC_ARM_PLL_PHI0_FREQ (1U * GHZ)
14#define S32CC_A53_FREQ (1U * GHZ)
15#define S32CC_XBAR_2X_FREQ (800U * MHZ)
16#define S32CC_PERIPH_PLL_VCO_FREQ (2U * GHZ)
17#define S32CC_PERIPH_PLL_PHI3_FREQ (125U * MHZ)
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030018
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030019static int enable_fxosc_clk(void)
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030020{
21 int ret;
22
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030023 ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
24 if (ret != 0) {
25 return ret;
26 }
27
28 ret = clk_enable(S32CC_CLK_FXOSC);
29 if (ret != 0) {
30 return ret;
31 }
32
33 return ret;
34}
35
36static int enable_arm_pll(void)
37{
38 int ret;
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030039
Ghennadi Procopciuc83af4502024-06-12 11:17:37 +030040 ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
41 if (ret != 0) {
42 return ret;
43 }
44
Ghennadi Procopciuc7ad4e232024-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 Procopciucde950ef2024-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 Procopciucb5101c42024-06-12 14:21:39 +030055 ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
56 if (ret != 0) {
57 return ret;
58 }
59
Ghennadi Procopciuc84e82082024-06-12 14:30:30 +030060 ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
61 if (ret != 0) {
62 return ret;
63 }
64
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030065 return ret;
66}
67
Ghennadi Procopciuc86533522024-08-06 11:48:11 +030068static int enable_periph_pll(void)
69{
70 int ret;
71
72 ret = clk_set_parent(S32CC_CLK_PERIPH_PLL_MUX, S32CC_CLK_FXOSC);
73 if (ret != 0) {
74 return ret;
75 }
76
77 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_VCO, S32CC_PERIPH_PLL_VCO_FREQ, NULL);
78 if (ret != 0) {
79 return ret;
80 }
81
82 ret = clk_set_rate(S32CC_CLK_PERIPH_PLL_PHI3, S32CC_PERIPH_PLL_PHI3_FREQ, NULL);
83 if (ret != 0) {
84 return ret;
85 }
86
87 ret = clk_enable(S32CC_CLK_PERIPH_PLL_VCO);
88 if (ret != 0) {
89 return ret;
90 }
91
92 ret = clk_enable(S32CC_CLK_PERIPH_PLL_PHI3);
93 if (ret != 0) {
94 return ret;
95 }
96
97 return ret;
98}
99
Ghennadi Procopciucd3869452024-07-23 12:14:02 +0300100static int enable_a53_clk(void)
101{
102 int ret;
103
104 ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
105 if (ret != 0) {
106 return ret;
107 }
108
109 ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
110 if (ret != 0) {
111 return ret;
112 }
113
Ghennadi Procopciuc7004f672024-06-12 14:44:47 +0300114 ret = clk_enable(S32CC_CLK_A53_CORE);
115 if (ret != 0) {
116 return ret;
117 }
118
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +0300119 return ret;
120}
Ghennadi Procopciucd3869452024-07-23 12:14:02 +0300121
Ghennadi Procopciucb8ad8802024-08-05 16:51:03 +0300122static int enable_xbar_clk(void)
123{
124 int ret;
125
126 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
127 if (ret != 0) {
128 return ret;
129 }
130
131 ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
132 if (ret != 0) {
133 return ret;
134 }
135
136 ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
137 if (ret != 0) {
138 return ret;
139 }
140
141 ret = clk_enable(S32CC_CLK_XBAR_2X);
142 if (ret != 0) {
143 return ret;
144 }
145
146 return ret;
147}
148
Ghennadi Procopciucd3869452024-07-23 12:14:02 +0300149int s32cc_init_early_clks(void)
150{
151 int ret;
152
153 s32cc_clk_register_drv();
154
155 ret = enable_fxosc_clk();
156 if (ret != 0) {
157 return ret;
158 }
159
160 ret = enable_arm_pll();
161 if (ret != 0) {
162 return ret;
163 }
164
Ghennadi Procopciuc86533522024-08-06 11:48:11 +0300165 ret = enable_periph_pll();
166 if (ret != 0) {
167 return ret;
168 }
169
Ghennadi Procopciucd3869452024-07-23 12:14:02 +0300170 ret = enable_a53_clk();
171 if (ret != 0) {
172 return ret;
173 }
174
Ghennadi Procopciucb8ad8802024-08-05 16:51:03 +0300175 ret = enable_xbar_clk();
176 if (ret != 0) {
177 return ret;
178 }
179
Ghennadi Procopciucd3869452024-07-23 12:14:02 +0300180 return ret;
181}