xref: /OK3568_Linux_fs/kernel/drivers/clk/clk-si5351.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * clk-si5351.h: Silicon Laboratories Si5351A/B/C I2C Clock Generator
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
6*4882a593Smuzhiyun  * Rabeeh Khoury <rabeeh@solid-run.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef _CLK_SI5351_H_
10*4882a593Smuzhiyun #define _CLK_SI5351_H_
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define SI5351_BUS_BASE_ADDR			0x60
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define SI5351_PLL_VCO_MIN			600000000
15*4882a593Smuzhiyun #define SI5351_PLL_VCO_MAX			900000000
16*4882a593Smuzhiyun #define SI5351_MULTISYNTH_MIN_FREQ		1000000
17*4882a593Smuzhiyun #define SI5351_MULTISYNTH_DIVBY4_FREQ		150000000
18*4882a593Smuzhiyun #define SI5351_MULTISYNTH_MAX_FREQ		160000000
19*4882a593Smuzhiyun #define SI5351_MULTISYNTH67_MAX_FREQ		SI5351_MULTISYNTH_DIVBY4_FREQ
20*4882a593Smuzhiyun #define SI5351_CLKOUT_MIN_FREQ			8000
21*4882a593Smuzhiyun #define SI5351_CLKOUT_MAX_FREQ			SI5351_MULTISYNTH_MAX_FREQ
22*4882a593Smuzhiyun #define SI5351_CLKOUT67_MAX_FREQ		SI5351_MULTISYNTH67_MAX_FREQ
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define SI5351_PLL_A_MIN			15
25*4882a593Smuzhiyun #define SI5351_PLL_A_MAX			90
26*4882a593Smuzhiyun #define SI5351_PLL_B_MAX			(SI5351_PLL_C_MAX-1)
27*4882a593Smuzhiyun #define SI5351_PLL_C_MAX			1048575
28*4882a593Smuzhiyun #define SI5351_MULTISYNTH_A_MIN			6
29*4882a593Smuzhiyun #define SI5351_MULTISYNTH_A_MAX			1800
30*4882a593Smuzhiyun #define SI5351_MULTISYNTH67_A_MAX		254
31*4882a593Smuzhiyun #define SI5351_MULTISYNTH_B_MAX			(SI5351_MULTISYNTH_C_MAX-1)
32*4882a593Smuzhiyun #define SI5351_MULTISYNTH_C_MAX			1048575
33*4882a593Smuzhiyun #define SI5351_MULTISYNTH_P1_MAX		((1<<18)-1)
34*4882a593Smuzhiyun #define SI5351_MULTISYNTH_P2_MAX		((1<<20)-1)
35*4882a593Smuzhiyun #define SI5351_MULTISYNTH_P3_MAX		((1<<20)-1)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define SI5351_DEVICE_STATUS			0
38*4882a593Smuzhiyun #define SI5351_INTERRUPT_STATUS			1
39*4882a593Smuzhiyun #define SI5351_INTERRUPT_MASK			2
40*4882a593Smuzhiyun #define  SI5351_STATUS_SYS_INIT			(1<<7)
41*4882a593Smuzhiyun #define  SI5351_STATUS_LOL_B			(1<<6)
42*4882a593Smuzhiyun #define  SI5351_STATUS_LOL_A			(1<<5)
43*4882a593Smuzhiyun #define  SI5351_STATUS_LOS			(1<<4)
44*4882a593Smuzhiyun #define SI5351_OUTPUT_ENABLE_CTRL		3
45*4882a593Smuzhiyun #define SI5351_OEB_PIN_ENABLE_CTRL		9
46*4882a593Smuzhiyun #define SI5351_PLL_INPUT_SOURCE			15
47*4882a593Smuzhiyun #define  SI5351_CLKIN_DIV_MASK			(3<<6)
48*4882a593Smuzhiyun #define  SI5351_CLKIN_DIV_1			(0<<6)
49*4882a593Smuzhiyun #define  SI5351_CLKIN_DIV_2			(1<<6)
50*4882a593Smuzhiyun #define  SI5351_CLKIN_DIV_4			(2<<6)
51*4882a593Smuzhiyun #define  SI5351_CLKIN_DIV_8			(3<<6)
52*4882a593Smuzhiyun #define  SI5351_PLLB_SOURCE			(1<<3)
53*4882a593Smuzhiyun #define  SI5351_PLLA_SOURCE			(1<<2)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define SI5351_CLK0_CTRL			16
56*4882a593Smuzhiyun #define SI5351_CLK1_CTRL			17
57*4882a593Smuzhiyun #define SI5351_CLK2_CTRL			18
58*4882a593Smuzhiyun #define SI5351_CLK3_CTRL			19
59*4882a593Smuzhiyun #define SI5351_CLK4_CTRL			20
60*4882a593Smuzhiyun #define SI5351_CLK5_CTRL			21
61*4882a593Smuzhiyun #define SI5351_CLK6_CTRL			22
62*4882a593Smuzhiyun #define SI5351_CLK7_CTRL			23
63*4882a593Smuzhiyun #define  SI5351_CLK_POWERDOWN			(1<<7)
64*4882a593Smuzhiyun #define  SI5351_CLK_INTEGER_MODE		(1<<6)
65*4882a593Smuzhiyun #define  SI5351_CLK_PLL_SELECT			(1<<5)
66*4882a593Smuzhiyun #define  SI5351_CLK_INVERT			(1<<4)
67*4882a593Smuzhiyun #define  SI5351_CLK_INPUT_MASK			(3<<2)
68*4882a593Smuzhiyun #define  SI5351_CLK_INPUT_XTAL			(0<<2)
69*4882a593Smuzhiyun #define  SI5351_CLK_INPUT_CLKIN			(1<<2)
70*4882a593Smuzhiyun #define  SI5351_CLK_INPUT_MULTISYNTH_0_4	(2<<2)
71*4882a593Smuzhiyun #define  SI5351_CLK_INPUT_MULTISYNTH_N		(3<<2)
72*4882a593Smuzhiyun #define  SI5351_CLK_DRIVE_STRENGTH_MASK		(3<<0)
73*4882a593Smuzhiyun #define  SI5351_CLK_DRIVE_STRENGTH_2MA		(0<<0)
74*4882a593Smuzhiyun #define  SI5351_CLK_DRIVE_STRENGTH_4MA		(1<<0)
75*4882a593Smuzhiyun #define  SI5351_CLK_DRIVE_STRENGTH_6MA		(2<<0)
76*4882a593Smuzhiyun #define  SI5351_CLK_DRIVE_STRENGTH_8MA		(3<<0)
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define SI5351_CLK3_0_DISABLE_STATE		24
79*4882a593Smuzhiyun #define SI5351_CLK7_4_DISABLE_STATE		25
80*4882a593Smuzhiyun #define  SI5351_CLK_DISABLE_STATE_MASK		3
81*4882a593Smuzhiyun #define  SI5351_CLK_DISABLE_STATE_LOW		0
82*4882a593Smuzhiyun #define  SI5351_CLK_DISABLE_STATE_HIGH		1
83*4882a593Smuzhiyun #define  SI5351_CLK_DISABLE_STATE_FLOAT		2
84*4882a593Smuzhiyun #define  SI5351_CLK_DISABLE_STATE_NEVER		3
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #define SI5351_PARAMETERS_LENGTH		8
87*4882a593Smuzhiyun #define SI5351_PLLA_PARAMETERS			26
88*4882a593Smuzhiyun #define SI5351_PLLB_PARAMETERS			34
89*4882a593Smuzhiyun #define SI5351_CLK0_PARAMETERS			42
90*4882a593Smuzhiyun #define SI5351_CLK1_PARAMETERS			50
91*4882a593Smuzhiyun #define SI5351_CLK2_PARAMETERS			58
92*4882a593Smuzhiyun #define SI5351_CLK3_PARAMETERS			66
93*4882a593Smuzhiyun #define SI5351_CLK4_PARAMETERS			74
94*4882a593Smuzhiyun #define SI5351_CLK5_PARAMETERS			82
95*4882a593Smuzhiyun #define SI5351_CLK6_PARAMETERS			90
96*4882a593Smuzhiyun #define SI5351_CLK7_PARAMETERS			91
97*4882a593Smuzhiyun #define SI5351_CLK6_7_OUTPUT_DIVIDER		92
98*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_MASK		(7 << 4)
99*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK6_DIV_MASK		(7 << 0)
100*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_SHIFT		4
101*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV6_SHIFT		0
102*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_1		0
103*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_2		1
104*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_4		2
105*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_8		3
106*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_16		4
107*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_32		5
108*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_64		6
109*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIV_128		7
110*4882a593Smuzhiyun #define  SI5351_OUTPUT_CLK_DIVBY4		(3<<2)
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #define SI5351_SSC_PARAM0			149
113*4882a593Smuzhiyun #define SI5351_SSC_PARAM1			150
114*4882a593Smuzhiyun #define SI5351_SSC_PARAM2			151
115*4882a593Smuzhiyun #define SI5351_SSC_PARAM3			152
116*4882a593Smuzhiyun #define SI5351_SSC_PARAM4			153
117*4882a593Smuzhiyun #define SI5351_SSC_PARAM5			154
118*4882a593Smuzhiyun #define SI5351_SSC_PARAM6			155
119*4882a593Smuzhiyun #define SI5351_SSC_PARAM7			156
120*4882a593Smuzhiyun #define SI5351_SSC_PARAM8			157
121*4882a593Smuzhiyun #define SI5351_SSC_PARAM9			158
122*4882a593Smuzhiyun #define SI5351_SSC_PARAM10			159
123*4882a593Smuzhiyun #define SI5351_SSC_PARAM11			160
124*4882a593Smuzhiyun #define SI5351_SSC_PARAM12			161
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #define SI5351_VXCO_PARAMETERS_LOW		162
127*4882a593Smuzhiyun #define SI5351_VXCO_PARAMETERS_MID		163
128*4882a593Smuzhiyun #define SI5351_VXCO_PARAMETERS_HIGH		164
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define SI5351_CLK0_PHASE_OFFSET		165
131*4882a593Smuzhiyun #define SI5351_CLK1_PHASE_OFFSET		166
132*4882a593Smuzhiyun #define SI5351_CLK2_PHASE_OFFSET		167
133*4882a593Smuzhiyun #define SI5351_CLK3_PHASE_OFFSET		168
134*4882a593Smuzhiyun #define SI5351_CLK4_PHASE_OFFSET		169
135*4882a593Smuzhiyun #define SI5351_CLK5_PHASE_OFFSET		170
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun #define SI5351_PLL_RESET			177
138*4882a593Smuzhiyun #define  SI5351_PLL_RESET_B			(1<<7)
139*4882a593Smuzhiyun #define  SI5351_PLL_RESET_A			(1<<5)
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define SI5351_CRYSTAL_LOAD			183
142*4882a593Smuzhiyun #define  SI5351_CRYSTAL_LOAD_MASK		(3<<6)
143*4882a593Smuzhiyun #define  SI5351_CRYSTAL_LOAD_6PF		(1<<6)
144*4882a593Smuzhiyun #define  SI5351_CRYSTAL_LOAD_8PF		(2<<6)
145*4882a593Smuzhiyun #define  SI5351_CRYSTAL_LOAD_10PF		(3<<6)
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun #define SI5351_FANOUT_ENABLE			187
148*4882a593Smuzhiyun #define  SI5351_CLKIN_ENABLE			(1<<7)
149*4882a593Smuzhiyun #define  SI5351_XTAL_ENABLE			(1<<6)
150*4882a593Smuzhiyun #define  SI5351_MULTISYNTH_ENABLE		(1<<4)
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /**
153*4882a593Smuzhiyun  * enum si5351_variant - SiLabs Si5351 chip variant
154*4882a593Smuzhiyun  * @SI5351_VARIANT_A: Si5351A (8 output clocks, XTAL input)
155*4882a593Smuzhiyun  * @SI5351_VARIANT_A3: Si5351A MSOP10 (3 output clocks, XTAL input)
156*4882a593Smuzhiyun  * @SI5351_VARIANT_B: Si5351B (8 output clocks, XTAL/VXCO input)
157*4882a593Smuzhiyun  * @SI5351_VARIANT_C: Si5351C (8 output clocks, XTAL/CLKIN input)
158*4882a593Smuzhiyun  */
159*4882a593Smuzhiyun enum si5351_variant {
160*4882a593Smuzhiyun 	SI5351_VARIANT_A = 1,
161*4882a593Smuzhiyun 	SI5351_VARIANT_A3 = 2,
162*4882a593Smuzhiyun 	SI5351_VARIANT_B = 3,
163*4882a593Smuzhiyun 	SI5351_VARIANT_C = 4,
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun #endif
167