xref: /linux/drivers/dpll/zl3073x/dpll.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1 // SPDX-License-Identifier: GPL-2.0-only
2 
3 #include <linux/bits.h>
4 #include <linux/bitfield.h>
5 #include <linux/cleanup.h>
6 #include <linux/bug.h>
7 #include <linux/container_of.h>
8 #include <linux/dev_printk.h>
9 #include <linux/dpll.h>
10 #include <linux/err.h>
11 #include <linux/kthread.h>
12 #include <linux/math64.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/ptp_clock_kernel.h>
18 #include <linux/slab.h>
19 #include <linux/sprintf.h>
20 
21 #include "core.h"
22 #include "dpll.h"
23 #include "prop.h"
24 #include "regs.h"
25 
26 #define ZL3073X_DPLL_REF_NONE		ZL3073X_NUM_REFS
27 #define ZL3073X_DPLL_REF_IS_VALID(_ref)	((_ref) != ZL3073X_DPLL_REF_NONE)
28 
29 /**
30  * struct zl3073x_dpll_pin - DPLL pin
31  * @list: this DPLL pin list entry
32  * @dpll: DPLL the pin is registered to
33  * @dpll_pin: pointer to registered dpll_pin
34  * @tracker: tracking object for the acquired reference
35  * @fwnode: firmware node handle
36  * @label: package label
37  * @dir: pin direction
38  * @id: pin id
39  * @prio: pin priority <0, 14>
40  * @esync_control: embedded sync is controllable
41  * @phase_gran: phase adjustment granularity
42  * @operstate: last saved operational state
43  * @phase_offset: last saved pin phase offset
44  * @freq_offset: last saved fractional frequency offset
45  * @measured_freq: last saved measured frequency
46  */
47 struct zl3073x_dpll_pin {
48 	struct list_head	list;
49 	struct zl3073x_dpll	*dpll;
50 	struct dpll_pin		*dpll_pin;
51 	dpll_tracker		tracker;
52 	struct fwnode_handle	*fwnode;
53 	char			label[8];
54 	enum dpll_pin_direction	dir;
55 	u8			id;
56 	u8			prio;
57 	bool			esync_control;
58 	s32			phase_gran;
59 	enum dpll_pin_operstate	operstate;
60 	s64			phase_offset;
61 	s64			freq_offset;
62 	u32			measured_freq;
63 };
64 
65 /*
66  * Supported esync ranges for input and for output per output pair type
67  */
68 static const struct dpll_pin_frequency esync_freq_ranges[] = {
69 	DPLL_PIN_FREQUENCY_RANGE(0, 1),
70 };
71 
72 /**
73  * zl3073x_dpll_is_input_pin - check if the pin is input one
74  * @pin: pin to check
75  *
76  * Return: true if pin is input, false if pin is output.
77  */
78 static bool
zl3073x_dpll_is_input_pin(struct zl3073x_dpll_pin * pin)79 zl3073x_dpll_is_input_pin(struct zl3073x_dpll_pin *pin)
80 {
81 	return pin->dir == DPLL_PIN_DIRECTION_INPUT;
82 }
83 
84 /**
85  * zl3073x_dpll_is_nco_pin - check if the pin is a virtual NCO pin
86  * @pin: pin to check
87  *
88  * Return: true if pin is a virtual NCO pin, false otherwise.
89  */
90 static bool
zl3073x_dpll_is_nco_pin(struct zl3073x_dpll_pin * pin)91 zl3073x_dpll_is_nco_pin(struct zl3073x_dpll_pin *pin)
92 {
93 	return pin->id == ZL3073X_NCO_PIN_ID;
94 }
95 
96 /**
97  * zl3073x_dpll_is_p_pin - check if the pin is P-pin
98  * @pin: pin to check
99  *
100  * Return: true if the pin is P-pin, false if it is N-pin
101  */
102 static bool
zl3073x_dpll_is_p_pin(struct zl3073x_dpll_pin * pin)103 zl3073x_dpll_is_p_pin(struct zl3073x_dpll_pin *pin)
104 {
105 	return zl3073x_is_p_pin(pin->id);
106 }
107 
108 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)109 zl3073x_dpll_pin_direction_get(const struct dpll_pin *dpll_pin, void *pin_priv,
110 			       const struct dpll_device *dpll, void *dpll_priv,
111 			       enum dpll_pin_direction *direction,
112 			       struct netlink_ext_ack *extack)
113 {
114 	struct zl3073x_dpll_pin *pin = pin_priv;
115 
116 	*direction = pin->dir;
117 
118 	return 0;
119 }
120 
121 static struct zl3073x_dpll_pin *
zl3073x_dpll_pin_get_by_ref(struct zl3073x_dpll * zldpll,u8 ref_id)122 zl3073x_dpll_pin_get_by_ref(struct zl3073x_dpll *zldpll, u8 ref_id)
123 {
124 	struct zl3073x_dpll_pin *pin;
125 
126 	list_for_each_entry(pin, &zldpll->pins, list) {
127 		if (zl3073x_dpll_is_input_pin(pin) &&
128 		    zl3073x_input_pin_ref_get(pin->id) == ref_id)
129 			return pin;
130 	}
131 
132 	return NULL;
133 }
134 
135 static struct zl3073x_dpll_pin *
zl3073x_dpll_nco_pin_get(struct zl3073x_dpll * zldpll)136 zl3073x_dpll_nco_pin_get(struct zl3073x_dpll *zldpll)
137 {
138 	struct zl3073x_dpll_pin *pin;
139 
140 	list_for_each_entry(pin, &zldpll->pins, list) {
141 		if (zl3073x_dpll_is_nco_pin(pin))
142 			return pin;
143 	}
144 
145 	return NULL;
146 }
147 
148 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)149 zl3073x_dpll_input_pin_esync_get(const struct dpll_pin *dpll_pin,
150 				 void *pin_priv,
151 				 const struct dpll_device *dpll,
152 				 void *dpll_priv,
153 				 struct dpll_pin_esync *esync,
154 				 struct netlink_ext_ack *extack)
155 {
156 	struct zl3073x_dpll *zldpll = dpll_priv;
157 	struct zl3073x_dev *zldev = zldpll->dev;
158 	struct zl3073x_dpll_pin *pin = pin_priv;
159 	const struct zl3073x_ref *ref;
160 	u8 ref_id;
161 
162 	guard(mutex)(&zldpll->lock);
163 
164 	ref_id = zl3073x_input_pin_ref_get(pin->id);
165 	ref = zl3073x_ref_state_get(zldev, ref_id);
166 
167 	if (!pin->esync_control || zl3073x_ref_freq_get(ref) <= 1)
168 		return -EOPNOTSUPP;
169 
170 	esync->range = esync_freq_ranges;
171 	esync->range_num = ARRAY_SIZE(esync_freq_ranges);
172 
173 	switch (zl3073x_ref_sync_mode_get(ref)) {
174 	case ZL_REF_SYNC_CTRL_MODE_50_50_ESYNC_25_75:
175 		esync->freq = ref->esync_n_div == ZL_REF_ESYNC_DIV_1HZ ? 1 : 0;
176 		esync->pulse = 25;
177 		break;
178 	default:
179 		esync->freq = 0;
180 		esync->pulse = 0;
181 		break;
182 	}
183 
184 	return 0;
185 }
186 
187 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)188 zl3073x_dpll_input_pin_esync_set(const struct dpll_pin *dpll_pin,
189 				 void *pin_priv,
190 				 const struct dpll_device *dpll,
191 				 void *dpll_priv, u64 freq,
192 				 struct netlink_ext_ack *extack)
193 {
194 	struct zl3073x_dpll *zldpll = dpll_priv;
195 	struct zl3073x_dev *zldev = zldpll->dev;
196 	struct zl3073x_dpll_pin *pin = pin_priv;
197 	struct zl3073x_ref ref;
198 	u8 ref_id, sync_mode;
199 
200 	guard(mutex)(&zldpll->lock);
201 
202 	ref_id = zl3073x_input_pin_ref_get(pin->id);
203 	ref = *zl3073x_ref_state_get(zldev, ref_id);
204 
205 	/* Use freq == 0 to disable esync */
206 	if (!freq)
207 		sync_mode = ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR_OFF;
208 	else
209 		sync_mode = ZL_REF_SYNC_CTRL_MODE_50_50_ESYNC_25_75;
210 
211 	zl3073x_ref_sync_mode_set(&ref, sync_mode);
212 
213 	if (freq) {
214 		/* 1 Hz is only supported frequency now */
215 		ref.esync_n_div = ZL_REF_ESYNC_DIV_1HZ;
216 	}
217 
218 	/* Update reference configuration */
219 	return zl3073x_ref_state_set(zldev, ref_id, &ref);
220 }
221 
222 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)223 zl3073x_dpll_input_pin_ref_sync_get(const struct dpll_pin *dpll_pin,
224 				    void *pin_priv,
225 				    const struct dpll_pin *ref_sync_pin,
226 				    void *ref_sync_pin_priv,
227 				    enum dpll_pin_state *state,
228 				    struct netlink_ext_ack *extack)
229 {
230 	struct zl3073x_dpll_pin *sync_pin = ref_sync_pin_priv;
231 	struct zl3073x_dpll_pin *pin = pin_priv;
232 	struct zl3073x_dpll *zldpll = pin->dpll;
233 	struct zl3073x_dev *zldev = zldpll->dev;
234 	const struct zl3073x_ref *ref;
235 	u8 ref_id, mode, pair;
236 
237 	guard(mutex)(&zldpll->lock);
238 
239 	ref_id = zl3073x_input_pin_ref_get(pin->id);
240 	ref = zl3073x_ref_state_get(zldev, ref_id);
241 	mode = zl3073x_ref_sync_mode_get(ref);
242 	pair = zl3073x_ref_sync_pair_get(ref);
243 
244 	if (mode == ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR &&
245 	    pair == zl3073x_input_pin_ref_get(sync_pin->id))
246 		*state = DPLL_PIN_STATE_CONNECTED;
247 	else
248 		*state = DPLL_PIN_STATE_DISCONNECTED;
249 
250 	return 0;
251 }
252 
253 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)254 zl3073x_dpll_input_pin_ref_sync_set(const struct dpll_pin *dpll_pin,
255 				    void *pin_priv,
256 				    const struct dpll_pin *ref_sync_pin,
257 				    void *ref_sync_pin_priv,
258 				    const enum dpll_pin_state state,
259 				    struct netlink_ext_ack *extack)
260 {
261 	struct zl3073x_dpll_pin *sync_pin = ref_sync_pin_priv;
262 	struct zl3073x_dpll_pin *pin = pin_priv;
263 	struct zl3073x_dpll *zldpll = pin->dpll;
264 	struct zl3073x_dev *zldev = zldpll->dev;
265 	u8 mode, ref_id, sync_ref_id;
266 	struct zl3073x_chan chan;
267 	struct zl3073x_ref ref;
268 	bool sync_ntf = false;
269 	int rc;
270 
271 	mutex_lock(&zldpll->lock);
272 
273 	ref_id = zl3073x_input_pin_ref_get(pin->id);
274 	sync_ref_id = zl3073x_input_pin_ref_get(sync_pin->id);
275 	ref = *zl3073x_ref_state_get(zldev, ref_id);
276 
277 	if (state == DPLL_PIN_STATE_CONNECTED) {
278 		const struct zl3073x_ref *sync_ref;
279 		u32 ref_freq, sync_freq;
280 
281 		sync_ref = zl3073x_ref_state_get(zldev, sync_ref_id);
282 		ref_freq = zl3073x_ref_freq_get(&ref);
283 		sync_freq = zl3073x_ref_freq_get(sync_ref);
284 
285 		/* Sync signal must be 8 kHz or less and clock reference
286 		 * must be 1 kHz or more and higher than the sync signal.
287 		 */
288 		if (sync_freq > 8000) {
289 			NL_SET_ERR_MSG(extack,
290 				       "sync frequency must be 8 kHz or less");
291 			rc = -EINVAL;
292 			goto unlock;
293 		}
294 		if (ref_freq < 1000) {
295 			NL_SET_ERR_MSG(extack,
296 				       "clock frequency must be 1 kHz or more");
297 			rc = -EINVAL;
298 			goto unlock;
299 		}
300 		if (ref_freq <= sync_freq) {
301 			NL_SET_ERR_MSG(extack,
302 				       "clock frequency must be higher than sync frequency");
303 			rc = -EINVAL;
304 			goto unlock;
305 		}
306 
307 		zl3073x_ref_sync_pair_set(&ref, sync_ref_id);
308 		mode = ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR;
309 	} else {
310 		mode = ZL_REF_SYNC_CTRL_MODE_REFSYNC_PAIR_OFF;
311 	}
312 
313 	zl3073x_ref_sync_mode_set(&ref, mode);
314 
315 	rc = zl3073x_ref_state_set(zldev, ref_id, &ref);
316 	if (rc)
317 		goto unlock;
318 
319 	/* All code paths accessing per-channel reference priorities are
320 	 * serialized by the subsystem dpll_lock, so it is safe to release
321 	 * our lock here before iterating over the other channels.
322 	 */
323 	mutex_unlock(&zldpll->lock);
324 
325 	if (state != DPLL_PIN_STATE_CONNECTED)
326 		return 0;
327 
328 	/* The datasheet recommends excluding the sync source from automatic
329 	 * reference selection by setting its priority to NONE on all DPLL
330 	 * channels. This is advisory - the ref sync pair is already
331 	 * configured, so a failure here is not fatal. On disconnect the
332 	 * priority is left as NONE and the user must explicitly make the
333 	 * pin selectable again.
334 	 */
335 	list_for_each_entry(zldpll, &zldev->dplls, list) {
336 		u8 prio;
337 
338 		mutex_lock(&zldpll->lock);
339 
340 		chan = *zl3073x_chan_state_get(zldev, zldpll->id);
341 		prio = zl3073x_chan_ref_prio_get(&chan, sync_ref_id);
342 		if (prio == ZL_DPLL_REF_PRIO_NONE) {
343 			mutex_unlock(&zldpll->lock);
344 			continue; /* Ref is already non-selectable */
345 		}
346 
347 		zl3073x_chan_ref_prio_set(&chan, sync_ref_id,
348 					  ZL_DPLL_REF_PRIO_NONE);
349 		if (zl3073x_chan_state_set(zldev, zldpll->id, &chan))
350 			dev_warn(zldev->dev,
351 				 "Failed to set ref prio on DPLL%u\n",
352 				 zldpll->id);
353 		else
354 			sync_ntf = true;
355 
356 		mutex_unlock(&zldpll->lock);
357 	}
358 	if (sync_ntf)
359 		__dpll_pin_change_ntf(sync_pin->dpll_pin);
360 
361 	return 0;
362 unlock:
363 	mutex_unlock(&zldpll->lock);
364 	return rc;
365 }
366 
367 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,struct dpll_ffo_param * ffo,struct netlink_ext_ack * extack)368 zl3073x_dpll_input_pin_ffo_get(const struct dpll_pin *dpll_pin, void *pin_priv,
369 			       const struct dpll_device *dpll, void *dpll_priv,
370 			       struct dpll_ffo_param *ffo,
371 			       struct netlink_ext_ack *extack)
372 {
373 	struct zl3073x_dpll *zldpll = dpll_priv;
374 	struct zl3073x_dpll_pin *pin = pin_priv;
375 
376 	guard(mutex)(&zldpll->lock);
377 
378 	if (pin->operstate != DPLL_PIN_OPERSTATE_ACTIVE)
379 		return -ENODATA;
380 
381 	ffo->ffo = pin->freq_offset;
382 
383 	return 0;
384 }
385 
386 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)387 zl3073x_dpll_input_pin_measured_freq_get(const struct dpll_pin *dpll_pin,
388 					 void *pin_priv,
389 					 const struct dpll_device *dpll,
390 					 void *dpll_priv, u64 *measured_freq,
391 					 struct netlink_ext_ack *extack)
392 {
393 	struct zl3073x_dpll *zldpll = dpll_priv;
394 	struct zl3073x_dpll_pin *pin = pin_priv;
395 
396 	guard(mutex)(&zldpll->lock);
397 
398 	*measured_freq = pin->measured_freq;
399 	*measured_freq *= DPLL_PIN_MEASURED_FREQUENCY_DIVIDER;
400 
401 	return 0;
402 }
403 
404 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)405 zl3073x_dpll_input_pin_frequency_get(const struct dpll_pin *dpll_pin,
406 				     void *pin_priv,
407 				     const struct dpll_device *dpll,
408 				     void *dpll_priv, u64 *frequency,
409 				     struct netlink_ext_ack *extack)
410 {
411 	struct zl3073x_dpll *zldpll = dpll_priv;
412 	struct zl3073x_dpll_pin *pin = pin_priv;
413 	u8 ref_id;
414 
415 	guard(mutex)(&zldpll->lock);
416 
417 	ref_id = zl3073x_input_pin_ref_get(pin->id);
418 	*frequency = zl3073x_dev_ref_freq_get(zldpll->dev, ref_id);
419 
420 	return 0;
421 }
422 
423 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)424 zl3073x_dpll_input_pin_frequency_set(const struct dpll_pin *dpll_pin,
425 				     void *pin_priv,
426 				     const struct dpll_device *dpll,
427 				     void *dpll_priv, u64 frequency,
428 				     struct netlink_ext_ack *extack)
429 {
430 	struct zl3073x_dpll *zldpll = dpll_priv;
431 	struct zl3073x_dev *zldev = zldpll->dev;
432 	struct zl3073x_dpll_pin *pin = pin_priv;
433 	struct zl3073x_ref ref;
434 	u8 ref_id;
435 
436 	guard(mutex)(&zldpll->lock);
437 
438 	/* Get reference state */
439 	ref_id = zl3073x_input_pin_ref_get(pin->id);
440 	ref = *zl3073x_ref_state_get(zldev, ref_id);
441 
442 	/* Update frequency */
443 	zl3073x_ref_freq_set(&ref, frequency);
444 
445 	/* Commit reference state */
446 	return zl3073x_ref_state_set(zldev, ref_id, &ref);
447 }
448 
449 /**
450  * zl3073x_dpll_connected_ref_get - get currently connected reference
451  * @zldpll: pointer to zl3073x_dpll
452  *
453  * Looks for currently connected reference the DPLL is locked to.
454  *
455  * Return: reference index if locked, ZL3073X_DPLL_REF_NONE otherwise
456  */
457 static u8
zl3073x_dpll_connected_ref_get(struct zl3073x_dpll * zldpll)458 zl3073x_dpll_connected_ref_get(struct zl3073x_dpll *zldpll)
459 {
460 	const struct zl3073x_chan *chan = zl3073x_chan_state_get(zldpll->dev,
461 								 zldpll->id);
462 	u8 state;
463 
464 	/* A reference is connected only when the DPLL is locked to it */
465 	state = zl3073x_chan_refsel_state_get(chan);
466 	if (state == ZL_DPLL_REFSEL_STATUS_STATE_LOCK)
467 		return zl3073x_chan_refsel_ref_get(chan);
468 
469 	return ZL3073X_DPLL_REF_NONE;
470 }
471 
472 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)473 zl3073x_dpll_input_pin_phase_offset_get(const struct dpll_pin *dpll_pin,
474 					void *pin_priv,
475 					const struct dpll_device *dpll,
476 					void *dpll_priv, s64 *phase_offset,
477 					struct netlink_ext_ack *extack)
478 {
479 	struct zl3073x_dpll *zldpll = dpll_priv;
480 	struct zl3073x_dev *zldev = zldpll->dev;
481 	struct zl3073x_dpll_pin *pin = pin_priv;
482 	const struct zl3073x_ref *ref;
483 	u8 conn_id, ref_id;
484 	s64 ref_phase;
485 
486 	guard(mutex)(&zldpll->lock);
487 
488 	/* Get currently connected reference */
489 	conn_id = zl3073x_dpll_connected_ref_get(zldpll);
490 
491 	/* Report phase offset only for currently connected pin if the phase
492 	 * monitor feature is disabled and only if the input pin signal is
493 	 * present.
494 	 */
495 	ref_id = zl3073x_input_pin_ref_get(pin->id);
496 	ref = zl3073x_ref_state_get(zldev, ref_id);
497 	if ((!zldpll->phase_monitor && ref_id != conn_id) ||
498 	    !zl3073x_ref_is_status_ok(ref)) {
499 		*phase_offset = 0;
500 		return 0;
501 	}
502 
503 	ref_phase = pin->phase_offset;
504 
505 	/* The DPLL being locked to a higher freq than the current ref
506 	 * the phase offset is modded to the period of the signal
507 	 * the dpll is locked to.
508 	 */
509 	if (ZL3073X_DPLL_REF_IS_VALID(conn_id) && conn_id != ref_id) {
510 		u32 conn_freq, ref_freq;
511 
512 		/* Get frequency of connected and given ref */
513 		conn_freq = zl3073x_dev_ref_freq_get(zldev, conn_id);
514 		ref_freq = zl3073x_ref_freq_get(ref);
515 
516 		if (conn_freq > ref_freq) {
517 			s64 conn_period, div_factor;
518 
519 			conn_period = div_s64(PSEC_PER_SEC, conn_freq);
520 			div_factor = div64_s64(ref_phase, conn_period);
521 			ref_phase -= conn_period * div_factor;
522 		}
523 	}
524 
525 	*phase_offset = ref_phase * DPLL_PHASE_OFFSET_DIVIDER;
526 
527 	return 0;
528 }
529 
530 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)531 zl3073x_dpll_input_pin_phase_adjust_get(const struct dpll_pin *dpll_pin,
532 					void *pin_priv,
533 					const struct dpll_device *dpll,
534 					void *dpll_priv,
535 					s32 *phase_adjust,
536 					struct netlink_ext_ack *extack)
537 {
538 	struct zl3073x_dpll *zldpll = dpll_priv;
539 	struct zl3073x_dev *zldev = zldpll->dev;
540 	struct zl3073x_dpll_pin *pin = pin_priv;
541 	const struct zl3073x_ref *ref;
542 	s64 phase_comp;
543 	u8 ref_id;
544 
545 	guard(mutex)(&zldpll->lock);
546 
547 	/* Read reference configuration */
548 	ref_id = zl3073x_input_pin_ref_get(pin->id);
549 	ref = zl3073x_ref_state_get(zldev, ref_id);
550 
551 	/* Perform sign extension based on register width */
552 	if (zl3073x_dev_is_ref_phase_comp_32bit(zldev))
553 		phase_comp = sign_extend64(ref->phase_comp, 31);
554 	else
555 		phase_comp = sign_extend64(ref->phase_comp, 47);
556 
557 	/* Reverse two's complement negation applied during set and convert
558 	 * to 32bit signed int
559 	 */
560 	*phase_adjust = (s32)-phase_comp;
561 
562 	return 0;
563 }
564 
565 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)566 zl3073x_dpll_input_pin_phase_adjust_set(const struct dpll_pin *dpll_pin,
567 					void *pin_priv,
568 					const struct dpll_device *dpll,
569 					void *dpll_priv,
570 					s32 phase_adjust,
571 					struct netlink_ext_ack *extack)
572 {
573 	struct zl3073x_dpll *zldpll = dpll_priv;
574 	struct zl3073x_dev *zldev = zldpll->dev;
575 	struct zl3073x_dpll_pin *pin = pin_priv;
576 	struct zl3073x_ref ref;
577 	u8 ref_id;
578 
579 	guard(mutex)(&zldpll->lock);
580 
581 	/* Read reference configuration */
582 	ref_id = zl3073x_input_pin_ref_get(pin->id);
583 	ref = *zl3073x_ref_state_get(zldev, ref_id);
584 
585 	/* The value in the register is stored as two's complement negation
586 	 * of requested value.
587 	 */
588 	ref.phase_comp = -phase_adjust;
589 
590 	/* Update reference configuration */
591 	return zl3073x_ref_state_set(zldev, ref_id, &ref);
592 }
593 
594 /**
595  * zl3073x_dpll_ref_operstate_get - get operational state for input pin
596  * @pin: pointer to pin
597  * @operstate: place to store operational state
598  *
599  * Returns the actual hardware state of the pin: whether it is actively
600  * used by the DPLL, has no signal, failed qualification, or is simply
601  * not in use.
602  *
603  * Return: 0 on success, <0 on error
604  */
605 static int
zl3073x_dpll_ref_operstate_get(struct zl3073x_dpll_pin * pin,enum dpll_pin_operstate * operstate)606 zl3073x_dpll_ref_operstate_get(struct zl3073x_dpll_pin *pin,
607 			       enum dpll_pin_operstate *operstate)
608 {
609 	struct zl3073x_dpll *zldpll = pin->dpll;
610 	struct zl3073x_dev *zldev = zldpll->dev;
611 	const struct zl3073x_ref *ref;
612 	u8 ref_id;
613 
614 	lockdep_assert_held(&zldpll->lock);
615 
616 	ref_id = zl3073x_input_pin_ref_get(pin->id);
617 
618 	/* Check if this pin is the currently locked reference */
619 	if (ref_id == zl3073x_dpll_connected_ref_get(zldpll)) {
620 		*operstate = DPLL_PIN_OPERSTATE_ACTIVE;
621 		return 0;
622 	}
623 
624 	/* Check reference monitor status */
625 	ref = zl3073x_ref_state_get(zldev, ref_id);
626 	if (ref->mon_status & ZL_REF_MON_STATUS_LOS)
627 		*operstate = DPLL_PIN_OPERSTATE_NO_SIGNAL;
628 	else if (!zl3073x_ref_is_status_ok(ref))
629 		*operstate = DPLL_PIN_OPERSTATE_QUAL_FAILED;
630 	else
631 		*operstate = DPLL_PIN_OPERSTATE_STANDBY;
632 
633 	return 0;
634 }
635 
636 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)637 zl3073x_dpll_input_pin_state_on_dpll_get(const struct dpll_pin *dpll_pin,
638 					 void *pin_priv,
639 					 const struct dpll_device *dpll,
640 					 void *dpll_priv,
641 					 enum dpll_pin_state *state,
642 					 struct netlink_ext_ack *extack)
643 {
644 	struct zl3073x_dpll *zldpll = dpll_priv;
645 	struct zl3073x_dpll_pin *pin = pin_priv;
646 	const struct zl3073x_chan *chan;
647 	u8 mode, ref;
648 
649 	guard(mutex)(&zldpll->lock);
650 
651 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
652 	ref = zl3073x_input_pin_ref_get(pin->id);
653 	mode = zl3073x_chan_mode_get(chan);
654 
655 	switch (mode) {
656 	case ZL_DPLL_MODE_REFSEL_MODE_REFLOCK:
657 		if (ref == zl3073x_chan_ref_get(chan))
658 			*state = DPLL_PIN_STATE_CONNECTED;
659 		else
660 			*state = DPLL_PIN_STATE_DISCONNECTED;
661 		break;
662 	case ZL_DPLL_MODE_REFSEL_MODE_AUTO:
663 		if (zl3073x_chan_ref_is_selectable(chan, ref))
664 			*state = DPLL_PIN_STATE_SELECTABLE;
665 		else
666 			*state = DPLL_PIN_STATE_DISCONNECTED;
667 		break;
668 	default:
669 		*state = DPLL_PIN_STATE_DISCONNECTED;
670 		break;
671 	}
672 
673 	return 0;
674 }
675 
676 static int
zl3073x_dpll_input_pin_operstate_on_dpll_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,enum dpll_pin_operstate * operstate,struct netlink_ext_ack * extack)677 zl3073x_dpll_input_pin_operstate_on_dpll_get(const struct dpll_pin *dpll_pin,
678 					     void *pin_priv,
679 					     const struct dpll_device *dpll,
680 					     void *dpll_priv,
681 					     enum dpll_pin_operstate *operstate,
682 					     struct netlink_ext_ack *extack)
683 {
684 	struct zl3073x_dpll *zldpll = dpll_priv;
685 	struct zl3073x_dpll_pin *pin = pin_priv;
686 
687 	guard(mutex)(&zldpll->lock);
688 
689 	return zl3073x_dpll_ref_operstate_get(pin, operstate);
690 }
691 
692 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)693 zl3073x_dpll_input_pin_state_on_dpll_set(const struct dpll_pin *dpll_pin,
694 					 void *pin_priv,
695 					 const struct dpll_device *dpll,
696 					 void *dpll_priv,
697 					 enum dpll_pin_state state,
698 					 struct netlink_ext_ack *extack)
699 {
700 	struct zl3073x_dpll *zldpll = dpll_priv;
701 	struct zl3073x_dpll_pin *pin = pin_priv;
702 	struct zl3073x_dpll_pin *nco_pin = NULL;
703 	struct zl3073x_chan chan;
704 	u8 mode, ref;
705 	int rc = 0;
706 
707 	mutex_lock(&zldpll->lock);
708 
709 	chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
710 	ref = zl3073x_input_pin_ref_get(pin->id);
711 	mode = zl3073x_chan_mode_get(&chan);
712 
713 	switch (mode) {
714 	case ZL_DPLL_MODE_REFSEL_MODE_REFLOCK:
715 		if (state == DPLL_PIN_STATE_CONNECTED) {
716 			/* Choose the pin as new selected reference */
717 			zl3073x_chan_ref_set(&chan, ref);
718 		} else if (state == DPLL_PIN_STATE_DISCONNECTED) {
719 			/* Choose new mode based on lock status */
720 			switch (zldpll->lock_status) {
721 			case DPLL_LOCK_STATUS_LOCKED_HO_ACQ:
722 			case DPLL_LOCK_STATUS_HOLDOVER:
723 				mode = ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER;
724 				break;
725 			default:
726 				mode = ZL_DPLL_MODE_REFSEL_MODE_FREERUN;
727 				break;
728 			}
729 			zl3073x_chan_mode_set(&chan, mode);
730 		} else {
731 			goto invalid_state;
732 		}
733 		break;
734 	case ZL_DPLL_MODE_REFSEL_MODE_NCO:
735 		if (state == DPLL_PIN_STATE_CONNECTED)
736 			nco_pin = zl3073x_dpll_nco_pin_get(zldpll);
737 		fallthrough;
738 	case ZL_DPLL_MODE_REFSEL_MODE_FREERUN:
739 	case ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER:
740 		if (state == DPLL_PIN_STATE_CONNECTED) {
741 			/* Choose the pin as new selected reference */
742 			zl3073x_chan_ref_set(&chan, ref);
743 			/* Switch to reflock mode */
744 			zl3073x_chan_mode_set(&chan,
745 					      ZL_DPLL_MODE_REFSEL_MODE_REFLOCK);
746 		} else if (state != DPLL_PIN_STATE_DISCONNECTED) {
747 			goto invalid_state;
748 		}
749 		break;
750 	case ZL_DPLL_MODE_REFSEL_MODE_AUTO:
751 		if (state == DPLL_PIN_STATE_SELECTABLE) {
752 			if (zl3073x_chan_ref_is_selectable(&chan, ref))
753 				goto unlock; /* Pin is already selectable */
754 
755 			/* Restore pin priority in HW */
756 			zl3073x_chan_ref_prio_set(&chan, ref, pin->prio);
757 		} else if (state == DPLL_PIN_STATE_DISCONNECTED) {
758 			if (!zl3073x_chan_ref_is_selectable(&chan, ref))
759 				goto unlock; /* Pin is already disconnected */
760 
761 			/* Set pin priority to none in HW */
762 			zl3073x_chan_ref_prio_set(&chan, ref,
763 						  ZL_DPLL_REF_PRIO_NONE);
764 		} else {
765 			goto invalid_state;
766 		}
767 		break;
768 	default:
769 		/* In other modes we cannot change input reference */
770 		NL_SET_ERR_MSG(extack,
771 			       "Pin state cannot be changed in current mode");
772 		rc = -EOPNOTSUPP;
773 		goto unlock;
774 	}
775 
776 	/* Commit DPLL channel changes */
777 	rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
778 	goto unlock;
779 
780 invalid_state:
781 	NL_SET_ERR_MSG_MOD(extack, "Invalid pin state for this device mode");
782 	rc = -EINVAL;
783 unlock:
784 	mutex_unlock(&zldpll->lock);
785 
786 	/* If leaving NCO mode, notify userspace about the NCO pin
787 	 * state change - the periodic worker skips the NCO pin.
788 	 */
789 	if (!rc && nco_pin)
790 		__dpll_pin_change_ntf(nco_pin->dpll_pin);
791 
792 	return rc;
793 }
794 
795 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)796 zl3073x_dpll_input_pin_prio_get(const struct dpll_pin *dpll_pin, void *pin_priv,
797 				const struct dpll_device *dpll, void *dpll_priv,
798 				u32 *prio, struct netlink_ext_ack *extack)
799 {
800 	struct zl3073x_dpll *zldpll = dpll_priv;
801 	struct zl3073x_dpll_pin *pin = pin_priv;
802 
803 	guard(mutex)(&zldpll->lock);
804 
805 	*prio = pin->prio;
806 
807 	return 0;
808 }
809 
810 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)811 zl3073x_dpll_input_pin_prio_set(const struct dpll_pin *dpll_pin, void *pin_priv,
812 				const struct dpll_device *dpll, void *dpll_priv,
813 				u32 prio, struct netlink_ext_ack *extack)
814 {
815 	struct zl3073x_dpll *zldpll = dpll_priv;
816 	struct zl3073x_dpll_pin *pin = pin_priv;
817 	struct zl3073x_chan chan;
818 	u8 ref;
819 	int rc;
820 
821 	guard(mutex)(&zldpll->lock);
822 
823 	if (prio > ZL_DPLL_REF_PRIO_MAX)
824 		return -EINVAL;
825 
826 	/* If the pin is selectable then update HW registers */
827 	chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
828 	ref = zl3073x_input_pin_ref_get(pin->id);
829 	if (zl3073x_chan_ref_is_selectable(&chan, ref)) {
830 		zl3073x_chan_ref_prio_set(&chan, ref, prio);
831 		rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
832 		if (rc)
833 			return rc;
834 	}
835 
836 	/* Save priority */
837 	pin->prio = prio;
838 
839 	return 0;
840 }
841 
842 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)843 zl3073x_dpll_output_pin_esync_get(const struct dpll_pin *dpll_pin,
844 				  void *pin_priv,
845 				  const struct dpll_device *dpll,
846 				  void *dpll_priv,
847 				  struct dpll_pin_esync *esync,
848 				  struct netlink_ext_ack *extack)
849 {
850 	struct zl3073x_dpll *zldpll = dpll_priv;
851 	struct zl3073x_dev *zldev = zldpll->dev;
852 	struct zl3073x_dpll_pin *pin = pin_priv;
853 	const struct zl3073x_synth *synth;
854 	const struct zl3073x_out *out;
855 	u32 synth_freq, out_freq;
856 	u8 out_id;
857 
858 	guard(mutex)(&zldpll->lock);
859 
860 	out_id = zl3073x_output_pin_out_get(pin->id);
861 	out = zl3073x_out_state_get(zldev, out_id);
862 
863 	/* If N-division is enabled, esync is not supported. The register used
864 	 * for N-division is also used for the esync divider so both cannot
865 	 * be used.
866 	 */
867 	if (zl3073x_out_is_ndiv(out))
868 		return -EOPNOTSUPP;
869 
870 	/* Get attached synth frequency */
871 	synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(out));
872 	synth_freq = zl3073x_synth_freq_get(synth);
873 	out_freq = synth_freq / out->div;
874 
875 	if (!pin->esync_control || out_freq <= 1)
876 		return -EOPNOTSUPP;
877 
878 	esync->range = esync_freq_ranges;
879 	esync->range_num = ARRAY_SIZE(esync_freq_ranges);
880 
881 	if (zl3073x_out_clock_type_get(out) != ZL_OUTPUT_MODE_CLOCK_TYPE_ESYNC) {
882 		/* No need to read esync data if it is not enabled */
883 		esync->freq = 0;
884 		esync->pulse = 0;
885 
886 		return 0;
887 	}
888 
889 	/* Compute esync frequency */
890 	esync->freq = out_freq / out->esync_n_period;
891 
892 	/* By comparing the esync_pulse_width to the half of the pulse width
893 	 * the esync pulse percentage can be determined.
894 	 * Note that half pulse width is in units of half synth cycles, which
895 	 * is why it reduces down to be output_div.
896 	 */
897 	esync->pulse = (50 * out->esync_n_width) / out->div;
898 
899 	return 0;
900 }
901 
902 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)903 zl3073x_dpll_output_pin_esync_set(const struct dpll_pin *dpll_pin,
904 				  void *pin_priv,
905 				  const struct dpll_device *dpll,
906 				  void *dpll_priv, u64 freq,
907 				  struct netlink_ext_ack *extack)
908 {
909 	struct zl3073x_dpll *zldpll = dpll_priv;
910 	struct zl3073x_dev *zldev = zldpll->dev;
911 	struct zl3073x_dpll_pin *pin = pin_priv;
912 	const struct zl3073x_synth *synth;
913 	struct zl3073x_out out;
914 	u32 synth_freq;
915 	u8 out_id;
916 
917 	guard(mutex)(&zldpll->lock);
918 
919 	out_id = zl3073x_output_pin_out_get(pin->id);
920 	out = *zl3073x_out_state_get(zldev, out_id);
921 
922 	/* If N-division is enabled, esync is not supported. The register used
923 	 * for N-division is also used for the esync divider so both cannot
924 	 * be used.
925 	 */
926 	if (zl3073x_out_is_ndiv(&out))
927 		return -EOPNOTSUPP;
928 
929 	/* Update clock type in output mode */
930 	if (freq)
931 		zl3073x_out_clock_type_set(&out,
932 					   ZL_OUTPUT_MODE_CLOCK_TYPE_ESYNC);
933 	else
934 		zl3073x_out_clock_type_set(&out,
935 					   ZL_OUTPUT_MODE_CLOCK_TYPE_NORMAL);
936 
937 	/* If esync is being disabled just write mailbox and finish */
938 	if (!freq)
939 		return zl3073x_out_state_set(zldev, out_id, &out);
940 
941 	/* Get attached synth frequency */
942 	synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(&out));
943 	synth_freq = zl3073x_synth_freq_get(synth);
944 
945 	/* Compute and update esync period */
946 	out.esync_n_period = synth_freq / (u32)freq / out.div;
947 
948 	/* Half of the period in units of 1/2 synth cycle can be represented by
949 	 * the output_div. To get the supported esync pulse width of 25% of the
950 	 * period the output_div can just be divided by 2. Note that this
951 	 * assumes that output_div is even, otherwise some resolution will be
952 	 * lost.
953 	 */
954 	out.esync_n_width = out.div / 2;
955 
956 	/* Commit output configuration */
957 	return zl3073x_out_state_set(zldev, out_id, &out);
958 }
959 
960 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)961 zl3073x_dpll_output_pin_frequency_get(const struct dpll_pin *dpll_pin,
962 				      void *pin_priv,
963 				      const struct dpll_device *dpll,
964 				      void *dpll_priv, u64 *frequency,
965 				      struct netlink_ext_ack *extack)
966 {
967 	struct zl3073x_dpll *zldpll = dpll_priv;
968 	struct zl3073x_dpll_pin *pin = pin_priv;
969 
970 	guard(mutex)(&zldpll->lock);
971 
972 	*frequency = zl3073x_dev_output_pin_freq_get(zldpll->dev, pin->id);
973 
974 	return 0;
975 }
976 
977 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)978 zl3073x_dpll_output_pin_frequency_set(const struct dpll_pin *dpll_pin,
979 				      void *pin_priv,
980 				      const struct dpll_device *dpll,
981 				      void *dpll_priv, u64 frequency,
982 				      struct netlink_ext_ack *extack)
983 {
984 	struct zl3073x_dpll *zldpll = dpll_priv;
985 	struct zl3073x_dev *zldev = zldpll->dev;
986 	struct zl3073x_dpll_pin *pin = pin_priv;
987 	const struct zl3073x_synth *synth;
988 	u32 new_div, synth_freq;
989 	struct zl3073x_out out;
990 	u8 out_id;
991 
992 	guard(mutex)(&zldpll->lock);
993 
994 	out_id = zl3073x_output_pin_out_get(pin->id);
995 	out = *zl3073x_out_state_get(zldev, out_id);
996 
997 	/* Get attached synth frequency and compute new divisor */
998 	synth = zl3073x_synth_state_get(zldev, zl3073x_out_synth_get(&out));
999 	synth_freq = zl3073x_synth_freq_get(synth);
1000 	new_div = synth_freq / (u32)frequency;
1001 
1002 	/* Check signal format */
1003 	if (!zl3073x_out_is_ndiv(&out)) {
1004 		/* For non N-divided signal formats the frequency is computed
1005 		 * as division of synth frequency and output divisor.
1006 		 */
1007 		out.div = new_div;
1008 
1009 		/* For 50/50 duty cycle the divisor is equal to width */
1010 		out.width = new_div;
1011 
1012 		/* Commit output configuration */
1013 		return zl3073x_out_state_set(zldev, out_id, &out);
1014 	}
1015 
1016 	if (zl3073x_dpll_is_p_pin(pin)) {
1017 		/* We are going to change output frequency for P-pin but
1018 		 * if the requested frequency is less than current N-pin
1019 		 * frequency then indicate a failure as we are not able
1020 		 * to compute N-pin divisor to keep its frequency unchanged.
1021 		 *
1022 		 * Update divisor for N-pin to keep N-pin frequency.
1023 		 */
1024 		out.esync_n_period = (out.esync_n_period * out.div) / new_div;
1025 		if (!out.esync_n_period)
1026 			return -EINVAL;
1027 
1028 		/* Update the output divisor */
1029 		out.div = new_div;
1030 
1031 		/* For 50/50 duty cycle the divisor is equal to width */
1032 		out.width = out.div;
1033 	} else {
1034 		/* We are going to change frequency of N-pin but if
1035 		 * the requested freq is greater or equal than freq of P-pin
1036 		 * in the output pair we cannot compute divisor for the N-pin.
1037 		 * In this case indicate a failure.
1038 		 *
1039 		 * Update divisor for N-pin
1040 		 */
1041 		out.esync_n_period = div64_u64(synth_freq, frequency * out.div);
1042 		if (!out.esync_n_period)
1043 			return -EINVAL;
1044 	}
1045 
1046 	/* For 50/50 duty cycle the divisor is equal to width */
1047 	out.esync_n_width = out.esync_n_period;
1048 
1049 	/* Commit output configuration */
1050 	return zl3073x_out_state_set(zldev, out_id, &out);
1051 }
1052 
1053 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)1054 zl3073x_dpll_output_pin_phase_adjust_get(const struct dpll_pin *dpll_pin,
1055 					 void *pin_priv,
1056 					 const struct dpll_device *dpll,
1057 					 void *dpll_priv,
1058 					 s32 *phase_adjust,
1059 					 struct netlink_ext_ack *extack)
1060 {
1061 	struct zl3073x_dpll *zldpll = dpll_priv;
1062 	struct zl3073x_dev *zldev = zldpll->dev;
1063 	struct zl3073x_dpll_pin *pin = pin_priv;
1064 	const struct zl3073x_out *out;
1065 	u8 out_id;
1066 
1067 	guard(mutex)(&zldpll->lock);
1068 
1069 	out_id = zl3073x_output_pin_out_get(pin->id);
1070 	out = zl3073x_out_state_get(zldev, out_id);
1071 
1072 	/* The value in the register is expressed in half synth clock cycles. */
1073 	*phase_adjust = out->phase_comp * pin->phase_gran;
1074 
1075 	return 0;
1076 }
1077 
1078 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)1079 zl3073x_dpll_output_pin_phase_adjust_set(const struct dpll_pin *dpll_pin,
1080 					 void *pin_priv,
1081 					 const struct dpll_device *dpll,
1082 					 void *dpll_priv,
1083 					 s32 phase_adjust,
1084 					 struct netlink_ext_ack *extack)
1085 {
1086 	struct zl3073x_dpll *zldpll = dpll_priv;
1087 	struct zl3073x_dev *zldev = zldpll->dev;
1088 	struct zl3073x_dpll_pin *pin = pin_priv;
1089 	struct zl3073x_out out;
1090 	u8 out_id;
1091 
1092 	guard(mutex)(&zldpll->lock);
1093 
1094 	out_id = zl3073x_output_pin_out_get(pin->id);
1095 	out = *zl3073x_out_state_get(zldev, out_id);
1096 
1097 	/* The value in the register is expressed in half synth clock cycles. */
1098 	out.phase_comp = phase_adjust / pin->phase_gran;
1099 
1100 	/* Update output configuration from mailbox */
1101 	return zl3073x_out_state_set(zldev, out_id, &out);
1102 }
1103 
1104 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)1105 zl3073x_dpll_output_pin_state_on_dpll_get(const struct dpll_pin *dpll_pin,
1106 					  void *pin_priv,
1107 					  const struct dpll_device *dpll,
1108 					  void *dpll_priv,
1109 					  enum dpll_pin_state *state,
1110 					  struct netlink_ext_ack *extack)
1111 {
1112 	/* If the output pin is registered then it is always connected */
1113 	*state = DPLL_PIN_STATE_CONNECTED;
1114 
1115 	return 0;
1116 }
1117 
1118 static int
zl3073x_dpll_nco_pin_operstate_on_dpll_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,enum dpll_pin_operstate * operstate,struct netlink_ext_ack * extack)1119 zl3073x_dpll_nco_pin_operstate_on_dpll_get(const struct dpll_pin *dpll_pin,
1120 					   void *pin_priv,
1121 					   const struct dpll_device *dpll,
1122 					   void *dpll_priv,
1123 					   enum dpll_pin_operstate *operstate,
1124 					   struct netlink_ext_ack *extack)
1125 {
1126 	struct zl3073x_dpll *zldpll = dpll_priv;
1127 	const struct zl3073x_chan *chan;
1128 
1129 	guard(mutex)(&zldpll->lock);
1130 
1131 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1132 	if (zl3073x_chan_mode_is_nco(chan))
1133 		*operstate = DPLL_PIN_OPERSTATE_ACTIVE;
1134 	else
1135 		*operstate = DPLL_PIN_OPERSTATE_STANDBY;
1136 
1137 	return 0;
1138 }
1139 
1140 static int
zl3073x_dpll_nco_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)1141 zl3073x_dpll_nco_pin_state_on_dpll_get(const struct dpll_pin *dpll_pin,
1142 				       void *pin_priv,
1143 				       const struct dpll_device *dpll,
1144 				       void *dpll_priv,
1145 				       enum dpll_pin_state *state,
1146 				       struct netlink_ext_ack *extack)
1147 {
1148 	struct zl3073x_dpll *zldpll = dpll_priv;
1149 	const struct zl3073x_chan *chan;
1150 
1151 	guard(mutex)(&zldpll->lock);
1152 
1153 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1154 	if (zl3073x_chan_mode_is_nco(chan))
1155 		*state = DPLL_PIN_STATE_CONNECTED;
1156 	else
1157 		*state = DPLL_PIN_STATE_DISCONNECTED;
1158 
1159 	return 0;
1160 }
1161 
1162 static int
zl3073x_dpll_nco_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)1163 zl3073x_dpll_nco_pin_state_on_dpll_set(const struct dpll_pin *dpll_pin,
1164 				       void *pin_priv,
1165 				       const struct dpll_device *dpll,
1166 				       void *dpll_priv,
1167 				       enum dpll_pin_state state,
1168 				       struct netlink_ext_ack *extack)
1169 {
1170 	struct zl3073x_dpll_pin *ref_pin = NULL;
1171 	struct zl3073x_dpll *zldpll = dpll_priv;
1172 	struct zl3073x_chan chan;
1173 	u8 ref;
1174 	int rc;
1175 
1176 	mutex_lock(&zldpll->lock);
1177 
1178 	chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1179 
1180 	switch (state) {
1181 	case DPLL_PIN_STATE_CONNECTED:
1182 		if (zl3073x_chan_mode_is_nco(&chan)) {
1183 			mutex_unlock(&zldpll->lock);
1184 			return 0;
1185 		}
1186 		if (zl3073x_chan_mode_is_auto(&chan)) {
1187 			NL_SET_ERR_MSG(extack,
1188 				       "NCO pin cannot be connected in automatic mode");
1189 			mutex_unlock(&zldpll->lock);
1190 			return -EINVAL;
1191 		}
1192 		if (zl3073x_chan_mode_is_reflock(&chan)) {
1193 			/* Get currently connected pin */
1194 			ref = zl3073x_chan_ref_get(&chan);
1195 			ref_pin = zl3073x_dpll_pin_get_by_ref(zldpll, ref);
1196 		}
1197 		rc = zl3073x_chan_nco_mode_set(zldpll->dev, zldpll->id);
1198 		break;
1199 	case DPLL_PIN_STATE_DISCONNECTED:
1200 		if (!zl3073x_chan_mode_is_nco(&chan)) {
1201 			mutex_unlock(&zldpll->lock);
1202 			return 0;
1203 		}
1204 		/* Switch to freerun - holdover averaging was not
1205 		 * updated during NCO mode.
1206 		 */
1207 		zl3073x_chan_mode_set(&chan,
1208 				      ZL_DPLL_MODE_REFSEL_MODE_FREERUN);
1209 		rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
1210 		break;
1211 	default:
1212 		NL_SET_ERR_MSG(extack, "invalid pin state for NCO pin");
1213 		mutex_unlock(&zldpll->lock);
1214 		return -EINVAL;
1215 	}
1216 
1217 	mutex_unlock(&zldpll->lock);
1218 
1219 	if (!rc && ref_pin)
1220 		__dpll_pin_change_ntf(ref_pin->dpll_pin);
1221 
1222 	return rc;
1223 }
1224 
1225 static int
zl3073x_dpll_nco_pin_ffo_get(const struct dpll_pin * dpll_pin,void * pin_priv,const struct dpll_device * dpll,void * dpll_priv,struct dpll_ffo_param * ffo,struct netlink_ext_ack * extack)1226 zl3073x_dpll_nco_pin_ffo_get(const struct dpll_pin *dpll_pin, void *pin_priv,
1227 			     const struct dpll_device *dpll, void *dpll_priv,
1228 			     struct dpll_ffo_param *ffo,
1229 			     struct netlink_ext_ack *extack)
1230 {
1231 	struct zl3073x_dpll *zldpll = dpll_priv;
1232 	const struct zl3073x_chan *chan;
1233 	s64 df_offset;
1234 
1235 	guard(mutex)(&zldpll->lock);
1236 
1237 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1238 	if (!zl3073x_chan_mode_is_nco(chan))
1239 		return -ENODATA;
1240 
1241 	/* Do not report FFO if a failure occurred during switching to NCO. */
1242 	df_offset = zl3073x_chan_df_offset_get(chan);
1243 	if (df_offset == ZL_DPLL_DF_OFFSET_UNKNOWN)
1244 		return -ENODATA;
1245 
1246 	/* dpll_df_offset register has inverted sign per datasheet:
1247 	 * f_offset = f_nom * (-df_offset) / 2^48
1248 	 * NCO pin reports DPLL output offset from nominal, so negate.
1249 	 * Convert to PPT: ppt = -df * 5^12 / 2^36
1250 	 */
1251 	ffo->ffo = -mul_s64_u64_shr(df_offset, 244140625, 36);
1252 
1253 	return 0;
1254 }
1255 
1256 static int
zl3073x_dpll_temp_get(const struct dpll_device * dpll,void * dpll_priv,s32 * temp,struct netlink_ext_ack * extack)1257 zl3073x_dpll_temp_get(const struct dpll_device *dpll, void *dpll_priv,
1258 		      s32 *temp, struct netlink_ext_ack *extack)
1259 {
1260 	struct zl3073x_dpll *zldpll = dpll_priv;
1261 	struct zl3073x_dev *zldev = zldpll->dev;
1262 	u16 val;
1263 	int rc;
1264 
1265 	guard(mutex)(&zldpll->lock);
1266 
1267 	rc = zl3073x_read_u16(zldev, ZL_REG_DIE_TEMP_STATUS, &val);
1268 	if (rc)
1269 		return rc;
1270 
1271 	/* Register value is in units of 0.1 C, convert to millidegrees */
1272 	*temp = (s16)val * 100;
1273 
1274 	return 0;
1275 }
1276 
1277 static int
__zl3073x_dpll_lock_status_get(struct zl3073x_dpll * zldpll,enum dpll_lock_status * status)1278 __zl3073x_dpll_lock_status_get(struct zl3073x_dpll *zldpll,
1279 			       enum dpll_lock_status *status)
1280 {
1281 	const struct zl3073x_chan *chan;
1282 
1283 	lockdep_assert_held(&zldpll->lock);
1284 
1285 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1286 
1287 	switch (zl3073x_chan_mode_get(chan)) {
1288 	case ZL_DPLL_MODE_REFSEL_MODE_FREERUN:
1289 	case ZL_DPLL_MODE_REFSEL_MODE_NCO:
1290 		/* In FREERUN and NCO modes the DPLL is always unlocked */
1291 		*status = DPLL_LOCK_STATUS_UNLOCKED;
1292 
1293 		return 0;
1294 	default:
1295 		break;
1296 	}
1297 
1298 	switch (zl3073x_chan_lock_state_get(chan)) {
1299 	case ZL_DPLL_MON_STATUS_STATE_LOCK:
1300 		if (zl3073x_chan_is_ho_ready(chan))
1301 			*status = DPLL_LOCK_STATUS_LOCKED_HO_ACQ;
1302 		else
1303 			*status = DPLL_LOCK_STATUS_LOCKED;
1304 		break;
1305 	case ZL_DPLL_MON_STATUS_STATE_HOLDOVER:
1306 	case ZL_DPLL_MON_STATUS_STATE_ACQUIRING:
1307 		*status = DPLL_LOCK_STATUS_HOLDOVER;
1308 		break;
1309 	default:
1310 		dev_warn(zldpll->dev->dev,
1311 			 "Unknown DPLL monitor status: 0x%02x\n",
1312 			 chan->mon_status);
1313 		*status = DPLL_LOCK_STATUS_UNLOCKED;
1314 		break;
1315 	}
1316 
1317 	return 0;
1318 }
1319 
1320 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)1321 zl3073x_dpll_lock_status_get(const struct dpll_device *dpll, void *dpll_priv,
1322 			     enum dpll_lock_status *status,
1323 			     enum dpll_lock_status_error *status_error,
1324 			     struct netlink_ext_ack *extack)
1325 {
1326 	struct zl3073x_dpll *zldpll = dpll_priv;
1327 
1328 	guard(mutex)(&zldpll->lock);
1329 
1330 	return __zl3073x_dpll_lock_status_get(zldpll, status);
1331 }
1332 
1333 static int
zl3073x_dpll_supported_modes_get(const struct dpll_device * dpll,void * dpll_priv,unsigned long * modes,struct netlink_ext_ack * extack)1334 zl3073x_dpll_supported_modes_get(const struct dpll_device *dpll,
1335 				 void *dpll_priv, unsigned long *modes,
1336 				 struct netlink_ext_ack *extack)
1337 {
1338 	__set_bit(DPLL_MODE_AUTOMATIC, modes);
1339 	__set_bit(DPLL_MODE_MANUAL, modes);
1340 
1341 	return 0;
1342 }
1343 
1344 static int
zl3073x_dpll_mode_get(const struct dpll_device * dpll,void * dpll_priv,enum dpll_mode * mode,struct netlink_ext_ack * extack)1345 zl3073x_dpll_mode_get(const struct dpll_device *dpll, void *dpll_priv,
1346 		      enum dpll_mode *mode, struct netlink_ext_ack *extack)
1347 {
1348 	struct zl3073x_dpll *zldpll = dpll_priv;
1349 	const struct zl3073x_chan *chan;
1350 
1351 	guard(mutex)(&zldpll->lock);
1352 
1353 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1354 
1355 	switch (zl3073x_chan_mode_get(chan)) {
1356 	case ZL_DPLL_MODE_REFSEL_MODE_FREERUN:
1357 	case ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER:
1358 	case ZL_DPLL_MODE_REFSEL_MODE_NCO:
1359 	case ZL_DPLL_MODE_REFSEL_MODE_REFLOCK:
1360 		/* Use MANUAL for device FREERUN, HOLDOVER, NCO and
1361 		 * REFLOCK modes
1362 		 */
1363 		*mode = DPLL_MODE_MANUAL;
1364 		break;
1365 	case ZL_DPLL_MODE_REFSEL_MODE_AUTO:
1366 		/* Use AUTO for device AUTO mode */
1367 		*mode = DPLL_MODE_AUTOMATIC;
1368 		break;
1369 	default:
1370 		return -EINVAL;
1371 	}
1372 
1373 	return 0;
1374 }
1375 
1376 static int
zl3073x_dpll_phase_offset_avg_factor_get(const struct dpll_device * dpll,void * dpll_priv,u32 * factor,struct netlink_ext_ack * extack)1377 zl3073x_dpll_phase_offset_avg_factor_get(const struct dpll_device *dpll,
1378 					 void *dpll_priv, u32 *factor,
1379 					 struct netlink_ext_ack *extack)
1380 {
1381 	struct zl3073x_dpll *zldpll = dpll_priv;
1382 
1383 	*factor = zl3073x_dev_phase_avg_factor_get(zldpll->dev);
1384 
1385 	return 0;
1386 }
1387 
1388 static int
zl3073x_dpll_phase_offset_avg_factor_set(const struct dpll_device * dpll,void * dpll_priv,u32 factor,struct netlink_ext_ack * extack)1389 zl3073x_dpll_phase_offset_avg_factor_set(const struct dpll_device *dpll,
1390 					 void *dpll_priv, u32 factor,
1391 					 struct netlink_ext_ack *extack)
1392 {
1393 	struct zl3073x_dpll *item, *zldpll = dpll_priv;
1394 	int rc;
1395 
1396 	if (factor > 15) {
1397 		NL_SET_ERR_MSG_FMT(extack,
1398 				   "Phase offset average factor has to be from range <0,15>");
1399 		return -EINVAL;
1400 	}
1401 
1402 	rc = zl3073x_dev_phase_avg_factor_set(zldpll->dev, factor);
1403 	if (rc) {
1404 		NL_SET_ERR_MSG_FMT(extack,
1405 				   "Failed to set phase offset averaging factor");
1406 		return rc;
1407 	}
1408 
1409 	/* The averaging factor is common for all DPLL channels so after
1410 	 * change we have to send a notification for other DPLL devices.
1411 	 */
1412 	list_for_each_entry(item, &zldpll->dev->dplls, list) {
1413 		struct dpll_device *dpll_dev = READ_ONCE(item->dpll_dev);
1414 
1415 		if (item != zldpll && dpll_dev)
1416 			__dpll_device_change_ntf(dpll_dev);
1417 	}
1418 
1419 	return 0;
1420 }
1421 
1422 static int
zl3073x_dpll_mode_set(const struct dpll_device * dpll,void * dpll_priv,enum dpll_mode mode,struct netlink_ext_ack * extack)1423 zl3073x_dpll_mode_set(const struct dpll_device *dpll, void *dpll_priv,
1424 		      enum dpll_mode mode, struct netlink_ext_ack *extack)
1425 {
1426 	struct zl3073x_dpll *zldpll = dpll_priv;
1427 	struct zl3073x_dpll_pin *nco_pin = NULL;
1428 	struct zl3073x_chan chan;
1429 	u8 hw_mode, ref;
1430 	int rc;
1431 
1432 	mutex_lock(&zldpll->lock);
1433 
1434 	chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1435 	ref = zl3073x_chan_refsel_ref_get(&chan);
1436 
1437 	if (mode == DPLL_MODE_MANUAL) {
1438 		/* We are switching from automatic to manual mode:
1439 		 * - if we have a valid reference selected during auto mode then
1440 		 *   we will switch to forced reference lock mode and use this
1441 		 *   reference for selection
1442 		 * - if NO valid reference is selected, we will switch to forced
1443 		 *   holdover mode or freerun mode, depending on the current
1444 		 *   lock status
1445 		 */
1446 		if (ZL3073X_DPLL_REF_IS_VALID(ref))
1447 			hw_mode = ZL_DPLL_MODE_REFSEL_MODE_REFLOCK;
1448 		else if (zldpll->lock_status == DPLL_LOCK_STATUS_UNLOCKED)
1449 			hw_mode = ZL_DPLL_MODE_REFSEL_MODE_FREERUN;
1450 		else
1451 			hw_mode = ZL_DPLL_MODE_REFSEL_MODE_HOLDOVER;
1452 	} else {
1453 		if (zl3073x_chan_mode_is_nco(&chan))
1454 			nco_pin = zl3073x_dpll_nco_pin_get(zldpll);
1455 
1456 		/* We are switching from manual to automatic mode:
1457 		 * - if there is a valid reference selected then ensure that
1458 		 *   it is selectable after switch to automatic mode
1459 		 * - switch to automatic mode
1460 		 */
1461 		if (ZL3073X_DPLL_REF_IS_VALID(ref) &&
1462 		    !zl3073x_chan_ref_is_selectable(&chan, ref)) {
1463 			struct zl3073x_dpll_pin *pin;
1464 
1465 			pin = zl3073x_dpll_pin_get_by_ref(zldpll, ref);
1466 			if (pin) {
1467 				/* Restore pin priority in HW */
1468 				zl3073x_chan_ref_prio_set(&chan, ref,
1469 							  pin->prio);
1470 			}
1471 		}
1472 
1473 		hw_mode = ZL_DPLL_MODE_REFSEL_MODE_AUTO;
1474 	}
1475 
1476 	zl3073x_chan_mode_set(&chan, hw_mode);
1477 	if (ZL3073X_DPLL_REF_IS_VALID(ref))
1478 		zl3073x_chan_ref_set(&chan, ref);
1479 
1480 	rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
1481 	if (rc) {
1482 		NL_SET_ERR_MSG_MOD(extack,
1483 				   "failed to set reference selection mode");
1484 		mutex_unlock(&zldpll->lock);
1485 		return rc;
1486 	}
1487 
1488 	mutex_unlock(&zldpll->lock);
1489 
1490 	/* If leaving NCO mode, notify userspace about the NCO pin
1491 	 * state change - the periodic worker skips the NCO pin.
1492 	 */
1493 	if (nco_pin)
1494 		__dpll_pin_change_ntf(nco_pin->dpll_pin);
1495 
1496 	return 0;
1497 }
1498 
1499 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)1500 zl3073x_dpll_phase_offset_monitor_get(const struct dpll_device *dpll,
1501 				      void *dpll_priv,
1502 				      enum dpll_feature_state *state,
1503 				      struct netlink_ext_ack *extack)
1504 {
1505 	struct zl3073x_dpll *zldpll = dpll_priv;
1506 
1507 	guard(mutex)(&zldpll->lock);
1508 
1509 	if (zldpll->phase_monitor)
1510 		*state = DPLL_FEATURE_STATE_ENABLE;
1511 	else
1512 		*state = DPLL_FEATURE_STATE_DISABLE;
1513 
1514 	return 0;
1515 }
1516 
1517 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)1518 zl3073x_dpll_phase_offset_monitor_set(const struct dpll_device *dpll,
1519 				      void *dpll_priv,
1520 				      enum dpll_feature_state state,
1521 				      struct netlink_ext_ack *extack)
1522 {
1523 	struct zl3073x_dpll *zldpll = dpll_priv;
1524 
1525 	guard(mutex)(&zldpll->lock);
1526 
1527 	zldpll->phase_monitor = (state == DPLL_FEATURE_STATE_ENABLE);
1528 
1529 	return 0;
1530 }
1531 
1532 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)1533 zl3073x_dpll_freq_monitor_get(const struct dpll_device *dpll,
1534 			      void *dpll_priv,
1535 			      enum dpll_feature_state *state,
1536 			      struct netlink_ext_ack *extack)
1537 {
1538 	struct zl3073x_dpll *zldpll = dpll_priv;
1539 
1540 	if (READ_ONCE(zldpll->dev->freq_monitor))
1541 		*state = DPLL_FEATURE_STATE_ENABLE;
1542 	else
1543 		*state = DPLL_FEATURE_STATE_DISABLE;
1544 
1545 	return 0;
1546 }
1547 
1548 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)1549 zl3073x_dpll_freq_monitor_set(const struct dpll_device *dpll,
1550 			      void *dpll_priv,
1551 			      enum dpll_feature_state state,
1552 			      struct netlink_ext_ack *extack)
1553 {
1554 	struct zl3073x_dpll *item, *zldpll = dpll_priv;
1555 	struct zl3073x_dev *zldev = zldpll->dev;
1556 
1557 	WRITE_ONCE(zldev->freq_monitor, state == DPLL_FEATURE_STATE_ENABLE);
1558 
1559 	/* The frequency monitoring is common for all DPLL channels so after
1560 	 * change we have to send a notification for other DPLL devices.
1561 	 */
1562 	list_for_each_entry(item, &zldev->dplls, list) {
1563 		struct dpll_device *dpll_dev = READ_ONCE(item->dpll_dev);
1564 
1565 		if (item != zldpll && dpll_dev)
1566 			__dpll_device_change_ntf(dpll_dev);
1567 	}
1568 
1569 	return 0;
1570 }
1571 
1572 static const struct dpll_pin_ops zl3073x_dpll_input_pin_ops = {
1573 	.supported_ffo = BIT(DPLL_FFO_PIN_DEVICE),
1574 	.direction_get = zl3073x_dpll_pin_direction_get,
1575 	.esync_get = zl3073x_dpll_input_pin_esync_get,
1576 	.esync_set = zl3073x_dpll_input_pin_esync_set,
1577 	.ffo_get = zl3073x_dpll_input_pin_ffo_get,
1578 	.frequency_get = zl3073x_dpll_input_pin_frequency_get,
1579 	.frequency_set = zl3073x_dpll_input_pin_frequency_set,
1580 	.measured_freq_get = zl3073x_dpll_input_pin_measured_freq_get,
1581 	.operstate_on_dpll_get = zl3073x_dpll_input_pin_operstate_on_dpll_get,
1582 	.phase_offset_get = zl3073x_dpll_input_pin_phase_offset_get,
1583 	.phase_adjust_get = zl3073x_dpll_input_pin_phase_adjust_get,
1584 	.phase_adjust_set = zl3073x_dpll_input_pin_phase_adjust_set,
1585 	.prio_get = zl3073x_dpll_input_pin_prio_get,
1586 	.prio_set = zl3073x_dpll_input_pin_prio_set,
1587 	.ref_sync_get = zl3073x_dpll_input_pin_ref_sync_get,
1588 	.ref_sync_set = zl3073x_dpll_input_pin_ref_sync_set,
1589 	.state_on_dpll_get = zl3073x_dpll_input_pin_state_on_dpll_get,
1590 	.state_on_dpll_set = zl3073x_dpll_input_pin_state_on_dpll_set,
1591 };
1592 
1593 static const struct dpll_pin_ops zl3073x_dpll_output_pin_ops = {
1594 	.direction_get = zl3073x_dpll_pin_direction_get,
1595 	.esync_get = zl3073x_dpll_output_pin_esync_get,
1596 	.esync_set = zl3073x_dpll_output_pin_esync_set,
1597 	.frequency_get = zl3073x_dpll_output_pin_frequency_get,
1598 	.frequency_set = zl3073x_dpll_output_pin_frequency_set,
1599 	.phase_adjust_get = zl3073x_dpll_output_pin_phase_adjust_get,
1600 	.phase_adjust_set = zl3073x_dpll_output_pin_phase_adjust_set,
1601 	.state_on_dpll_get = zl3073x_dpll_output_pin_state_on_dpll_get,
1602 };
1603 
1604 static const struct dpll_pin_ops zl3073x_dpll_nco_pin_ops = {
1605 	.supported_ffo = BIT(DPLL_FFO_PIN_DEVICE),
1606 	.direction_get = zl3073x_dpll_pin_direction_get,
1607 	.ffo_get = zl3073x_dpll_nco_pin_ffo_get,
1608 	.operstate_on_dpll_get = zl3073x_dpll_nco_pin_operstate_on_dpll_get,
1609 	.state_on_dpll_get = zl3073x_dpll_nco_pin_state_on_dpll_get,
1610 	.state_on_dpll_set = zl3073x_dpll_nco_pin_state_on_dpll_set,
1611 };
1612 
1613 static const struct dpll_device_ops zl3073x_dpll_device_ops = {
1614 	.lock_status_get = zl3073x_dpll_lock_status_get,
1615 	.mode_get = zl3073x_dpll_mode_get,
1616 	.mode_set = zl3073x_dpll_mode_set,
1617 	.phase_offset_avg_factor_get = zl3073x_dpll_phase_offset_avg_factor_get,
1618 	.phase_offset_avg_factor_set = zl3073x_dpll_phase_offset_avg_factor_set,
1619 	.phase_offset_monitor_get = zl3073x_dpll_phase_offset_monitor_get,
1620 	.phase_offset_monitor_set = zl3073x_dpll_phase_offset_monitor_set,
1621 	.freq_monitor_get = zl3073x_dpll_freq_monitor_get,
1622 	.freq_monitor_set = zl3073x_dpll_freq_monitor_set,
1623 	.supported_modes_get = zl3073x_dpll_supported_modes_get,
1624 };
1625 
1626 /**
1627  * zl3073x_dpll_pin_alloc - allocate DPLL pin
1628  * @zldpll: pointer to zl3073x_dpll
1629  * @dir: pin direction
1630  * @id: pin id
1631  *
1632  * Allocates and initializes zl3073x_dpll_pin structure for given
1633  * pin id and direction.
1634  *
1635  * Return: pointer to allocated structure on success, error pointer on error
1636  */
1637 static struct zl3073x_dpll_pin *
zl3073x_dpll_pin_alloc(struct zl3073x_dpll * zldpll,enum dpll_pin_direction dir,u8 id)1638 zl3073x_dpll_pin_alloc(struct zl3073x_dpll *zldpll, enum dpll_pin_direction dir,
1639 		       u8 id)
1640 {
1641 	struct zl3073x_dpll_pin *pin;
1642 
1643 	pin = kzalloc_obj(*pin);
1644 	if (!pin)
1645 		return ERR_PTR(-ENOMEM);
1646 
1647 	pin->dpll = zldpll;
1648 	pin->dir = dir;
1649 	pin->id = id;
1650 
1651 	return pin;
1652 }
1653 
1654 /**
1655  * zl3073x_dpll_pin_free - deallocate DPLL pin
1656  * @pin: pin to free
1657  *
1658  * Deallocates DPLL pin previously allocated by @zl3073x_dpll_pin_alloc.
1659  */
1660 static void
zl3073x_dpll_pin_free(struct zl3073x_dpll_pin * pin)1661 zl3073x_dpll_pin_free(struct zl3073x_dpll_pin *pin)
1662 {
1663 	WARN(pin->dpll_pin, "DPLL pin is still registered\n");
1664 
1665 	kfree(pin);
1666 }
1667 
1668 /**
1669  * zl3073x_dpll_pin_register - register DPLL pin
1670  * @pin: pointer to DPLL pin
1671  * @index: absolute pin index for registration
1672  *
1673  * Registers given DPLL pin into DPLL sub-system.
1674  *
1675  * Return: 0 on success, <0 on error
1676  */
1677 static int
zl3073x_dpll_pin_register(struct zl3073x_dpll_pin * pin,u32 index)1678 zl3073x_dpll_pin_register(struct zl3073x_dpll_pin *pin, u32 index)
1679 {
1680 	struct zl3073x_dpll *zldpll = pin->dpll;
1681 	struct zl3073x_pin_props *props;
1682 	const struct dpll_pin_ops *ops;
1683 	int rc;
1684 
1685 	/* Get pin properties */
1686 	props = zl3073x_pin_props_get(zldpll->dev, pin->dir, pin->id);
1687 	if (IS_ERR(props))
1688 		return PTR_ERR(props);
1689 
1690 	/* Save package label, fwnode, esync capability and phase adjust
1691 	 * granularity.
1692 	 */
1693 	strscpy(pin->label, props->package_label);
1694 	pin->fwnode = fwnode_handle_get(props->fwnode);
1695 	pin->esync_control = props->esync_control;
1696 	pin->phase_gran = props->dpll_props.phase_gran;
1697 
1698 	if (zl3073x_dpll_is_input_pin(pin)) {
1699 		const struct zl3073x_chan *chan;
1700 		u8 ref;
1701 
1702 		chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1703 		ref = zl3073x_input_pin_ref_get(pin->id);
1704 		pin->prio = zl3073x_chan_ref_prio_get(chan, ref);
1705 
1706 		if (pin->prio == ZL_DPLL_REF_PRIO_NONE)
1707 			/* Clamp prio to max value */
1708 			pin->prio = ZL_DPLL_REF_PRIO_MAX;
1709 	}
1710 
1711 	/* Create or get existing DPLL pin */
1712 	pin->dpll_pin = dpll_pin_get(zldpll->dev->clock_id, index, THIS_MODULE,
1713 				     &props->dpll_props, &pin->tracker);
1714 	if (IS_ERR(pin->dpll_pin)) {
1715 		rc = PTR_ERR(pin->dpll_pin);
1716 		goto err_pin_get;
1717 	}
1718 	dpll_pin_fwnode_set(pin->dpll_pin, props->fwnode);
1719 
1720 	if (zl3073x_dpll_is_input_pin(pin))
1721 		ops = &zl3073x_dpll_input_pin_ops;
1722 	else
1723 		ops = &zl3073x_dpll_output_pin_ops;
1724 
1725 	/* Register the pin */
1726 	rc = dpll_pin_register(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
1727 	if (rc)
1728 		goto err_register;
1729 
1730 	/* Free pin properties */
1731 	zl3073x_pin_props_put(props);
1732 
1733 	return 0;
1734 
1735 err_register:
1736 	dpll_pin_put(pin->dpll_pin, &pin->tracker);
1737 err_pin_get:
1738 	pin->dpll_pin = NULL;
1739 	fwnode_handle_put(pin->fwnode);
1740 	pin->fwnode = NULL;
1741 	zl3073x_pin_props_put(props);
1742 
1743 	return rc;
1744 }
1745 
1746 /**
1747  * zl3073x_dpll_pin_unregister - unregister DPLL pin
1748  * @pin: pointer to DPLL pin
1749  *
1750  * Unregisters pin previously registered by @zl3073x_dpll_pin_register.
1751  */
1752 static void
zl3073x_dpll_pin_unregister(struct zl3073x_dpll_pin * pin)1753 zl3073x_dpll_pin_unregister(struct zl3073x_dpll_pin *pin)
1754 {
1755 	struct zl3073x_dpll *zldpll = pin->dpll;
1756 	const struct dpll_pin_ops *ops;
1757 
1758 	WARN(!pin->dpll_pin, "DPLL pin is not registered\n");
1759 
1760 	if (zl3073x_dpll_is_nco_pin(pin))
1761 		ops = &zl3073x_dpll_nco_pin_ops;
1762 	else if (zl3073x_dpll_is_input_pin(pin))
1763 		ops = &zl3073x_dpll_input_pin_ops;
1764 	else
1765 		ops = &zl3073x_dpll_output_pin_ops;
1766 
1767 	/* Unregister the pin */
1768 	dpll_pin_unregister(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
1769 
1770 	dpll_pin_put(pin->dpll_pin, &pin->tracker);
1771 	pin->dpll_pin = NULL;
1772 
1773 	fwnode_handle_put(pin->fwnode);
1774 	pin->fwnode = NULL;
1775 }
1776 
1777 /**
1778  * zl3073x_dpll_pins_unregister - unregister all registered DPLL pins
1779  * @zldpll: pointer to zl3073x_dpll structure
1780  *
1781  * Enumerates all DPLL pins registered to given DPLL device and
1782  * unregisters them.
1783  */
1784 static void
zl3073x_dpll_pins_unregister(struct zl3073x_dpll * zldpll)1785 zl3073x_dpll_pins_unregister(struct zl3073x_dpll *zldpll)
1786 {
1787 	struct zl3073x_dpll_pin *pin, *next;
1788 
1789 	list_for_each_entry_safe(pin, next, &zldpll->pins, list) {
1790 		zl3073x_dpll_pin_unregister(pin);
1791 		list_del(&pin->list);
1792 		zl3073x_dpll_pin_free(pin);
1793 	}
1794 }
1795 
1796 /**
1797  * zl3073x_dpll_pin_is_registrable - check if the pin is registrable
1798  * @zldpll: pointer to zl3073x_dpll structure
1799  * @dir: pin direction
1800  * @index: pin index
1801  *
1802  * Checks if the given pin can be registered to given DPLL. For both
1803  * directions the pin can be registered if it is enabled. In case of
1804  * differential signal type only P-pin is reported as registrable.
1805  * And additionally for the output pin, the pin can be registered only
1806  * if it is connected to synthesizer that is driven by given DPLL.
1807  *
1808  * Return: true if the pin is registrable, false if not
1809  */
1810 static bool
zl3073x_dpll_pin_is_registrable(struct zl3073x_dpll * zldpll,enum dpll_pin_direction dir,u8 index)1811 zl3073x_dpll_pin_is_registrable(struct zl3073x_dpll *zldpll,
1812 				enum dpll_pin_direction dir, u8 index)
1813 {
1814 	struct zl3073x_dev *zldev = zldpll->dev;
1815 	bool is_diff, is_enabled;
1816 	const char *name;
1817 
1818 	if (dir == DPLL_PIN_DIRECTION_INPUT) {
1819 		u8 ref_id = zl3073x_input_pin_ref_get(index);
1820 		const struct zl3073x_ref *ref;
1821 
1822 		name = "REF";
1823 		ref = zl3073x_ref_state_get(zldev, ref_id);
1824 		is_diff = zl3073x_ref_is_diff(ref);
1825 		is_enabled = zl3073x_ref_is_enabled(ref);
1826 	} else {
1827 		/* Output P&N pair shares single HW output */
1828 		u8 out = zl3073x_output_pin_out_get(index);
1829 
1830 		/* Skip the pin if it is connected to different DPLL channel */
1831 		if (zl3073x_dev_out_dpll_get(zldev, out) != zldpll->id) {
1832 			dev_dbg(zldev->dev,
1833 				"OUT%u is driven by different DPLL\n", out);
1834 
1835 			return false;
1836 		}
1837 
1838 		name = "OUT";
1839 		is_diff = zl3073x_dev_out_is_diff(zldev, out);
1840 		is_enabled = zl3073x_dev_output_pin_is_enabled(zldev, index);
1841 	}
1842 
1843 	/* Skip N-pin if the corresponding input/output is differential */
1844 	if (is_diff && zl3073x_is_n_pin(index)) {
1845 		dev_dbg(zldev->dev, "%s%u is differential, skipping N-pin\n",
1846 			name, index / 2);
1847 
1848 		return false;
1849 	}
1850 
1851 	/* Skip the pin if it is disabled */
1852 	if (!is_enabled) {
1853 		dev_dbg(zldev->dev, "%s%u%c is disabled\n", name, index / 2,
1854 			zl3073x_is_p_pin(index) ? 'P' : 'N');
1855 
1856 		return false;
1857 	}
1858 
1859 	return true;
1860 }
1861 
1862 static const struct dpll_pin_properties zl3073x_dpll_nco_pin_props = {
1863 	.type = DPLL_PIN_TYPE_INT_NCO,
1864 	.package_label = "NCO",
1865 	.capabilities = DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE,
1866 };
1867 
1868 static int
zl3073x_dpll_nco_pin_register(struct zl3073x_dpll * zldpll)1869 zl3073x_dpll_nco_pin_register(struct zl3073x_dpll *zldpll)
1870 {
1871 	struct zl3073x_dpll_pin *pin;
1872 	struct zl3073x_chan chan;
1873 	int rc;
1874 
1875 	/* Ensure that ctrl bits are configured for NCO operation:
1876 	 * - nco_auto_read: auto-capture tracking offset on NCO entry
1877 	 * - tod_step_reset: apply negated ToD step on NCO exit
1878 	 * - tie_clear: PPS DPLLs re-align outputs on NCO exit
1879 	 */
1880 	mutex_lock(&zldpll->lock);
1881 	chan = *zl3073x_chan_state_get(zldpll->dev, zldpll->id);
1882 	FIELD_MODIFY(ZL_DPLL_CTRL_NCO_AUTO_READ, &chan.ctrl, 1);
1883 	FIELD_MODIFY(ZL_DPLL_CTRL_TOD_STEP_RST, &chan.ctrl, 1);
1884 	FIELD_MODIFY(ZL_DPLL_CTRL_TIE_CLEAR, &chan.ctrl,
1885 		     zldpll->type == DPLL_TYPE_PPS ? 1 : 0);
1886 	rc = zl3073x_chan_state_set(zldpll->dev, zldpll->id, &chan);
1887 	mutex_unlock(&zldpll->lock);
1888 	if (rc)
1889 		return rc;
1890 
1891 	pin = zl3073x_dpll_pin_alloc(zldpll, DPLL_PIN_DIRECTION_INPUT,
1892 				     ZL3073X_NCO_PIN_ID);
1893 	if (IS_ERR(pin))
1894 		return PTR_ERR(pin);
1895 
1896 	pin->dpll_pin = dpll_pin_get(zldpll->dev->clock_id, ZL3073X_NCO_PIN_ID,
1897 				     THIS_MODULE, &zl3073x_dpll_nco_pin_props,
1898 				     &pin->tracker);
1899 	if (IS_ERR(pin->dpll_pin)) {
1900 		rc = PTR_ERR(pin->dpll_pin);
1901 		goto err_pin_get;
1902 	}
1903 
1904 	rc = dpll_pin_register(zldpll->dpll_dev, pin->dpll_pin,
1905 			       &zl3073x_dpll_nco_pin_ops, pin);
1906 	if (rc)
1907 		goto err_register;
1908 
1909 	list_add(&pin->list, &zldpll->pins);
1910 
1911 	return 0;
1912 
1913 err_register:
1914 	dpll_pin_put(pin->dpll_pin, &pin->tracker);
1915 err_pin_get:
1916 	pin->dpll_pin = NULL;
1917 	kfree(pin);
1918 
1919 	return rc;
1920 }
1921 
1922 /**
1923  * zl3073x_dpll_pins_register - register all registerable DPLL pins
1924  * @zldpll: pointer to zl3073x_dpll structure
1925  *
1926  * Enumerates all possible input/output pins and registers all of them
1927  * that are registrable.
1928  *
1929  * Return: 0 on success, <0 on error
1930  */
1931 static int
zl3073x_dpll_pins_register(struct zl3073x_dpll * zldpll)1932 zl3073x_dpll_pins_register(struct zl3073x_dpll *zldpll)
1933 {
1934 	struct zl3073x_dpll_pin *pin;
1935 	enum dpll_pin_direction dir;
1936 	u8 id, index;
1937 	int rc;
1938 
1939 	/* Process input pins */
1940 	for (index = 0; index < ZL3073X_NUM_PINS; index++) {
1941 		/* First input pins and then output pins */
1942 		if (index < ZL3073X_NUM_INPUT_PINS) {
1943 			id = index;
1944 			dir = DPLL_PIN_DIRECTION_INPUT;
1945 		} else {
1946 			id = index - ZL3073X_NUM_INPUT_PINS;
1947 			dir = DPLL_PIN_DIRECTION_OUTPUT;
1948 		}
1949 
1950 		/* Check if the pin registrable to this DPLL */
1951 		if (!zl3073x_dpll_pin_is_registrable(zldpll, dir, id))
1952 			continue;
1953 
1954 		pin = zl3073x_dpll_pin_alloc(zldpll, dir, id);
1955 		if (IS_ERR(pin)) {
1956 			rc = PTR_ERR(pin);
1957 			goto error;
1958 		}
1959 
1960 		rc = zl3073x_dpll_pin_register(pin, index);
1961 		if (rc) {
1962 			zl3073x_dpll_pin_free(pin);
1963 			goto error;
1964 		}
1965 
1966 		list_add(&pin->list, &zldpll->pins);
1967 	}
1968 
1969 	/* Register NCO virtual input pin */
1970 	rc = zl3073x_dpll_nco_pin_register(zldpll);
1971 	if (rc)
1972 		goto error;
1973 
1974 	return 0;
1975 
1976 error:
1977 	zl3073x_dpll_pins_unregister(zldpll);
1978 
1979 	return rc;
1980 }
1981 
1982 /**
1983  * zl3073x_dpll_device_register - register DPLL device
1984  * @zldpll: pointer to zl3073x_dpll structure
1985  *
1986  * Registers given DPLL device into DPLL sub-system.
1987  *
1988  * Return: 0 on success, <0 on error
1989  */
1990 static int
zl3073x_dpll_device_register(struct zl3073x_dpll * zldpll)1991 zl3073x_dpll_device_register(struct zl3073x_dpll *zldpll)
1992 {
1993 	struct zl3073x_dev *zldev = zldpll->dev;
1994 	int rc;
1995 
1996 	zldpll->ops = zl3073x_dpll_device_ops;
1997 	if (zldev->info->flags & ZL3073X_FLAG_DIE_TEMP)
1998 		zldpll->ops.temp_get = zl3073x_dpll_temp_get;
1999 
2000 	zldpll->dpll_dev = dpll_device_get(zldev->clock_id, zldpll->id,
2001 					   THIS_MODULE, &zldpll->tracker);
2002 	if (IS_ERR(zldpll->dpll_dev)) {
2003 		rc = PTR_ERR(zldpll->dpll_dev);
2004 		zldpll->dpll_dev = NULL;
2005 
2006 		return rc;
2007 	}
2008 
2009 	zldpll->type = zl3073x_prop_dpll_type_get(zldev, zldpll->id);
2010 	rc = dpll_device_register(zldpll->dpll_dev, zldpll->type,
2011 				  &zldpll->ops, zldpll);
2012 	if (rc) {
2013 		dpll_device_put(zldpll->dpll_dev, &zldpll->tracker);
2014 		zldpll->dpll_dev = NULL;
2015 	}
2016 
2017 	return rc;
2018 }
2019 
2020 /**
2021  * zl3073x_dpll_device_unregister - unregister DPLL device
2022  * @zldpll: pointer to zl3073x_dpll structure
2023  *
2024  * Unregisters given DPLL device from DPLL sub-system previously registered
2025  * by @zl3073x_dpll_device_register.
2026  */
2027 static void
zl3073x_dpll_device_unregister(struct zl3073x_dpll * zldpll)2028 zl3073x_dpll_device_unregister(struct zl3073x_dpll *zldpll)
2029 {
2030 	struct dpll_device *dpll_dev = READ_ONCE(zldpll->dpll_dev);
2031 
2032 	WARN(!dpll_dev, "DPLL device is not registered\n");
2033 
2034 	WRITE_ONCE(zldpll->dpll_dev, NULL);
2035 	dpll_device_unregister(dpll_dev, &zldpll->ops, zldpll);
2036 	dpll_device_put(dpll_dev, &zldpll->tracker);
2037 }
2038 
2039 /**
2040  * zl3073x_dpll_pin_phase_offset_check - check for pin phase offset change
2041  * @pin: pin to check
2042  *
2043  * Check for the change of DPLL to connected pin phase offset change.
2044  *
2045  * Return: true on phase offset change, false otherwise
2046  */
2047 static bool
zl3073x_dpll_pin_phase_offset_check(struct zl3073x_dpll_pin * pin)2048 zl3073x_dpll_pin_phase_offset_check(struct zl3073x_dpll_pin *pin)
2049 {
2050 	struct zl3073x_dpll *zldpll = pin->dpll;
2051 	struct zl3073x_dev *zldev = zldpll->dev;
2052 	unsigned int reg;
2053 	s64 phase_offset;
2054 	u8 ref_id;
2055 	int rc;
2056 
2057 	lockdep_assert_held(&zldpll->lock);
2058 
2059 	/* No phase offset if the ref monitor reports signal errors */
2060 	ref_id = zl3073x_input_pin_ref_get(pin->id);
2061 	if (!zl3073x_dev_ref_is_status_ok(zldev, ref_id))
2062 		return false;
2063 
2064 	/* Select register to read phase offset value depending on pin and
2065 	 * phase monitor state:
2066 	 * 1) For connected pin use dpll_phase_err_data register
2067 	 * 2) For other pins use appropriate ref_phase register if the phase
2068 	 *    monitor feature is enabled.
2069 	 */
2070 	if (pin->operstate == DPLL_PIN_OPERSTATE_ACTIVE)
2071 		reg = ZL_REG_DPLL_PHASE_ERR_DATA(zldpll->id);
2072 	else if (zldpll->phase_monitor)
2073 		reg = ZL_REG_REF_PHASE(ref_id);
2074 	else
2075 		return false;
2076 
2077 	/* Read measured phase offset value */
2078 	rc = zl3073x_read_u48(zldev, reg, &phase_offset);
2079 	if (rc) {
2080 		dev_err(zldev->dev, "Failed to read ref phase offset: %pe\n",
2081 			ERR_PTR(rc));
2082 
2083 		return false;
2084 	}
2085 
2086 	/* Convert to ps */
2087 	phase_offset = div_s64(sign_extend64(phase_offset, 47), 100);
2088 
2089 	/* Compare with previous value */
2090 	if (phase_offset != pin->phase_offset) {
2091 		dev_dbg(zldev->dev, "%s phase offset changed: %lld -> %lld\n",
2092 			pin->label, pin->phase_offset, phase_offset);
2093 		pin->phase_offset = phase_offset;
2094 
2095 		return true;
2096 	}
2097 
2098 	return false;
2099 }
2100 
2101 /**
2102  * zl3073x_dpll_pin_ffo_check - check for FFO change on active pin
2103  * @pin: pin to check
2104  *
2105  * Return: true on change, false otherwise
2106  */
2107 static bool
zl3073x_dpll_pin_ffo_check(struct zl3073x_dpll_pin * pin)2108 zl3073x_dpll_pin_ffo_check(struct zl3073x_dpll_pin *pin)
2109 {
2110 	struct zl3073x_dpll *zldpll = pin->dpll;
2111 	struct zl3073x_dev *zldev = zldpll->dev;
2112 	const struct zl3073x_chan *chan;
2113 	s64 ffo;
2114 
2115 	lockdep_assert_held(&zldpll->lock);
2116 
2117 	if (pin->operstate != DPLL_PIN_OPERSTATE_ACTIVE)
2118 		return false;
2119 
2120 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
2121 	if (zl3073x_chan_df_offset_get(chan) == ZL_DPLL_DF_OFFSET_UNKNOWN)
2122 		return false;
2123 
2124 	/* dpll_df_offset register has inverted sign per datasheet:
2125 	 * f_offset = f_nom * (-df_offset) / 2^48
2126 	 * Input pin FFO is pin-vs-DPLL (opposite of DPLL-vs-reference),
2127 	 * so the two inversions cancel out: ppt = df * 5^12 / 2^36
2128 	 */
2129 	ffo = mul_s64_u64_shr(zl3073x_chan_df_offset_get(chan),
2130 			      244140625, 36);
2131 
2132 	if (pin->freq_offset != ffo) {
2133 		dev_dbg(zldev->dev, "%s freq offset changed to: %lld\n",
2134 			pin->label, ffo);
2135 		pin->freq_offset = ffo;
2136 		return true;
2137 	}
2138 
2139 	return false;
2140 }
2141 
2142 /**
2143  * zl3073x_dpll_pin_measured_freq_check - check for pin measured frequency
2144  * change
2145  * @pin: pin to check
2146  *
2147  * Check for the given pin's measured frequency change.
2148  *
2149  * Return: true on measured frequency change, false otherwise
2150  */
2151 static bool
zl3073x_dpll_pin_measured_freq_check(struct zl3073x_dpll_pin * pin)2152 zl3073x_dpll_pin_measured_freq_check(struct zl3073x_dpll_pin *pin)
2153 {
2154 	struct zl3073x_dpll *zldpll = pin->dpll;
2155 	struct zl3073x_dev *zldev = zldpll->dev;
2156 	const struct zl3073x_ref *ref;
2157 	u8 ref_id;
2158 	u32 freq;
2159 
2160 	lockdep_assert_held(&zldpll->lock);
2161 
2162 	if (!READ_ONCE(zldpll->dev->freq_monitor))
2163 		return false;
2164 
2165 	ref_id = zl3073x_input_pin_ref_get(pin->id);
2166 	ref = zl3073x_ref_state_get(zldev, ref_id);
2167 
2168 	freq = zl3073x_ref_meas_freq_get(ref);
2169 	if (pin->measured_freq != freq) {
2170 		dev_dbg(zldev->dev, "%s measured freq changed: %u -> %u\n",
2171 			pin->label, pin->measured_freq, freq);
2172 		pin->measured_freq = freq;
2173 
2174 		return true;
2175 	}
2176 
2177 	return false;
2178 }
2179 
2180 /**
2181  * zl3073x_dpll_changes_check - check for changes and send notifications
2182  * @zldpll: pointer to zl3073x_dpll structure
2183  *
2184  * Checks for changes on given DPLL device and its registered DPLL pins
2185  * and sends notifications about them.
2186  *
2187  * This function is periodically called from @zl3073x_dev_periodic_work.
2188  */
2189 void
zl3073x_dpll_changes_check(struct zl3073x_dpll * zldpll)2190 zl3073x_dpll_changes_check(struct zl3073x_dpll *zldpll)
2191 {
2192 	DECLARE_BITMAP(changed_pins, ZL3073X_NUM_INPUT_PINS);
2193 	struct zl3073x_dev *zldev = zldpll->dev;
2194 	enum dpll_lock_status lock_status;
2195 	struct device *dev = zldev->dev;
2196 	struct zl3073x_dpll_pin *pin;
2197 	bool dev_changed = false;
2198 	int rc;
2199 
2200 	bitmap_zero(changed_pins, ZL3073X_NUM_INPUT_PINS);
2201 
2202 	mutex_lock(&zldpll->lock);
2203 
2204 	zldpll->check_count++;
2205 
2206 	rc = zl3073x_chan_state_update(zldev, zldpll->id);
2207 	if (rc) {
2208 		dev_err(dev, "Failed to get DPLL%u state: %pe\n",
2209 			zldpll->id, ERR_PTR(rc));
2210 		goto unlock;
2211 	}
2212 
2213 	rc = __zl3073x_dpll_lock_status_get(zldpll, &lock_status);
2214 	if (rc) {
2215 		dev_err(dev, "Failed to get DPLL%u lock status: %pe\n",
2216 			zldpll->id, ERR_PTR(rc));
2217 		goto unlock;
2218 	}
2219 
2220 	if (zldpll->lock_status != lock_status) {
2221 		zldpll->lock_status = lock_status;
2222 		dev_changed = true;
2223 	}
2224 
2225 	/* Update phase offset latch registers for this DPLL if the phase
2226 	 * offset monitor feature is enabled.
2227 	 */
2228 	if (zldpll->phase_monitor) {
2229 		rc = zl3073x_ref_phase_offsets_update(zldev, zldpll->id);
2230 		if (rc) {
2231 			dev_err(zldev->dev,
2232 				"Failed to update phase offsets: %pe\n",
2233 				ERR_PTR(rc));
2234 			goto unlock;
2235 		}
2236 	}
2237 
2238 	list_for_each_entry(pin, &zldpll->pins, list) {
2239 		enum dpll_pin_operstate operstate;
2240 
2241 		/* Only physical input pins need monitoring */
2242 		if (!zl3073x_dpll_is_input_pin(pin) ||
2243 		    zl3073x_dpll_is_nco_pin(pin))
2244 			continue;
2245 
2246 		rc = zl3073x_dpll_ref_operstate_get(pin, &operstate);
2247 		if (rc) {
2248 			dev_err(dev,
2249 				"Failed to get %s on DPLL%u oper state: %pe\n",
2250 				pin->label, zldpll->id, ERR_PTR(rc));
2251 			goto unlock;
2252 		}
2253 
2254 		if (operstate != pin->operstate) {
2255 			dev_dbg(dev, "%s oper state changed: %u->%u\n",
2256 				pin->label, pin->operstate, operstate);
2257 			pin->operstate = operstate;
2258 			set_bit(pin->id, changed_pins);
2259 		}
2260 
2261 		if (zldpll->check_count % 2 == 0) {
2262 			if (zl3073x_dpll_pin_phase_offset_check(pin))
2263 				set_bit(pin->id, changed_pins);
2264 
2265 			if (zl3073x_dpll_pin_ffo_check(pin))
2266 				set_bit(pin->id, changed_pins);
2267 
2268 			if (zl3073x_dpll_pin_measured_freq_check(pin))
2269 				set_bit(pin->id, changed_pins);
2270 		}
2271 	}
2272 
2273 unlock:
2274 	mutex_unlock(&zldpll->lock);
2275 
2276 	/* Send notifications outside the lock to avoid ABBA deadlock
2277 	 * with dpll_lock taken by notification functions.
2278 	 */
2279 	if (dev_changed)
2280 		dpll_device_change_ntf(zldpll->dpll_dev);
2281 
2282 	list_for_each_entry(pin, &zldpll->pins, list) {
2283 		if (zl3073x_dpll_is_input_pin(pin) &&
2284 		    !zl3073x_dpll_is_nco_pin(pin) &&
2285 		    test_bit(pin->id, changed_pins))
2286 			dpll_pin_change_ntf(pin->dpll_pin);
2287 	}
2288 }
2289 
2290 /**
2291  * zl3073x_dpll_init_fine_phase_adjust - do initial fine phase adjustments
2292  * @zldev: pointer to zl3073x device
2293  *
2294  * Performs initial fine phase adjustments needed per datasheet.
2295  *
2296  * Return: 0 on success, <0 on error
2297  */
2298 int
zl3073x_dpll_init_fine_phase_adjust(struct zl3073x_dev * zldev)2299 zl3073x_dpll_init_fine_phase_adjust(struct zl3073x_dev *zldev)
2300 {
2301 	int rc;
2302 
2303 	rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_MASK, 0x1f);
2304 	if (rc)
2305 		return rc;
2306 
2307 	rc = zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_INTVL, 0x01);
2308 	if (rc)
2309 		return rc;
2310 
2311 	rc = zl3073x_write_u16(zldev, ZL_REG_SYNTH_PHASE_SHIFT_DATA, 0xffff);
2312 	if (rc)
2313 		return rc;
2314 
2315 	return zl3073x_write_u8(zldev, ZL_REG_SYNTH_PHASE_SHIFT_CTRL, 0x01);
2316 }
2317 
2318 /* Maximum frequency adjustment: +-1% of nominal in ppb */
2319 #define ZL3073X_DPLL_PTP_MAX_ADJ	10000000
2320 
2321 /**
2322  * zl3073x_dpll_ptp_gettimex64 - read current time from ToD counters
2323  * @info: PTP clock info
2324  * @ts: timespec to store current time
2325  * @sts: optional system timestamp pair for cross-timestamping
2326  *
2327  * Return: 0 on success, <0 on error
2328  */
zl3073x_dpll_ptp_gettimex64(struct ptp_clock_info * info,struct timespec64 * ts,struct ptp_system_timestamp * sts)2329 static int zl3073x_dpll_ptp_gettimex64(struct ptp_clock_info *info,
2330 				       struct timespec64 *ts,
2331 				       struct ptp_system_timestamp *sts)
2332 {
2333 	struct zl3073x_dpll *zldpll = container_of(info, struct zl3073x_dpll,
2334 						   ptp_info);
2335 
2336 	guard(mutex)(&zldpll->lock);
2337 
2338 	return zl3073x_chan_tod_read(zldpll->dev, zldpll->id, false, ts, sts);
2339 }
2340 
2341 /**
2342  * zl3073x_dpll_ptp_settime64 - set ToD counters to given time
2343  * @info: PTP clock info
2344  * @ts: timespec with time to set
2345  *
2346  * Return: 0 on success, <0 on error
2347  */
zl3073x_dpll_ptp_settime64(struct ptp_clock_info * info,const struct timespec64 * ts)2348 static int zl3073x_dpll_ptp_settime64(struct ptp_clock_info *info,
2349 				      const struct timespec64 *ts)
2350 {
2351 	struct zl3073x_dpll *zldpll = container_of(info, struct zl3073x_dpll,
2352 						   ptp_info);
2353 
2354 	guard(mutex)(&zldpll->lock);
2355 
2356 	return zl3073x_chan_tod_write(zldpll->dev, zldpll->id, *ts);
2357 }
2358 
2359 /**
2360  * zl3073x_dpll_ptp_adjtime_phase_step - adjust sub-second time via phase step
2361  * @zldpll: DPLL channel
2362  * @delta: time adjustment in nanoseconds (must be within (-NSEC_PER_SEC,
2363  *         NSEC_PER_SEC))
2364  *
2365  * Uses the output phase step mechanism with tod_step=1 to adjust both
2366  * the output clock phase and the ToD counter simultaneously. This keeps
2367  * outputs and ToD coherent. Only valid for NCO.
2368  *
2369  * Outputs are grouped by synthesizer since the phase step value is in
2370  * synthesizer clock cycles. The first synth group with enabled outputs
2371  * uses tod_step to adjust both outputs and the ToD counter. Remaining
2372  * groups step outputs only. If no synth has enabled outputs, the ToD
2373  * counter is stepped alone using an empty output mask (the FW uses
2374  * the first enabled synth's period for the conversion).
2375  *
2376  * Return:
2377  * * %0			- success (or partial success if a later synth group
2378  *			  failed after the first was already stepped)
2379  * * %-EOPNOTSUPP	- no synths available
2380  * * negative		- error
2381  */
zl3073x_dpll_ptp_adjtime_phase_step(struct zl3073x_dpll * zldpll,s64 delta)2382 static int zl3073x_dpll_ptp_adjtime_phase_step(struct zl3073x_dpll *zldpll,
2383 					       s64 delta)
2384 {
2385 	u16 synth_mask[ZL3073X_NUM_SYNTHS] = {};
2386 	struct zl3073x_dev *zldev = zldpll->dev;
2387 	const struct zl3073x_synth *synth;
2388 	struct zl3073x_dpll_pin *pin;
2389 	u32 first_synth_freq = 0;
2390 	bool tod_stepped = false;
2391 	s32 step_cycles;
2392 	u32 synth_freq;
2393 	int rc;
2394 	u8 i;
2395 
2396 	/* Build per-synth output masks from registered output pins */
2397 	list_for_each_entry(pin, &zldpll->pins, list) {
2398 		u8 out_id, synth_id;
2399 
2400 		if (zl3073x_dpll_is_input_pin(pin))
2401 			continue;
2402 
2403 		out_id = zl3073x_output_pin_out_get(pin->id);
2404 
2405 		if (!zl3073x_dev_out_is_stepped(zldev, out_id))
2406 			continue;
2407 
2408 		synth_id = zl3073x_dev_out_synth_get(zldev, out_id);
2409 		if (synth_id >= ZL3073X_NUM_SYNTHS) {
2410 			dev_warn(zldev->dev, "Unexpected synth id for OUT%u\n",
2411 				 out_id);
2412 			continue;
2413 		}
2414 		synth_mask[synth_id] |= BIT(out_id);
2415 	}
2416 
2417 	/* Process each synth group */
2418 	for (i = 0; i < ZL3073X_NUM_SYNTHS; i++) {
2419 		synth = zl3073x_synth_state_get(zldev, i);
2420 		if (!zl3073x_synth_is_enabled(synth) ||
2421 		    zl3073x_synth_dpll_get(synth) != zldpll->id)
2422 			continue;
2423 
2424 		synth_freq = zl3073x_synth_freq_get(synth);
2425 
2426 		/* Remember first enabled synth freq for ToD-only fallback */
2427 		if (!first_synth_freq)
2428 			first_synth_freq = synth_freq;
2429 
2430 		if (!synth_mask[i])
2431 			continue;
2432 
2433 		/* Safe for s32: max synth freq is 750 MHz */
2434 		step_cycles = div_s64(delta * synth_freq, NSEC_PER_SEC);
2435 
2436 		rc = zl3073x_chan_phase_step(zldev, zldpll->id,
2437 					     synth_mask[i], step_cycles,
2438 					     !tod_stepped);
2439 		if (rc) {
2440 			if (tod_stepped) {
2441 				dev_warn(zldev->dev,
2442 					 "Partial phase step failure\n");
2443 				return 0;
2444 			}
2445 			return rc;
2446 		}
2447 		tod_stepped = true;
2448 	}
2449 
2450 	if (!first_synth_freq)
2451 		return -EOPNOTSUPP;
2452 
2453 	/* No enabled outputs found; step ToD counter only using the
2454 	 * first enabled synth's period (empty output mask).
2455 	 */
2456 	if (!tod_stepped) {
2457 		step_cycles = div_s64(delta * first_synth_freq, NSEC_PER_SEC);
2458 		return zl3073x_chan_phase_step(zldev, zldpll->id, 0,
2459 					       step_cycles, true);
2460 	}
2461 
2462 	return 0;
2463 }
2464 
2465 /**
2466  * zl3073x_dpll_ptp_adjtime - adjust PTP clock time
2467  * @info: PTP clock info
2468  * @delta: time adjustment in nanoseconds
2469  *
2470  * For NCO, large deltas (>= 1 second) are split into a ToD
2471  * read-modify-write for the seconds part and an output phase step for
2472  * the sub-second remainder. Sub-second deltas use phase step directly,
2473  * falling back to ToD read-modify-write if phase step or TIE write
2474  * fails. In AUTO/REFLOCK modes, large deltas are split into ToD
2475  * read-modify-write for seconds and TIE write for the sub-second
2476  * remainder. Sub-second deltas use TIE write directly.
2477  *
2478  * If the seconds part was already committed when the sub-second
2479  * mechanism fails, returns 0 to prevent the PTP servo from retrying
2480  * the full delta and applying seconds again.
2481  *
2482  * Return: 0 on success (or partial success), <0 on error
2483  */
zl3073x_dpll_ptp_adjtime(struct ptp_clock_info * info,s64 delta)2484 static int zl3073x_dpll_ptp_adjtime(struct ptp_clock_info *info, s64 delta)
2485 {
2486 	struct zl3073x_dpll *zldpll = container_of(info, struct zl3073x_dpll,
2487 						   ptp_info);
2488 	struct zl3073x_dev *zldev = zldpll->dev;
2489 	const struct zl3073x_chan *chan;
2490 	bool sec_adjusted = false;
2491 	struct timespec64 ts;
2492 	int rc;
2493 
2494 	if (!delta)
2495 		return 0;
2496 
2497 	guard(mutex)(&zldpll->lock);
2498 
2499 	/* Modes without phase step or TIE use plain ToD adjust */
2500 	chan = zl3073x_chan_state_get(zldev, zldpll->id);
2501 	if (!zl3073x_chan_mode_is_nco(chan) &&
2502 	    !zl3073x_chan_mode_supports_tie(chan))
2503 		return zl3073x_chan_tod_adjust(zldev, zldpll->id,
2504 					       ns_to_timespec64(delta));
2505 
2506 	/* Split off seconds via ToD read-modify-write so the sub-second
2507 	 * remainder can be applied through the output-coherent mechanism
2508 	 * (phase step or TIE write).
2509 	 */
2510 	if (delta >= NSEC_PER_SEC || delta <= -NSEC_PER_SEC) {
2511 		s32 remainder;
2512 
2513 		ts.tv_sec = div_s64_rem(delta, NSEC_PER_SEC, &remainder);
2514 		ts.tv_nsec = 0;
2515 		delta = remainder;
2516 
2517 		rc = zl3073x_chan_tod_adjust(zldev, zldpll->id, ts);
2518 		if (rc)
2519 			return rc;
2520 
2521 		/* No sub-second remainder, done */
2522 		if (!delta)
2523 			return 0;
2524 
2525 		/* Wait for the ToD write to be applied at the 1 Hz edge
2526 		 * before issuing phase step or TIE write, so the pending
2527 		 * WR_NEXT_1HZ does not overwrite the sub-second adjustment.
2528 		 */
2529 		rc = zl3073x_chan_tod_ready_wait(zldev, zldpll->id);
2530 		if (rc)
2531 			return rc;
2532 
2533 		sec_adjusted = true;
2534 	}
2535 
2536 	/* Apply sub-second delta via phase step (NCO) or TIE write */
2537 	if (zl3073x_chan_mode_is_nco(chan)) {
2538 		rc = zl3073x_dpll_ptp_adjtime_phase_step(zldpll, delta);
2539 		if (!rc)
2540 			return 0;
2541 	} else {
2542 		rc = zl3073x_chan_tie_write(zldev, zldpll->id, delta);
2543 		if (!rc)
2544 			return 0;
2545 	}
2546 
2547 	/* Phase step or TIE write failed, fall back to ToD adjust */
2548 	rc = zl3073x_chan_tod_adjust(zldev, zldpll->id,
2549 				     ns_to_timespec64(delta));
2550 
2551 	/* In the unlikely event that both phase step/TIE write and fallback
2552 	 * ToD adjust fail after seconds were already committed, return
2553 	 * success to prevent the PTP servo from retrying the full delta and
2554 	 * applying seconds again. The sub-second residual will self-correct
2555 	 * in the next servo cycle.
2556 	 */
2557 	if (rc && sec_adjusted) {
2558 		dev_warn(zldev->dev,
2559 			 "Sub-second adjustment failed after seconds applied\n");
2560 		return 0;
2561 	}
2562 
2563 	return rc;
2564 }
2565 
2566 /**
2567  * zl3073x_dpll_ptp_adjfine - adjust PTP clock frequency
2568  * @info: PTP clock info
2569  * @scaled_ppm: frequency adjustment in scaled ppm (ppm * 2^16)
2570  *
2571  * Only supported for NCO. Writes the delta frequency offset register.
2572  *
2573  * Return:
2574  * * %0			- success or @scaled_ppm is zero (no-op)
2575  * * %-EOPNOTSUPP	- NCO pin is not connected and @scaled_ppm is non-zero
2576  * * negative		- other error
2577  */
2578 static int
zl3073x_dpll_ptp_adjfine(struct ptp_clock_info * info,long scaled_ppm)2579 zl3073x_dpll_ptp_adjfine(struct ptp_clock_info *info, long scaled_ppm)
2580 {
2581 	struct zl3073x_dpll *zldpll = container_of(info, struct zl3073x_dpll,
2582 						   ptp_info);
2583 	const struct zl3073x_chan *chan;
2584 	s64 offset;
2585 
2586 	/* Convert scaled_ppm to df_offset in 2^-48 steps:
2587 	 *   df_offset = -(scaled_ppm * 2^32) / 10^6
2588 	 *
2589 	 * Simplify to avoid overflow:
2590 	 *   df_offset = -(scaled_ppm * 2^26) / 5^6
2591 	 *   df_offset = -(scaled_ppm * 67108864) / 15625
2592 	 */
2593 	offset = -div_s64((s64)scaled_ppm * 67108864LL, 15625);
2594 
2595 	guard(mutex)(&zldpll->lock);
2596 
2597 	chan = zl3073x_chan_state_get(zldpll->dev, zldpll->id);
2598 	if (!zl3073x_chan_mode_is_nco(chan))
2599 		return scaled_ppm ? -EOPNOTSUPP : 0;
2600 	if (offset == chan->df_offset)
2601 		return 0;
2602 
2603 	return zl3073x_chan_df_offset_set(zldpll->dev, zldpll->id, offset);
2604 }
2605 
2606 /**
2607  * zl3073x_dpll_ptp_adjphase - adjust PTP clock phase
2608  * @info: PTP clock info
2609  * @delta: phase adjustment in nanoseconds
2610  *
2611  * Only supported in AUTO and REFLOCK modes. Uses TIE write for
2612  * nanosecond resolution phase adjustment.
2613  *
2614  * Return:
2615  * * %0			- success or @delta is zero (no-op)
2616  * * %-EOPNOTSUPP	- mode does not support TIE and @delta is non-zero
2617  * * negative		- other error
2618  */
zl3073x_dpll_ptp_adjphase(struct ptp_clock_info * info,s32 delta)2619 static int zl3073x_dpll_ptp_adjphase(struct ptp_clock_info *info, s32 delta)
2620 {
2621 	struct zl3073x_dpll *zldpll = container_of(info, struct zl3073x_dpll,
2622 						   ptp_info);
2623 	struct zl3073x_dev *zldev = zldpll->dev;
2624 	const struct zl3073x_chan *chan;
2625 
2626 	if (!delta)
2627 		return 0;
2628 
2629 	guard(mutex)(&zldpll->lock);
2630 
2631 	chan = zl3073x_chan_state_get(zldev, zldpll->id);
2632 
2633 	if (!zl3073x_chan_mode_supports_tie(chan))
2634 		return -EOPNOTSUPP;
2635 
2636 	return zl3073x_chan_tie_write(zldev, zldpll->id, delta);
2637 }
2638 
2639 static s32
zl3073x_dpll_ptp_getmaxphase(struct ptp_clock_info * info __always_unused)2640 zl3073x_dpll_ptp_getmaxphase(struct ptp_clock_info *info __always_unused)
2641 {
2642 	/* HW limits TIE write to +-1 second. Return the constant HW
2643 	 * limit and let adjphase handle mode-specific checks.
2644 	 */
2645 	return NSEC_PER_SEC - 1;
2646 }
2647 
2648 static const struct ptp_clock_info zl3073x_dpll_ptp_clock_info = {
2649 	.owner		= THIS_MODULE,
2650 	.max_adj	= ZL3073X_DPLL_PTP_MAX_ADJ,
2651 	.gettimex64	= zl3073x_dpll_ptp_gettimex64,
2652 	.settime64	= zl3073x_dpll_ptp_settime64,
2653 	.adjtime	= zl3073x_dpll_ptp_adjtime,
2654 	.adjfine	= zl3073x_dpll_ptp_adjfine,
2655 	.adjphase	= zl3073x_dpll_ptp_adjphase,
2656 	.getmaxphase	= zl3073x_dpll_ptp_getmaxphase,
2657 };
2658 
2659 /**
2660  * zl3073x_dpll_ptp_register - register PTP clock for a DPLL channel
2661  * @zldpll: DPLL channel to register PTP clock for
2662  *
2663  * Return: 0 on success, <0 on error
2664  */
zl3073x_dpll_ptp_register(struct zl3073x_dpll * zldpll)2665 static int zl3073x_dpll_ptp_register(struct zl3073x_dpll *zldpll)
2666 {
2667 	struct zl3073x_dev *zldev = zldpll->dev;
2668 	struct ptp_clock *ptp_clock;
2669 
2670 	zldpll->ptp_info = zl3073x_dpll_ptp_clock_info;
2671 	snprintf(zldpll->ptp_info.name, sizeof(zldpll->ptp_info.name),
2672 		 "%s-dpll%u", dev_name(zldev->dev), zldpll->id);
2673 
2674 	ptp_clock = ptp_clock_register(&zldpll->ptp_info, zldev->dev);
2675 	if (IS_ERR(ptp_clock)) {
2676 		dev_err(zldev->dev, "Failed to register PTP clock for DPLL%u\n",
2677 			zldpll->id);
2678 		return PTR_ERR(ptp_clock);
2679 	}
2680 
2681 	zldpll->ptp_clock = ptp_clock;
2682 
2683 	return 0;
2684 }
2685 
2686 /**
2687  * zl3073x_dpll_ptp_unregister - unregister PTP clock for a DPLL channel
2688  * @zldpll: DPLL channel to unregister PTP clock for
2689  */
zl3073x_dpll_ptp_unregister(struct zl3073x_dpll * zldpll)2690 static void zl3073x_dpll_ptp_unregister(struct zl3073x_dpll *zldpll)
2691 {
2692 	if (!IS_ERR_OR_NULL(zldpll->ptp_clock)) {
2693 		ptp_clock_unregister(zldpll->ptp_clock);
2694 		zldpll->ptp_clock = NULL;
2695 	}
2696 }
2697 
2698 /**
2699  * zl3073x_dpll_ref_sync_pair_register - register ref_sync pairs for a pin
2700  * @pin: pointer to zl3073x_dpll_pin structure
2701  *
2702  * Iterates 'ref-sync-sources' phandles in the pin's firmware node and
2703  * registers each declared pairing.
2704  *
2705  * Return: 0 on success, <0 on error
2706  */
2707 static int
zl3073x_dpll_ref_sync_pair_register(struct zl3073x_dpll_pin * pin)2708 zl3073x_dpll_ref_sync_pair_register(struct zl3073x_dpll_pin *pin)
2709 {
2710 	struct zl3073x_dev *zldev = pin->dpll->dev;
2711 	struct fwnode_handle *fwnode;
2712 	struct dpll_pin *sync_pin;
2713 	dpll_tracker tracker;
2714 	int n, rc;
2715 
2716 	for (n = 0; ; n++) {
2717 		/* Get n'th ref-sync source */
2718 		fwnode = fwnode_find_reference(pin->fwnode, "ref-sync-sources",
2719 					       n);
2720 		if (IS_ERR(fwnode)) {
2721 			rc = PTR_ERR(fwnode);
2722 			break;
2723 		}
2724 
2725 		/* Find associated dpll pin */
2726 		sync_pin = fwnode_dpll_pin_find(fwnode, &tracker);
2727 		fwnode_handle_put(fwnode);
2728 		if (!sync_pin) {
2729 			dev_warn(zldev->dev, "%s: ref-sync source %d not found",
2730 				 pin->label, n);
2731 			continue;
2732 		}
2733 
2734 		/* Register new ref-sync pair */
2735 		rc = dpll_pin_ref_sync_pair_add(pin->dpll_pin, sync_pin);
2736 		dpll_pin_put(sync_pin, &tracker);
2737 
2738 		/* -EBUSY means pairing already exists from another DPLL's
2739 		 * registration.
2740 		 */
2741 		if (rc && rc != -EBUSY) {
2742 			dev_err(zldev->dev,
2743 				"%s: failed to add ref-sync source %d: %pe",
2744 				pin->label, n, ERR_PTR(rc));
2745 			break;
2746 		}
2747 	}
2748 
2749 	return rc != -ENOENT ? rc : 0;
2750 }
2751 
2752 /**
2753  * zl3073x_dpll_ref_sync_pairs_register - register ref_sync pairs for a DPLL
2754  * @zldpll: pointer to zl3073x_dpll structure
2755  *
2756  * Iterates all registered input pins of the given DPLL and establishes
2757  * ref_sync pairings declared by 'ref-sync-sources' phandles in the
2758  * device tree.
2759  *
2760  * Return: 0 on success, <0 on error
2761  */
2762 static int
zl3073x_dpll_ref_sync_pairs_register(struct zl3073x_dpll * zldpll)2763 zl3073x_dpll_ref_sync_pairs_register(struct zl3073x_dpll *zldpll)
2764 {
2765 	struct zl3073x_dpll_pin *pin;
2766 	int rc;
2767 
2768 	list_for_each_entry(pin, &zldpll->pins, list) {
2769 		if (!zl3073x_dpll_is_input_pin(pin) || !pin->fwnode)
2770 			continue;
2771 
2772 		rc = zl3073x_dpll_ref_sync_pair_register(pin);
2773 		if (rc)
2774 			return rc;
2775 	}
2776 
2777 	return 0;
2778 }
2779 
2780 /**
2781  * zl3073x_dpll_alloc - allocate DPLL device
2782  * @zldev: pointer to zl3073x device
2783  * @ch: DPLL channel number
2784  *
2785  * Allocates DPLL device structure for given DPLL channel.
2786  *
2787  * Return: pointer to DPLL device on success, error pointer on error
2788  */
2789 struct zl3073x_dpll *
zl3073x_dpll_alloc(struct zl3073x_dev * zldev,u8 ch)2790 zl3073x_dpll_alloc(struct zl3073x_dev *zldev, u8 ch)
2791 {
2792 	struct zl3073x_dpll *zldpll;
2793 
2794 	zldpll = kzalloc_obj(*zldpll);
2795 	if (!zldpll)
2796 		return ERR_PTR(-ENOMEM);
2797 
2798 	zldpll->dev = zldev;
2799 	zldpll->id = ch;
2800 	mutex_init(&zldpll->lock);
2801 	INIT_LIST_HEAD(&zldpll->pins);
2802 
2803 	return zldpll;
2804 }
2805 
2806 /**
2807  * zl3073x_dpll_free - free DPLL device
2808  * @zldpll: pointer to zl3073x_dpll structure
2809  *
2810  * Deallocates given DPLL device previously allocated by @zl3073x_dpll_alloc.
2811  */
2812 void
zl3073x_dpll_free(struct zl3073x_dpll * zldpll)2813 zl3073x_dpll_free(struct zl3073x_dpll *zldpll)
2814 {
2815 	WARN(zldpll->dpll_dev, "DPLL device is still registered\n");
2816 
2817 	mutex_destroy(&zldpll->lock);
2818 	kfree(zldpll);
2819 }
2820 
2821 /**
2822  * zl3073x_dpll_register - register DPLL device and all its pins
2823  * @zldpll: pointer to zl3073x_dpll structure
2824  *
2825  * Registers given DPLL device and all its pins into DPLL sub-system.
2826  *
2827  * Return: 0 on success, <0 on error
2828  */
2829 int
zl3073x_dpll_register(struct zl3073x_dpll * zldpll)2830 zl3073x_dpll_register(struct zl3073x_dpll *zldpll)
2831 {
2832 	int rc;
2833 
2834 	rc = zl3073x_dpll_device_register(zldpll);
2835 	if (rc)
2836 		return rc;
2837 
2838 	rc = zl3073x_dpll_pins_register(zldpll);
2839 	if (rc) {
2840 		zl3073x_dpll_device_unregister(zldpll);
2841 		return rc;
2842 	}
2843 
2844 	rc = zl3073x_dpll_ref_sync_pairs_register(zldpll);
2845 	if (rc) {
2846 		zl3073x_dpll_pins_unregister(zldpll);
2847 		zl3073x_dpll_device_unregister(zldpll);
2848 		return rc;
2849 	}
2850 
2851 	rc = zl3073x_dpll_ptp_register(zldpll);
2852 	if (rc) {
2853 		zl3073x_dpll_pins_unregister(zldpll);
2854 		zl3073x_dpll_device_unregister(zldpll);
2855 		return rc;
2856 	}
2857 
2858 	return 0;
2859 }
2860 
2861 /**
2862  * zl3073x_dpll_unregister - unregister DPLL device and its pins
2863  * @zldpll: pointer to zl3073x_dpll structure
2864  *
2865  * Unregisters given DPLL device and all its pins from DPLL sub-system
2866  * previously registered by @zl3073x_dpll_register.
2867  */
2868 void
zl3073x_dpll_unregister(struct zl3073x_dpll * zldpll)2869 zl3073x_dpll_unregister(struct zl3073x_dpll *zldpll)
2870 {
2871 	zl3073x_dpll_ptp_unregister(zldpll);
2872 	zl3073x_dpll_pins_unregister(zldpll);
2873 	zl3073x_dpll_device_unregister(zldpll);
2874 }
2875