Merge branch 'CR_2888_515_clocktree_pll0_Xingyu.Wu' into 'jh7110-5.15.y-devel'
[platform/kernel/linux-starfive.git] / drivers / clk / starfive / clk-starfive-jh7110-pll.h
1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2 /*
3  * StarFive JH7110 PLL Clock Generator Driver
4  *
5  * Copyright (C) 2022 Xingyu Wu <xingyu.wu@starfivetech.com>
6  */
7
8 #ifndef _CLK_STARFIVE_JH7110_PLL_H_
9 #define _CLK_STARFIVE_JH7110_PLL_H_
10
11 /*
12  * If set PLL2_DEFAULT_FREQ NULL of 0 , then PLL2 frequency is original.
13  * If set PLL2_DEFAULT_FREQ one of 'starfive_pll2_freq_value', then PLL2
14  * frequency will be set the new rate during clock tree registering.
15  */
16 #define PLL0_DEFAULT_FREQ       PLL0_FREQ_1500_VALUE
17 #define PLL2_DEFAULT_FREQ       PLL2_FREQ_1188_VALUE
18
19 #define PLL0_INDEX              0
20 #define PLL1_INDEX              1
21 #define PLL2_INDEX              2
22
23 #define PLL_INDEX_MAX   3
24
25 #define PLL0_DACPD_SHIFT        24
26 #define PLL0_DACPD_MASK         0x1000000
27 #define PLL0_DSMPD_SHIFT        25
28 #define PLL0_DSMPD_MASK         0x2000000
29 #define PLL0_FBDIV_SHIFT        0
30 #define PLL0_FBDIV_MASK         0xFFF
31 #define PLL0_FRAC_SHIFT         0
32 #define PLL0_FRAC_MASK          0xFFFFFF
33 #define PLL0_POSTDIV1_SHIFT     28
34 #define PLL0_POSTDIV1_MASK      0x30000000
35 #define PLL0_PREDIV_SHIFT       0
36 #define PLL0_PREDIV_MASK        0x3F
37
38 #define PLL1_DACPD_SHIFT        15
39 #define PLL1_DACPD_MASK         0x8000
40 #define PLL1_DSMPD_SHIFT        16
41 #define PLL1_DSMPD_MASK         0x10000
42 #define PLL1_FBDIV_SHIFT        17
43 #define PLL1_FBDIV_MASK         0x1FFE0000
44 #define PLL1_FRAC_SHIFT         0
45 #define PLL1_FRAC_MASK          0xFFFFFF
46 #define PLL1_POSTDIV1_SHIFT     28
47 #define PLL1_POSTDIV1_MASK      0x30000000
48 #define PLL1_PREDIV_SHIFT       0
49 #define PLL1_PREDIV_MASK        0x3F
50
51 #define PLL2_DACPD_SHIFT        15
52 #define PLL2_DACPD_MASK         0x8000
53 #define PLL2_DSMPD_SHIFT        16
54 #define PLL2_DSMPD_MASK         0x10000
55 #define PLL2_FBDIV_SHIFT        17
56 #define PLL2_FBDIV_MASK         0x1FFE0000
57 #define PLL2_FRAC_SHIFT         0
58 #define PLL2_FRAC_MASK          0xFFFFFF
59 #define PLL2_POSTDIV1_SHIFT     28
60 #define PLL2_POSTDIV1_MASK      0x30000000
61 #define PLL2_PREDIV_SHIFT       0
62 #define PLL2_PREDIV_MASK        0x3F
63
64 #define FRAC_PATR_SIZE          1000
65
66 struct pll_syscon_offset {
67         u32 dacpd_offset;
68         u32 dsmpd_offset;
69         u32 fbdiv_offset;
70         u32 frac_offset;
71         u32 prediv_offset;
72         u32 postdiv1_offset;
73 };
74
75 struct pll_syscon_mask {
76         u32 dacpd_mask;
77         u32 dsmpd_mask;
78         u32 fbdiv_mask;
79         u32 frac_mask;
80         u32 prediv_mask;
81         u32 postdiv1_mask;
82 };
83
84 struct pll_syscon_shift {
85         u32 dacpd_shift;
86         u32 dsmpd_shift;
87         u32 fbdiv_shift;
88         u32 frac_shift;
89         u32 prediv_shift;
90         u32 postdiv1_shift;
91 };
92
93 struct jh7110_clk_pll_data {
94         struct device *dev;
95         struct clk_hw hw;
96         unsigned long refclk_freq;
97         unsigned int idx;
98         unsigned int freq_select_idx;
99
100         struct regmap *sys_syscon_regmap;
101         struct pll_syscon_offset offset;
102         struct pll_syscon_mask mask;
103         struct pll_syscon_shift shift;
104 };
105
106 struct starfive_pll_syscon_value {
107         unsigned long freq;
108         u32 prediv;
109         u32 fbdiv;
110         u32 postdiv1;
111 /* Both daxpd and dsmpd set 1 while integer multiple mode */
112 /* Both daxpd and dsmpd set 0 while fraction multiple mode */
113         u32 dacpd;
114         u32 dsmpd;
115 /* frac value should be decimals multiplied by 2^24 */
116         u32 frac;
117 };
118
119 enum starfive_pll0_freq_value {
120         PLL0_FREQ_375_VALUE = 375000000,
121         PLL0_FREQ_500_VALUE = 500000000,
122         PLL0_FREQ_625_VALUE = 625000000,
123         PLL0_FREQ_750_VALUE = 750000000,
124         PLL0_FREQ_875_VALUE = 875000000,
125         PLL0_FREQ_1000_VALUE = 1000000000,
126         PLL0_FREQ_1250_VALUE = 1250000000,
127         PLL0_FREQ_1375_VALUE = 1375000000,
128         PLL0_FREQ_1500_VALUE = 1500000000
129 };
130
131 enum starfive_pll0_freq {
132         PLL0_FREQ_375 = 0,
133         PLL0_FREQ_500,
134         PLL0_FREQ_625,
135         PLL0_FREQ_750,
136         PLL0_FREQ_875,
137         PLL0_FREQ_1000,
138         PLL0_FREQ_1250,
139         PLL0_FREQ_1375,
140         PLL0_FREQ_1500,
141         PLL0_FREQ_MAX = PLL0_FREQ_1500
142 };
143
144 enum starfive_pll1_freq_value {
145         PLL1_FREQ_1066_VALUE = 1066000000,
146 };
147
148 enum starfive_pll1_freq {
149         PLL1_FREQ_1066 = 0,
150 };
151
152 enum starfive_pll2_freq_value {
153         PLL2_FREQ_1188_VALUE = 1188000000,
154         PLL2_FREQ_12288_VALUE = 1228800000,
155 };
156
157 enum starfive_pll2_freq {
158         PLL2_FREQ_1188 = 0,
159         PLL2_FREQ_12288,
160 };
161
162 static const struct starfive_pll_syscon_value
163         jh7110_pll0_syscon_freq[] = {
164         [PLL0_FREQ_375] = {
165                 .freq = PLL0_FREQ_375_VALUE,
166                 .prediv = 8,
167                 .fbdiv = 125,
168                 .postdiv1 = 1,
169                 .dacpd = 1,
170                 .dsmpd = 1,
171         },
172         [PLL0_FREQ_500] = {
173                 .freq = PLL0_FREQ_500_VALUE,
174                 .prediv = 6,
175                 .fbdiv = 125,
176                 .postdiv1 = 1,
177                 .dacpd = 1,
178                 .dsmpd = 1,
179         },
180         [PLL0_FREQ_625] = {
181                 .freq = PLL0_FREQ_625_VALUE,
182                 .prediv = 24,
183                 .fbdiv = 625,
184                 .postdiv1 = 1,
185                 .dacpd = 1,
186                 .dsmpd = 1,
187         },
188         [PLL0_FREQ_750] = {
189                 .freq = PLL0_FREQ_750_VALUE,
190                 .prediv = 4,
191                 .fbdiv = 125,
192                 .postdiv1 = 1,
193                 .dacpd = 1,
194                 .dsmpd = 1,
195         },
196         [PLL0_FREQ_875] = {
197                 .freq = PLL0_FREQ_875_VALUE,
198                 .prediv = 24,
199                 .fbdiv = 875,
200                 .postdiv1 = 1,
201                 .dacpd = 1,
202                 .dsmpd = 1,
203         },
204         [PLL0_FREQ_1000] = {
205                 .freq = PLL0_FREQ_1000_VALUE,
206                 .prediv = 3,
207                 .fbdiv = 125,
208                 .postdiv1 = 1,
209                 .dacpd = 1,
210                 .dsmpd = 1,
211         },
212         [PLL0_FREQ_1250] = {
213                 .freq = PLL0_FREQ_1250_VALUE,
214                 .prediv = 12,
215                 .fbdiv = 625,
216                 .postdiv1 = 1,
217                 .dacpd = 1,
218                 .dsmpd = 1,
219         },
220         [PLL0_FREQ_1375] = {
221                 .freq = PLL0_FREQ_1375_VALUE,
222                 .prediv = 24,
223                 .fbdiv = 1375,
224                 .postdiv1 = 1,
225                 .dacpd = 1,
226                 .dsmpd = 1,
227         },
228         [PLL0_FREQ_1500] = {
229                 .freq = PLL0_FREQ_1500_VALUE,
230                 .prediv = 2,
231                 .fbdiv = 125,
232                 .postdiv1 = 1,
233                 .dacpd = 1,
234                 .dsmpd = 1,
235         },
236 };
237
238 static const struct starfive_pll_syscon_value
239         jh7110_pll1_syscon_freq[] = {
240         [PLL1_FREQ_1066] = {
241                 .freq = PLL1_FREQ_1066_VALUE,
242                 .prediv = 12,
243                 .fbdiv = 533,
244                 .postdiv1 = 1,
245                 .dacpd = 1,
246                 .dsmpd = 1,
247         },
248 };
249
250 static const struct starfive_pll_syscon_value
251         jh7110_pll2_syscon_freq[] = {
252         [PLL2_FREQ_1188] = {
253                 .freq = PLL2_FREQ_1188_VALUE,
254                 .prediv = 2,
255                 .fbdiv = 99,
256                 .postdiv1 = 1,
257                 .dacpd = 1,
258                 .dsmpd = 1,
259         },
260         [PLL2_FREQ_12288] = {
261                 .freq = PLL2_FREQ_12288_VALUE,
262                 .prediv = 5,
263                 .fbdiv = 256,
264                 .postdiv1 = 1,
265                 .dacpd = 1,
266                 .dsmpd = 1,
267         },
268 };
269
270 int __init clk_starfive_jh7110_pll_init(struct platform_device *pdev,
271                                 struct jh7110_clk_pll_data *pll_priv);
272
273 #endif