blob: 2c256a519ba5e585758eabdac8ad7580ab1f9fd7 [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
11#define S32CC_FXOSC_FREQ (40U * MHZ)
Ghennadi Procopciuc7ad4e232024-06-12 11:55:32 +030012#define S32CC_ARM_PLL_VCO_FREQ (2U * GHZ)
Ghennadi Procopciucde950ef2024-06-12 12:00:15 +030013#define S32CC_ARM_PLL_PHI0_FREQ (1U * GHZ)
Ghennadi Procopciuc64e0c222024-06-12 13:05:05 +030014#define S32CC_A53_FREQ (1U * GHZ)
Ghennadi Procopciucb8ad8802024-08-05 16:51:03 +030015#define S32CC_XBAR_2X_FREQ (800U * MHZ)
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030016
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030017static int enable_fxosc_clk(void)
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030018{
19 int ret;
20
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030021 ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
22 if (ret != 0) {
23 return ret;
24 }
25
26 ret = clk_enable(S32CC_CLK_FXOSC);
27 if (ret != 0) {
28 return ret;
29 }
30
31 return ret;
32}
33
34static int enable_arm_pll(void)
35{
36 int ret;
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030037
Ghennadi Procopciuc83af4502024-06-12 11:17:37 +030038 ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
39 if (ret != 0) {
40 return ret;
41 }
42
Ghennadi Procopciuc7ad4e232024-06-12 11:55:32 +030043 ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
44 if (ret != 0) {
45 return ret;
46 }
47
Ghennadi Procopciucde950ef2024-06-12 12:00:15 +030048 ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
49 if (ret != 0) {
50 return ret;
51 }
52
Ghennadi Procopciucb5101c42024-06-12 14:21:39 +030053 ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
54 if (ret != 0) {
55 return ret;
56 }
57
Ghennadi Procopciuc84e82082024-06-12 14:30:30 +030058 ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
59 if (ret != 0) {
60 return ret;
61 }
62
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030063 return ret;
64}
65
66static int enable_a53_clk(void)
67{
68 int ret;
69
70 ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
71 if (ret != 0) {
72 return ret;
73 }
74
75 ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
76 if (ret != 0) {
77 return ret;
78 }
79
Ghennadi Procopciuc7004f672024-06-12 14:44:47 +030080 ret = clk_enable(S32CC_CLK_A53_CORE);
81 if (ret != 0) {
82 return ret;
83 }
84
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030085 return ret;
86}
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030087
Ghennadi Procopciucb8ad8802024-08-05 16:51:03 +030088static int enable_xbar_clk(void)
89{
90 int ret;
91
92 ret = clk_set_parent(S32CC_CLK_MC_CGM0_MUX0, S32CC_CLK_ARM_PLL_DFS1);
93 if (ret != 0) {
94 return ret;
95 }
96
97 ret = clk_set_rate(S32CC_CLK_XBAR_2X, S32CC_XBAR_2X_FREQ, NULL);
98 if (ret != 0) {
99 return ret;
100 }
101
102 ret = clk_enable(S32CC_CLK_ARM_PLL_DFS1);
103 if (ret != 0) {
104 return ret;
105 }
106
107 ret = clk_enable(S32CC_CLK_XBAR_2X);
108 if (ret != 0) {
109 return ret;
110 }
111
112 return ret;
113}
114
Ghennadi Procopciucd3869452024-07-23 12:14:02 +0300115int s32cc_init_early_clks(void)
116{
117 int ret;
118
119 s32cc_clk_register_drv();
120
121 ret = enable_fxosc_clk();
122 if (ret != 0) {
123 return ret;
124 }
125
126 ret = enable_arm_pll();
127 if (ret != 0) {
128 return ret;
129 }
130
131 ret = enable_a53_clk();
132 if (ret != 0) {
133 return ret;
134 }
135
Ghennadi Procopciucb8ad8802024-08-05 16:51:03 +0300136 ret = enable_xbar_clk();
137 if (ret != 0) {
138 return ret;
139 }
140
Ghennadi Procopciucd3869452024-07-23 12:14:02 +0300141 return ret;
142}