xref: /linux/drivers/dpll/zl3073x/dpll.c (revision 68ca50bc0fa64841cd73b8a1538df1d7f7eb4108)
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
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
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
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 *
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 void
1083 zl3073x_dpll_change_work(struct work_struct *work)
1084 {
1085 	struct zl3073x_dpll *zldpll;
1086 
1087 	zldpll = container_of(work, struct zl3073x_dpll, change_work);
1088 	dpll_device_change_ntf(zldpll->dpll_dev);
1089 }
1090 
1091 static int
1092 zl3073x_dpll_phase_offset_avg_factor_set(const struct dpll_device *dpll,
1093 					 void *dpll_priv, u32 factor,
1094 					 struct netlink_ext_ack *extack)
1095 {
1096 	struct zl3073x_dpll *item, *zldpll = dpll_priv;
1097 	int rc;
1098 
1099 	if (factor > 15) {
1100 		NL_SET_ERR_MSG_FMT(extack,
1101 				   "Phase offset average factor has to be from range <0,15>");
1102 		return -EINVAL;
1103 	}
1104 
1105 	rc = zl3073x_dev_phase_avg_factor_set(zldpll->dev, factor);
1106 	if (rc) {
1107 		NL_SET_ERR_MSG_FMT(extack,
1108 				   "Failed to set phase offset averaging factor");
1109 		return rc;
1110 	}
1111 
1112 	/* The averaging factor is common for all DPLL channels so after change
1113 	 * we have to send a notification for other DPLL devices.
1114 	 */
1115 	list_for_each_entry(item, &zldpll->dev->dplls, list) {
1116 		if (item != zldpll)
1117 			schedule_work(&item->change_work);
1118 	}
1119 
1120 	return 0;
1121 }
1122 
1123 static int
1124 zl3073x_dpll_mode_set(const struct dpll_device *dpll, void *dpll_priv,
1125 		      enum dpll_mode mode, struct netlink_ext_ack *extack)
1126 {
1127 	struct zl3073x_dpll *zldpll = dpll_priv;
1128 	struct zl3073x_chan chan;
1129 	u8 hw_mode, ref;
1130 	int rc;
1131 
1132 	chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1133 	ref = zl3073x_chan_refsel_ref_get(&chan);
1134 
1135 	if (mode == DPLL_MODE_MANUAL) {
1136 		/* We are switching from automatic to manual mode:
1137 		 * - if we have a valid reference selected during auto mode then
1138 		 *   we will switch to forced reference lock mode and use this
1139 		 *   reference for selection
1140 		 * - if NO valid reference is selected, we will switch to forced
1141 		 *   holdover mode or freerun mode, depending on the current
1142 		 *   lock status
1143 		 */
1144 		if (ZL3073X_DPLL_REF_IS_VALID(ref))
1145 			hw_mode = ZL_DPLL_MODE_REFSEL_MODE_REFLOCK;
1146 		else if (zldpll->lock_status == DPLL_LOCK_STATUS_UNLOCKED)
1147 			hw_mode = ZL_DPLL_MODE_REFSEL_MODE_FREERUN;
1148 		else
1149 			hw_mode = ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER;
1150 	} else {
1151 		/* We are switching from manual to automatic mode:
1152 		 * - if there is a valid reference selected then ensure that
1153 		 *   it is selectable after switch to automatic mode
1154 		 * - switch to automatic mode
1155 		 */
1156 		if (ZL3073X_DPLL_REF_IS_VALID(ref) &&
1157 		    !zl3073x_chan_ref_is_selectable(&chan, ref)) {
1158 			struct zl3073x_dpll_pin *pin;
1159 
1160 			pin = zl3073x_dpll_pin_get_by_ref(zldpll, ref);
1161 			if (pin) {
1162 				/* Restore pin priority in HW */
1163 				zl3073x_chan_ref_prio_set(&chan, ref,
1164 							  pin->prio);
1165 			}
1166 		}
1167 
1168 		hw_mode = ZL_DPLL_MODE_REFSEL_MODE_AUTO;
1169 	}
1170 
1171 	zl3073x_chan_mode_set(&chan, hw_mode);
1172 	if (ZL3073X_DPLL_REF_IS_VALID(ref))
1173 		zl3073x_chan_ref_set(&chan, ref);
1174 
1175 	rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
1176 	if (rc) {
1177 		NL_SET_ERR_MSG_MOD(extack,
1178 				   "failed to set reference selection mode");
1179 		return rc;
1180 	}
1181 
1182 	return 0;
1183 }
1184 
1185 static int
1186 zl3073x_dpll_phase_offset_monitor_get(const struct dpll_device *dpll,
1187 				      void *dpll_priv,
1188 				      enum dpll_feature_state *state,
1189 				      struct netlink_ext_ack *extack)
1190 {
1191 	struct zl3073x_dpll *zldpll = dpll_priv;
1192 
1193 	if (zldpll->phase_monitor)
1194 		*state = DPLL_FEATURE_STATE_ENABLE;
1195 	else
1196 		*state = DPLL_FEATURE_STATE_DISABLE;
1197 
1198 	return 0;
1199 }
1200 
1201 static int
1202 zl3073x_dpll_phase_offset_monitor_set(const struct dpll_device *dpll,
1203 				      void *dpll_priv,
1204 				      enum dpll_feature_state state,
1205 				      struct netlink_ext_ack *extack)
1206 {
1207 	struct zl3073x_dpll *zldpll = dpll_priv;
1208 
1209 	zldpll->phase_monitor = (state == DPLL_FEATURE_STATE_ENABLE);
1210 
1211 	return 0;
1212 }
1213 
1214 static int
1215 zl3073x_dpll_freq_monitor_get(const struct dpll_device *dpll,
1216 			      void *dpll_priv,
1217 			      enum dpll_feature_state *state,
1218 			      struct netlink_ext_ack *extack)
1219 {
1220 	struct zl3073x_dpll *zldpll = dpll_priv;
1221 
1222 	if (zldpll->freq_monitor)
1223 		*state = DPLL_FEATURE_STATE_ENABLE;
1224 	else
1225 		*state = DPLL_FEATURE_STATE_DISABLE;
1226 
1227 	return 0;
1228 }
1229 
1230 static int
1231 zl3073x_dpll_freq_monitor_set(const struct dpll_device *dpll,
1232 			      void *dpll_priv,
1233 			      enum dpll_feature_state state,
1234 			      struct netlink_ext_ack *extack)
1235 {
1236 	struct zl3073x_dpll *zldpll = dpll_priv;
1237 
1238 	zldpll->freq_monitor = (state == DPLL_FEATURE_STATE_ENABLE);
1239 
1240 	return 0;
1241 }
1242 
1243 static const struct dpll_pin_ops zl3073x_dpll_input_pin_ops = {
1244 	.direction_get = zl3073x_dpll_pin_direction_get,
1245 	.esync_get = zl3073x_dpll_input_pin_esync_get,
1246 	.esync_set = zl3073x_dpll_input_pin_esync_set,
1247 	.ffo_get = zl3073x_dpll_input_pin_ffo_get,
1248 	.frequency_get = zl3073x_dpll_input_pin_frequency_get,
1249 	.frequency_set = zl3073x_dpll_input_pin_frequency_set,
1250 	.measured_freq_get = zl3073x_dpll_input_pin_measured_freq_get,
1251 	.phase_offset_get = zl3073x_dpll_input_pin_phase_offset_get,
1252 	.phase_adjust_get = zl3073x_dpll_input_pin_phase_adjust_get,
1253 	.phase_adjust_set = zl3073x_dpll_input_pin_phase_adjust_set,
1254 	.prio_get = zl3073x_dpll_input_pin_prio_get,
1255 	.prio_set = zl3073x_dpll_input_pin_prio_set,
1256 	.ref_sync_get = zl3073x_dpll_input_pin_ref_sync_get,
1257 	.ref_sync_set = zl3073x_dpll_input_pin_ref_sync_set,
1258 	.state_on_dpll_get = zl3073x_dpll_input_pin_state_on_dpll_get,
1259 	.state_on_dpll_set = zl3073x_dpll_input_pin_state_on_dpll_set,
1260 };
1261 
1262 static const struct dpll_pin_ops zl3073x_dpll_output_pin_ops = {
1263 	.direction_get = zl3073x_dpll_pin_direction_get,
1264 	.esync_get = zl3073x_dpll_output_pin_esync_get,
1265 	.esync_set = zl3073x_dpll_output_pin_esync_set,
1266 	.frequency_get = zl3073x_dpll_output_pin_frequency_get,
1267 	.frequency_set = zl3073x_dpll_output_pin_frequency_set,
1268 	.phase_adjust_get = zl3073x_dpll_output_pin_phase_adjust_get,
1269 	.phase_adjust_set = zl3073x_dpll_output_pin_phase_adjust_set,
1270 	.state_on_dpll_get = zl3073x_dpll_output_pin_state_on_dpll_get,
1271 };
1272 
1273 static const struct dpll_device_ops zl3073x_dpll_device_ops = {
1274 	.lock_status_get = zl3073x_dpll_lock_status_get,
1275 	.mode_get = zl3073x_dpll_mode_get,
1276 	.mode_set = zl3073x_dpll_mode_set,
1277 	.phase_offset_avg_factor_get = zl3073x_dpll_phase_offset_avg_factor_get,
1278 	.phase_offset_avg_factor_set = zl3073x_dpll_phase_offset_avg_factor_set,
1279 	.phase_offset_monitor_get = zl3073x_dpll_phase_offset_monitor_get,
1280 	.phase_offset_monitor_set = zl3073x_dpll_phase_offset_monitor_set,
1281 	.freq_monitor_get = zl3073x_dpll_freq_monitor_get,
1282 	.freq_monitor_set = zl3073x_dpll_freq_monitor_set,
1283 	.supported_modes_get = zl3073x_dpll_supported_modes_get,
1284 };
1285 
1286 /**
1287  * zl3073x_dpll_pin_alloc - allocate DPLL pin
1288  * @zldpll: pointer to zl3073x_dpll
1289  * @dir: pin direction
1290  * @id: pin id
1291  *
1292  * Allocates and initializes zl3073x_dpll_pin structure for given
1293  * pin id and direction.
1294  *
1295  * Return: pointer to allocated structure on success, error pointer on error
1296  */
1297 static struct zl3073x_dpll_pin *
1298 zl3073x_dpll_pin_alloc(struct zl3073x_dpll *zldpll, enum dpll_pin_direction dir,
1299 		       u8 id)
1300 {
1301 	struct zl3073x_dpll_pin *pin;
1302 
1303 	pin = kzalloc_obj(*pin);
1304 	if (!pin)
1305 		return ERR_PTR(-ENOMEM);
1306 
1307 	pin->dpll = zldpll;
1308 	pin->dir = dir;
1309 	pin->id = id;
1310 
1311 	return pin;
1312 }
1313 
1314 /**
1315  * zl3073x_dpll_pin_free - deallocate DPLL pin
1316  * @pin: pin to free
1317  *
1318  * Deallocates DPLL pin previously allocated by @zl3073x_dpll_pin_alloc.
1319  */
1320 static void
1321 zl3073x_dpll_pin_free(struct zl3073x_dpll_pin *pin)
1322 {
1323 	WARN(pin->dpll_pin, "DPLL pin is still registered\n");
1324 
1325 	kfree(pin);
1326 }
1327 
1328 /**
1329  * zl3073x_dpll_pin_register - register DPLL pin
1330  * @pin: pointer to DPLL pin
1331  * @index: absolute pin index for registration
1332  *
1333  * Registers given DPLL pin into DPLL sub-system.
1334  *
1335  * Return: 0 on success, <0 on error
1336  */
1337 static int
1338 zl3073x_dpll_pin_register(struct zl3073x_dpll_pin *pin, u32 index)
1339 {
1340 	struct zl3073x_dpll *zldpll = pin->dpll;
1341 	struct zl3073x_pin_props *props;
1342 	const struct dpll_pin_ops *ops;
1343 	int rc;
1344 
1345 	/* Get pin properties */
1346 	props = zl3073x_pin_props_get(zldpll->dev, pin->dir, pin->id);
1347 	if (IS_ERR(props))
1348 		return PTR_ERR(props);
1349 
1350 	/* Save package label, fwnode, esync capability and phase adjust
1351 	 * granularity.
1352 	 */
1353 	strscpy(pin->label, props->package_label);
1354 	pin->fwnode = fwnode_handle_get(props->fwnode);
1355 	pin->esync_control = props->esync_control;
1356 	pin->phase_gran = props->dpll_props.phase_gran;
1357 
1358 	if (zl3073x_dpll_is_input_pin(pin)) {
1359 		const struct zl3073x_chan *chan;
1360 		u8 ref;
1361 
1362 		chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1363 		ref = zl3073x_input_pin_ref_get(pin->id);
1364 		pin->prio = zl3073x_chan_ref_prio_get(chan, ref);
1365 
1366 		if (pin->prio == ZL_DPLL_REF_PRIO_NONE)
1367 			/* Clamp prio to max value */
1368 			pin->prio = ZL_DPLL_REF_PRIO_MAX;
1369 	}
1370 
1371 	/* Create or get existing DPLL pin */
1372 	pin->dpll_pin = dpll_pin_get(zldpll->dev->clock_id, index, THIS_MODULE,
1373 				     &props->dpll_props, &pin->tracker);
1374 	if (IS_ERR(pin->dpll_pin)) {
1375 		rc = PTR_ERR(pin->dpll_pin);
1376 		goto err_pin_get;
1377 	}
1378 	dpll_pin_fwnode_set(pin->dpll_pin, props->fwnode);
1379 
1380 	if (zl3073x_dpll_is_input_pin(pin))
1381 		ops = &zl3073x_dpll_input_pin_ops;
1382 	else
1383 		ops = &zl3073x_dpll_output_pin_ops;
1384 
1385 	/* Register the pin */
1386 	rc = dpll_pin_register(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
1387 	if (rc)
1388 		goto err_register;
1389 
1390 	/* Free pin properties */
1391 	zl3073x_pin_props_put(props);
1392 
1393 	return 0;
1394 
1395 err_register:
1396 	dpll_pin_put(pin->dpll_pin, &pin->tracker);
1397 err_pin_get:
1398 	pin->dpll_pin = NULL;
1399 	fwnode_handle_put(pin->fwnode);
1400 	pin->fwnode = NULL;
1401 	zl3073x_pin_props_put(props);
1402 
1403 	return rc;
1404 }
1405 
1406 /**
1407  * zl3073x_dpll_pin_unregister - unregister DPLL pin
1408  * @pin: pointer to DPLL pin
1409  *
1410  * Unregisters pin previously registered by @zl3073x_dpll_pin_register.
1411  */
1412 static void
1413 zl3073x_dpll_pin_unregister(struct zl3073x_dpll_pin *pin)
1414 {
1415 	struct zl3073x_dpll *zldpll = pin->dpll;
1416 	const struct dpll_pin_ops *ops;
1417 
1418 	WARN(!pin->dpll_pin, "DPLL pin is not registered\n");
1419 
1420 	if (zl3073x_dpll_is_input_pin(pin))
1421 		ops = &zl3073x_dpll_input_pin_ops;
1422 	else
1423 		ops = &zl3073x_dpll_output_pin_ops;
1424 
1425 	/* Unregister the pin */
1426 	dpll_pin_unregister(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
1427 
1428 	dpll_pin_put(pin->dpll_pin, &pin->tracker);
1429 	pin->dpll_pin = NULL;
1430 
1431 	fwnode_handle_put(pin->fwnode);
1432 	pin->fwnode = NULL;
1433 }
1434 
1435 /**
1436  * zl3073x_dpll_pins_unregister - unregister all registered DPLL pins
1437  * @zldpll: pointer to zl3073x_dpll structure
1438  *
1439  * Enumerates all DPLL pins registered to given DPLL device and
1440  * unregisters them.
1441  */
1442 static void
1443 zl3073x_dpll_pins_unregister(struct zl3073x_dpll *zldpll)
1444 {
1445 	struct zl3073x_dpll_pin *pin, *next;
1446 
1447 	list_for_each_entry_safe(pin, next, &zldpll->pins, list) {
1448 		zl3073x_dpll_pin_unregister(pin);
1449 		list_del(&pin->list);
1450 		zl3073x_dpll_pin_free(pin);
1451 	}
1452 }
1453 
1454 /**
1455  * zl3073x_dpll_pin_is_registrable - check if the pin is registrable
1456  * @zldpll: pointer to zl3073x_dpll structure
1457  * @dir: pin direction
1458  * @index: pin index
1459  *
1460  * Checks if the given pin can be registered to given DPLL. For both
1461  * directions the pin can be registered if it is enabled. In case of
1462  * differential signal type only P-pin is reported as registrable.
1463  * And additionally for the output pin, the pin can be registered only
1464  * if it is connected to synthesizer that is driven by given DPLL.
1465  *
1466  * Return: true if the pin is registrable, false if not
1467  */
1468 static bool
1469 zl3073x_dpll_pin_is_registrable(struct zl3073x_dpll *zldpll,
1470 				enum dpll_pin_direction dir, u8 index)
1471 {
1472 	struct zl3073x_dev *zldev = zldpll->dev;
1473 	const struct zl3073x_chan *chan;
1474 	bool is_diff, is_enabled;
1475 	const char *name;
1476 
1477 	chan = zl3073x_chan_state_get(zldev, zldpll->id);
1478 
1479 	if (dir == DPLL_PIN_DIRECTION_INPUT) {
1480 		u8 ref_id = zl3073x_input_pin_ref_get(index);
1481 		const struct zl3073x_ref *ref;
1482 
1483 		/* Skip the pin if the DPLL is running in NCO mode */
1484 		if (zl3073x_chan_mode_get(chan) == ZL_DPLL_MODE_REFSEL_MODE_NCO)
1485 			return false;
1486 
1487 		name = "REF";
1488 		ref = zl3073x_ref_state_get(zldev, ref_id);
1489 		is_diff = zl3073x_ref_is_diff(ref);
1490 		is_enabled = zl3073x_ref_is_enabled(ref);
1491 	} else {
1492 		/* Output P&N pair shares single HW output */
1493 		u8 out = zl3073x_output_pin_out_get(index);
1494 
1495 		/* Skip the pin if it is connected to different DPLL channel */
1496 		if (zl3073x_dev_out_dpll_get(zldev, out) != zldpll->id) {
1497 			dev_dbg(zldev->dev,
1498 				"OUT%u is driven by different DPLL\n", out);
1499 
1500 			return false;
1501 		}
1502 
1503 		name = "OUT";
1504 		is_diff = zl3073x_dev_out_is_diff(zldev, out);
1505 		is_enabled = zl3073x_dev_output_pin_is_enabled(zldev, index);
1506 	}
1507 
1508 	/* Skip N-pin if the corresponding input/output is differential */
1509 	if (is_diff && zl3073x_is_n_pin(index)) {
1510 		dev_dbg(zldev->dev, "%s%u is differential, skipping N-pin\n",
1511 			name, index / 2);
1512 
1513 		return false;
1514 	}
1515 
1516 	/* Skip the pin if it is disabled */
1517 	if (!is_enabled) {
1518 		dev_dbg(zldev->dev, "%s%u%c is disabled\n", name, index / 2,
1519 			zl3073x_is_p_pin(index) ? 'P' : 'N');
1520 
1521 		return false;
1522 	}
1523 
1524 	return true;
1525 }
1526 
1527 /**
1528  * zl3073x_dpll_pins_register - register all registerable DPLL pins
1529  * @zldpll: pointer to zl3073x_dpll structure
1530  *
1531  * Enumerates all possible input/output pins and registers all of them
1532  * that are registrable.
1533  *
1534  * Return: 0 on success, <0 on error
1535  */
1536 static int
1537 zl3073x_dpll_pins_register(struct zl3073x_dpll *zldpll)
1538 {
1539 	struct zl3073x_dpll_pin *pin;
1540 	enum dpll_pin_direction dir;
1541 	u8 id, index;
1542 	int rc;
1543 
1544 	/* Process input pins */
1545 	for (index = 0; index < ZL3073X_NUM_PINS; index++) {
1546 		/* First input pins and then output pins */
1547 		if (index < ZL3073X_NUM_INPUT_PINS) {
1548 			id = index;
1549 			dir = DPLL_PIN_DIRECTION_INPUT;
1550 		} else {
1551 			id = index - ZL3073X_NUM_INPUT_PINS;
1552 			dir = DPLL_PIN_DIRECTION_OUTPUT;
1553 		}
1554 
1555 		/* Check if the pin registrable to this DPLL */
1556 		if (!zl3073x_dpll_pin_is_registrable(zldpll, dir, id))
1557 			continue;
1558 
1559 		pin = zl3073x_dpll_pin_alloc(zldpll, dir, id);
1560 		if (IS_ERR(pin)) {
1561 			rc = PTR_ERR(pin);
1562 			goto error;
1563 		}
1564 
1565 		rc = zl3073x_dpll_pin_register(pin, index);
1566 		if (rc) {
1567 			zl3073x_dpll_pin_free(pin);
1568 			goto error;
1569 		}
1570 
1571 		list_add(&pin->list, &zldpll->pins);
1572 	}
1573 
1574 	return 0;
1575 
1576 error:
1577 	zl3073x_dpll_pins_unregister(zldpll);
1578 
1579 	return rc;
1580 }
1581 
1582 /**
1583  * zl3073x_dpll_device_register - register DPLL device
1584  * @zldpll: pointer to zl3073x_dpll structure
1585  *
1586  * Registers given DPLL device into DPLL sub-system.
1587  *
1588  * Return: 0 on success, <0 on error
1589  */
1590 static int
1591 zl3073x_dpll_device_register(struct zl3073x_dpll *zldpll)
1592 {
1593 	struct zl3073x_dev *zldev = zldpll->dev;
1594 	int rc;
1595 
1596 	zldpll->ops = zl3073x_dpll_device_ops;
1597 	if (zldev->info->flags & ZL3073X_FLAG_DIE_TEMP)
1598 		zldpll->ops.temp_get = zl3073x_dpll_temp_get;
1599 
1600 	zldpll->dpll_dev = dpll_device_get(zldev->clock_id, zldpll->id,
1601 					   THIS_MODULE, &zldpll->tracker);
1602 	if (IS_ERR(zldpll->dpll_dev)) {
1603 		rc = PTR_ERR(zldpll->dpll_dev);
1604 		zldpll->dpll_dev = NULL;
1605 
1606 		return rc;
1607 	}
1608 
1609 	rc = dpll_device_register(zldpll->dpll_dev,
1610 				  zl3073x_prop_dpll_type_get(zldev, zldpll->id),
1611 				  &zldpll->ops, zldpll);
1612 	if (rc) {
1613 		dpll_device_put(zldpll->dpll_dev, &zldpll->tracker);
1614 		zldpll->dpll_dev = NULL;
1615 	}
1616 
1617 	return rc;
1618 }
1619 
1620 /**
1621  * zl3073x_dpll_device_unregister - unregister DPLL device
1622  * @zldpll: pointer to zl3073x_dpll structure
1623  *
1624  * Unregisters given DPLL device from DPLL sub-system previously registered
1625  * by @zl3073x_dpll_device_register.
1626  */
1627 static void
1628 zl3073x_dpll_device_unregister(struct zl3073x_dpll *zldpll)
1629 {
1630 	WARN(!zldpll->dpll_dev, "DPLL device is not registered\n");
1631 
1632 	cancel_work_sync(&zldpll->change_work);
1633 
1634 	dpll_device_unregister(zldpll->dpll_dev, &zldpll->ops, zldpll);
1635 	dpll_device_put(zldpll->dpll_dev, &zldpll->tracker);
1636 	zldpll->dpll_dev = NULL;
1637 }
1638 
1639 /**
1640  * zl3073x_dpll_pin_phase_offset_check - check for pin phase offset change
1641  * @pin: pin to check
1642  *
1643  * Check for the change of DPLL to connected pin phase offset change.
1644  *
1645  * Return: true on phase offset change, false otherwise
1646  */
1647 static bool
1648 zl3073x_dpll_pin_phase_offset_check(struct zl3073x_dpll_pin *pin)
1649 {
1650 	struct zl3073x_dpll *zldpll = pin->dpll;
1651 	struct zl3073x_dev *zldev = zldpll->dev;
1652 	unsigned int reg;
1653 	s64 phase_offset;
1654 	u8 ref_id;
1655 	int rc;
1656 
1657 	/* No phase offset if the ref monitor reports signal errors */
1658 	ref_id = zl3073x_input_pin_ref_get(pin->id);
1659 	if (!zl3073x_dev_ref_is_status_ok(zldev, ref_id))
1660 		return false;
1661 
1662 	/* Select register to read phase offset value depending on pin and
1663 	 * phase monitor state:
1664 	 * 1) For connected pin use dpll_phase_err_data register
1665 	 * 2) For other pins use appropriate ref_phase register if the phase
1666 	 *    monitor feature is enabled.
1667 	 */
1668 	if (pin->pin_state == DPLL_PIN_STATE_CONNECTED)
1669 		reg = ZL_REG_DPLL_PHASE_ERR_DATA(zldpll->id);
1670 	else if (zldpll->phase_monitor)
1671 		reg = ZL_REG_REF_PHASE(ref_id);
1672 	else
1673 		return false;
1674 
1675 	/* Read measured phase offset value */
1676 	rc = zl3073x_read_u48(zldev, reg, &phase_offset);
1677 	if (rc) {
1678 		dev_err(zldev->dev, "Failed to read ref phase offset: %pe\n",
1679 			ERR_PTR(rc));
1680 
1681 		return false;
1682 	}
1683 
1684 	/* Convert to ps */
1685 	phase_offset = div_s64(sign_extend64(phase_offset, 47), 100);
1686 
1687 	/* Compare with previous value */
1688 	if (phase_offset != pin->phase_offset) {
1689 		dev_dbg(zldev->dev, "%s phase offset changed: %lld -> %lld\n",
1690 			pin->label, pin->phase_offset, phase_offset);
1691 		pin->phase_offset = phase_offset;
1692 
1693 		return true;
1694 	}
1695 
1696 	return false;
1697 }
1698 
1699 /**
1700  * zl3073x_dpll_pin_ffo_check - check for pin fractional frequency offset change
1701  * @pin: pin to check
1702  *
1703  * Check for the given pin's fractional frequency change.
1704  *
1705  * Return: true on fractional frequency offset change, false otherwise
1706  */
1707 static bool
1708 zl3073x_dpll_pin_ffo_check(struct zl3073x_dpll_pin *pin)
1709 {
1710 	struct zl3073x_dpll *zldpll = pin->dpll;
1711 	struct zl3073x_dev *zldev = zldpll->dev;
1712 	const struct zl3073x_ref *ref;
1713 	u8 ref_id;
1714 	s64 ffo;
1715 
1716 	/* Get reference monitor status */
1717 	ref_id = zl3073x_input_pin_ref_get(pin->id);
1718 	ref = zl3073x_ref_state_get(zldev, ref_id);
1719 
1720 	/* Do not report ffo changes if the reference monitor report errors */
1721 	if (!zl3073x_ref_is_status_ok(ref))
1722 		return false;
1723 
1724 	/* Compare with previous value */
1725 	ffo = zl3073x_ref_ffo_get(ref);
1726 	if (pin->freq_offset != ffo) {
1727 		dev_dbg(zldev->dev, "%s freq offset changed: %lld -> %lld\n",
1728 			pin->label, pin->freq_offset, ffo);
1729 		pin->freq_offset = ffo;
1730 
1731 		return true;
1732 	}
1733 
1734 	return false;
1735 }
1736 
1737 /**
1738  * zl3073x_dpll_pin_measured_freq_check - check for pin measured frequency
1739  * change
1740  * @pin: pin to check
1741  *
1742  * Check for the given pin's measured frequency change.
1743  *
1744  * Return: true on measured frequency change, false otherwise
1745  */
1746 static bool
1747 zl3073x_dpll_pin_measured_freq_check(struct zl3073x_dpll_pin *pin)
1748 {
1749 	struct zl3073x_dpll *zldpll = pin->dpll;
1750 	struct zl3073x_dev *zldev = zldpll->dev;
1751 	const struct zl3073x_ref *ref;
1752 	u8 ref_id;
1753 	u32 freq;
1754 
1755 	if (!zldpll->freq_monitor)
1756 		return false;
1757 
1758 	ref_id = zl3073x_input_pin_ref_get(pin->id);
1759 	ref = zl3073x_ref_state_get(zldev, ref_id);
1760 
1761 	freq = zl3073x_ref_meas_freq_get(ref);
1762 	if (pin->measured_freq != freq) {
1763 		dev_dbg(zldev->dev, "%s measured freq changed: %u -> %u\n",
1764 			pin->label, pin->measured_freq, freq);
1765 		pin->measured_freq = freq;
1766 
1767 		return true;
1768 	}
1769 
1770 	return false;
1771 }
1772 
1773 /**
1774  * zl3073x_dpll_changes_check - check for changes and send notifications
1775  * @zldpll: pointer to zl3073x_dpll structure
1776  *
1777  * Checks for changes on given DPLL device and its registered DPLL pins
1778  * and sends notifications about them.
1779  *
1780  * This function is periodically called from @zl3073x_dev_periodic_work.
1781  */
1782 void
1783 zl3073x_dpll_changes_check(struct zl3073x_dpll *zldpll)
1784 {
1785 	struct zl3073x_dev *zldev = zldpll->dev;
1786 	enum dpll_lock_status lock_status;
1787 	struct device *dev = zldev->dev;
1788 	const struct zl3073x_chan *chan;
1789 	struct zl3073x_dpll_pin *pin;
1790 	int rc;
1791 	u8 mode;
1792 
1793 	zldpll->check_count++;
1794 
1795 	/* Get current lock status for the DPLL */
1796 	rc = zl3073x_dpll_lock_status_get(zldpll->dpll_dev, zldpll,
1797 					  &lock_status, NULL, NULL);
1798 	if (rc) {
1799 		dev_err(dev, "Failed to get DPLL%u lock status: %pe\n",
1800 			zldpll->id, ERR_PTR(rc));
1801 		return;
1802 	}
1803 
1804 	/* If lock status was changed then notify DPLL core */
1805 	if (zldpll->lock_status != lock_status) {
1806 		zldpll->lock_status = lock_status;
1807 		dpll_device_change_ntf(zldpll->dpll_dev);
1808 	}
1809 
1810 	/* Input pin monitoring does make sense only in automatic
1811 	 * or forced reference modes.
1812 	 */
1813 	chan = zl3073x_chan_state_get(zldev, zldpll->id);
1814 	mode = zl3073x_chan_mode_get(chan);
1815 	if (mode != ZL_DPLL_MODE_REFSEL_MODE_AUTO &&
1816 	    mode != ZL_DPLL_MODE_REFSEL_MODE_REFLOCK)
1817 		return;
1818 
1819 	/* Update phase offset latch registers for this DPLL if the phase
1820 	 * offset monitor feature is enabled.
1821 	 */
1822 	if (zldpll->phase_monitor) {
1823 		rc = zl3073x_ref_phase_offsets_update(zldev, zldpll->id);
1824 		if (rc) {
1825 			dev_err(zldev->dev,
1826 				"Failed to update phase offsets: %pe\n",
1827 				ERR_PTR(rc));
1828 			return;
1829 		}
1830 	}
1831 
1832 	list_for_each_entry(pin, &zldpll->pins, list) {
1833 		enum dpll_pin_state state;
1834 		bool pin_changed = false;
1835 
1836 		/* Output pins change checks are not necessary because output
1837 		 * states are constant.
1838 		 */
1839 		if (!zl3073x_dpll_is_input_pin(pin))
1840 			continue;
1841 
1842 		rc = zl3073x_dpll_ref_state_get(pin, &state);
1843 		if (rc) {
1844 			dev_err(dev,
1845 				"Failed to get %s on DPLL%u state: %pe\n",
1846 				pin->label, zldpll->id, ERR_PTR(rc));
1847 			return;
1848 		}
1849 
1850 		if (state != pin->pin_state) {
1851 			dev_dbg(dev, "%s state changed: %u->%u\n", pin->label,
1852 				pin->pin_state, state);
1853 			pin->pin_state = state;
1854 			pin_changed = true;
1855 		}
1856 
1857 		/* Check for phase offset, ffo, and measured freq change
1858 		 * once per second.
1859 		 */
1860 		if (zldpll->check_count % 2 == 0) {
1861 			if (zl3073x_dpll_pin_phase_offset_check(pin))
1862 				pin_changed = true;
1863 
1864 			if (zl3073x_dpll_pin_ffo_check(pin))
1865 				pin_changed = true;
1866 
1867 			if (zl3073x_dpll_pin_measured_freq_check(pin))
1868 				pin_changed = true;
1869 		}
1870 
1871 		if (pin_changed)
1872 			dpll_pin_change_ntf(pin->dpll_pin);
1873 	}
1874 }
1875 
1876 /**
1877  * zl3073x_dpll_init_fine_phase_adjust - do initial fine phase adjustments
1878  * @zldev: pointer to zl3073x device
1879  *
1880  * Performs initial fine phase adjustments needed per datasheet.
1881  *
1882  * Return: 0 on success, <0 on error
1883  */
1884 int
1885 zl3073x_dpll_init_fine_phase_adjust(struct zl3073x_dev *zldev)
1886 {
1887 	int rc;
1888 
1889 	rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_MASK, 0x1f);
1890 	if (rc)
1891 		return rc;
1892 
1893 	rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_INTVL, 0x01);
1894 	if (rc)
1895 		return rc;
1896 
1897 	rc = zl3073x_write_u16(zldev, ZL_REG_SYNTH_PHASE_SHIFT_DATA, 0xffff);
1898 	if (rc)
1899 		return rc;
1900 
1901 	rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_CTRL, 0x01);
1902 	if (rc)
1903 		return rc;
1904 
1905 	return rc;
1906 }
1907 
1908 /**
1909  * zl3073x_dpll_alloc - allocate DPLL device
1910  * @zldev: pointer to zl3073x device
1911  * @ch: DPLL channel number
1912  *
1913  * Allocates DPLL device structure for given DPLL channel.
1914  *
1915  * Return: pointer to DPLL device on success, error pointer on error
1916  */
1917 struct zl3073x_dpll *
1918 zl3073x_dpll_alloc(struct zl3073x_dev *zldev, u8 ch)
1919 {
1920 	struct zl3073x_dpll *zldpll;
1921 
1922 	zldpll = kzalloc_obj(*zldpll);
1923 	if (!zldpll)
1924 		return ERR_PTR(-ENOMEM);
1925 
1926 	zldpll->dev = zldev;
1927 	zldpll->id = ch;
1928 	INIT_LIST_HEAD(&zldpll->pins);
1929 	INIT_WORK(&zldpll->change_work, zl3073x_dpll_change_work);
1930 
1931 	return zldpll;
1932 }
1933 
1934 /**
1935  * zl3073x_dpll_free - free DPLL device
1936  * @zldpll: pointer to zl3073x_dpll structure
1937  *
1938  * Deallocates given DPLL device previously allocated by @zl3073x_dpll_alloc.
1939  */
1940 void
1941 zl3073x_dpll_free(struct zl3073x_dpll *zldpll)
1942 {
1943 	WARN(zldpll->dpll_dev, "DPLL device is still registered\n");
1944 
1945 	kfree(zldpll);
1946 }
1947 
1948 /**
1949  * zl3073x_dpll_ref_sync_pair_register - register ref_sync pairs for a pin
1950  * @pin: pointer to zl3073x_dpll_pin structure
1951  *
1952  * Iterates 'ref-sync-sources' phandles in the pin's firmware node and
1953  * registers each declared pairing.
1954  *
1955  * Return: 0 on success, <0 on error
1956  */
1957 static int
1958 zl3073x_dpll_ref_sync_pair_register(struct zl3073x_dpll_pin *pin)
1959 {
1960 	struct zl3073x_dev *zldev = pin->dpll->dev;
1961 	struct fwnode_handle *fwnode;
1962 	struct dpll_pin *sync_pin;
1963 	dpll_tracker tracker;
1964 	int n, rc;
1965 
1966 	for (n = 0; ; n++) {
1967 		/* Get n'th ref-sync source */
1968 		fwnode = fwnode_find_reference(pin->fwnode, "ref-sync-sources",
1969 					       n);
1970 		if (IS_ERR(fwnode)) {
1971 			rc = PTR_ERR(fwnode);
1972 			break;
1973 		}
1974 
1975 		/* Find associated dpll pin */
1976 		sync_pin = fwnode_dpll_pin_find(fwnode, &tracker);
1977 		fwnode_handle_put(fwnode);
1978 		if (!sync_pin) {
1979 			dev_warn(zldev->dev, "%s: ref-sync source %d not found",
1980 				 pin->label, n);
1981 			continue;
1982 		}
1983 
1984 		/* Register new ref-sync pair */
1985 		rc = dpll_pin_ref_sync_pair_add(pin->dpll_pin, sync_pin);
1986 		dpll_pin_put(sync_pin, &tracker);
1987 
1988 		/* -EBUSY means pairing already exists from another DPLL's
1989 		 * registration.
1990 		 */
1991 		if (rc && rc != -EBUSY) {
1992 			dev_err(zldev->dev,
1993 				"%s: failed to add ref-sync source %d: %pe",
1994 				pin->label, n, ERR_PTR(rc));
1995 			break;
1996 		}
1997 	}
1998 
1999 	return rc != -ENOENT ? rc : 0;
2000 }
2001 
2002 /**
2003  * zl3073x_dpll_ref_sync_pairs_register - register ref_sync pairs for a DPLL
2004  * @zldpll: pointer to zl3073x_dpll structure
2005  *
2006  * Iterates all registered input pins of the given DPLL and establishes
2007  * ref_sync pairings declared by 'ref-sync-sources' phandles in the
2008  * device tree.
2009  *
2010  * Return: 0 on success, <0 on error
2011  */
2012 static int
2013 zl3073x_dpll_ref_sync_pairs_register(struct zl3073x_dpll *zldpll)
2014 {
2015 	struct zl3073x_dpll_pin *pin;
2016 	int rc;
2017 
2018 	list_for_each_entry(pin, &zldpll->pins, list) {
2019 		if (!zl3073x_dpll_is_input_pin(pin) || !pin->fwnode)
2020 			continue;
2021 
2022 		rc = zl3073x_dpll_ref_sync_pair_register(pin);
2023 		if (rc)
2024 			return rc;
2025 	}
2026 
2027 	return 0;
2028 }
2029 
2030 /**
2031  * zl3073x_dpll_register - register DPLL device and all its pins
2032  * @zldpll: pointer to zl3073x_dpll structure
2033  *
2034  * Registers given DPLL device and all its pins into DPLL sub-system.
2035  *
2036  * Return: 0 on success, <0 on error
2037  */
2038 int
2039 zl3073x_dpll_register(struct zl3073x_dpll *zldpll)
2040 {
2041 	int rc;
2042 
2043 	rc = zl3073x_dpll_device_register(zldpll);
2044 	if (rc)
2045 		return rc;
2046 
2047 	rc = zl3073x_dpll_pins_register(zldpll);
2048 	if (rc) {
2049 		zl3073x_dpll_device_unregister(zldpll);
2050 		return rc;
2051 	}
2052 
2053 	rc = zl3073x_dpll_ref_sync_pairs_register(zldpll);
2054 	if (rc) {
2055 		zl3073x_dpll_pins_unregister(zldpll);
2056 		zl3073x_dpll_device_unregister(zldpll);
2057 		return rc;
2058 	}
2059 
2060 	return 0;
2061 }
2062 
2063 /**
2064  * zl3073x_dpll_unregister - unregister DPLL device and its pins
2065  * @zldpll: pointer to zl3073x_dpll structure
2066  *
2067  * Unregisters given DPLL device and all its pins from DPLL sub-system
2068  * previously registered by @zl3073x_dpll_register.
2069  */
2070 void
2071 zl3073x_dpll_unregister(struct zl3073x_dpll *zldpll)
2072 {
2073 	/* Unregister all pins and dpll */
2074 	zl3073x_dpll_pins_unregister(zldpll);
2075 	zl3073x_dpll_device_unregister(zldpll);
2076 }
2077