1 // SPDX-License-Identifier: GPL-2.0-only
2
3 #include <linux/bits.h>
4 #include <linux/bitfield.h>
5 #include <linux/bug.h>
6 #include <linux/container_of.h>
7 #include <linux/dev_printk.h>
8 #include <linux/dpll.h>
9 #include <linux/err.h>
10 #include <linux/kthread.h>
11 #include <linux/math64.h>
12 #include <linux/mod_devicetable.h>
13 #include <linux/module.h>
14 #include <linux/netlink.h>
15 #include <linux/platform_device.h>
16 #include <linux/property.h>
17 #include <linux/slab.h>
18 #include <linux/sprintf.h>
19
20 #include "core.h"
21 #include "dpll.h"
22 #include "prop.h"
23 #include "regs.h"
24
25 #define ZL3073X_DPLL_REF_NONE ZL3073X_NUM_REFS
26 #define ZL3073X_DPLL_REF_IS_VALID(_ref) ((_ref) != ZL3073X_DPLL_REF_NONE)
27
28 /**
29 * struct zl3073x_dpll_pin - DPLL pin
30 * @list: this DPLL pin list entry
31 * @dpll: DPLL the pin is registered to
32 * @dpll_pin: pointer to registered dpll_pin
33 * @tracker: tracking object for the acquired reference
34 * @fwnode: firmware node handle
35 * @label: package label
36 * @dir: pin direction
37 * @id: pin id
38 * @prio: pin priority <0, 14>
39 * @esync_control: embedded sync is controllable
40 * @phase_gran: phase adjustment granularity
41 * @pin_state: last saved pin state
42 * @phase_offset: last saved pin phase offset
43 * @freq_offset: last saved fractional frequency offset
44 * @measured_freq: last saved measured frequency
45 */
46 struct zl3073x_dpll_pin {
47 struct list_head list;
48 struct zl3073x_dpll *dpll;
49 struct dpll_pin *dpll_pin;
50 dpll_tracker tracker;
51 struct fwnode_handle *fwnode;
52 char label[8];
53 enum dpll_pin_direction dir;
54 u8 id;
55 u8 prio;
56 bool esync_control;
57 s32 phase_gran;
58 enum dpll_pin_state pin_state;
59 s64 phase_offset;
60 s64 freq_offset;
61 u32 measured_freq;
62 };
63
64 /*
65 * Supported esync ranges for input and for output per output pair type
66 */
67 static const struct dpll_pin_frequency esync_freq_ranges[] = {
68 DPLL_PIN_FREQUENCY_RANGE(0, 1),
69 };
70
71 /**
72 * zl3073x_dpll_is_input_pin - check if the pin is input one
73 * @pin: pin to check
74 *
75 * Return: true if pin is input, false if pin is output.
76 */
77 static bool
zl3073x_dpll_is_input_pin(struct zl3073x_dpll_pin * pin)78 zl3073x_dpll_is_input_pin(struct zl3073x_dpll_pin *pin)
79 {
80 return pin->dir == DPLL_PIN_DIRECTION_INPUT;
81 }
82
83 /**
84 * zl3073x_dpll_is_p_pin - check if the pin is P-pin
85 * @pin: pin to check
86 *
87 * Return: true if the pin is P-pin, false if it is N-pin
88 */
89 static bool
zl3073x_dpll_is_p_pin(struct zl3073x_dpll_pin * pin)90 zl3073x_dpll_is_p_pin(struct zl3073x_dpll_pin *pin)
91 {
92 return zl3073x_is_p_pin(pin->id);
93 }
94
95 static int
zl3073x_dpll_pin_direction_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,enum dpll_pin_direction * direction,struct netlink_ext_ack * extack)96 zl3073x_dpll_pin_direction_get(const struct dpll_pin *dpll_pin, void *pin_priv,
97 const struct dpll_device *dpll, void *dpll_priv,
98 enum dpll_pin_direction *direction,
99 struct netlink_ext_ack *extack)
100 {
101 struct zl3073x_dpll_pin *pin = pin_priv;
102
103 *direction = pin->dir;
104
105 return 0;
106 }
107
108 static struct zl3073x_dpll_pin *
zl3073x_dpll_pin_get_by_ref(struct zl3073x_dpll * zldpll,u8 ref_id)109 zl3073x_dpll_pin_get_by_ref(struct zl3073x_dpll *zldpll, u8 ref_id)
110 {
111 struct zl3073x_dpll_pin *pin;
112
113 list_for_each_entry(pin, &zldpll->pins, list) {
114 if (zl3073x_dpll_is_input_pin(pin) &&
115 zl3073x_input_pin_ref_get(pin->id) == ref_id)
116 return pin;
117 }
118
119 return NULL;
120 }
121
122 static int
zl3073x_dpll_input_pin_esync_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,struct dpll_pin_esync * esync,struct netlink_ext_ack * extack)123 zl3073x_dpll_input_pin_esync_get(const struct dpll_pin *dpll_pin,
124 void *pin_priv,
125 const struct dpll_device *dpll,
126 void *dpll_priv,
127 struct dpll_pin_esync *esync,
128 struct netlink_ext_ack *extack)
129 {
130 struct zl3073x_dpll *zldpll = dpll_priv;
131 struct zl3073x_dev *zldev = zldpll->dev;
132 struct zl3073x_dpll_pin *pin = pin_priv;
133 const struct zl3073x_ref *ref;
134 u8 ref_id;
135
136 ref_id = zl3073x_input_pin_ref_get(pin->id);
137 ref = zl3073x_ref_state_get(zldev, ref_id);
138
139 if (!pin->esync_control || zl3073x_ref_freq_get(ref) <= 1)
140 return -EOPNOTSUPP;
141
142 esync->range = esync_freq_ranges;
143 esync->range_num = ARRAY_SIZE(esync_freq_ranges);
144
145 switch (zl3073x_ref_sync_mode_get(ref)) {
146 case ZL_REF_SYNC_CTRL_MODE_50_50_ESYNC_25_75:
147 esync->freq = ref->esync_n_div == ZL_REF_ESYNC_DIV_1HZ ? 1 : 0;
148 esync->pulse = 25;
149 break;
150 default:
151 esync->freq = 0;
152 esync->pulse = 0;
153 break;
154 }
155
156 return 0;
157 }
158
159 static int
zl3073x_dpll_input_pin_esync_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u64 freq,struct netlink_ext_ack * extack)160 zl3073x_dpll_input_pin_esync_set(const struct dpll_pin *dpll_pin,
161 void *pin_priv,
162 const struct dpll_device *dpll,
163 void *dpll_priv, u64 freq,
164 struct netlink_ext_ack *extack)
165 {
166 struct zl3073x_dpll *zldpll = dpll_priv;
167 struct zl3073x_dev *zldev = zldpll->dev;
168 struct zl3073x_dpll_pin *pin = pin_priv;
169 struct zl3073x_ref ref;
170 u8 ref_id, sync_mode;
171
172 ref_id = zl3073x_input_pin_ref_get(pin->id);
173 ref = *zl3073x_ref_state_get(zldev, ref_id);
174
175 /* Use freq == 0 to disable esync */
176 if (!freq)
177 sync_mode = ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR_OFF;
178 else
179 sync_mode = ZL_REF_SYNC_CTRL_MODE_50_50_ESYNC_25_75;
180
181 zl3073x_ref_sync_mode_set(&ref, sync_mode);
182
183 if (freq) {
184 /* 1 Hz is only supported frequency now */
185 ref.esync_n_div = ZL_REF_ESYNC_DIV_1HZ;
186 }
187
188 /* Update reference configuration */
189 return zl3073x_ref_state_set(zldev, ref_id, &ref);
190 }
191
192 static int
zl3073x_dpll_input_pin_ref_sync_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_pin * ref_sync_pin,void * ref_sync_pin_priv,enum dpll_pin_state * state,struct netlink_ext_ack * extack)193 zl3073x_dpll_input_pin_ref_sync_get(const struct dpll_pin *dpll_pin,
194 void *pin_priv,
195 const struct dpll_pin *ref_sync_pin,
196 void *ref_sync_pin_priv,
197 enum dpll_pin_state *state,
198 struct netlink_ext_ack *extack)
199 {
200 struct zl3073x_dpll_pin *sync_pin = ref_sync_pin_priv;
201 struct zl3073x_dpll_pin *pin = pin_priv;
202 struct zl3073x_dpll *zldpll = pin->dpll;
203 struct zl3073x_dev *zldev = zldpll->dev;
204 const struct zl3073x_ref *ref;
205 u8 ref_id, mode, pair;
206
207 ref_id = zl3073x_input_pin_ref_get(pin->id);
208 ref = zl3073x_ref_state_get(zldev, ref_id);
209 mode = zl3073x_ref_sync_mode_get(ref);
210 pair = zl3073x_ref_sync_pair_get(ref);
211
212 if (mode == ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR &&
213 pair == zl3073x_input_pin_ref_get(sync_pin->id))
214 *state = DPLL_PIN_STATE_CONNECTED;
215 else
216 *state = DPLL_PIN_STATE_DISCONNECTED;
217
218 return 0;
219 }
220
221 static int
zl3073x_dpll_input_pin_ref_sync_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_pin * ref_sync_pin,void * ref_sync_pin_priv,const enum dpll_pin_state state,struct netlink_ext_ack * extack)222 zl3073x_dpll_input_pin_ref_sync_set(const struct dpll_pin *dpll_pin,
223 void *pin_priv,
224 const struct dpll_pin *ref_sync_pin,
225 void *ref_sync_pin_priv,
226 const enum dpll_pin_state state,
227 struct netlink_ext_ack *extack)
228 {
229 struct zl3073x_dpll_pin *sync_pin = ref_sync_pin_priv;
230 struct zl3073x_dpll_pin *pin = pin_priv;
231 struct zl3073x_dpll *zldpll = pin->dpll;
232 struct zl3073x_dev *zldev = zldpll->dev;
233 u8 mode, ref_id, sync_ref_id;
234 struct zl3073x_chan chan;
235 struct zl3073x_ref ref;
236 int rc;
237
238 ref_id = zl3073x_input_pin_ref_get(pin->id);
239 sync_ref_id = zl3073x_input_pin_ref_get(sync_pin->id);
240 ref = *zl3073x_ref_state_get(zldev, ref_id);
241
242 if (state == DPLL_PIN_STATE_CONNECTED) {
243 const struct zl3073x_ref *sync_ref;
244 u32 ref_freq, sync_freq;
245
246 sync_ref = zl3073x_ref_state_get(zldev, sync_ref_id);
247 ref_freq = zl3073x_ref_freq_get(&ref);
248 sync_freq = zl3073x_ref_freq_get(sync_ref);
249
250 /* Sync signal must be 8 kHz or less and clock reference
251 * must be 1 kHz or more and higher than the sync signal.
252 */
253 if (sync_freq > 8000) {
254 NL_SET_ERR_MSG(extack,
255 "sync frequency must be 8 kHz or less");
256 return -EINVAL;
257 }
258 if (ref_freq < 1000) {
259 NL_SET_ERR_MSG(extack,
260 "clock frequency must be 1 kHz or more");
261 return -EINVAL;
262 }
263 if (ref_freq <= sync_freq) {
264 NL_SET_ERR_MSG(extack,
265 "clock frequency must be higher than sync frequency");
266 return -EINVAL;
267 }
268
269 zl3073x_ref_sync_pair_set(&ref, sync_ref_id);
270 mode = ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR;
271 } else {
272 mode = ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR_OFF;
273 }
274
275 zl3073x_ref_sync_mode_set(&ref, mode);
276
277 rc = zl3073x_ref_state_set(zldev, ref_id, &ref);
278 if (rc)
279 return rc;
280
281 /* Exclude sync source from automatic reference selection by setting
282 * its priority to NONE. On disconnect the priority is left as NONE
283 * and the user must explicitly make the pin selectable again.
284 */
285 if (state == DPLL_PIN_STATE_CONNECTED) {
286 chan = *zl3073x_chan_state_get(zldev, zldpll->id);
287 zl3073x_chan_ref_prio_set(&chan, sync_ref_id,
288 ZL_DPLL_REF_PRIO_NONE);
289 return zl3073x_chan_state_set(zldev, zldpll->id, &chan);
290 }
291
292 return 0;
293 }
294
295 static int
zl3073x_dpll_input_pin_ffo_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,s64 * ffo,struct netlink_ext_ack * extack)296 zl3073x_dpll_input_pin_ffo_get(const struct dpll_pin *dpll_pin, void *pin_priv,
297 const struct dpll_device *dpll, void *dpll_priv,
298 s64 *ffo, struct netlink_ext_ack *extack)
299 {
300 struct zl3073x_dpll_pin *pin = pin_priv;
301
302 *ffo = pin->freq_offset;
303
304 return 0;
305 }
306
307 static int
zl3073x_dpll_input_pin_measured_freq_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u64 * measured_freq,struct netlink_ext_ack * extack)308 zl3073x_dpll_input_pin_measured_freq_get(const struct dpll_pin *dpll_pin,
309 void *pin_priv,
310 const struct dpll_device *dpll,
311 void *dpll_priv, u64 *measured_freq,
312 struct netlink_ext_ack *extack)
313 {
314 struct zl3073x_dpll_pin *pin = pin_priv;
315
316 *measured_freq = pin->measured_freq;
317 *measured_freq *= DPLL_PIN_MEASURED_FREQUENCY_DIVIDER;
318
319 return 0;
320 }
321
322 static int
zl3073x_dpll_input_pin_frequency_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u64 * frequency,struct netlink_ext_ack * extack)323 zl3073x_dpll_input_pin_frequency_get(const struct dpll_pin *dpll_pin,
324 void *pin_priv,
325 const struct dpll_device *dpll,
326 void *dpll_priv, u64 *frequency,
327 struct netlink_ext_ack *extack)
328 {
329 struct zl3073x_dpll *zldpll = dpll_priv;
330 struct zl3073x_dpll_pin *pin = pin_priv;
331 u8 ref_id;
332
333 ref_id = zl3073x_input_pin_ref_get(pin->id);
334 *frequency = zl3073x_dev_ref_freq_get(zldpll->dev, ref_id);
335
336 return 0;
337 }
338
339 static int
zl3073x_dpll_input_pin_frequency_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u64 frequency,struct netlink_ext_ack * extack)340 zl3073x_dpll_input_pin_frequency_set(const struct dpll_pin *dpll_pin,
341 void *pin_priv,
342 const struct dpll_device *dpll,
343 void *dpll_priv, u64 frequency,
344 struct netlink_ext_ack *extack)
345 {
346 struct zl3073x_dpll *zldpll = dpll_priv;
347 struct zl3073x_dev *zldev = zldpll->dev;
348 struct zl3073x_dpll_pin *pin = pin_priv;
349 struct zl3073x_ref ref;
350 u8 ref_id;
351
352 /* Get reference state */
353 ref_id = zl3073x_input_pin_ref_get(pin->id);
354 ref = *zl3073x_ref_state_get(zldev, ref_id);
355
356 /* Update frequency */
357 zl3073x_ref_freq_set(&ref, frequency);
358
359 /* Commit reference state */
360 return zl3073x_ref_state_set(zldev, ref_id, &ref);
361 }
362
363 /**
364 * zl3073x_dpll_connected_ref_get - get currently connected reference
365 * @zldpll: pointer to zl3073x_dpll
366 *
367 * Looks for currently connected reference the DPLL is locked to.
368 *
369 * Return: reference index if locked, ZL3073X_DPLL_REF_NONE otherwise
370 */
371 static u8
zl3073x_dpll_connected_ref_get(struct zl3073x_dpll * zldpll)372 zl3073x_dpll_connected_ref_get(struct zl3073x_dpll *zldpll)
373 {
374 const struct zl3073x_chan *chan = zl3073x_chan_state_get(zldpll->dev,
375 zldpll->id);
376 u8 state;
377
378 /* A reference is connected only when the DPLL is locked to it */
379 state = zl3073x_chan_refsel_state_get(chan);
380 if (state == ZL_DPLL_REFSEL_STATUS_STATE_LOCK)
381 return zl3073x_chan_refsel_ref_get(chan);
382
383 return ZL3073X_DPLL_REF_NONE;
384 }
385
386 static int
zl3073x_dpll_input_pin_phase_offset_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,s64 * phase_offset,struct netlink_ext_ack * extack)387 zl3073x_dpll_input_pin_phase_offset_get(const struct dpll_pin *dpll_pin,
388 void *pin_priv,
389 const struct dpll_device *dpll,
390 void *dpll_priv, s64 *phase_offset,
391 struct netlink_ext_ack *extack)
392 {
393 struct zl3073x_dpll *zldpll = dpll_priv;
394 struct zl3073x_dev *zldev = zldpll->dev;
395 struct zl3073x_dpll_pin *pin = pin_priv;
396 const struct zl3073x_ref *ref;
397 u8 conn_id, ref_id;
398 s64 ref_phase;
399
400 /* Get currently connected reference */
401 conn_id = zl3073x_dpll_connected_ref_get(zldpll);
402
403 /* Report phase offset only for currently connected pin if the phase
404 * monitor feature is disabled and only if the input pin signal is
405 * present.
406 */
407 ref_id = zl3073x_input_pin_ref_get(pin->id);
408 ref = zl3073x_ref_state_get(zldev, ref_id);
409 if ((!zldpll->phase_monitor && ref_id != conn_id) ||
410 !zl3073x_ref_is_status_ok(ref)) {
411 *phase_offset = 0;
412 return 0;
413 }
414
415 ref_phase = pin->phase_offset;
416
417 /* The DPLL being locked to a higher freq than the current ref
418 * the phase offset is modded to the period of the signal
419 * the dpll is locked to.
420 */
421 if (ZL3073X_DPLL_REF_IS_VALID(conn_id) && conn_id != ref_id) {
422 u32 conn_freq, ref_freq;
423
424 /* Get frequency of connected and given ref */
425 conn_freq = zl3073x_dev_ref_freq_get(zldev, conn_id);
426 ref_freq = zl3073x_ref_freq_get(ref);
427
428 if (conn_freq > ref_freq) {
429 s64 conn_period, div_factor;
430
431 conn_period = div_s64(PSEC_PER_SEC, conn_freq);
432 div_factor = div64_s64(ref_phase, conn_period);
433 ref_phase -= conn_period * div_factor;
434 }
435 }
436
437 *phase_offset = ref_phase * DPLL_PHASE_OFFSET_DIVIDER;
438
439 return 0;
440 }
441
442 static int
zl3073x_dpll_input_pin_phase_adjust_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,s32 * phase_adjust,struct netlink_ext_ack * extack)443 zl3073x_dpll_input_pin_phase_adjust_get(const struct dpll_pin *dpll_pin,
444 void *pin_priv,
445 const struct dpll_device *dpll,
446 void *dpll_priv,
447 s32 *phase_adjust,
448 struct netlink_ext_ack *extack)
449 {
450 struct zl3073x_dpll *zldpll = dpll_priv;
451 struct zl3073x_dev *zldev = zldpll->dev;
452 struct zl3073x_dpll_pin *pin = pin_priv;
453 const struct zl3073x_ref *ref;
454 s64 phase_comp;
455 u8 ref_id;
456
457 /* Read reference configuration */
458 ref_id = zl3073x_input_pin_ref_get(pin->id);
459 ref = zl3073x_ref_state_get(zldev, ref_id);
460
461 /* Perform sign extension based on register width */
462 if (zl3073x_dev_is_ref_phase_comp_32bit(zldev))
463 phase_comp = sign_extend64(ref->phase_comp, 31);
464 else
465 phase_comp = sign_extend64(ref->phase_comp, 47);
466
467 /* Reverse two's complement negation applied during set and convert
468 * to 32bit signed int
469 */
470 *phase_adjust = (s32)-phase_comp;
471
472 return 0;
473 }
474
475 static int
zl3073x_dpll_input_pin_phase_adjust_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,s32 phase_adjust,struct netlink_ext_ack * extack)476 zl3073x_dpll_input_pin_phase_adjust_set(const struct dpll_pin *dpll_pin,
477 void *pin_priv,
478 const struct dpll_device *dpll,
479 void *dpll_priv,
480 s32 phase_adjust,
481 struct netlink_ext_ack *extack)
482 {
483 struct zl3073x_dpll *zldpll = dpll_priv;
484 struct zl3073x_dev *zldev = zldpll->dev;
485 struct zl3073x_dpll_pin *pin = pin_priv;
486 struct zl3073x_ref ref;
487 u8 ref_id;
488
489 /* Read reference configuration */
490 ref_id = zl3073x_input_pin_ref_get(pin->id);
491 ref = *zl3073x_ref_state_get(zldev, ref_id);
492
493 /* The value in the register is stored as two's complement negation
494 * of requested value.
495 */
496 ref.phase_comp = -phase_adjust;
497
498 /* Update reference configuration */
499 return zl3073x_ref_state_set(zldev, ref_id, &ref);
500 }
501
502 /**
503 * zl3073x_dpll_ref_state_get - get status for given input pin
504 * @pin: pointer to pin
505 * @state: place to store status
506 *
507 * Checks current status for the given input pin and stores the value
508 * to @state.
509 *
510 * Return: 0 on success, <0 on error
511 */
512 static int
zl3073x_dpll_ref_state_get(struct zl3073x_dpll_pin * pin,enum dpll_pin_state * state)513 zl3073x_dpll_ref_state_get(struct zl3073x_dpll_pin *pin,
514 enum dpll_pin_state *state)
515 {
516 struct zl3073x_dpll *zldpll = pin->dpll;
517 struct zl3073x_dev *zldev = zldpll->dev;
518 const struct zl3073x_chan *chan;
519 u8 ref;
520
521 chan = zl3073x_chan_state_get(zldev, zldpll->id);
522 ref = zl3073x_input_pin_ref_get(pin->id);
523
524 /* Check if the pin reference is connected */
525 if (ref == zl3073x_dpll_connected_ref_get(zldpll)) {
526 *state = DPLL_PIN_STATE_CONNECTED;
527 return 0;
528 }
529
530 /* If the DPLL is running in automatic mode and the reference is
531 * selectable and its monitor does not report any error then report
532 * pin as selectable.
533 */
534 if (zl3073x_chan_mode_get(chan) == ZL_DPLL_MODE_REFSEL_MODE_AUTO &&
535 zl3073x_dev_ref_is_status_ok(zldev, ref) &&
536 zl3073x_chan_ref_is_selectable(chan, ref)) {
537 *state = DPLL_PIN_STATE_SELECTABLE;
538 return 0;
539 }
540
541 /* Otherwise report the pin as disconnected */
542 *state = DPLL_PIN_STATE_DISCONNECTED;
543
544 return 0;
545 }
546
547 static int
zl3073x_dpll_input_pin_state_on_dpll_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,enum dpll_pin_state * state,struct netlink_ext_ack * extack)548 zl3073x_dpll_input_pin_state_on_dpll_get(const struct dpll_pin *dpll_pin,
549 void *pin_priv,
550 const struct dpll_device *dpll,
551 void *dpll_priv,
552 enum dpll_pin_state *state,
553 struct netlink_ext_ack *extack)
554 {
555 struct zl3073x_dpll_pin *pin = pin_priv;
556
557 return zl3073x_dpll_ref_state_get(pin, state);
558 }
559
560 static int
zl3073x_dpll_input_pin_state_on_dpll_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,enum dpll_pin_state state,struct netlink_ext_ack * extack)561 zl3073x_dpll_input_pin_state_on_dpll_set(const struct dpll_pin *dpll_pin,
562 void *pin_priv,
563 const struct dpll_device *dpll,
564 void *dpll_priv,
565 enum dpll_pin_state state,
566 struct netlink_ext_ack *extack)
567 {
568 struct zl3073x_dpll *zldpll = dpll_priv;
569 struct zl3073x_dpll_pin *pin = pin_priv;
570 struct zl3073x_chan chan;
571 u8 mode, ref;
572 int rc;
573
574 chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
575 ref = zl3073x_input_pin_ref_get(pin->id);
576 mode = zl3073x_chan_mode_get(&chan);
577
578 switch (mode) {
579 case ZL_DPLL_MODE_REFSEL_MODE_REFLOCK:
580 if (state == DPLL_PIN_STATE_CONNECTED) {
581 /* Choose the pin as new selected reference */
582 zl3073x_chan_ref_set(&chan, ref);
583 } else if (state == DPLL_PIN_STATE_DISCONNECTED) {
584 /* Choose new mode based on lock status */
585 switch (zldpll->lock_status) {
586 case DPLL_LOCK_STATUS_LOCKED_HO_ACQ:
587 case DPLL_LOCK_STATUS_HOLDOVER:
588 mode = ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER;
589 break;
590 default:
591 mode = ZL_DPLL_MODE_REFSEL_MODE_FREERUN;
592 break;
593 }
594 zl3073x_chan_mode_set(&chan, mode);
595 } else {
596 goto invalid_state;
597 }
598 break;
599 case ZL_DPLL_MODE_REFSEL_MODE_FREERUN:
600 case ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER:
601 if (state == DPLL_PIN_STATE_CONNECTED) {
602 /* Choose the pin as new selected reference */
603 zl3073x_chan_ref_set(&chan, ref);
604 /* Switch to reflock mode */
605 zl3073x_chan_mode_set(&chan,
606 ZL_DPLL_MODE_REFSEL_MODE_REFLOCK);
607 } else if (state != DPLL_PIN_STATE_DISCONNECTED) {
608 goto invalid_state;
609 }
610 break;
611 case ZL_DPLL_MODE_REFSEL_MODE_AUTO:
612 if (state == DPLL_PIN_STATE_SELECTABLE) {
613 if (zl3073x_chan_ref_is_selectable(&chan, ref))
614 return 0; /* Pin is already selectable */
615
616 /* Restore pin priority in HW */
617 zl3073x_chan_ref_prio_set(&chan, ref, pin->prio);
618 } else if (state == DPLL_PIN_STATE_DISCONNECTED) {
619 if (!zl3073x_chan_ref_is_selectable(&chan, ref))
620 return 0; /* Pin is already disconnected */
621
622 /* Set pin priority to none in HW */
623 zl3073x_chan_ref_prio_set(&chan, ref,
624 ZL_DPLL_REF_PRIO_NONE);
625 } else {
626 goto invalid_state;
627 }
628 break;
629 default:
630 /* In other modes we cannot change input reference */
631 NL_SET_ERR_MSG(extack,
632 "Pin state cannot be changed in current mode");
633 return -EOPNOTSUPP;
634 }
635
636 /* Commit DPLL channel changes */
637 rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
638 if (rc)
639 return rc;
640
641 return 0;
642 invalid_state:
643 NL_SET_ERR_MSG_MOD(extack, "Invalid pin state for this device mode");
644 return -EINVAL;
645 }
646
647 static int
zl3073x_dpll_input_pin_prio_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u32 * prio,struct netlink_ext_ack * extack)648 zl3073x_dpll_input_pin_prio_get(const struct dpll_pin *dpll_pin, void *pin_priv,
649 const struct dpll_device *dpll, void *dpll_priv,
650 u32 *prio, struct netlink_ext_ack *extack)
651 {
652 struct zl3073x_dpll_pin *pin = pin_priv;
653
654 *prio = pin->prio;
655
656 return 0;
657 }
658
659 static int
zl3073x_dpll_input_pin_prio_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u32 prio,struct netlink_ext_ack * extack)660 zl3073x_dpll_input_pin_prio_set(const struct dpll_pin *dpll_pin, void *pin_priv,
661 const struct dpll_device *dpll, void *dpll_priv,
662 u32 prio, struct netlink_ext_ack *extack)
663 {
664 struct zl3073x_dpll *zldpll = dpll_priv;
665 struct zl3073x_dpll_pin *pin = pin_priv;
666 struct zl3073x_chan chan;
667 u8 ref;
668 int rc;
669
670 if (prio > ZL_DPLL_REF_PRIO_MAX)
671 return -EINVAL;
672
673 /* If the pin is selectable then update HW registers */
674 chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
675 ref = zl3073x_input_pin_ref_get(pin->id);
676 if (zl3073x_chan_ref_is_selectable(&chan, ref)) {
677 zl3073x_chan_ref_prio_set(&chan, ref, prio);
678 rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
679 if (rc)
680 return rc;
681 }
682
683 /* Save priority */
684 pin->prio = prio;
685
686 return 0;
687 }
688
689 static int
zl3073x_dpll_output_pin_esync_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,struct dpll_pin_esync * esync,struct netlink_ext_ack * extack)690 zl3073x_dpll_output_pin_esync_get(const struct dpll_pin *dpll_pin,
691 void *pin_priv,
692 const struct dpll_device *dpll,
693 void *dpll_priv,
694 struct dpll_pin_esync *esync,
695 struct netlink_ext_ack *extack)
696 {
697 struct zl3073x_dpll *zldpll = dpll_priv;
698 struct zl3073x_dev *zldev = zldpll->dev;
699 struct zl3073x_dpll_pin *pin = pin_priv;
700 const struct zl3073x_synth *synth;
701 const struct zl3073x_out *out;
702 u32 synth_freq, out_freq;
703 u8 out_id;
704
705 out_id = zl3073x_output_pin_out_get(pin->id);
706 out = zl3073x_out_state_get(zldev, out_id);
707
708 /* If N-division is enabled, esync is not supported. The register used
709 * for N-division is also used for the esync divider so both cannot
710 * be used.
711 */
712 if (zl3073x_out_is_ndiv(out))
713 return -EOPNOTSUPP;
714
715 /* Get attached synth frequency */
716 synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(out));
717 synth_freq = zl3073x_synth_freq_get(synth);
718 out_freq = synth_freq / out->div;
719
720 if (!pin->esync_control || out_freq <= 1)
721 return -EOPNOTSUPP;
722
723 esync->range = esync_freq_ranges;
724 esync->range_num = ARRAY_SIZE(esync_freq_ranges);
725
726 if (zl3073x_out_clock_type_get(out) != ZL_OUTPUT_MODE_CLOCK_TYPE_ESYNC) {
727 /* No need to read esync data if it is not enabled */
728 esync->freq = 0;
729 esync->pulse = 0;
730
731 return 0;
732 }
733
734 /* Compute esync frequency */
735 esync->freq = out_freq / out->esync_n_period;
736
737 /* By comparing the esync_pulse_width to the half of the pulse width
738 * the esync pulse percentage can be determined.
739 * Note that half pulse width is in units of half synth cycles, which
740 * is why it reduces down to be output_div.
741 */
742 esync->pulse = (50 * out->esync_n_width) / out->div;
743
744 return 0;
745 }
746
747 static int
zl3073x_dpll_output_pin_esync_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u64 freq,struct netlink_ext_ack * extack)748 zl3073x_dpll_output_pin_esync_set(const struct dpll_pin *dpll_pin,
749 void *pin_priv,
750 const struct dpll_device *dpll,
751 void *dpll_priv, u64 freq,
752 struct netlink_ext_ack *extack)
753 {
754 struct zl3073x_dpll *zldpll = dpll_priv;
755 struct zl3073x_dev *zldev = zldpll->dev;
756 struct zl3073x_dpll_pin *pin = pin_priv;
757 const struct zl3073x_synth *synth;
758 struct zl3073x_out out;
759 u32 synth_freq;
760 u8 out_id;
761
762 out_id = zl3073x_output_pin_out_get(pin->id);
763 out = *zl3073x_out_state_get(zldev, out_id);
764
765 /* If N-division is enabled, esync is not supported. The register used
766 * for N-division is also used for the esync divider so both cannot
767 * be used.
768 */
769 if (zl3073x_out_is_ndiv(&out))
770 return -EOPNOTSUPP;
771
772 /* Update clock type in output mode */
773 if (freq)
774 zl3073x_out_clock_type_set(&out,
775 ZL_OUTPUT_MODE_CLOCK_TYPE_ESYNC);
776 else
777 zl3073x_out_clock_type_set(&out,
778 ZL_OUTPUT_MODE_CLOCK_TYPE_NORMAL);
779
780 /* If esync is being disabled just write mailbox and finish */
781 if (!freq)
782 goto write_mailbox;
783
784 /* Get attached synth frequency */
785 synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(&out));
786 synth_freq = zl3073x_synth_freq_get(synth);
787
788 /* Compute and update esync period */
789 out.esync_n_period = synth_freq / (u32)freq / out.div;
790
791 /* Half of the period in units of 1/2 synth cycle can be represented by
792 * the output_div. To get the supported esync pulse width of 25% of the
793 * period the output_div can just be divided by 2. Note that this
794 * assumes that output_div is even, otherwise some resolution will be
795 * lost.
796 */
797 out.esync_n_width = out.div / 2;
798
799 write_mailbox:
800 /* Commit output configuration */
801 return zl3073x_out_state_set(zldev, out_id, &out);
802 }
803
804 static int
zl3073x_dpll_output_pin_frequency_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u64 * frequency,struct netlink_ext_ack * extack)805 zl3073x_dpll_output_pin_frequency_get(const struct dpll_pin *dpll_pin,
806 void *pin_priv,
807 const struct dpll_device *dpll,
808 void *dpll_priv, u64 *frequency,
809 struct netlink_ext_ack *extack)
810 {
811 struct zl3073x_dpll *zldpll = dpll_priv;
812 struct zl3073x_dpll_pin *pin = pin_priv;
813
814 *frequency = zl3073x_dev_output_pin_freq_get(zldpll->dev, pin->id);
815
816 return 0;
817 }
818
819 static int
zl3073x_dpll_output_pin_frequency_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,u64 frequency,struct netlink_ext_ack * extack)820 zl3073x_dpll_output_pin_frequency_set(const struct dpll_pin *dpll_pin,
821 void *pin_priv,
822 const struct dpll_device *dpll,
823 void *dpll_priv, u64 frequency,
824 struct netlink_ext_ack *extack)
825 {
826 struct zl3073x_dpll *zldpll = dpll_priv;
827 struct zl3073x_dev *zldev = zldpll->dev;
828 struct zl3073x_dpll_pin *pin = pin_priv;
829 const struct zl3073x_synth *synth;
830 u32 new_div, synth_freq;
831 struct zl3073x_out out;
832 u8 out_id;
833
834 out_id = zl3073x_output_pin_out_get(pin->id);
835 out = *zl3073x_out_state_get(zldev, out_id);
836
837 /* Get attached synth frequency and compute new divisor */
838 synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(&out));
839 synth_freq = zl3073x_synth_freq_get(synth);
840 new_div = synth_freq / (u32)frequency;
841
842 /* Check signal format */
843 if (!zl3073x_out_is_ndiv(&out)) {
844 /* For non N-divided signal formats the frequency is computed
845 * as division of synth frequency and output divisor.
846 */
847 out.div = new_div;
848
849 /* For 50/50 duty cycle the divisor is equal to width */
850 out.width = new_div;
851
852 /* Commit output configuration */
853 return zl3073x_out_state_set(zldev, out_id, &out);
854 }
855
856 if (zl3073x_dpll_is_p_pin(pin)) {
857 /* We are going to change output frequency for P-pin but
858 * if the requested frequency is less than current N-pin
859 * frequency then indicate a failure as we are not able
860 * to compute N-pin divisor to keep its frequency unchanged.
861 *
862 * Update divisor for N-pin to keep N-pin frequency.
863 */
864 out.esync_n_period = (out.esync_n_period * out.div) / new_div;
865 if (!out.esync_n_period)
866 return -EINVAL;
867
868 /* Update the output divisor */
869 out.div = new_div;
870
871 /* For 50/50 duty cycle the divisor is equal to width */
872 out.width = out.div;
873 } else {
874 /* We are going to change frequency of N-pin but if
875 * the requested freq is greater or equal than freq of P-pin
876 * in the output pair we cannot compute divisor for the N-pin.
877 * In this case indicate a failure.
878 *
879 * Update divisor for N-pin
880 */
881 out.esync_n_period = div64_u64(synth_freq, frequency * out.div);
882 if (!out.esync_n_period)
883 return -EINVAL;
884 }
885
886 /* For 50/50 duty cycle the divisor is equal to width */
887 out.esync_n_width = out.esync_n_period;
888
889 /* Commit output configuration */
890 return zl3073x_out_state_set(zldev, out_id, &out);
891 }
892
893 static int
zl3073x_dpll_output_pin_phase_adjust_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,s32 * phase_adjust,struct netlink_ext_ack * extack)894 zl3073x_dpll_output_pin_phase_adjust_get(const struct dpll_pin *dpll_pin,
895 void *pin_priv,
896 const struct dpll_device *dpll,
897 void *dpll_priv,
898 s32 *phase_adjust,
899 struct netlink_ext_ack *extack)
900 {
901 struct zl3073x_dpll *zldpll = dpll_priv;
902 struct zl3073x_dev *zldev = zldpll->dev;
903 struct zl3073x_dpll_pin *pin = pin_priv;
904 const struct zl3073x_out *out;
905 u8 out_id;
906
907 out_id = zl3073x_output_pin_out_get(pin->id);
908 out = zl3073x_out_state_get(zldev, out_id);
909
910 /* The value in the register is expressed in half synth clock cycles. */
911 *phase_adjust = out->phase_comp * pin->phase_gran;
912
913 return 0;
914 }
915
916 static int
zl3073x_dpll_output_pin_phase_adjust_set(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,s32 phase_adjust,struct netlink_ext_ack * extack)917 zl3073x_dpll_output_pin_phase_adjust_set(const struct dpll_pin *dpll_pin,
918 void *pin_priv,
919 const struct dpll_device *dpll,
920 void *dpll_priv,
921 s32 phase_adjust,
922 struct netlink_ext_ack *extack)
923 {
924 struct zl3073x_dpll *zldpll = dpll_priv;
925 struct zl3073x_dev *zldev = zldpll->dev;
926 struct zl3073x_dpll_pin *pin = pin_priv;
927 struct zl3073x_out out;
928 u8 out_id;
929
930 out_id = zl3073x_output_pin_out_get(pin->id);
931 out = *zl3073x_out_state_get(zldev, out_id);
932
933 /* The value in the register is expressed in half synth clock cycles. */
934 out.phase_comp = phase_adjust / pin->phase_gran;
935
936 /* Update output configuration from mailbox */
937 return zl3073x_out_state_set(zldev, out_id, &out);
938 }
939
940 static int
zl3073x_dpll_output_pin_state_on_dpll_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,enum dpll_pin_state * state,struct netlink_ext_ack * extack)941 zl3073x_dpll_output_pin_state_on_dpll_get(const struct dpll_pin *dpll_pin,
942 void *pin_priv,
943 const struct dpll_device *dpll,
944 void *dpll_priv,
945 enum dpll_pin_state *state,
946 struct netlink_ext_ack *extack)
947 {
948 /* If the output pin is registered then it is always connected */
949 *state = DPLL_PIN_STATE_CONNECTED;
950
951 return 0;
952 }
953
954 static int
zl3073x_dpll_temp_get(const struct dpll_device * dpll,void * dpll_priv,s32 * temp,struct netlink_ext_ack * extack)955 zl3073x_dpll_temp_get(const struct dpll_device *dpll, void *dpll_priv,
956 s32 *temp, struct netlink_ext_ack *extack)
957 {
958 struct zl3073x_dpll *zldpll = dpll_priv;
959 struct zl3073x_dev *zldev = zldpll->dev;
960 u16 val;
961 int rc;
962
963 rc = zl3073x_read_u16(zldev, ZL_REG_DIE_TEMP_STATUS, &val);
964 if (rc)
965 return rc;
966
967 /* Register value is in units of 0.1 C, convert to millidegrees */
968 *temp = (s16)val * 100;
969
970 return 0;
971 }
972
973 static int
zl3073x_dpll_lock_status_get(const struct dpll_device * dpll,void * dpll_priv,enum dpll_lock_status * status,enum dpll_lock_status_error * status_error,struct netlink_ext_ack * extack)974 zl3073x_dpll_lock_status_get(const struct dpll_device *dpll, void *dpll_priv,
975 enum dpll_lock_status *status,
976 enum dpll_lock_status_error *status_error,
977 struct netlink_ext_ack *extack)
978 {
979 struct zl3073x_dpll *zldpll = dpll_priv;
980 const struct zl3073x_chan *chan;
981
982 chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
983
984 switch (zl3073x_chan_mode_get(chan)) {
985 case ZL_DPLL_MODE_REFSEL_MODE_FREERUN:
986 case ZL_DPLL_MODE_REFSEL_MODE_NCO:
987 /* In FREERUN and NCO modes the DPLL is always unlocked */
988 *status = DPLL_LOCK_STATUS_UNLOCKED;
989
990 return 0;
991 default:
992 break;
993 }
994
995 switch (zl3073x_chan_lock_state_get(chan)) {
996 case ZL_DPLL_MON_STATUS_STATE_LOCK:
997 if (zl3073x_chan_is_ho_ready(chan))
998 *status = DPLL_LOCK_STATUS_LOCKED_HO_ACQ;
999 else
1000 *status = DPLL_LOCK_STATUS_LOCKED;
1001 break;
1002 case ZL_DPLL_MON_STATUS_STATE_HOLDOVER:
1003 case ZL_DPLL_MON_STATUS_STATE_ACQUIRING:
1004 *status = DPLL_LOCK_STATUS_HOLDOVER;
1005 break;
1006 default:
1007 dev_warn(zldpll->dev->dev,
1008 "Unknown DPLL monitor status: 0x%02x\n",
1009 chan->mon_status);
1010 *status = DPLL_LOCK_STATUS_UNLOCKED;
1011 break;
1012 }
1013
1014 return 0;
1015 }
1016
1017 static int
zl3073x_dpll_supported_modes_get(const struct dpll_device * dpll,void * dpll_priv,unsigned long * modes,struct netlink_ext_ack * extack)1018 zl3073x_dpll_supported_modes_get(const struct dpll_device *dpll,
1019 void *dpll_priv, unsigned long *modes,
1020 struct netlink_ext_ack *extack)
1021 {
1022 struct zl3073x_dpll *zldpll = dpll_priv;
1023 const struct zl3073x_chan *chan;
1024
1025 chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1026
1027 /* We support switching between automatic and manual mode, except in
1028 * a case where the DPLL channel is configured to run in NCO mode.
1029 * In this case, report only the manual mode to which the NCO is mapped
1030 * as the only supported one.
1031 */
1032 if (zl3073x_chan_mode_get(chan) != ZL_DPLL_MODE_REFSEL_MODE_NCO)
1033 __set_bit(DPLL_MODE_AUTOMATIC, modes);
1034
1035 __set_bit(DPLL_MODE_MANUAL, modes);
1036
1037 return 0;
1038 }
1039
1040 static int
zl3073x_dpll_mode_get(const struct dpll_device * dpll,void * dpll_priv,enum dpll_mode * mode,struct netlink_ext_ack * extack)1041 zl3073x_dpll_mode_get(const struct dpll_device *dpll, void *dpll_priv,
1042 enum dpll_mode *mode, struct netlink_ext_ack *extack)
1043 {
1044 struct zl3073x_dpll *zldpll = dpll_priv;
1045 const struct zl3073x_chan *chan;
1046
1047 chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1048
1049 switch (zl3073x_chan_mode_get(chan)) {
1050 case ZL_DPLL_MODE_REFSEL_MODE_FREERUN:
1051 case ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER:
1052 case ZL_DPLL_MODE_REFSEL_MODE_NCO:
1053 case ZL_DPLL_MODE_REFSEL_MODE_REFLOCK:
1054 /* Use MANUAL for device FREERUN, HOLDOVER, NCO and
1055 * REFLOCK modes
1056 */
1057 *mode = DPLL_MODE_MANUAL;
1058 break;
1059 case ZL_DPLL_MODE_REFSEL_MODE_AUTO:
1060 /* Use AUTO for device AUTO mode */
1061 *mode = DPLL_MODE_AUTOMATIC;
1062 break;
1063 default:
1064 return -EINVAL;
1065 }
1066
1067 return 0;
1068 }
1069
1070 static int
zl3073x_dpll_phase_offset_avg_factor_get(const struct dpll_device * dpll,void * dpll_priv,u32 * factor,struct netlink_ext_ack * extack)1071 zl3073x_dpll_phase_offset_avg_factor_get(const struct dpll_device *dpll,
1072 void *dpll_priv, u32 *factor,
1073 struct netlink_ext_ack *extack)
1074 {
1075 struct zl3073x_dpll *zldpll = dpll_priv;
1076
1077 *factor = zl3073x_dev_phase_avg_factor_get(zldpll->dev);
1078
1079 return 0;
1080 }
1081
1082 static int
zl3073x_dpll_phase_offset_avg_factor_set(const struct dpll_device * dpll,void * dpll_priv,u32 factor,struct netlink_ext_ack * extack)1083 zl3073x_dpll_phase_offset_avg_factor_set(const struct dpll_device *dpll,
1084 void *dpll_priv, u32 factor,
1085 struct netlink_ext_ack *extack)
1086 {
1087 struct zl3073x_dpll *item, *zldpll = dpll_priv;
1088 int rc;
1089
1090 if (factor > 15) {
1091 NL_SET_ERR_MSG_FMT(extack,
1092 "Phase offset average factor has to be from range <0,15>");
1093 return -EINVAL;
1094 }
1095
1096 rc = zl3073x_dev_phase_avg_factor_set(zldpll->dev, factor);
1097 if (rc) {
1098 NL_SET_ERR_MSG_FMT(extack,
1099 "Failed to set phase offset averaging factor");
1100 return rc;
1101 }
1102
1103 /* The averaging factor is common for all DPLL channels so after change
1104 * we have to send a notification for other DPLL devices.
1105 */
1106 list_for_each_entry(item, &zldpll->dev->dplls, list) {
1107 struct dpll_device *dpll_dev = READ_ONCE(item->dpll_dev);
1108
1109 if (item != zldpll && dpll_dev)
1110 __dpll_device_change_ntf(dpll_dev);
1111 }
1112
1113 return 0;
1114 }
1115
1116 static int
zl3073x_dpll_mode_set(const struct dpll_device * dpll,void * dpll_priv,enum dpll_mode mode,struct netlink_ext_ack * extack)1117 zl3073x_dpll_mode_set(const struct dpll_device *dpll, void *dpll_priv,
1118 enum dpll_mode mode, struct netlink_ext_ack *extack)
1119 {
1120 struct zl3073x_dpll *zldpll = dpll_priv;
1121 struct zl3073x_chan chan;
1122 u8 hw_mode, ref;
1123 int rc;
1124
1125 chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1126 ref = zl3073x_chan_refsel_ref_get(&chan);
1127
1128 if (mode == DPLL_MODE_MANUAL) {
1129 /* We are switching from automatic to manual mode:
1130 * - if we have a valid reference selected during auto mode then
1131 * we will switch to forced reference lock mode and use this
1132 * reference for selection
1133 * - if NO valid reference is selected, we will switch to forced
1134 * holdover mode or freerun mode, depending on the current
1135 * lock status
1136 */
1137 if (ZL3073X_DPLL_REF_IS_VALID(ref))
1138 hw_mode = ZL_DPLL_MODE_REFSEL_MODE_REFLOCK;
1139 else if (zldpll->lock_status == DPLL_LOCK_STATUS_UNLOCKED)
1140 hw_mode = ZL_DPLL_MODE_REFSEL_MODE_FREERUN;
1141 else
1142 hw_mode = ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER;
1143 } else {
1144 /* We are switching from manual to automatic mode:
1145 * - if there is a valid reference selected then ensure that
1146 * it is selectable after switch to automatic mode
1147 * - switch to automatic mode
1148 */
1149 if (ZL3073X_DPLL_REF_IS_VALID(ref) &&
1150 !zl3073x_chan_ref_is_selectable(&chan, ref)) {
1151 struct zl3073x_dpll_pin *pin;
1152
1153 pin = zl3073x_dpll_pin_get_by_ref(zldpll, ref);
1154 if (pin) {
1155 /* Restore pin priority in HW */
1156 zl3073x_chan_ref_prio_set(&chan, ref,
1157 pin->prio);
1158 }
1159 }
1160
1161 hw_mode = ZL_DPLL_MODE_REFSEL_MODE_AUTO;
1162 }
1163
1164 zl3073x_chan_mode_set(&chan, hw_mode);
1165 if (ZL3073X_DPLL_REF_IS_VALID(ref))
1166 zl3073x_chan_ref_set(&chan, ref);
1167
1168 rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
1169 if (rc) {
1170 NL_SET_ERR_MSG_MOD(extack,
1171 "failed to set reference selection mode");
1172 return rc;
1173 }
1174
1175 return 0;
1176 }
1177
1178 static int
zl3073x_dpll_phase_offset_monitor_get(const struct dpll_device * dpll,void * dpll_priv,enum dpll_feature_state * state,struct netlink_ext_ack * extack)1179 zl3073x_dpll_phase_offset_monitor_get(const struct dpll_device *dpll,
1180 void *dpll_priv,
1181 enum dpll_feature_state *state,
1182 struct netlink_ext_ack *extack)
1183 {
1184 struct zl3073x_dpll *zldpll = dpll_priv;
1185
1186 if (zldpll->phase_monitor)
1187 *state = DPLL_FEATURE_STATE_ENABLE;
1188 else
1189 *state = DPLL_FEATURE_STATE_DISABLE;
1190
1191 return 0;
1192 }
1193
1194 static int
zl3073x_dpll_phase_offset_monitor_set(const struct dpll_device * dpll,void * dpll_priv,enum dpll_feature_state state,struct netlink_ext_ack * extack)1195 zl3073x_dpll_phase_offset_monitor_set(const struct dpll_device *dpll,
1196 void *dpll_priv,
1197 enum dpll_feature_state state,
1198 struct netlink_ext_ack *extack)
1199 {
1200 struct zl3073x_dpll *zldpll = dpll_priv;
1201
1202 zldpll->phase_monitor = (state == DPLL_FEATURE_STATE_ENABLE);
1203
1204 return 0;
1205 }
1206
1207 static int
zl3073x_dpll_freq_monitor_get(const struct dpll_device * dpll,void * dpll_priv,enum dpll_feature_state * state,struct netlink_ext_ack * extack)1208 zl3073x_dpll_freq_monitor_get(const struct dpll_device *dpll,
1209 void *dpll_priv,
1210 enum dpll_feature_state *state,
1211 struct netlink_ext_ack *extack)
1212 {
1213 struct zl3073x_dpll *zldpll = dpll_priv;
1214
1215 if (zldpll->dev->freq_monitor)
1216 *state = DPLL_FEATURE_STATE_ENABLE;
1217 else
1218 *state = DPLL_FEATURE_STATE_DISABLE;
1219
1220 return 0;
1221 }
1222
1223 static int
zl3073x_dpll_freq_monitor_set(const struct dpll_device * dpll,void * dpll_priv,enum dpll_feature_state state,struct netlink_ext_ack * extack)1224 zl3073x_dpll_freq_monitor_set(const struct dpll_device *dpll,
1225 void *dpll_priv,
1226 enum dpll_feature_state state,
1227 struct netlink_ext_ack *extack)
1228 {
1229 struct zl3073x_dpll *item, *zldpll = dpll_priv;
1230
1231 zldpll->dev->freq_monitor = (state == DPLL_FEATURE_STATE_ENABLE);
1232
1233 /* The frequency monitoring is common for all DPLL channels so after
1234 * change we have to send a notification for other DPLL devices.
1235 */
1236 list_for_each_entry(item, &zldpll->dev->dplls, list) {
1237 struct dpll_device *dpll_dev = READ_ONCE(item->dpll_dev);
1238
1239 if (item != zldpll && dpll_dev)
1240 __dpll_device_change_ntf(dpll_dev);
1241 }
1242
1243 return 0;
1244 }
1245
1246 static const struct dpll_pin_ops zl3073x_dpll_input_pin_ops = {
1247 .direction_get = zl3073x_dpll_pin_direction_get,
1248 .esync_get = zl3073x_dpll_input_pin_esync_get,
1249 .esync_set = zl3073x_dpll_input_pin_esync_set,
1250 .ffo_get = zl3073x_dpll_input_pin_ffo_get,
1251 .frequency_get = zl3073x_dpll_input_pin_frequency_get,
1252 .frequency_set = zl3073x_dpll_input_pin_frequency_set,
1253 .measured_freq_get = zl3073x_dpll_input_pin_measured_freq_get,
1254 .phase_offset_get = zl3073x_dpll_input_pin_phase_offset_get,
1255 .phase_adjust_get = zl3073x_dpll_input_pin_phase_adjust_get,
1256 .phase_adjust_set = zl3073x_dpll_input_pin_phase_adjust_set,
1257 .prio_get = zl3073x_dpll_input_pin_prio_get,
1258 .prio_set = zl3073x_dpll_input_pin_prio_set,
1259 .ref_sync_get = zl3073x_dpll_input_pin_ref_sync_get,
1260 .ref_sync_set = zl3073x_dpll_input_pin_ref_sync_set,
1261 .state_on_dpll_get = zl3073x_dpll_input_pin_state_on_dpll_get,
1262 .state_on_dpll_set = zl3073x_dpll_input_pin_state_on_dpll_set,
1263 };
1264
1265 static const struct dpll_pin_ops zl3073x_dpll_output_pin_ops = {
1266 .direction_get = zl3073x_dpll_pin_direction_get,
1267 .esync_get = zl3073x_dpll_output_pin_esync_get,
1268 .esync_set = zl3073x_dpll_output_pin_esync_set,
1269 .frequency_get = zl3073x_dpll_output_pin_frequency_get,
1270 .frequency_set = zl3073x_dpll_output_pin_frequency_set,
1271 .phase_adjust_get = zl3073x_dpll_output_pin_phase_adjust_get,
1272 .phase_adjust_set = zl3073x_dpll_output_pin_phase_adjust_set,
1273 .state_on_dpll_get = zl3073x_dpll_output_pin_state_on_dpll_get,
1274 };
1275
1276 static const struct dpll_device_ops zl3073x_dpll_device_ops = {
1277 .lock_status_get = zl3073x_dpll_lock_status_get,
1278 .mode_get = zl3073x_dpll_mode_get,
1279 .mode_set = zl3073x_dpll_mode_set,
1280 .phase_offset_avg_factor_get = zl3073x_dpll_phase_offset_avg_factor_get,
1281 .phase_offset_avg_factor_set = zl3073x_dpll_phase_offset_avg_factor_set,
1282 .phase_offset_monitor_get = zl3073x_dpll_phase_offset_monitor_get,
1283 .phase_offset_monitor_set = zl3073x_dpll_phase_offset_monitor_set,
1284 .freq_monitor_get = zl3073x_dpll_freq_monitor_get,
1285 .freq_monitor_set = zl3073x_dpll_freq_monitor_set,
1286 .supported_modes_get = zl3073x_dpll_supported_modes_get,
1287 };
1288
1289 /**
1290 * zl3073x_dpll_pin_alloc - allocate DPLL pin
1291 * @zldpll: pointer to zl3073x_dpll
1292 * @dir: pin direction
1293 * @id: pin id
1294 *
1295 * Allocates and initializes zl3073x_dpll_pin structure for given
1296 * pin id and direction.
1297 *
1298 * Return: pointer to allocated structure on success, error pointer on error
1299 */
1300 static struct zl3073x_dpll_pin *
zl3073x_dpll_pin_alloc(struct zl3073x_dpll * zldpll,enum dpll_pin_direction dir,u8 id)1301 zl3073x_dpll_pin_alloc(struct zl3073x_dpll *zldpll, enum dpll_pin_direction dir,
1302 u8 id)
1303 {
1304 struct zl3073x_dpll_pin *pin;
1305
1306 pin = kzalloc_obj(*pin);
1307 if (!pin)
1308 return ERR_PTR(-ENOMEM);
1309
1310 pin->dpll = zldpll;
1311 pin->dir = dir;
1312 pin->id = id;
1313
1314 return pin;
1315 }
1316
1317 /**
1318 * zl3073x_dpll_pin_free - deallocate DPLL pin
1319 * @pin: pin to free
1320 *
1321 * Deallocates DPLL pin previously allocated by @zl3073x_dpll_pin_alloc.
1322 */
1323 static void
zl3073x_dpll_pin_free(struct zl3073x_dpll_pin * pin)1324 zl3073x_dpll_pin_free(struct zl3073x_dpll_pin *pin)
1325 {
1326 WARN(pin->dpll_pin, "DPLL pin is still registered\n");
1327
1328 kfree(pin);
1329 }
1330
1331 /**
1332 * zl3073x_dpll_pin_register - register DPLL pin
1333 * @pin: pointer to DPLL pin
1334 * @index: absolute pin index for registration
1335 *
1336 * Registers given DPLL pin into DPLL sub-system.
1337 *
1338 * Return: 0 on success, <0 on error
1339 */
1340 static int
zl3073x_dpll_pin_register(struct zl3073x_dpll_pin * pin,u32 index)1341 zl3073x_dpll_pin_register(struct zl3073x_dpll_pin *pin, u32 index)
1342 {
1343 struct zl3073x_dpll *zldpll = pin->dpll;
1344 struct zl3073x_pin_props *props;
1345 const struct dpll_pin_ops *ops;
1346 int rc;
1347
1348 /* Get pin properties */
1349 props = zl3073x_pin_props_get(zldpll->dev, pin->dir, pin->id);
1350 if (IS_ERR(props))
1351 return PTR_ERR(props);
1352
1353 /* Save package label, fwnode, esync capability and phase adjust
1354 * granularity.
1355 */
1356 strscpy(pin->label, props->package_label);
1357 pin->fwnode = fwnode_handle_get(props->fwnode);
1358 pin->esync_control = props->esync_control;
1359 pin->phase_gran = props->dpll_props.phase_gran;
1360
1361 if (zl3073x_dpll_is_input_pin(pin)) {
1362 const struct zl3073x_chan *chan;
1363 u8 ref;
1364
1365 chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1366 ref = zl3073x_input_pin_ref_get(pin->id);
1367 pin->prio = zl3073x_chan_ref_prio_get(chan, ref);
1368
1369 if (pin->prio == ZL_DPLL_REF_PRIO_NONE)
1370 /* Clamp prio to max value */
1371 pin->prio = ZL_DPLL_REF_PRIO_MAX;
1372 }
1373
1374 /* Create or get existing DPLL pin */
1375 pin->dpll_pin = dpll_pin_get(zldpll->dev->clock_id, index, THIS_MODULE,
1376 &props->dpll_props, &pin->tracker);
1377 if (IS_ERR(pin->dpll_pin)) {
1378 rc = PTR_ERR(pin->dpll_pin);
1379 goto err_pin_get;
1380 }
1381 dpll_pin_fwnode_set(pin->dpll_pin, props->fwnode);
1382
1383 if (zl3073x_dpll_is_input_pin(pin))
1384 ops = &zl3073x_dpll_input_pin_ops;
1385 else
1386 ops = &zl3073x_dpll_output_pin_ops;
1387
1388 /* Register the pin */
1389 rc = dpll_pin_register(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
1390 if (rc)
1391 goto err_register;
1392
1393 /* Free pin properties */
1394 zl3073x_pin_props_put(props);
1395
1396 return 0;
1397
1398 err_register:
1399 dpll_pin_put(pin->dpll_pin, &pin->tracker);
1400 err_pin_get:
1401 pin->dpll_pin = NULL;
1402 fwnode_handle_put(pin->fwnode);
1403 pin->fwnode = NULL;
1404 zl3073x_pin_props_put(props);
1405
1406 return rc;
1407 }
1408
1409 /**
1410 * zl3073x_dpll_pin_unregister - unregister DPLL pin
1411 * @pin: pointer to DPLL pin
1412 *
1413 * Unregisters pin previously registered by @zl3073x_dpll_pin_register.
1414 */
1415 static void
zl3073x_dpll_pin_unregister(struct zl3073x_dpll_pin * pin)1416 zl3073x_dpll_pin_unregister(struct zl3073x_dpll_pin *pin)
1417 {
1418 struct zl3073x_dpll *zldpll = pin->dpll;
1419 const struct dpll_pin_ops *ops;
1420
1421 WARN(!pin->dpll_pin, "DPLL pin is not registered\n");
1422
1423 if (zl3073x_dpll_is_input_pin(pin))
1424 ops = &zl3073x_dpll_input_pin_ops;
1425 else
1426 ops = &zl3073x_dpll_output_pin_ops;
1427
1428 /* Unregister the pin */
1429 dpll_pin_unregister(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
1430
1431 dpll_pin_put(pin->dpll_pin, &pin->tracker);
1432 pin->dpll_pin = NULL;
1433
1434 fwnode_handle_put(pin->fwnode);
1435 pin->fwnode = NULL;
1436 }
1437
1438 /**
1439 * zl3073x_dpll_pins_unregister - unregister all registered DPLL pins
1440 * @zldpll: pointer to zl3073x_dpll structure
1441 *
1442 * Enumerates all DPLL pins registered to given DPLL device and
1443 * unregisters them.
1444 */
1445 static void
zl3073x_dpll_pins_unregister(struct zl3073x_dpll * zldpll)1446 zl3073x_dpll_pins_unregister(struct zl3073x_dpll *zldpll)
1447 {
1448 struct zl3073x_dpll_pin *pin, *next;
1449
1450 list_for_each_entry_safe(pin, next, &zldpll->pins, list) {
1451 zl3073x_dpll_pin_unregister(pin);
1452 list_del(&pin->list);
1453 zl3073x_dpll_pin_free(pin);
1454 }
1455 }
1456
1457 /**
1458 * zl3073x_dpll_pin_is_registrable - check if the pin is registrable
1459 * @zldpll: pointer to zl3073x_dpll structure
1460 * @dir: pin direction
1461 * @index: pin index
1462 *
1463 * Checks if the given pin can be registered to given DPLL. For both
1464 * directions the pin can be registered if it is enabled. In case of
1465 * differential signal type only P-pin is reported as registrable.
1466 * And additionally for the output pin, the pin can be registered only
1467 * if it is connected to synthesizer that is driven by given DPLL.
1468 *
1469 * Return: true if the pin is registrable, false if not
1470 */
1471 static bool
zl3073x_dpll_pin_is_registrable(struct zl3073x_dpll * zldpll,enum dpll_pin_direction dir,u8 index)1472 zl3073x_dpll_pin_is_registrable(struct zl3073x_dpll *zldpll,
1473 enum dpll_pin_direction dir, u8 index)
1474 {
1475 struct zl3073x_dev *zldev = zldpll->dev;
1476 const struct zl3073x_chan *chan;
1477 bool is_diff, is_enabled;
1478 const char *name;
1479
1480 chan = zl3073x_chan_state_get(zldev, zldpll->id);
1481
1482 if (dir == DPLL_PIN_DIRECTION_INPUT) {
1483 u8 ref_id = zl3073x_input_pin_ref_get(index);
1484 const struct zl3073x_ref *ref;
1485
1486 /* Skip the pin if the DPLL is running in NCO mode */
1487 if (zl3073x_chan_mode_get(chan) == ZL_DPLL_MODE_REFSEL_MODE_NCO)
1488 return false;
1489
1490 name = "REF";
1491 ref = zl3073x_ref_state_get(zldev, ref_id);
1492 is_diff = zl3073x_ref_is_diff(ref);
1493 is_enabled = zl3073x_ref_is_enabled(ref);
1494 } else {
1495 /* Output P&N pair shares single HW output */
1496 u8 out = zl3073x_output_pin_out_get(index);
1497
1498 /* Skip the pin if it is connected to different DPLL channel */
1499 if (zl3073x_dev_out_dpll_get(zldev, out) != zldpll->id) {
1500 dev_dbg(zldev->dev,
1501 "OUT%u is driven by different DPLL\n", out);
1502
1503 return false;
1504 }
1505
1506 name = "OUT";
1507 is_diff = zl3073x_dev_out_is_diff(zldev, out);
1508 is_enabled = zl3073x_dev_output_pin_is_enabled(zldev, index);
1509 }
1510
1511 /* Skip N-pin if the corresponding input/output is differential */
1512 if (is_diff && zl3073x_is_n_pin(index)) {
1513 dev_dbg(zldev->dev, "%s%u is differential, skipping N-pin\n",
1514 name, index / 2);
1515
1516 return false;
1517 }
1518
1519 /* Skip the pin if it is disabled */
1520 if (!is_enabled) {
1521 dev_dbg(zldev->dev, "%s%u%c is disabled\n", name, index / 2,
1522 zl3073x_is_p_pin(index) ? 'P' : 'N');
1523
1524 return false;
1525 }
1526
1527 return true;
1528 }
1529
1530 /**
1531 * zl3073x_dpll_pins_register - register all registerable DPLL pins
1532 * @zldpll: pointer to zl3073x_dpll structure
1533 *
1534 * Enumerates all possible input/output pins and registers all of them
1535 * that are registrable.
1536 *
1537 * Return: 0 on success, <0 on error
1538 */
1539 static int
zl3073x_dpll_pins_register(struct zl3073x_dpll * zldpll)1540 zl3073x_dpll_pins_register(struct zl3073x_dpll *zldpll)
1541 {
1542 struct zl3073x_dpll_pin *pin;
1543 enum dpll_pin_direction dir;
1544 u8 id, index;
1545 int rc;
1546
1547 /* Process input pins */
1548 for (index = 0; index < ZL3073X_NUM_PINS; index++) {
1549 /* First input pins and then output pins */
1550 if (index < ZL3073X_NUM_INPUT_PINS) {
1551 id = index;
1552 dir = DPLL_PIN_DIRECTION_INPUT;
1553 } else {
1554 id = index - ZL3073X_NUM_INPUT_PINS;
1555 dir = DPLL_PIN_DIRECTION_OUTPUT;
1556 }
1557
1558 /* Check if the pin registrable to this DPLL */
1559 if (!zl3073x_dpll_pin_is_registrable(zldpll, dir, id))
1560 continue;
1561
1562 pin = zl3073x_dpll_pin_alloc(zldpll, dir, id);
1563 if (IS_ERR(pin)) {
1564 rc = PTR_ERR(pin);
1565 goto error;
1566 }
1567
1568 rc = zl3073x_dpll_pin_register(pin, index);
1569 if (rc) {
1570 zl3073x_dpll_pin_free(pin);
1571 goto error;
1572 }
1573
1574 list_add(&pin->list, &zldpll->pins);
1575 }
1576
1577 return 0;
1578
1579 error:
1580 zl3073x_dpll_pins_unregister(zldpll);
1581
1582 return rc;
1583 }
1584
1585 /**
1586 * zl3073x_dpll_device_register - register DPLL device
1587 * @zldpll: pointer to zl3073x_dpll structure
1588 *
1589 * Registers given DPLL device into DPLL sub-system.
1590 *
1591 * Return: 0 on success, <0 on error
1592 */
1593 static int
zl3073x_dpll_device_register(struct zl3073x_dpll * zldpll)1594 zl3073x_dpll_device_register(struct zl3073x_dpll *zldpll)
1595 {
1596 struct zl3073x_dev *zldev = zldpll->dev;
1597 int rc;
1598
1599 zldpll->ops = zl3073x_dpll_device_ops;
1600 if (zldev->info->flags & ZL3073X_FLAG_DIE_TEMP)
1601 zldpll->ops.temp_get = zl3073x_dpll_temp_get;
1602
1603 zldpll->dpll_dev = dpll_device_get(zldev->clock_id, zldpll->id,
1604 THIS_MODULE, &zldpll->tracker);
1605 if (IS_ERR(zldpll->dpll_dev)) {
1606 rc = PTR_ERR(zldpll->dpll_dev);
1607 zldpll->dpll_dev = NULL;
1608
1609 return rc;
1610 }
1611
1612 rc = dpll_device_register(zldpll->dpll_dev,
1613 zl3073x_prop_dpll_type_get(zldev, zldpll->id),
1614 &zldpll->ops, zldpll);
1615 if (rc) {
1616 dpll_device_put(zldpll->dpll_dev, &zldpll->tracker);
1617 zldpll->dpll_dev = NULL;
1618 }
1619
1620 return rc;
1621 }
1622
1623 /**
1624 * zl3073x_dpll_device_unregister - unregister DPLL device
1625 * @zldpll: pointer to zl3073x_dpll structure
1626 *
1627 * Unregisters given DPLL device from DPLL sub-system previously registered
1628 * by @zl3073x_dpll_device_register.
1629 */
1630 static void
zl3073x_dpll_device_unregister(struct zl3073x_dpll * zldpll)1631 zl3073x_dpll_device_unregister(struct zl3073x_dpll *zldpll)
1632 {
1633 struct dpll_device *dpll_dev = READ_ONCE(zldpll->dpll_dev);
1634
1635 WARN(!dpll_dev, "DPLL device is not registered\n");
1636
1637 WRITE_ONCE(zldpll->dpll_dev, NULL);
1638 dpll_device_unregister(dpll_dev, &zldpll->ops, zldpll);
1639 dpll_device_put(dpll_dev, &zldpll->tracker);
1640 }
1641
1642 /**
1643 * zl3073x_dpll_pin_phase_offset_check - check for pin phase offset change
1644 * @pin: pin to check
1645 *
1646 * Check for the change of DPLL to connected pin phase offset change.
1647 *
1648 * Return: true on phase offset change, false otherwise
1649 */
1650 static bool
zl3073x_dpll_pin_phase_offset_check(struct zl3073x_dpll_pin * pin)1651 zl3073x_dpll_pin_phase_offset_check(struct zl3073x_dpll_pin *pin)
1652 {
1653 struct zl3073x_dpll *zldpll = pin->dpll;
1654 struct zl3073x_dev *zldev = zldpll->dev;
1655 unsigned int reg;
1656 s64 phase_offset;
1657 u8 ref_id;
1658 int rc;
1659
1660 /* No phase offset if the ref monitor reports signal errors */
1661 ref_id = zl3073x_input_pin_ref_get(pin->id);
1662 if (!zl3073x_dev_ref_is_status_ok(zldev, ref_id))
1663 return false;
1664
1665 /* Select register to read phase offset value depending on pin and
1666 * phase monitor state:
1667 * 1) For connected pin use dpll_phase_err_data register
1668 * 2) For other pins use appropriate ref_phase register if the phase
1669 * monitor feature is enabled.
1670 */
1671 if (pin->pin_state == DPLL_PIN_STATE_CONNECTED)
1672 reg = ZL_REG_DPLL_PHASE_ERR_DATA(zldpll->id);
1673 else if (zldpll->phase_monitor)
1674 reg = ZL_REG_REF_PHASE(ref_id);
1675 else
1676 return false;
1677
1678 /* Read measured phase offset value */
1679 rc = zl3073x_read_u48(zldev, reg, &phase_offset);
1680 if (rc) {
1681 dev_err(zldev->dev, "Failed to read ref phase offset: %pe\n",
1682 ERR_PTR(rc));
1683
1684 return false;
1685 }
1686
1687 /* Convert to ps */
1688 phase_offset = div_s64(sign_extend64(phase_offset, 47), 100);
1689
1690 /* Compare with previous value */
1691 if (phase_offset != pin->phase_offset) {
1692 dev_dbg(zldev->dev, "%s phase offset changed: %lld -> %lld\n",
1693 pin->label, pin->phase_offset, phase_offset);
1694 pin->phase_offset = phase_offset;
1695
1696 return true;
1697 }
1698
1699 return false;
1700 }
1701
1702 /**
1703 * zl3073x_dpll_pin_ffo_check - check for pin fractional frequency offset change
1704 * @pin: pin to check
1705 *
1706 * Check for the given pin's fractional frequency change.
1707 *
1708 * Return: true on fractional frequency offset change, false otherwise
1709 */
1710 static bool
zl3073x_dpll_pin_ffo_check(struct zl3073x_dpll_pin * pin)1711 zl3073x_dpll_pin_ffo_check(struct zl3073x_dpll_pin *pin)
1712 {
1713 struct zl3073x_dpll *zldpll = pin->dpll;
1714 struct zl3073x_dev *zldev = zldpll->dev;
1715 const struct zl3073x_ref *ref;
1716 u8 ref_id;
1717 s64 ffo;
1718
1719 /* Get reference monitor status */
1720 ref_id = zl3073x_input_pin_ref_get(pin->id);
1721 ref = zl3073x_ref_state_get(zldev, ref_id);
1722
1723 /* Do not report ffo changes if the reference monitor report errors */
1724 if (!zl3073x_ref_is_status_ok(ref))
1725 return false;
1726
1727 /* Compare with previous value */
1728 ffo = zl3073x_ref_ffo_get(ref);
1729 if (pin->freq_offset != ffo) {
1730 dev_dbg(zldev->dev, "%s freq offset changed: %lld -> %lld\n",
1731 pin->label, pin->freq_offset, ffo);
1732 pin->freq_offset = ffo;
1733
1734 return true;
1735 }
1736
1737 return false;
1738 }
1739
1740 /**
1741 * zl3073x_dpll_pin_measured_freq_check - check for pin measured frequency
1742 * change
1743 * @pin: pin to check
1744 *
1745 * Check for the given pin's measured frequency change.
1746 *
1747 * Return: true on measured frequency change, false otherwise
1748 */
1749 static bool
zl3073x_dpll_pin_measured_freq_check(struct zl3073x_dpll_pin * pin)1750 zl3073x_dpll_pin_measured_freq_check(struct zl3073x_dpll_pin *pin)
1751 {
1752 struct zl3073x_dpll *zldpll = pin->dpll;
1753 struct zl3073x_dev *zldev = zldpll->dev;
1754 const struct zl3073x_ref *ref;
1755 u8 ref_id;
1756 u32 freq;
1757
1758 if (!zldpll->dev->freq_monitor)
1759 return false;
1760
1761 ref_id = zl3073x_input_pin_ref_get(pin->id);
1762 ref = zl3073x_ref_state_get(zldev, ref_id);
1763
1764 freq = zl3073x_ref_meas_freq_get(ref);
1765 if (pin->measured_freq != freq) {
1766 dev_dbg(zldev->dev, "%s measured freq changed: %u -> %u\n",
1767 pin->label, pin->measured_freq, freq);
1768 pin->measured_freq = freq;
1769
1770 return true;
1771 }
1772
1773 return false;
1774 }
1775
1776 /**
1777 * zl3073x_dpll_changes_check - check for changes and send notifications
1778 * @zldpll: pointer to zl3073x_dpll structure
1779 *
1780 * Checks for changes on given DPLL device and its registered DPLL pins
1781 * and sends notifications about them.
1782 *
1783 * This function is periodically called from @zl3073x_dev_periodic_work.
1784 */
1785 void
zl3073x_dpll_changes_check(struct zl3073x_dpll * zldpll)1786 zl3073x_dpll_changes_check(struct zl3073x_dpll *zldpll)
1787 {
1788 struct zl3073x_dev *zldev = zldpll->dev;
1789 enum dpll_lock_status lock_status;
1790 struct device *dev = zldev->dev;
1791 struct zl3073x_dpll_pin *pin;
1792 int rc;
1793
1794 zldpll->check_count++;
1795
1796 /* Get current lock status for the DPLL */
1797 rc = zl3073x_dpll_lock_status_get(zldpll->dpll_dev, zldpll,
1798 &lock_status, NULL, NULL);
1799 if (rc) {
1800 dev_err(dev, "Failed to get DPLL%u lock status: %pe\n",
1801 zldpll->id, ERR_PTR(rc));
1802 return;
1803 }
1804
1805 /* If lock status was changed then notify DPLL core */
1806 if (zldpll->lock_status != lock_status) {
1807 zldpll->lock_status = lock_status;
1808 dpll_device_change_ntf(zldpll->dpll_dev);
1809 }
1810
1811 /* Update phase offset latch registers for this DPLL if the phase
1812 * offset monitor feature is enabled.
1813 */
1814 if (zldpll->phase_monitor) {
1815 rc = zl3073x_ref_phase_offsets_update(zldev, zldpll->id);
1816 if (rc) {
1817 dev_err(zldev->dev,
1818 "Failed to update phase offsets: %pe\n",
1819 ERR_PTR(rc));
1820 return;
1821 }
1822 }
1823
1824 list_for_each_entry(pin, &zldpll->pins, list) {
1825 enum dpll_pin_state state;
1826 bool pin_changed = false;
1827
1828 /* Output pins change checks are not necessary because output
1829 * states are constant.
1830 */
1831 if (!zl3073x_dpll_is_input_pin(pin))
1832 continue;
1833
1834 rc = zl3073x_dpll_ref_state_get(pin, &state);
1835 if (rc) {
1836 dev_err(dev,
1837 "Failed to get %s on DPLL%u state: %pe\n",
1838 pin->label, zldpll->id, ERR_PTR(rc));
1839 return;
1840 }
1841
1842 if (state != pin->pin_state) {
1843 dev_dbg(dev, "%s state changed: %u->%u\n", pin->label,
1844 pin->pin_state, state);
1845 pin->pin_state = state;
1846 pin_changed = true;
1847 }
1848
1849 /* Check for phase offset, ffo, and measured freq change
1850 * once per second.
1851 */
1852 if (zldpll->check_count % 2 == 0) {
1853 if (zl3073x_dpll_pin_phase_offset_check(pin))
1854 pin_changed = true;
1855
1856 if (zl3073x_dpll_pin_ffo_check(pin))
1857 pin_changed = true;
1858
1859 if (zl3073x_dpll_pin_measured_freq_check(pin))
1860 pin_changed = true;
1861 }
1862
1863 if (pin_changed)
1864 dpll_pin_change_ntf(pin->dpll_pin);
1865 }
1866 }
1867
1868 /**
1869 * zl3073x_dpll_init_fine_phase_adjust - do initial fine phase adjustments
1870 * @zldev: pointer to zl3073x device
1871 *
1872 * Performs initial fine phase adjustments needed per datasheet.
1873 *
1874 * Return: 0 on success, <0 on error
1875 */
1876 int
zl3073x_dpll_init_fine_phase_adjust(struct zl3073x_dev * zldev)1877 zl3073x_dpll_init_fine_phase_adjust(struct zl3073x_dev *zldev)
1878 {
1879 int rc;
1880
1881 rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_MASK, 0x1f);
1882 if (rc)
1883 return rc;
1884
1885 rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_INTVL, 0x01);
1886 if (rc)
1887 return rc;
1888
1889 rc = zl3073x_write_u16(zldev, ZL_REG_SYNTH_PHASE_SHIFT_DATA, 0xffff);
1890 if (rc)
1891 return rc;
1892
1893 rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_CTRL, 0x01);
1894 if (rc)
1895 return rc;
1896
1897 return rc;
1898 }
1899
1900 /**
1901 * zl3073x_dpll_alloc - allocate DPLL device
1902 * @zldev: pointer to zl3073x device
1903 * @ch: DPLL channel number
1904 *
1905 * Allocates DPLL device structure for given DPLL channel.
1906 *
1907 * Return: pointer to DPLL device on success, error pointer on error
1908 */
1909 struct zl3073x_dpll *
zl3073x_dpll_alloc(struct zl3073x_dev * zldev,u8 ch)1910 zl3073x_dpll_alloc(struct zl3073x_dev *zldev, u8 ch)
1911 {
1912 struct zl3073x_dpll *zldpll;
1913
1914 zldpll = kzalloc_obj(*zldpll);
1915 if (!zldpll)
1916 return ERR_PTR(-ENOMEM);
1917
1918 zldpll->dev = zldev;
1919 zldpll->id = ch;
1920 INIT_LIST_HEAD(&zldpll->pins);
1921
1922 return zldpll;
1923 }
1924
1925 /**
1926 * zl3073x_dpll_free - free DPLL device
1927 * @zldpll: pointer to zl3073x_dpll structure
1928 *
1929 * Deallocates given DPLL device previously allocated by @zl3073x_dpll_alloc.
1930 */
1931 void
zl3073x_dpll_free(struct zl3073x_dpll * zldpll)1932 zl3073x_dpll_free(struct zl3073x_dpll *zldpll)
1933 {
1934 WARN(zldpll->dpll_dev, "DPLL device is still registered\n");
1935
1936 kfree(zldpll);
1937 }
1938
1939 /**
1940 * zl3073x_dpll_ref_sync_pair_register - register ref_sync pairs for a pin
1941 * @pin: pointer to zl3073x_dpll_pin structure
1942 *
1943 * Iterates 'ref-sync-sources' phandles in the pin's firmware node and
1944 * registers each declared pairing.
1945 *
1946 * Return: 0 on success, <0 on error
1947 */
1948 static int
zl3073x_dpll_ref_sync_pair_register(struct zl3073x_dpll_pin * pin)1949 zl3073x_dpll_ref_sync_pair_register(struct zl3073x_dpll_pin *pin)
1950 {
1951 struct zl3073x_dev *zldev = pin->dpll->dev;
1952 struct fwnode_handle *fwnode;
1953 struct dpll_pin *sync_pin;
1954 dpll_tracker tracker;
1955 int n, rc;
1956
1957 for (n = 0; ; n++) {
1958 /* Get n'th ref-sync source */
1959 fwnode = fwnode_find_reference(pin->fwnode, "ref-sync-sources",
1960 n);
1961 if (IS_ERR(fwnode)) {
1962 rc = PTR_ERR(fwnode);
1963 break;
1964 }
1965
1966 /* Find associated dpll pin */
1967 sync_pin = fwnode_dpll_pin_find(fwnode, &tracker);
1968 fwnode_handle_put(fwnode);
1969 if (!sync_pin) {
1970 dev_warn(zldev->dev, "%s: ref-sync source %d not found",
1971 pin->label, n);
1972 continue;
1973 }
1974
1975 /* Register new ref-sync pair */
1976 rc = dpll_pin_ref_sync_pair_add(pin->dpll_pin, sync_pin);
1977 dpll_pin_put(sync_pin, &tracker);
1978
1979 /* -EBUSY means pairing already exists from another DPLL's
1980 * registration.
1981 */
1982 if (rc && rc != -EBUSY) {
1983 dev_err(zldev->dev,
1984 "%s: failed to add ref-sync source %d: %pe",
1985 pin->label, n, ERR_PTR(rc));
1986 break;
1987 }
1988 }
1989
1990 return rc != -ENOENT ? rc : 0;
1991 }
1992
1993 /**
1994 * zl3073x_dpll_ref_sync_pairs_register - register ref_sync pairs for a DPLL
1995 * @zldpll: pointer to zl3073x_dpll structure
1996 *
1997 * Iterates all registered input pins of the given DPLL and establishes
1998 * ref_sync pairings declared by 'ref-sync-sources' phandles in the
1999 * device tree.
2000 *
2001 * Return: 0 on success, <0 on error
2002 */
2003 static int
zl3073x_dpll_ref_sync_pairs_register(struct zl3073x_dpll * zldpll)2004 zl3073x_dpll_ref_sync_pairs_register(struct zl3073x_dpll *zldpll)
2005 {
2006 struct zl3073x_dpll_pin *pin;
2007 int rc;
2008
2009 list_for_each_entry(pin, &zldpll->pins, list) {
2010 if (!zl3073x_dpll_is_input_pin(pin) || !pin->fwnode)
2011 continue;
2012
2013 rc = zl3073x_dpll_ref_sync_pair_register(pin);
2014 if (rc)
2015 return rc;
2016 }
2017
2018 return 0;
2019 }
2020
2021 /**
2022 * zl3073x_dpll_register - register DPLL device and all its pins
2023 * @zldpll: pointer to zl3073x_dpll structure
2024 *
2025 * Registers given DPLL device and all its pins into DPLL sub-system.
2026 *
2027 * Return: 0 on success, <0 on error
2028 */
2029 int
zl3073x_dpll_register(struct zl3073x_dpll * zldpll)2030 zl3073x_dpll_register(struct zl3073x_dpll *zldpll)
2031 {
2032 int rc;
2033
2034 rc = zl3073x_dpll_device_register(zldpll);
2035 if (rc)
2036 return rc;
2037
2038 rc = zl3073x_dpll_pins_register(zldpll);
2039 if (rc) {
2040 zl3073x_dpll_device_unregister(zldpll);
2041 return rc;
2042 }
2043
2044 rc = zl3073x_dpll_ref_sync_pairs_register(zldpll);
2045 if (rc) {
2046 zl3073x_dpll_pins_unregister(zldpll);
2047 zl3073x_dpll_device_unregister(zldpll);
2048 return rc;
2049 }
2050
2051 return 0;
2052 }
2053
2054 /**
2055 * zl3073x_dpll_unregister - unregister DPLL device and its pins
2056 * @zldpll: pointer to zl3073x_dpll structure
2057 *
2058 * Unregisters given DPLL device and all its pins from DPLL sub-system
2059 * previously registered by @zl3073x_dpll_register.
2060 */
2061 void
zl3073x_dpll_unregister(struct zl3073x_dpll * zldpll)2062 zl3073x_dpll_unregister(struct zl3073x_dpll *zldpll)
2063 {
2064 /* Unregister all pins and dpll */
2065 zl3073x_dpll_pins_unregister(zldpll);
2066 zl3073x_dpll_device_unregister(zldpll);
2067 }
2068