1668c222752f3b921cfa9204ee3399587eb8b981
[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         PLL0_FREQ_1625_VALUE = 1625000000,
130         PLL0_FREQ_1750_VALUE = 1750000000
131 };
132
133 enum starfive_pll0_freq {
134         PLL0_FREQ_375 = 0,
135         PLL0_FREQ_500,
136         PLL0_FREQ_625,
137         PLL0_FREQ_750,
138         PLL0_FREQ_875,
139         PLL0_FREQ_1000,
140         PLL0_FREQ_1250,
141         PLL0_FREQ_1375,
142         PLL0_FREQ_1500,
143         PLL0_FREQ_1625,
144         PLL0_FREQ_1750,
145         PLL0_FREQ_MAX
146 };
147
148 enum starfive_pll1_freq_value {
149         PLL1_FREQ_1066_VALUE = 1066000000,
150 };
151
152 enum starfive_pll1_freq {
153         PLL1_FREQ_1066 = 0,
154 };
155
156 enum starfive_pll2_freq_value {
157         PLL2_FREQ_1188_VALUE = 1188000000,
158         PLL2_FREQ_12288_VALUE = 1228800000,
159 };
160
161 enum starfive_pll2_freq {
162         PLL2_FREQ_1188 = 0,
163         PLL2_FREQ_12288,
164 };
165
166 static const struct starfive_pll_syscon_value
167         jh7110_pll0_syscon_freq[PLL0_FREQ_MAX] = {
168         [PLL0_FREQ_375] = {
169                 .freq = PLL0_FREQ_375_VALUE,
170                 .prediv = 8,
171                 .fbdiv = 125,
172                 .postdiv1 = 1,
173                 .dacpd = 1,
174                 .dsmpd = 1,
175         },
176         [PLL0_FREQ_500] = {
177                 .freq = PLL0_FREQ_500_VALUE,
178                 .prediv = 6,
179                 .fbdiv = 125,
180                 .postdiv1 = 1,
181                 .dacpd = 1,
182                 .dsmpd = 1,
183         },
184         [PLL0_FREQ_625] = {
185                 .freq = PLL0_FREQ_625_VALUE,
186                 .prediv = 24,
187                 .fbdiv = 625,
188                 .postdiv1 = 1,
189                 .dacpd = 1,
190                 .dsmpd = 1,
191         },
192         [PLL0_FREQ_750] = {
193                 .freq = PLL0_FREQ_750_VALUE,
194                 .prediv = 4,
195                 .fbdiv = 125,
196                 .postdiv1 = 1,
197                 .dacpd = 1,
198                 .dsmpd = 1,
199         },
200         [PLL0_FREQ_875] = {
201                 .freq = PLL0_FREQ_875_VALUE,
202                 .prediv = 24,
203                 .fbdiv = 875,
204                 .postdiv1 = 1,
205                 .dacpd = 1,
206                 .dsmpd = 1,
207         },
208         [PLL0_FREQ_1000] = {
209                 .freq = PLL0_FREQ_1000_VALUE,
210                 .prediv = 3,
211                 .fbdiv = 125,
212                 .postdiv1 = 1,
213                 .dacpd = 1,
214                 .dsmpd = 1,
215         },
216         [PLL0_FREQ_1250] = {
217                 .freq = PLL0_FREQ_1250_VALUE,
218                 .prediv = 12,
219                 .fbdiv = 625,
220                 .postdiv1 = 1,
221                 .dacpd = 1,
222                 .dsmpd = 1,
223         },
224         [PLL0_FREQ_1375] = {
225                 .freq = PLL0_FREQ_1375_VALUE,
226                 .prediv = 24,
227                 .fbdiv = 1375,
228                 .postdiv1 = 1,
229                 .dacpd = 1,
230                 .dsmpd = 1,
231         },
232         [PLL0_FREQ_1500] = {
233                 .freq = PLL0_FREQ_1500_VALUE,
234                 .prediv = 2,
235                 .fbdiv = 125,
236                 .postdiv1 = 1,
237                 .dacpd = 1,
238                 .dsmpd = 1,
239         },
240         [PLL0_FREQ_1625] = {
241                 .freq = PLL0_FREQ_1625_VALUE,
242                 .prediv = 24,
243                 .fbdiv = 1625,
244                 .postdiv1 = 1,
245                 .dacpd = 1,
246                 .dsmpd = 1,
247         },
248         [PLL0_FREQ_1750] = {
249                 .freq = PLL0_FREQ_1750_VALUE,
250                 .prediv = 12,
251                 .fbdiv = 875,
252                 .postdiv1 = 1,
253                 .dacpd = 1,
254                 .dsmpd = 1,
255         },
256 };
257
258 static const struct starfive_pll_syscon_value
259         jh7110_pll1_syscon_freq[] = {
260         [PLL1_FREQ_1066] = {
261                 .freq = PLL1_FREQ_1066_VALUE,
262                 .prediv = 12,
263                 .fbdiv = 533,
264                 .postdiv1 = 1,
265                 .dacpd = 1,
266                 .dsmpd = 1,
267         },
268 };
269
270 static const struct starfive_pll_syscon_value
271         jh7110_pll2_syscon_freq[] = {
272         [PLL2_FREQ_1188] = {
273                 .freq = PLL2_FREQ_1188_VALUE,
274                 .prediv = 2,
275                 .fbdiv = 99,
276                 .postdiv1 = 1,
277                 .dacpd = 1,
278                 .dsmpd = 1,
279         },
280         [PLL2_FREQ_12288] = {
281                 .freq = PLL2_FREQ_12288_VALUE,
282                 .prediv = 5,
283                 .fbdiv = 256,
284                 .postdiv1 = 1,
285                 .dacpd = 1,
286                 .dsmpd = 1,
287         },
288 };
289
290 int __init clk_starfive_jh7110_pll_init(struct platform_device *pdev,
291                                 struct jh7110_clk_pll_data *pll_priv);
292
293 #endif