xref: /freebsd/sys/dev/clk/starfive/jh7110_clk_pll.h (revision 0612538e3ac93c1884f595a72609c078aefbcc28)
1*0612538eSJari Sihvola /* SPDX-License-Identifier: MIT */
2*0612538eSJari Sihvola /*
3*0612538eSJari Sihvola  * StarFive JH7110 PLL Clock Generator Driver
4*0612538eSJari Sihvola  *
5*0612538eSJari Sihvola  * Copyright (C) 2022 Xingyu Wu <xingyu.wu@starfivetech.com>
6*0612538eSJari Sihvola  */
7*0612538eSJari Sihvola 
8*0612538eSJari Sihvola #define PLL0_DACPD_SHIFT	24
9*0612538eSJari Sihvola #define PLL0_DACPD_MASK		0x1000000
10*0612538eSJari Sihvola #define PLL_0_DACPD_SHIFT	24
11*0612538eSJari Sihvola #define PLL_0_DACPD_MASK		0x1000000
12*0612538eSJari Sihvola 
13*0612538eSJari Sihvola #define PLL0_DSMPD_SHIFT	25
14*0612538eSJari Sihvola #define PLL0_DSMPD_MASK		0x2000000
15*0612538eSJari Sihvola #define PLL0_FBDIV_SHIFT	0
16*0612538eSJari Sihvola #define PLL0_FBDIV_MASK		0xFFF
17*0612538eSJari Sihvola #define PLL0_FRAC_SHIFT		0
18*0612538eSJari Sihvola #define PLL0_FRAC_MASK		0xFFFFFF
19*0612538eSJari Sihvola #define PLL0_POSTDIV1_SHIFT	28
20*0612538eSJari Sihvola #define PLL0_POSTDIV1_MASK	0x30000000
21*0612538eSJari Sihvola #define PLL0_PREDIV_SHIFT	0
22*0612538eSJari Sihvola #define PLL0_PREDIV_MASK	0x3F
23*0612538eSJari Sihvola 
24*0612538eSJari Sihvola #define PLL1_DACPD_SHIFT	15
25*0612538eSJari Sihvola #define PLL1_DACPD_MASK		0x8000
26*0612538eSJari Sihvola #define PLL1_DSMPD_SHIFT	16
27*0612538eSJari Sihvola #define PLL1_DSMPD_MASK		0x10000
28*0612538eSJari Sihvola #define PLL1_FBDIV_SHIFT	17
29*0612538eSJari Sihvola #define PLL1_FBDIV_MASK		0x1FFE0000
30*0612538eSJari Sihvola #define PLL1_FRAC_SHIFT		0
31*0612538eSJari Sihvola #define PLL1_FRAC_MASK		0xFFFFFF
32*0612538eSJari Sihvola #define PLL1_POSTDIV1_SHIFT	28
33*0612538eSJari Sihvola #define PLL1_POSTDIV1_MASK	0x30000000
34*0612538eSJari Sihvola #define PLL1_PREDIV_SHIFT	0
35*0612538eSJari Sihvola #define PLL1_PREDIV_MASK	0x3F
36*0612538eSJari Sihvola 
37*0612538eSJari Sihvola #define PLL2_DACPD_SHIFT	15
38*0612538eSJari Sihvola #define PLL2_DACPD_MASK		0x8000
39*0612538eSJari Sihvola #define PLL2_DSMPD_SHIFT	16
40*0612538eSJari Sihvola #define PLL2_DSMPD_MASK		0x10000
41*0612538eSJari Sihvola #define PLL2_FBDIV_SHIFT	17
42*0612538eSJari Sihvola #define PLL2_FBDIV_MASK		0x1FFE0000
43*0612538eSJari Sihvola #define PLL2_FRAC_SHIFT		0
44*0612538eSJari Sihvola #define PLL2_FRAC_MASK		0xFFFFFF
45*0612538eSJari Sihvola #define PLL2_POSTDIV1_SHIFT	28
46*0612538eSJari Sihvola #define PLL2_POSTDIV1_MASK	0x30000000
47*0612538eSJari Sihvola #define PLL2_PREDIV_SHIFT	0
48*0612538eSJari Sihvola #define PLL2_PREDIV_MASK	0x3F
49*0612538eSJari Sihvola 
50*0612538eSJari Sihvola #define FRAC_PATR_SIZE		1000
51*0612538eSJari Sihvola 
52*0612538eSJari Sihvola struct jh7110_pll_syscon_value {
53*0612538eSJari Sihvola 	uint64_t freq;
54*0612538eSJari Sihvola 	uint32_t prediv;
55*0612538eSJari Sihvola 	uint32_t fbdiv;
56*0612538eSJari Sihvola 	uint32_t postdiv1;
57*0612538eSJari Sihvola 	uint32_t dacpd;
58*0612538eSJari Sihvola 	uint32_t dsmpd;
59*0612538eSJari Sihvola 	uint32_t frac;
60*0612538eSJari Sihvola };
61*0612538eSJari Sihvola 
62*0612538eSJari Sihvola enum starfive_pll0_freq_value {
63*0612538eSJari Sihvola 	PLL0_FREQ_375_VALUE = 375000000,
64*0612538eSJari Sihvola 	PLL0_FREQ_500_VALUE = 500000000,
65*0612538eSJari Sihvola 	PLL0_FREQ_625_VALUE = 625000000,
66*0612538eSJari Sihvola 	PLL0_FREQ_750_VALUE = 750000000,
67*0612538eSJari Sihvola 	PLL0_FREQ_875_VALUE = 875000000,
68*0612538eSJari Sihvola 	PLL0_FREQ_1000_VALUE = 1000000000,
69*0612538eSJari Sihvola 	PLL0_FREQ_1250_VALUE = 1250000000,
70*0612538eSJari Sihvola 	PLL0_FREQ_1375_VALUE = 1375000000,
71*0612538eSJari Sihvola 	PLL0_FREQ_1500_VALUE = 1500000000
72*0612538eSJari Sihvola };
73*0612538eSJari Sihvola 
74*0612538eSJari Sihvola enum starfive_pll0_freq {
75*0612538eSJari Sihvola 	PLL0_FREQ_375 = 0,
76*0612538eSJari Sihvola 	PLL0_FREQ_500,
77*0612538eSJari Sihvola 	PLL0_FREQ_625,
78*0612538eSJari Sihvola 	PLL0_FREQ_750,
79*0612538eSJari Sihvola 	PLL0_FREQ_875,
80*0612538eSJari Sihvola 	PLL0_FREQ_1000,
81*0612538eSJari Sihvola 	PLL0_FREQ_1250,
82*0612538eSJari Sihvola 	PLL0_FREQ_1375,
83*0612538eSJari Sihvola 	PLL0_FREQ_1500,
84*0612538eSJari Sihvola 	PLL0_FREQ_MAX = PLL0_FREQ_1500
85*0612538eSJari Sihvola };
86*0612538eSJari Sihvola 
87*0612538eSJari Sihvola enum starfive_pll1_freq_value {
88*0612538eSJari Sihvola 	PLL1_FREQ_1066_VALUE = 1066000000,
89*0612538eSJari Sihvola };
90*0612538eSJari Sihvola 
91*0612538eSJari Sihvola enum starfive_pll1_freq {
92*0612538eSJari Sihvola 	PLL1_FREQ_1066 = 0,
93*0612538eSJari Sihvola };
94*0612538eSJari Sihvola 
95*0612538eSJari Sihvola enum starfive_pll2_freq_value {
96*0612538eSJari Sihvola 	PLL2_FREQ_1188_VALUE = 1188000000,
97*0612538eSJari Sihvola 	PLL2_FREQ_12288_VALUE = 1228800000,
98*0612538eSJari Sihvola };
99*0612538eSJari Sihvola 
100*0612538eSJari Sihvola enum starfive_pll2_freq {
101*0612538eSJari Sihvola 	PLL2_FREQ_1188 = 0,
102*0612538eSJari Sihvola 	PLL2_FREQ_12288,
103*0612538eSJari Sihvola };
104*0612538eSJari Sihvola 
105*0612538eSJari Sihvola static const struct jh7110_pll_syscon_value
106*0612538eSJari Sihvola 	jh7110_pll0_syscon_freq[] = {
107*0612538eSJari Sihvola 	[PLL0_FREQ_375] = {
108*0612538eSJari Sihvola 		.freq = PLL0_FREQ_375_VALUE,
109*0612538eSJari Sihvola 		.prediv = 8,
110*0612538eSJari Sihvola 		.fbdiv = 125,
111*0612538eSJari Sihvola 		.postdiv1 = 1,
112*0612538eSJari Sihvola 		.dacpd = 1,
113*0612538eSJari Sihvola 		.dsmpd = 1,
114*0612538eSJari Sihvola 	},
115*0612538eSJari Sihvola 	[PLL0_FREQ_500] = {
116*0612538eSJari Sihvola 		.freq = PLL0_FREQ_500_VALUE,
117*0612538eSJari Sihvola 		.prediv = 6,
118*0612538eSJari Sihvola 		.fbdiv = 125,
119*0612538eSJari Sihvola 		.postdiv1 = 1,
120*0612538eSJari Sihvola 		.dacpd = 1,
121*0612538eSJari Sihvola 		.dsmpd = 1,
122*0612538eSJari Sihvola 	},
123*0612538eSJari Sihvola 	[PLL0_FREQ_625] = {
124*0612538eSJari Sihvola 		.freq = PLL0_FREQ_625_VALUE,
125*0612538eSJari Sihvola 		.prediv = 24,
126*0612538eSJari Sihvola 		.fbdiv = 625,
127*0612538eSJari Sihvola 		.postdiv1 = 1,
128*0612538eSJari Sihvola 		.dacpd = 1,
129*0612538eSJari Sihvola 		.dsmpd = 1,
130*0612538eSJari Sihvola 	},
131*0612538eSJari Sihvola 	[PLL0_FREQ_750] = {
132*0612538eSJari Sihvola 		.freq = PLL0_FREQ_750_VALUE,
133*0612538eSJari Sihvola 		.prediv = 4,
134*0612538eSJari Sihvola 		.fbdiv = 125,
135*0612538eSJari Sihvola 		.postdiv1 = 1,
136*0612538eSJari Sihvola 		.dacpd = 1,
137*0612538eSJari Sihvola 		.dsmpd = 1,
138*0612538eSJari Sihvola 	},
139*0612538eSJari Sihvola 	[PLL0_FREQ_875] = {
140*0612538eSJari Sihvola 		.freq = PLL0_FREQ_875_VALUE,
141*0612538eSJari Sihvola 		.prediv = 24,
142*0612538eSJari Sihvola 		.fbdiv = 875,
143*0612538eSJari Sihvola 		.postdiv1 = 1,
144*0612538eSJari Sihvola 		.dacpd = 1,
145*0612538eSJari Sihvola 		.dsmpd = 1,
146*0612538eSJari Sihvola 	},
147*0612538eSJari Sihvola 	[PLL0_FREQ_1000] = {
148*0612538eSJari Sihvola 		.freq = PLL0_FREQ_1000_VALUE,
149*0612538eSJari Sihvola 		.prediv = 3,
150*0612538eSJari Sihvola 		.fbdiv = 125,
151*0612538eSJari Sihvola 		.postdiv1 = 1,
152*0612538eSJari Sihvola 		.dacpd = 1,
153*0612538eSJari Sihvola 		.dsmpd = 1,
154*0612538eSJari Sihvola 	},
155*0612538eSJari Sihvola 	[PLL0_FREQ_1250] = {
156*0612538eSJari Sihvola 		.freq = PLL0_FREQ_1250_VALUE,
157*0612538eSJari Sihvola 		.prediv = 12,
158*0612538eSJari Sihvola 		.fbdiv = 625,
159*0612538eSJari Sihvola 		.postdiv1 = 1,
160*0612538eSJari Sihvola 		.dacpd = 1,
161*0612538eSJari Sihvola 		.dsmpd = 1,
162*0612538eSJari Sihvola 	},
163*0612538eSJari Sihvola 	[PLL0_FREQ_1375] = {
164*0612538eSJari Sihvola 		.freq = PLL0_FREQ_1375_VALUE,
165*0612538eSJari Sihvola 		.prediv = 24,
166*0612538eSJari Sihvola 		.fbdiv = 1375,
167*0612538eSJari Sihvola 		.postdiv1 = 1,
168*0612538eSJari Sihvola 		.dacpd = 1,
169*0612538eSJari Sihvola 		.dsmpd = 1,
170*0612538eSJari Sihvola 	},
171*0612538eSJari Sihvola 	[PLL0_FREQ_1500] = {
172*0612538eSJari Sihvola 		.freq = PLL0_FREQ_1500_VALUE,
173*0612538eSJari Sihvola 		.prediv = 2,
174*0612538eSJari Sihvola 		.fbdiv = 125,
175*0612538eSJari Sihvola 		.postdiv1 = 1,
176*0612538eSJari Sihvola 		.dacpd = 1,
177*0612538eSJari Sihvola 		.dsmpd = 1,
178*0612538eSJari Sihvola 	},
179*0612538eSJari Sihvola };
180*0612538eSJari Sihvola 
181*0612538eSJari Sihvola static const struct jh7110_pll_syscon_value
182*0612538eSJari Sihvola 	jh7110_pll1_syscon_freq[] = {
183*0612538eSJari Sihvola 	[PLL1_FREQ_1066] = {
184*0612538eSJari Sihvola 		.freq = PLL1_FREQ_1066_VALUE,
185*0612538eSJari Sihvola 		.prediv = 12,
186*0612538eSJari Sihvola 		.fbdiv = 533,
187*0612538eSJari Sihvola 		.postdiv1 = 1,
188*0612538eSJari Sihvola 		.dacpd = 1,
189*0612538eSJari Sihvola 		.dsmpd = 1,
190*0612538eSJari Sihvola 	},
191*0612538eSJari Sihvola };
192*0612538eSJari Sihvola 
193*0612538eSJari Sihvola static const struct jh7110_pll_syscon_value
194*0612538eSJari Sihvola 	jh7110_pll2_syscon_freq[] = {
195*0612538eSJari Sihvola 	[PLL2_FREQ_1188] = {
196*0612538eSJari Sihvola 		.freq = PLL2_FREQ_1188_VALUE,
197*0612538eSJari Sihvola 		.prediv = 2,
198*0612538eSJari Sihvola 		.fbdiv = 99,
199*0612538eSJari Sihvola 		.postdiv1 = 1,
200*0612538eSJari Sihvola 		.dacpd = 1,
201*0612538eSJari Sihvola 		.dsmpd = 1,
202*0612538eSJari Sihvola 	},
203*0612538eSJari Sihvola 	[PLL2_FREQ_12288] = {
204*0612538eSJari Sihvola 		.freq = PLL2_FREQ_12288_VALUE,
205*0612538eSJari Sihvola 		.prediv = 5,
206*0612538eSJari Sihvola 		.fbdiv = 256,
207*0612538eSJari Sihvola 		.postdiv1 = 1,
208*0612538eSJari Sihvola 		.dacpd = 1,
209*0612538eSJari Sihvola 		.dsmpd = 1,
210*0612538eSJari Sihvola 	},
211*0612538eSJari Sihvola };
212