xref: /linux/drivers/dpll/zl3073x/regs.h (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef _ZL3073X_REGS_H
4 #define _ZL3073X_REGS_H
5 
6 #include <linux/bitfield.h>
7 #include <linux/bits.h>
8 
9 /*
10  * Register address structure:
11  * ===========================
12  *  25        19 18  16 15     7 6           0
13  * +------------------------------------------+
14  * | max_offset | size |  page  | page_offset |
15  * +------------------------------------------+
16  *
17  * page_offset ... <0x00..0x7F>
18  * page .......... HW page number
19  * size .......... register byte size (1, 2, 4 or 6)
20  * max_offset .... maximal offset for indexed registers
21  *                 (for non-indexed regs max_offset == page_offset)
22  */
23 
24 #define ZL_REG_OFFSET_MASK	GENMASK(6, 0)
25 #define ZL_REG_PAGE_MASK	GENMASK(15, 7)
26 #define ZL_REG_SIZE_MASK	GENMASK(18, 16)
27 #define ZL_REG_MAX_OFFSET_MASK	GENMASK(25, 19)
28 #define ZL_REG_ADDR_MASK	GENMASK(15, 0)
29 
30 #define ZL_REG_OFFSET(_reg)	FIELD_GET(ZL_REG_OFFSET_MASK, _reg)
31 #define ZL_REG_PAGE(_reg)	FIELD_GET(ZL_REG_PAGE_MASK, _reg)
32 #define ZL_REG_MAX_OFFSET(_reg)	FIELD_GET(ZL_REG_MAX_OFFSET_MASK, _reg)
33 #define ZL_REG_SIZE(_reg)	FIELD_GET(ZL_REG_SIZE_MASK, _reg)
34 #define ZL_REG_ADDR(_reg)	FIELD_GET(ZL_REG_ADDR_MASK, _reg)
35 
36 /**
37  * ZL_REG_IDX - define indexed register
38  * @_idx: index of register to access
39  * @_page: register page
40  * @_offset: register offset in page
41  * @_size: register byte size (1, 2, 4 or 6)
42  * @_items: number of register indices
43  * @_stride: stride between items in bytes
44  *
45  * All parameters except @_idx should be constant.
46  */
47 #define ZL_REG_IDX(_idx, _page, _offset, _size, _items, _stride)	\
48 	(FIELD_PREP(ZL_REG_OFFSET_MASK,					\
49 		    (_offset) + (_idx) * (_stride))		|	\
50 	 FIELD_PREP_CONST(ZL_REG_PAGE_MASK, _page)		|	\
51 	 FIELD_PREP_CONST(ZL_REG_SIZE_MASK, _size)		|	\
52 	 FIELD_PREP_CONST(ZL_REG_MAX_OFFSET_MASK,			\
53 			  (_offset) + ((_items) - 1) * (_stride)))
54 
55 /**
56  * ZL_REG - define simple (non-indexed) register
57  * @_page: register page
58  * @_offset: register offset in page
59  * @_size: register byte size (1, 2, 4 or 6)
60  *
61  * All parameters should be constant.
62  */
63 #define ZL_REG(_page, _offset, _size)					\
64 	ZL_REG_IDX(0, _page, _offset, _size, 1, 0)
65 
66 /**************************
67  * Register Page 0, General
68  **************************/
69 
70 #define ZL_REG_ID				ZL_REG(0, 0x01, 2)
71 #define ZL_REG_REVISION				ZL_REG(0, 0x03, 2)
72 #define ZL_REG_FW_VER				ZL_REG(0, 0x05, 2)
73 #define ZL_REG_CUSTOM_CONFIG_VER		ZL_REG(0, 0x07, 4)
74 
75 /*************************
76  * Register Page 2, Status
77  *************************/
78 
79 #define ZL_REG_REF_MON_STATUS(_idx)					\
80 	ZL_REG_IDX(_idx, 2, 0x02, 1, ZL3073X_NUM_REFS, 1)
81 #define ZL_REF_MON_STATUS_OK			0 /* all bits zeroed */
82 
83 #define ZL_REG_DPLL_MON_STATUS(_idx)					\
84 	ZL_REG_IDX(_idx, 2, 0x10, 1, ZL3073X_MAX_CHANNELS, 1)
85 #define ZL_DPLL_MON_STATUS_STATE		GENMASK(1, 0)
86 #define ZL_DPLL_MON_STATUS_STATE_ACQUIRING	0
87 #define ZL_DPLL_MON_STATUS_STATE_LOCK		1
88 #define ZL_DPLL_MON_STATUS_STATE_HOLDOVER	2
89 #define ZL_DPLL_MON_STATUS_HO_READY		BIT(2)
90 
91 #define ZL_REG_DPLL_REFSEL_STATUS(_idx)					\
92 	ZL_REG_IDX(_idx, 2, 0x30, 1, ZL3073X_MAX_CHANNELS, 1)
93 #define ZL_DPLL_REFSEL_STATUS_REFSEL		GENMASK(3, 0)
94 #define ZL_DPLL_REFSEL_STATUS_STATE		GENMASK(6, 4)
95 #define ZL_DPLL_REFSEL_STATUS_STATE_LOCK	4
96 
97 #define ZL_REG_REF_FREQ(_idx)						\
98 	ZL_REG_IDX(_idx, 2, 0x44, 4, ZL3073X_NUM_REFS, 4)
99 
100 /**********************
101  * Register Page 4, Ref
102  **********************/
103 
104 #define ZL_REG_REF_PHASE_ERR_READ_RQST		ZL_REG(4, 0x0f, 1)
105 #define ZL_REF_PHASE_ERR_READ_RQST_RD		BIT(0)
106 
107 #define ZL_REG_REF_FREQ_MEAS_CTRL		ZL_REG(4, 0x1c, 1)
108 #define ZL_REF_FREQ_MEAS_CTRL			GENMASK(1, 0)
109 #define ZL_REF_FREQ_MEAS_CTRL_REF_FREQ		1
110 #define ZL_REF_FREQ_MEAS_CTRL_REF_FREQ_OFF	2
111 #define ZL_REF_FREQ_MEAS_CTRL_DPLL_FREQ_OFF	3
112 
113 #define ZL_REG_REF_FREQ_MEAS_MASK_3_0		ZL_REG(4, 0x1d, 1)
114 #define ZL_REF_FREQ_MEAS_MASK_3_0(_ref)		BIT(_ref)
115 
116 #define ZL_REG_REF_FREQ_MEAS_MASK_4		ZL_REG(4, 0x1e, 1)
117 #define ZL_REF_FREQ_MEAS_MASK_4(_ref)		BIT((_ref) - 8)
118 
119 #define ZL_REG_DPLL_MEAS_REF_FREQ_CTRL		ZL_REG(4, 0x1f, 1)
120 #define ZL_DPLL_MEAS_REF_FREQ_CTRL_EN		BIT(0)
121 #define ZL_DPLL_MEAS_REF_FREQ_CTRL_IDX		GENMASK(6, 4)
122 
123 #define ZL_REG_REF_PHASE(_idx)						\
124 	ZL_REG_IDX(_idx, 4, 0x20, 6, ZL3073X_NUM_REFS, 6)
125 
126 /***********************
127  * Register Page 5, DPLL
128  ***********************/
129 
130 #define ZL_REG_DPLL_MODE_REFSEL(_idx)					\
131 	ZL_REG_IDX(_idx, 5, 0x04, 1, ZL3073X_MAX_CHANNELS, 4)
132 #define ZL_DPLL_MODE_REFSEL_MODE		GENMASK(2, 0)
133 #define ZL_DPLL_MODE_REFSEL_MODE_FREERUN	0
134 #define ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER	1
135 #define ZL_DPLL_MODE_REFSEL_MODE_REFLOCK	2
136 #define ZL_DPLL_MODE_REFSEL_MODE_AUTO		3
137 #define ZL_DPLL_MODE_REFSEL_MODE_NCO		4
138 #define ZL_DPLL_MODE_REFSEL_REF			GENMASK(7, 4)
139 
140 #define ZL_REG_DPLL_MEAS_CTRL			ZL_REG(5, 0x50, 1)
141 #define ZL_DPLL_MEAS_CTRL_EN			BIT(0)
142 #define ZL_DPLL_MEAS_CTRL_AVG_FACTOR		GENMASK(7, 4)
143 
144 #define ZL_REG_DPLL_MEAS_IDX			ZL_REG(5, 0x51, 1)
145 #define ZL_DPLL_MEAS_IDX			GENMASK(2, 0)
146 
147 #define ZL_REG_DPLL_PHASE_ERR_READ_MASK		ZL_REG(5, 0x54, 1)
148 
149 #define ZL_REG_DPLL_PHASE_ERR_DATA(_idx)				\
150 	ZL_REG_IDX(_idx, 5, 0x55, 6, ZL3073X_MAX_CHANNELS, 6)
151 
152 /***********************************
153  * Register Page 9, Synth and Output
154  ***********************************/
155 
156 #define ZL_REG_SYNTH_CTRL(_idx)						\
157 	ZL_REG_IDX(_idx, 9, 0x00, 1, ZL3073X_NUM_SYNTHS, 1)
158 #define ZL_SYNTH_CTRL_EN			BIT(0)
159 #define ZL_SYNTH_CTRL_DPLL_SEL			GENMASK(6, 4)
160 
161 #define ZL_REG_SYNTH_PHASE_SHIFT_CTRL		ZL_REG(9, 0x1e, 1)
162 #define ZL_REG_SYNTH_PHASE_SHIFT_MASK		ZL_REG(9, 0x1f, 1)
163 #define ZL_REG_SYNTH_PHASE_SHIFT_INTVL		ZL_REG(9, 0x20, 1)
164 #define ZL_REG_SYNTH_PHASE_SHIFT_DATA		ZL_REG(9, 0x21, 2)
165 
166 #define ZL_REG_OUTPUT_CTRL(_idx)					\
167 	ZL_REG_IDX(_idx, 9, 0x28, 1, ZL3073X_NUM_OUTS, 1)
168 #define ZL_OUTPUT_CTRL_EN			BIT(0)
169 #define ZL_OUTPUT_CTRL_SYNTH_SEL		GENMASK(6, 4)
170 
171 /*******************************
172  * Register Page 10, Ref Mailbox
173  *******************************/
174 
175 #define ZL_REG_REF_MB_MASK			ZL_REG(10, 0x02, 2)
176 
177 #define ZL_REG_REF_MB_SEM			ZL_REG(10, 0x04, 1)
178 #define ZL_REF_MB_SEM_WR			BIT(0)
179 #define ZL_REF_MB_SEM_RD			BIT(1)
180 
181 #define ZL_REG_REF_FREQ_BASE			ZL_REG(10, 0x05, 2)
182 #define ZL_REG_REF_FREQ_MULT			ZL_REG(10, 0x07, 2)
183 #define ZL_REG_REF_RATIO_M			ZL_REG(10, 0x09, 2)
184 #define ZL_REG_REF_RATIO_N			ZL_REG(10, 0x0b, 2)
185 
186 #define ZL_REG_REF_CONFIG			ZL_REG(10, 0x0d, 1)
187 #define ZL_REF_CONFIG_ENABLE			BIT(0)
188 #define ZL_REF_CONFIG_DIFF_EN			BIT(2)
189 
190 #define ZL_REG_REF_PHASE_OFFSET_COMP		ZL_REG(10, 0x28, 6)
191 
192 #define ZL_REG_REF_SYNC_CTRL			ZL_REG(10, 0x2e, 1)
193 #define ZL_REF_SYNC_CTRL_MODE			GENMASK(2, 0)
194 #define ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR_OFF	0
195 #define ZL_REF_SYNC_CTRL_MODE_50_50_ESYNC_25_75	2
196 
197 #define ZL_REG_REF_ESYNC_DIV			ZL_REG(10, 0x30, 4)
198 #define ZL_REF_ESYNC_DIV_1HZ			0
199 
200 /********************************
201  * Register Page 12, DPLL Mailbox
202  ********************************/
203 
204 #define ZL_REG_DPLL_MB_MASK			ZL_REG(12, 0x02, 2)
205 
206 #define ZL_REG_DPLL_MB_SEM			ZL_REG(12, 0x04, 1)
207 #define ZL_DPLL_MB_SEM_WR			BIT(0)
208 #define ZL_DPLL_MB_SEM_RD			BIT(1)
209 
210 #define ZL_REG_DPLL_REF_PRIO(_idx)					\
211 	ZL_REG_IDX(_idx, 12, 0x52, 1, ZL3073X_NUM_REFS / 2, 1)
212 #define ZL_DPLL_REF_PRIO_REF_P			GENMASK(3, 0)
213 #define ZL_DPLL_REF_PRIO_REF_N			GENMASK(7, 4)
214 #define ZL_DPLL_REF_PRIO_MAX			14
215 #define ZL_DPLL_REF_PRIO_NONE			15
216 
217 /*********************************
218  * Register Page 13, Synth Mailbox
219  *********************************/
220 
221 #define ZL_REG_SYNTH_MB_MASK			ZL_REG(13, 0x02, 2)
222 
223 #define ZL_REG_SYNTH_MB_SEM			ZL_REG(13, 0x04, 1)
224 #define ZL_SYNTH_MB_SEM_WR			BIT(0)
225 #define ZL_SYNTH_MB_SEM_RD			BIT(1)
226 
227 #define ZL_REG_SYNTH_FREQ_BASE			ZL_REG(13, 0x06, 2)
228 #define ZL_REG_SYNTH_FREQ_MULT			ZL_REG(13, 0x08, 4)
229 #define ZL_REG_SYNTH_FREQ_M			ZL_REG(13, 0x0c, 2)
230 #define ZL_REG_SYNTH_FREQ_N			ZL_REG(13, 0x0e, 2)
231 
232 /**********************************
233  * Register Page 14, Output Mailbox
234  **********************************/
235 #define ZL_REG_OUTPUT_MB_MASK			ZL_REG(14, 0x02, 2)
236 
237 #define ZL_REG_OUTPUT_MB_SEM			ZL_REG(14, 0x04, 1)
238 #define ZL_OUTPUT_MB_SEM_WR			BIT(0)
239 #define ZL_OUTPUT_MB_SEM_RD			BIT(1)
240 
241 #define ZL_REG_OUTPUT_MODE			ZL_REG(14, 0x05, 1)
242 #define ZL_OUTPUT_MODE_CLOCK_TYPE		GENMASK(2, 0)
243 #define ZL_OUTPUT_MODE_CLOCK_TYPE_NORMAL	0
244 #define ZL_OUTPUT_MODE_CLOCK_TYPE_ESYNC		1
245 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT		GENMASK(7, 4)
246 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_DISABLED	0
247 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_LVDS	1
248 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_DIFF	2
249 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_LOWVCM	3
250 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_2		4
251 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_1P		5
252 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_1N		6
253 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_INV	7
254 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV	12
255 #define ZL_OUTPUT_MODE_SIGNAL_FORMAT_2_NDIV_INV	15
256 
257 #define ZL_REG_OUTPUT_DIV			ZL_REG(14, 0x0c, 4)
258 #define ZL_REG_OUTPUT_WIDTH			ZL_REG(14, 0x10, 4)
259 #define ZL_REG_OUTPUT_ESYNC_PERIOD		ZL_REG(14, 0x14, 4)
260 #define ZL_REG_OUTPUT_ESYNC_WIDTH		ZL_REG(14, 0x18, 4)
261 #define ZL_REG_OUTPUT_PHASE_COMP		ZL_REG(14, 0x20, 4)
262 
263 #endif /* _ZL3073X_REGS_H */
264