blob: 868cfd2c06c091f67a85cd3f053284ad7d051dd5 [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 Procopciuc66af5422024-06-12 09:07:16 +030015
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030016static int enable_fxosc_clk(void)
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030017{
18 int ret;
19
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030020 ret = clk_set_rate(S32CC_CLK_FXOSC, S32CC_FXOSC_FREQ, NULL);
21 if (ret != 0) {
22 return ret;
23 }
24
25 ret = clk_enable(S32CC_CLK_FXOSC);
26 if (ret != 0) {
27 return ret;
28 }
29
30 return ret;
31}
32
33static int enable_arm_pll(void)
34{
35 int ret;
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030036
Ghennadi Procopciuc83af4502024-06-12 11:17:37 +030037 ret = clk_set_parent(S32CC_CLK_ARM_PLL_MUX, S32CC_CLK_FXOSC);
38 if (ret != 0) {
39 return ret;
40 }
41
Ghennadi Procopciuc7ad4e232024-06-12 11:55:32 +030042 ret = clk_set_rate(S32CC_CLK_ARM_PLL_VCO, S32CC_ARM_PLL_VCO_FREQ, NULL);
43 if (ret != 0) {
44 return ret;
45 }
46
Ghennadi Procopciucde950ef2024-06-12 12:00:15 +030047 ret = clk_set_rate(S32CC_CLK_ARM_PLL_PHI0, S32CC_ARM_PLL_PHI0_FREQ, NULL);
48 if (ret != 0) {
49 return ret;
50 }
51
Ghennadi Procopciucb5101c42024-06-12 14:21:39 +030052 ret = clk_enable(S32CC_CLK_ARM_PLL_VCO);
53 if (ret != 0) {
54 return ret;
55 }
56
Ghennadi Procopciuc84e82082024-06-12 14:30:30 +030057 ret = clk_enable(S32CC_CLK_ARM_PLL_PHI0);
58 if (ret != 0) {
59 return ret;
60 }
61
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030062 return ret;
63}
64
65static int enable_a53_clk(void)
66{
67 int ret;
68
69 ret = clk_set_parent(S32CC_CLK_MC_CGM1_MUX0, S32CC_CLK_ARM_PLL_PHI0);
70 if (ret != 0) {
71 return ret;
72 }
73
74 ret = clk_set_rate(S32CC_CLK_A53_CORE, S32CC_A53_FREQ, NULL);
75 if (ret != 0) {
76 return ret;
77 }
78
Ghennadi Procopciuc7004f672024-06-12 14:44:47 +030079 ret = clk_enable(S32CC_CLK_A53_CORE);
80 if (ret != 0) {
81 return ret;
82 }
83
Ghennadi Procopciuc66af5422024-06-12 09:07:16 +030084 return ret;
85}
Ghennadi Procopciucd3869452024-07-23 12:14:02 +030086
87int s32cc_init_early_clks(void)
88{
89 int ret;
90
91 s32cc_clk_register_drv();
92
93 ret = enable_fxosc_clk();
94 if (ret != 0) {
95 return ret;
96 }
97
98 ret = enable_arm_pll();
99 if (ret != 0) {
100 return ret;
101 }
102
103 ret = enable_a53_clk();
104 if (ret != 0) {
105 return ret;
106 }
107
108 return ret;
109}