xref: /linux/drivers/net/ethernet/intel/ice/ice_dpll.c (revision 096c0fa42afa92b6ffa4e441c4c72a2f805c5a88)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2022, Intel Corporation. */
3 
4 #include "ice.h"
5 #include "ice_lib.h"
6 #include "ice_trace.h"
7 #include <linux/dpll.h>
8 
9 #define ICE_CGU_STATE_ACQ_ERR_THRESHOLD		50
10 #define ICE_DPLL_PIN_IDX_INVALID		0xff
11 #define ICE_DPLL_RCLK_NUM_PER_PF		1
12 #define ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT	25
13 
14 /**
15  * enum ice_dpll_pin_type - enumerate ice pin types:
16  * @ICE_DPLL_PIN_INVALID: invalid pin type
17  * @ICE_DPLL_PIN_TYPE_INPUT: input pin
18  * @ICE_DPLL_PIN_TYPE_OUTPUT: output pin
19  * @ICE_DPLL_PIN_TYPE_RCLK_INPUT: recovery clock input pin
20  */
21 enum ice_dpll_pin_type {
22 	ICE_DPLL_PIN_INVALID,
23 	ICE_DPLL_PIN_TYPE_INPUT,
24 	ICE_DPLL_PIN_TYPE_OUTPUT,
25 	ICE_DPLL_PIN_TYPE_RCLK_INPUT,
26 };
27 
28 static const char * const pin_type_name[] = {
29 	[ICE_DPLL_PIN_TYPE_INPUT] = "input",
30 	[ICE_DPLL_PIN_TYPE_OUTPUT] = "output",
31 	[ICE_DPLL_PIN_TYPE_RCLK_INPUT] = "rclk-input",
32 };
33 
34 static const struct dpll_pin_frequency ice_esync_range[] = {
35 	DPLL_PIN_FREQUENCY_RANGE(0, DPLL_PIN_FREQUENCY_1_HZ),
36 };
37 
38 /**
39  * ice_dpll_is_reset - check if reset is in progress
40  * @pf: private board structure
41  * @extack: error reporting
42  *
43  * If reset is in progress, fill extack with error.
44  *
45  * Return:
46  * * false - no reset in progress
47  * * true - reset in progress
48  */
49 static bool ice_dpll_is_reset(struct ice_pf *pf, struct netlink_ext_ack *extack)
50 {
51 	if (ice_is_reset_in_progress(pf->state)) {
52 		NL_SET_ERR_MSG(extack, "PF reset in progress");
53 		return true;
54 	}
55 	return false;
56 }
57 
58 /**
59  * ice_dpll_pin_freq_set - set pin's frequency
60  * @pf: private board structure
61  * @pin: pointer to a pin
62  * @pin_type: type of pin being configured
63  * @freq: frequency to be set
64  * @extack: error reporting
65  *
66  * Set requested frequency on a pin.
67  *
68  * Context: Called under pf->dplls.lock
69  * Return:
70  * * 0 - success
71  * * negative - error on AQ or wrong pin type given
72  */
73 static int
74 ice_dpll_pin_freq_set(struct ice_pf *pf, struct ice_dpll_pin *pin,
75 		      enum ice_dpll_pin_type pin_type, const u32 freq,
76 		      struct netlink_ext_ack *extack)
77 {
78 	u8 flags;
79 	int ret;
80 
81 	switch (pin_type) {
82 	case ICE_DPLL_PIN_TYPE_INPUT:
83 		flags = ICE_AQC_SET_CGU_IN_CFG_FLG1_UPDATE_FREQ;
84 		ret = ice_aq_set_input_pin_cfg(&pf->hw, pin->idx, flags,
85 					       pin->flags[0], freq, 0);
86 		break;
87 	case ICE_DPLL_PIN_TYPE_OUTPUT:
88 		flags = ICE_AQC_SET_CGU_OUT_CFG_UPDATE_FREQ;
89 		ret = ice_aq_set_output_pin_cfg(&pf->hw, pin->idx, flags,
90 						0, freq, 0);
91 		break;
92 	default:
93 		return -EINVAL;
94 	}
95 	if (ret) {
96 		NL_SET_ERR_MSG_FMT(extack,
97 				   "err:%d %s failed to set pin freq:%u on pin:%u\n",
98 				   ret,
99 				   ice_aq_str(pf->hw.adminq.sq_last_status),
100 				   freq, pin->idx);
101 		return ret;
102 	}
103 	pin->freq = freq;
104 
105 	return 0;
106 }
107 
108 /**
109  * ice_dpll_frequency_set - wrapper for pin callback for set frequency
110  * @pin: pointer to a pin
111  * @pin_priv: private data pointer passed on pin registration
112  * @dpll: pointer to dpll
113  * @dpll_priv: private data pointer passed on dpll registration
114  * @frequency: frequency to be set
115  * @extack: error reporting
116  * @pin_type: type of pin being configured
117  *
118  * Wraps internal set frequency command on a pin.
119  *
120  * Context: Acquires pf->dplls.lock
121  * Return:
122  * * 0 - success
123  * * negative - error pin not found or couldn't set in hw
124  */
125 static int
126 ice_dpll_frequency_set(const struct dpll_pin *pin, void *pin_priv,
127 		       const struct dpll_device *dpll, void *dpll_priv,
128 		       const u32 frequency,
129 		       struct netlink_ext_ack *extack,
130 		       enum ice_dpll_pin_type pin_type)
131 {
132 	struct ice_dpll_pin *p = pin_priv;
133 	struct ice_dpll *d = dpll_priv;
134 	struct ice_pf *pf = d->pf;
135 	int ret;
136 
137 	if (ice_dpll_is_reset(pf, extack))
138 		return -EBUSY;
139 
140 	mutex_lock(&pf->dplls.lock);
141 	ret = ice_dpll_pin_freq_set(pf, p, pin_type, frequency, extack);
142 	mutex_unlock(&pf->dplls.lock);
143 
144 	return ret;
145 }
146 
147 /**
148  * ice_dpll_input_frequency_set - input pin callback for set frequency
149  * @pin: pointer to a pin
150  * @pin_priv: private data pointer passed on pin registration
151  * @dpll: pointer to dpll
152  * @dpll_priv: private data pointer passed on dpll registration
153  * @frequency: frequency to be set
154  * @extack: error reporting
155  *
156  * Wraps internal set frequency command on a pin.
157  *
158  * Context: Calls a function which acquires pf->dplls.lock
159  * Return:
160  * * 0 - success
161  * * negative - error pin not found or couldn't set in hw
162  */
163 static int
164 ice_dpll_input_frequency_set(const struct dpll_pin *pin, void *pin_priv,
165 			     const struct dpll_device *dpll, void *dpll_priv,
166 			     u64 frequency, struct netlink_ext_ack *extack)
167 {
168 	return ice_dpll_frequency_set(pin, pin_priv, dpll, dpll_priv, frequency,
169 				      extack, ICE_DPLL_PIN_TYPE_INPUT);
170 }
171 
172 /**
173  * ice_dpll_output_frequency_set - output pin callback for set frequency
174  * @pin: pointer to a pin
175  * @pin_priv: private data pointer passed on pin registration
176  * @dpll: pointer to dpll
177  * @dpll_priv: private data pointer passed on dpll registration
178  * @frequency: frequency to be set
179  * @extack: error reporting
180  *
181  * Wraps internal set frequency command on a pin.
182  *
183  * Context: Calls a function which acquires pf->dplls.lock
184  * Return:
185  * * 0 - success
186  * * negative - error pin not found or couldn't set in hw
187  */
188 static int
189 ice_dpll_output_frequency_set(const struct dpll_pin *pin, void *pin_priv,
190 			      const struct dpll_device *dpll, void *dpll_priv,
191 			      u64 frequency, struct netlink_ext_ack *extack)
192 {
193 	return ice_dpll_frequency_set(pin, pin_priv, dpll, dpll_priv, frequency,
194 				      extack, ICE_DPLL_PIN_TYPE_OUTPUT);
195 }
196 
197 /**
198  * ice_dpll_frequency_get - wrapper for pin callback for get frequency
199  * @pin: pointer to a pin
200  * @pin_priv: private data pointer passed on pin registration
201  * @dpll: pointer to dpll
202  * @dpll_priv: private data pointer passed on dpll registration
203  * @frequency: on success holds pin's frequency
204  * @extack: error reporting
205  * @pin_type: type of pin being configured
206  *
207  * Wraps internal get frequency command of a pin.
208  *
209  * Context: Acquires pf->dplls.lock
210  * Return:
211  * * 0 - success
212  * * negative - error pin not found or couldn't get from hw
213  */
214 static int
215 ice_dpll_frequency_get(const struct dpll_pin *pin, void *pin_priv,
216 		       const struct dpll_device *dpll, void *dpll_priv,
217 		       u64 *frequency, struct netlink_ext_ack *extack,
218 		       enum ice_dpll_pin_type pin_type)
219 {
220 	struct ice_dpll_pin *p = pin_priv;
221 	struct ice_dpll *d = dpll_priv;
222 	struct ice_pf *pf = d->pf;
223 
224 	mutex_lock(&pf->dplls.lock);
225 	*frequency = p->freq;
226 	mutex_unlock(&pf->dplls.lock);
227 
228 	return 0;
229 }
230 
231 /**
232  * ice_dpll_input_frequency_get - input pin callback for get frequency
233  * @pin: pointer to a pin
234  * @pin_priv: private data pointer passed on pin registration
235  * @dpll: pointer to dpll
236  * @dpll_priv: private data pointer passed on dpll registration
237  * @frequency: on success holds pin's frequency
238  * @extack: error reporting
239  *
240  * Wraps internal get frequency command of a input pin.
241  *
242  * Context: Calls a function which acquires pf->dplls.lock
243  * Return:
244  * * 0 - success
245  * * negative - error pin not found or couldn't get from hw
246  */
247 static int
248 ice_dpll_input_frequency_get(const struct dpll_pin *pin, void *pin_priv,
249 			     const struct dpll_device *dpll, void *dpll_priv,
250 			     u64 *frequency, struct netlink_ext_ack *extack)
251 {
252 	return ice_dpll_frequency_get(pin, pin_priv, dpll, dpll_priv, frequency,
253 				      extack, ICE_DPLL_PIN_TYPE_INPUT);
254 }
255 
256 /**
257  * ice_dpll_output_frequency_get - output pin callback for get frequency
258  * @pin: pointer to a pin
259  * @pin_priv: private data pointer passed on pin registration
260  * @dpll: pointer to dpll
261  * @dpll_priv: private data pointer passed on dpll registration
262  * @frequency: on success holds pin's frequency
263  * @extack: error reporting
264  *
265  * Wraps internal get frequency command of a pin.
266  *
267  * Context: Calls a function which acquires pf->dplls.lock
268  * Return:
269  * * 0 - success
270  * * negative - error pin not found or couldn't get from hw
271  */
272 static int
273 ice_dpll_output_frequency_get(const struct dpll_pin *pin, void *pin_priv,
274 			      const struct dpll_device *dpll, void *dpll_priv,
275 			      u64 *frequency, struct netlink_ext_ack *extack)
276 {
277 	return ice_dpll_frequency_get(pin, pin_priv, dpll, dpll_priv, frequency,
278 				      extack, ICE_DPLL_PIN_TYPE_OUTPUT);
279 }
280 
281 /**
282  * ice_dpll_pin_enable - enable a pin on dplls
283  * @hw: board private hw structure
284  * @pin: pointer to a pin
285  * @dpll_idx: dpll index to connect to output pin
286  * @pin_type: type of pin being enabled
287  * @extack: error reporting
288  *
289  * Enable a pin on both dplls. Store current state in pin->flags.
290  *
291  * Context: Called under pf->dplls.lock
292  * Return:
293  * * 0 - OK
294  * * negative - error
295  */
296 static int
297 ice_dpll_pin_enable(struct ice_hw *hw, struct ice_dpll_pin *pin,
298 		    u8 dpll_idx, enum ice_dpll_pin_type pin_type,
299 		    struct netlink_ext_ack *extack)
300 {
301 	u8 flags = 0;
302 	int ret;
303 
304 	switch (pin_type) {
305 	case ICE_DPLL_PIN_TYPE_INPUT:
306 		if (pin->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN)
307 			flags |= ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
308 		flags |= ICE_AQC_SET_CGU_IN_CFG_FLG2_INPUT_EN;
309 		ret = ice_aq_set_input_pin_cfg(hw, pin->idx, 0, flags, 0, 0);
310 		break;
311 	case ICE_DPLL_PIN_TYPE_OUTPUT:
312 		flags = ICE_AQC_SET_CGU_OUT_CFG_UPDATE_SRC_SEL;
313 		if (pin->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN)
314 			flags |= ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
315 		flags |= ICE_AQC_SET_CGU_OUT_CFG_OUT_EN;
316 		ret = ice_aq_set_output_pin_cfg(hw, pin->idx, flags, dpll_idx,
317 						0, 0);
318 		break;
319 	default:
320 		return -EINVAL;
321 	}
322 	if (ret)
323 		NL_SET_ERR_MSG_FMT(extack,
324 				   "err:%d %s failed to enable %s pin:%u\n",
325 				   ret, ice_aq_str(hw->adminq.sq_last_status),
326 				   pin_type_name[pin_type], pin->idx);
327 
328 	return ret;
329 }
330 
331 /**
332  * ice_dpll_pin_disable - disable a pin on dplls
333  * @hw: board private hw structure
334  * @pin: pointer to a pin
335  * @pin_type: type of pin being disabled
336  * @extack: error reporting
337  *
338  * Disable a pin on both dplls. Store current state in pin->flags.
339  *
340  * Context: Called under pf->dplls.lock
341  * Return:
342  * * 0 - OK
343  * * negative - error
344  */
345 static int
346 ice_dpll_pin_disable(struct ice_hw *hw, struct ice_dpll_pin *pin,
347 		     enum ice_dpll_pin_type pin_type,
348 		     struct netlink_ext_ack *extack)
349 {
350 	u8 flags = 0;
351 	int ret;
352 
353 	switch (pin_type) {
354 	case ICE_DPLL_PIN_TYPE_INPUT:
355 		if (pin->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN)
356 			flags |= ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
357 		ret = ice_aq_set_input_pin_cfg(hw, pin->idx, 0, flags, 0, 0);
358 		break;
359 	case ICE_DPLL_PIN_TYPE_OUTPUT:
360 		if (pin->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN)
361 			flags |= ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
362 		ret = ice_aq_set_output_pin_cfg(hw, pin->idx, flags, 0, 0, 0);
363 		break;
364 	default:
365 		return -EINVAL;
366 	}
367 	if (ret)
368 		NL_SET_ERR_MSG_FMT(extack,
369 				   "err:%d %s failed to disable %s pin:%u\n",
370 				   ret, ice_aq_str(hw->adminq.sq_last_status),
371 				   pin_type_name[pin_type], pin->idx);
372 
373 	return ret;
374 }
375 
376 /**
377  * ice_dpll_pin_state_update - update pin's state
378  * @pf: private board struct
379  * @pin: structure with pin attributes to be updated
380  * @pin_type: type of pin being updated
381  * @extack: error reporting
382  *
383  * Determine pin current state and frequency, then update struct
384  * holding the pin info. For input pin states are separated for each
385  * dpll, for rclk pins states are separated for each parent.
386  *
387  * Context: Called under pf->dplls.lock
388  * Return:
389  * * 0 - OK
390  * * negative - error
391  */
392 static int
393 ice_dpll_pin_state_update(struct ice_pf *pf, struct ice_dpll_pin *pin,
394 			  enum ice_dpll_pin_type pin_type,
395 			  struct netlink_ext_ack *extack)
396 {
397 	u8 parent, port_num = ICE_AQC_SET_PHY_REC_CLK_OUT_CURR_PORT;
398 	int ret;
399 
400 	switch (pin_type) {
401 	case ICE_DPLL_PIN_TYPE_INPUT:
402 		ret = ice_aq_get_input_pin_cfg(&pf->hw, pin->idx, &pin->status,
403 					       NULL, NULL, &pin->flags[0],
404 					       &pin->freq, &pin->phase_adjust);
405 		if (ret)
406 			goto err;
407 		if (ICE_AQC_GET_CGU_IN_CFG_FLG2_INPUT_EN & pin->flags[0]) {
408 			if (pin->pin) {
409 				pin->state[pf->dplls.eec.dpll_idx] =
410 					pin->pin == pf->dplls.eec.active_input ?
411 					DPLL_PIN_STATE_CONNECTED :
412 					DPLL_PIN_STATE_SELECTABLE;
413 				pin->state[pf->dplls.pps.dpll_idx] =
414 					pin->pin == pf->dplls.pps.active_input ?
415 					DPLL_PIN_STATE_CONNECTED :
416 					DPLL_PIN_STATE_SELECTABLE;
417 			} else {
418 				pin->state[pf->dplls.eec.dpll_idx] =
419 					DPLL_PIN_STATE_SELECTABLE;
420 				pin->state[pf->dplls.pps.dpll_idx] =
421 					DPLL_PIN_STATE_SELECTABLE;
422 			}
423 		} else {
424 			pin->state[pf->dplls.eec.dpll_idx] =
425 				DPLL_PIN_STATE_DISCONNECTED;
426 			pin->state[pf->dplls.pps.dpll_idx] =
427 				DPLL_PIN_STATE_DISCONNECTED;
428 		}
429 		break;
430 	case ICE_DPLL_PIN_TYPE_OUTPUT:
431 		ret = ice_aq_get_output_pin_cfg(&pf->hw, pin->idx,
432 						&pin->flags[0], &parent,
433 						&pin->freq, NULL);
434 		if (ret)
435 			goto err;
436 
437 		parent &= ICE_AQC_GET_CGU_OUT_CFG_DPLL_SRC_SEL;
438 		if (ICE_AQC_GET_CGU_OUT_CFG_OUT_EN & pin->flags[0]) {
439 			pin->state[pf->dplls.eec.dpll_idx] =
440 				parent == pf->dplls.eec.dpll_idx ?
441 				DPLL_PIN_STATE_CONNECTED :
442 				DPLL_PIN_STATE_DISCONNECTED;
443 			pin->state[pf->dplls.pps.dpll_idx] =
444 				parent == pf->dplls.pps.dpll_idx ?
445 				DPLL_PIN_STATE_CONNECTED :
446 				DPLL_PIN_STATE_DISCONNECTED;
447 		} else {
448 			pin->state[pf->dplls.eec.dpll_idx] =
449 				DPLL_PIN_STATE_DISCONNECTED;
450 			pin->state[pf->dplls.pps.dpll_idx] =
451 				DPLL_PIN_STATE_DISCONNECTED;
452 		}
453 		break;
454 	case ICE_DPLL_PIN_TYPE_RCLK_INPUT:
455 		for (parent = 0; parent < pf->dplls.rclk.num_parents;
456 		     parent++) {
457 			u8 p = parent;
458 
459 			ret = ice_aq_get_phy_rec_clk_out(&pf->hw, &p,
460 							 &port_num,
461 							 &pin->flags[parent],
462 							 NULL);
463 			if (ret)
464 				goto err;
465 			if (ICE_AQC_GET_PHY_REC_CLK_OUT_OUT_EN &
466 			    pin->flags[parent])
467 				pin->state[parent] = DPLL_PIN_STATE_CONNECTED;
468 			else
469 				pin->state[parent] =
470 					DPLL_PIN_STATE_DISCONNECTED;
471 		}
472 		break;
473 	default:
474 		return -EINVAL;
475 	}
476 
477 	return 0;
478 err:
479 	if (extack)
480 		NL_SET_ERR_MSG_FMT(extack,
481 				   "err:%d %s failed to update %s pin:%u\n",
482 				   ret,
483 				   ice_aq_str(pf->hw.adminq.sq_last_status),
484 				   pin_type_name[pin_type], pin->idx);
485 	else
486 		dev_err_ratelimited(ice_pf_to_dev(pf),
487 				    "err:%d %s failed to update %s pin:%u\n",
488 				    ret,
489 				    ice_aq_str(pf->hw.adminq.sq_last_status),
490 				    pin_type_name[pin_type], pin->idx);
491 	return ret;
492 }
493 
494 /**
495  * ice_dpll_hw_input_prio_set - set input priority value in hardware
496  * @pf: board private structure
497  * @dpll: ice dpll pointer
498  * @pin: ice pin pointer
499  * @prio: priority value being set on a dpll
500  * @extack: error reporting
501  *
502  * Internal wrapper for setting the priority in the hardware.
503  *
504  * Context: Called under pf->dplls.lock
505  * Return:
506  * * 0 - success
507  * * negative - failure
508  */
509 static int
510 ice_dpll_hw_input_prio_set(struct ice_pf *pf, struct ice_dpll *dpll,
511 			   struct ice_dpll_pin *pin, const u32 prio,
512 			   struct netlink_ext_ack *extack)
513 {
514 	int ret;
515 
516 	ret = ice_aq_set_cgu_ref_prio(&pf->hw, dpll->dpll_idx, pin->idx,
517 				      (u8)prio);
518 	if (ret)
519 		NL_SET_ERR_MSG_FMT(extack,
520 				   "err:%d %s failed to set pin prio:%u on pin:%u\n",
521 				   ret,
522 				   ice_aq_str(pf->hw.adminq.sq_last_status),
523 				   prio, pin->idx);
524 	else
525 		dpll->input_prio[pin->idx] = prio;
526 
527 	return ret;
528 }
529 
530 /**
531  * ice_dpll_lock_status_get - get dpll lock status callback
532  * @dpll: registered dpll pointer
533  * @dpll_priv: private data pointer passed on dpll registration
534  * @status: on success holds dpll's lock status
535  * @status_error: status error value
536  * @extack: error reporting
537  *
538  * Dpll subsystem callback, provides dpll's lock status.
539  *
540  * Context: Acquires pf->dplls.lock
541  * Return:
542  * * 0 - success
543  * * negative - failure
544  */
545 static int
546 ice_dpll_lock_status_get(const struct dpll_device *dpll, void *dpll_priv,
547 			 enum dpll_lock_status *status,
548 			 enum dpll_lock_status_error *status_error,
549 			 struct netlink_ext_ack *extack)
550 {
551 	struct ice_dpll *d = dpll_priv;
552 	struct ice_pf *pf = d->pf;
553 
554 	mutex_lock(&pf->dplls.lock);
555 	*status = d->dpll_state;
556 	mutex_unlock(&pf->dplls.lock);
557 
558 	return 0;
559 }
560 
561 /**
562  * ice_dpll_mode_get - get dpll's working mode
563  * @dpll: registered dpll pointer
564  * @dpll_priv: private data pointer passed on dpll registration
565  * @mode: on success holds current working mode of dpll
566  * @extack: error reporting
567  *
568  * Dpll subsystem callback. Provides working mode of dpll.
569  *
570  * Context: Acquires pf->dplls.lock
571  * Return:
572  * * 0 - success
573  * * negative - failure
574  */
575 static int ice_dpll_mode_get(const struct dpll_device *dpll, void *dpll_priv,
576 			     enum dpll_mode *mode,
577 			     struct netlink_ext_ack *extack)
578 {
579 	struct ice_dpll *d = dpll_priv;
580 	struct ice_pf *pf = d->pf;
581 
582 	mutex_lock(&pf->dplls.lock);
583 	*mode = d->mode;
584 	mutex_unlock(&pf->dplls.lock);
585 
586 	return 0;
587 }
588 
589 /**
590  * ice_dpll_pin_state_set - set pin's state on dpll
591  * @pin: pointer to a pin
592  * @pin_priv: private data pointer passed on pin registration
593  * @dpll: registered dpll pointer
594  * @dpll_priv: private data pointer passed on dpll registration
595  * @enable: if pin shalll be enabled
596  * @extack: error reporting
597  * @pin_type: type of a pin
598  *
599  * Set pin state on a pin.
600  *
601  * Context: Acquires pf->dplls.lock
602  * Return:
603  * * 0 - OK or no change required
604  * * negative - error
605  */
606 static int
607 ice_dpll_pin_state_set(const struct dpll_pin *pin, void *pin_priv,
608 		       const struct dpll_device *dpll, void *dpll_priv,
609 		       bool enable, struct netlink_ext_ack *extack,
610 		       enum ice_dpll_pin_type pin_type)
611 {
612 	struct ice_dpll_pin *p = pin_priv;
613 	struct ice_dpll *d = dpll_priv;
614 	struct ice_pf *pf = d->pf;
615 	int ret;
616 
617 	if (ice_dpll_is_reset(pf, extack))
618 		return -EBUSY;
619 
620 	mutex_lock(&pf->dplls.lock);
621 	if (enable)
622 		ret = ice_dpll_pin_enable(&pf->hw, p, d->dpll_idx, pin_type,
623 					  extack);
624 	else
625 		ret = ice_dpll_pin_disable(&pf->hw, p, pin_type, extack);
626 	if (!ret)
627 		ret = ice_dpll_pin_state_update(pf, p, pin_type, extack);
628 	mutex_unlock(&pf->dplls.lock);
629 
630 	return ret;
631 }
632 
633 /**
634  * ice_dpll_output_state_set - enable/disable output pin on dpll device
635  * @pin: pointer to a pin
636  * @pin_priv: private data pointer passed on pin registration
637  * @dpll: dpll being configured
638  * @dpll_priv: private data pointer passed on dpll registration
639  * @state: state of pin to be set
640  * @extack: error reporting
641  *
642  * Dpll subsystem callback. Set given state on output type pin.
643  *
644  * Context: Calls a function which acquires pf->dplls.lock
645  * Return:
646  * * 0 - successfully enabled mode
647  * * negative - failed to enable mode
648  */
649 static int
650 ice_dpll_output_state_set(const struct dpll_pin *pin, void *pin_priv,
651 			  const struct dpll_device *dpll, void *dpll_priv,
652 			  enum dpll_pin_state state,
653 			  struct netlink_ext_ack *extack)
654 {
655 	bool enable = state == DPLL_PIN_STATE_CONNECTED;
656 	struct ice_dpll_pin *p = pin_priv;
657 	struct ice_dpll *d = dpll_priv;
658 
659 	if (state == DPLL_PIN_STATE_SELECTABLE)
660 		return -EINVAL;
661 	if (!enable && p->state[d->dpll_idx] == DPLL_PIN_STATE_DISCONNECTED)
662 		return 0;
663 
664 	return ice_dpll_pin_state_set(pin, pin_priv, dpll, dpll_priv, enable,
665 				      extack, ICE_DPLL_PIN_TYPE_OUTPUT);
666 }
667 
668 /**
669  * ice_dpll_input_state_set - enable/disable input pin on dpll levice
670  * @pin: pointer to a pin
671  * @pin_priv: private data pointer passed on pin registration
672  * @dpll: dpll being configured
673  * @dpll_priv: private data pointer passed on dpll registration
674  * @state: state of pin to be set
675  * @extack: error reporting
676  *
677  * Dpll subsystem callback. Enables given mode on input type pin.
678  *
679  * Context: Calls a function which acquires pf->dplls.lock
680  * Return:
681  * * 0 - successfully enabled mode
682  * * negative - failed to enable mode
683  */
684 static int
685 ice_dpll_input_state_set(const struct dpll_pin *pin, void *pin_priv,
686 			 const struct dpll_device *dpll, void *dpll_priv,
687 			 enum dpll_pin_state state,
688 			 struct netlink_ext_ack *extack)
689 {
690 	bool enable = state == DPLL_PIN_STATE_SELECTABLE;
691 
692 	return ice_dpll_pin_state_set(pin, pin_priv, dpll, dpll_priv, enable,
693 				      extack, ICE_DPLL_PIN_TYPE_INPUT);
694 }
695 
696 /**
697  * ice_dpll_pin_state_get - set pin's state on dpll
698  * @pin: pointer to a pin
699  * @pin_priv: private data pointer passed on pin registration
700  * @dpll: registered dpll pointer
701  * @dpll_priv: private data pointer passed on dpll registration
702  * @state: on success holds state of the pin
703  * @extack: error reporting
704  * @pin_type: type of questioned pin
705  *
706  * Determine pin state set it on a pin.
707  *
708  * Context: Acquires pf->dplls.lock
709  * Return:
710  * * 0 - success
711  * * negative - failed to get state
712  */
713 static int
714 ice_dpll_pin_state_get(const struct dpll_pin *pin, void *pin_priv,
715 		       const struct dpll_device *dpll, void *dpll_priv,
716 		       enum dpll_pin_state *state,
717 		       struct netlink_ext_ack *extack,
718 		       enum ice_dpll_pin_type pin_type)
719 {
720 	struct ice_dpll_pin *p = pin_priv;
721 	struct ice_dpll *d = dpll_priv;
722 	struct ice_pf *pf = d->pf;
723 	int ret;
724 
725 	if (ice_dpll_is_reset(pf, extack))
726 		return -EBUSY;
727 
728 	mutex_lock(&pf->dplls.lock);
729 	ret = ice_dpll_pin_state_update(pf, p, pin_type, extack);
730 	if (ret)
731 		goto unlock;
732 	if (pin_type == ICE_DPLL_PIN_TYPE_INPUT ||
733 	    pin_type == ICE_DPLL_PIN_TYPE_OUTPUT)
734 		*state = p->state[d->dpll_idx];
735 	ret = 0;
736 unlock:
737 	mutex_unlock(&pf->dplls.lock);
738 
739 	return ret;
740 }
741 
742 /**
743  * ice_dpll_output_state_get - get output pin state on dpll device
744  * @pin: pointer to a pin
745  * @pin_priv: private data pointer passed on pin registration
746  * @dpll: registered dpll pointer
747  * @dpll_priv: private data pointer passed on dpll registration
748  * @state: on success holds state of the pin
749  * @extack: error reporting
750  *
751  * Dpll subsystem callback. Check state of a pin.
752  *
753  * Context: Calls a function which acquires pf->dplls.lock
754  * Return:
755  * * 0 - success
756  * * negative - failed to get state
757  */
758 static int
759 ice_dpll_output_state_get(const struct dpll_pin *pin, void *pin_priv,
760 			  const struct dpll_device *dpll, void *dpll_priv,
761 			  enum dpll_pin_state *state,
762 			  struct netlink_ext_ack *extack)
763 {
764 	return ice_dpll_pin_state_get(pin, pin_priv, dpll, dpll_priv, state,
765 				      extack, ICE_DPLL_PIN_TYPE_OUTPUT);
766 }
767 
768 /**
769  * ice_dpll_input_state_get - get input pin state on dpll device
770  * @pin: pointer to a pin
771  * @pin_priv: private data pointer passed on pin registration
772  * @dpll: registered dpll pointer
773  * @dpll_priv: private data pointer passed on dpll registration
774  * @state: on success holds state of the pin
775  * @extack: error reporting
776  *
777  * Dpll subsystem callback. Check state of a input pin.
778  *
779  * Context: Calls a function which acquires pf->dplls.lock
780  * Return:
781  * * 0 - success
782  * * negative - failed to get state
783  */
784 static int
785 ice_dpll_input_state_get(const struct dpll_pin *pin, void *pin_priv,
786 			 const struct dpll_device *dpll, void *dpll_priv,
787 			 enum dpll_pin_state *state,
788 			 struct netlink_ext_ack *extack)
789 {
790 	return ice_dpll_pin_state_get(pin, pin_priv, dpll, dpll_priv, state,
791 				      extack, ICE_DPLL_PIN_TYPE_INPUT);
792 }
793 
794 /**
795  * ice_dpll_input_prio_get - get dpll's input prio
796  * @pin: pointer to a pin
797  * @pin_priv: private data pointer passed on pin registration
798  * @dpll: registered dpll pointer
799  * @dpll_priv: private data pointer passed on dpll registration
800  * @prio: on success - returns input priority on dpll
801  * @extack: error reporting
802  *
803  * Dpll subsystem callback. Handler for getting priority of a input pin.
804  *
805  * Context: Acquires pf->dplls.lock
806  * Return:
807  * * 0 - success
808  * * negative - failure
809  */
810 static int
811 ice_dpll_input_prio_get(const struct dpll_pin *pin, void *pin_priv,
812 			const struct dpll_device *dpll, void *dpll_priv,
813 			u32 *prio, struct netlink_ext_ack *extack)
814 {
815 	struct ice_dpll_pin *p = pin_priv;
816 	struct ice_dpll *d = dpll_priv;
817 	struct ice_pf *pf = d->pf;
818 
819 	mutex_lock(&pf->dplls.lock);
820 	*prio = d->input_prio[p->idx];
821 	mutex_unlock(&pf->dplls.lock);
822 
823 	return 0;
824 }
825 
826 /**
827  * ice_dpll_input_prio_set - set dpll input prio
828  * @pin: pointer to a pin
829  * @pin_priv: private data pointer passed on pin registration
830  * @dpll: registered dpll pointer
831  * @dpll_priv: private data pointer passed on dpll registration
832  * @prio: input priority to be set on dpll
833  * @extack: error reporting
834  *
835  * Dpll subsystem callback. Handler for setting priority of a input pin.
836  *
837  * Context: Acquires pf->dplls.lock
838  * Return:
839  * * 0 - success
840  * * negative - failure
841  */
842 static int
843 ice_dpll_input_prio_set(const struct dpll_pin *pin, void *pin_priv,
844 			const struct dpll_device *dpll, void *dpll_priv,
845 			u32 prio, struct netlink_ext_ack *extack)
846 {
847 	struct ice_dpll_pin *p = pin_priv;
848 	struct ice_dpll *d = dpll_priv;
849 	struct ice_pf *pf = d->pf;
850 	int ret;
851 
852 	if (ice_dpll_is_reset(pf, extack))
853 		return -EBUSY;
854 
855 	mutex_lock(&pf->dplls.lock);
856 	ret = ice_dpll_hw_input_prio_set(pf, d, p, prio, extack);
857 	mutex_unlock(&pf->dplls.lock);
858 
859 	return ret;
860 }
861 
862 /**
863  * ice_dpll_input_direction - callback for get input pin direction
864  * @pin: pointer to a pin
865  * @pin_priv: private data pointer passed on pin registration
866  * @dpll: registered dpll pointer
867  * @dpll_priv: private data pointer passed on dpll registration
868  * @direction: holds input pin direction
869  * @extack: error reporting
870  *
871  * Dpll subsystem callback. Handler for getting direction of a input pin.
872  *
873  * Return:
874  * * 0 - success
875  */
876 static int
877 ice_dpll_input_direction(const struct dpll_pin *pin, void *pin_priv,
878 			 const struct dpll_device *dpll, void *dpll_priv,
879 			 enum dpll_pin_direction *direction,
880 			 struct netlink_ext_ack *extack)
881 {
882 	*direction = DPLL_PIN_DIRECTION_INPUT;
883 
884 	return 0;
885 }
886 
887 /**
888  * ice_dpll_output_direction - callback for get output pin direction
889  * @pin: pointer to a pin
890  * @pin_priv: private data pointer passed on pin registration
891  * @dpll: registered dpll pointer
892  * @dpll_priv: private data pointer passed on dpll registration
893  * @direction: holds output pin direction
894  * @extack: error reporting
895  *
896  * Dpll subsystem callback. Handler for getting direction of an output pin.
897  *
898  * Return:
899  * * 0 - success
900  */
901 static int
902 ice_dpll_output_direction(const struct dpll_pin *pin, void *pin_priv,
903 			  const struct dpll_device *dpll, void *dpll_priv,
904 			  enum dpll_pin_direction *direction,
905 			  struct netlink_ext_ack *extack)
906 {
907 	*direction = DPLL_PIN_DIRECTION_OUTPUT;
908 
909 	return 0;
910 }
911 
912 /**
913  * ice_dpll_pin_phase_adjust_get - callback for get pin phase adjust value
914  * @pin: pointer to a pin
915  * @pin_priv: private data pointer passed on pin registration
916  * @dpll: registered dpll pointer
917  * @dpll_priv: private data pointer passed on dpll registration
918  * @phase_adjust: on success holds pin phase_adjust value
919  * @extack: error reporting
920  *
921  * Dpll subsystem callback. Handler for getting phase adjust value of a pin.
922  *
923  * Context: Acquires pf->dplls.lock
924  * Return:
925  * * 0 - success
926  * * negative - error
927  */
928 static int
929 ice_dpll_pin_phase_adjust_get(const struct dpll_pin *pin, void *pin_priv,
930 			      const struct dpll_device *dpll, void *dpll_priv,
931 			      s32 *phase_adjust,
932 			      struct netlink_ext_ack *extack)
933 {
934 	struct ice_dpll_pin *p = pin_priv;
935 	struct ice_pf *pf = p->pf;
936 
937 	mutex_lock(&pf->dplls.lock);
938 	*phase_adjust = p->phase_adjust;
939 	mutex_unlock(&pf->dplls.lock);
940 
941 	return 0;
942 }
943 
944 /**
945  * ice_dpll_pin_phase_adjust_set - helper for setting a pin phase adjust value
946  * @pin: pointer to a pin
947  * @pin_priv: private data pointer passed on pin registration
948  * @dpll: registered dpll pointer
949  * @dpll_priv: private data pointer passed on dpll registration
950  * @phase_adjust: phase_adjust to be set
951  * @extack: error reporting
952  * @type: type of a pin
953  *
954  * Helper for dpll subsystem callback. Handler for setting phase adjust value
955  * of a pin.
956  *
957  * Context: Acquires pf->dplls.lock
958  * Return:
959  * * 0 - success
960  * * negative - error
961  */
962 static int
963 ice_dpll_pin_phase_adjust_set(const struct dpll_pin *pin, void *pin_priv,
964 			      const struct dpll_device *dpll, void *dpll_priv,
965 			      s32 phase_adjust,
966 			      struct netlink_ext_ack *extack,
967 			      enum ice_dpll_pin_type type)
968 {
969 	struct ice_dpll_pin *p = pin_priv;
970 	struct ice_dpll *d = dpll_priv;
971 	struct ice_pf *pf = d->pf;
972 	u8 flag, flags_en = 0;
973 	int ret;
974 
975 	if (ice_dpll_is_reset(pf, extack))
976 		return -EBUSY;
977 
978 	mutex_lock(&pf->dplls.lock);
979 	switch (type) {
980 	case ICE_DPLL_PIN_TYPE_INPUT:
981 		flag = ICE_AQC_SET_CGU_IN_CFG_FLG1_UPDATE_DELAY;
982 		if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN)
983 			flags_en |= ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
984 		if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_INPUT_EN)
985 			flags_en |= ICE_AQC_SET_CGU_IN_CFG_FLG2_INPUT_EN;
986 		ret = ice_aq_set_input_pin_cfg(&pf->hw, p->idx, flag, flags_en,
987 					       0, phase_adjust);
988 		break;
989 	case ICE_DPLL_PIN_TYPE_OUTPUT:
990 		flag = ICE_AQC_SET_CGU_OUT_CFG_UPDATE_PHASE;
991 		if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_OUT_EN)
992 			flag |= ICE_AQC_SET_CGU_OUT_CFG_OUT_EN;
993 		if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN)
994 			flag |= ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
995 		ret = ice_aq_set_output_pin_cfg(&pf->hw, p->idx, flag, 0, 0,
996 						phase_adjust);
997 		break;
998 	default:
999 		ret = -EINVAL;
1000 	}
1001 	if (!ret)
1002 		p->phase_adjust = phase_adjust;
1003 	mutex_unlock(&pf->dplls.lock);
1004 	if (ret)
1005 		NL_SET_ERR_MSG_FMT(extack,
1006 				   "err:%d %s failed to set pin phase_adjust:%d for pin:%u on dpll:%u\n",
1007 				   ret,
1008 				   ice_aq_str(pf->hw.adminq.sq_last_status),
1009 				   phase_adjust, p->idx, d->dpll_idx);
1010 
1011 	return ret;
1012 }
1013 
1014 /**
1015  * ice_dpll_input_phase_adjust_set - callback for set input pin phase adjust
1016  * @pin: pointer to a pin
1017  * @pin_priv: private data pointer passed on pin registration
1018  * @dpll: registered dpll pointer
1019  * @dpll_priv: private data pointer passed on dpll registration
1020  * @phase_adjust: phase_adjust to be set
1021  * @extack: error reporting
1022  *
1023  * Dpll subsystem callback. Wraps a handler for setting phase adjust on input
1024  * pin.
1025  *
1026  * Context: Calls a function which acquires pf->dplls.lock
1027  * Return:
1028  * * 0 - success
1029  * * negative - error
1030  */
1031 static int
1032 ice_dpll_input_phase_adjust_set(const struct dpll_pin *pin, void *pin_priv,
1033 				const struct dpll_device *dpll, void *dpll_priv,
1034 				s32 phase_adjust,
1035 				struct netlink_ext_ack *extack)
1036 {
1037 	return ice_dpll_pin_phase_adjust_set(pin, pin_priv, dpll, dpll_priv,
1038 					     phase_adjust, extack,
1039 					     ICE_DPLL_PIN_TYPE_INPUT);
1040 }
1041 
1042 /**
1043  * ice_dpll_output_phase_adjust_set - callback for set output pin phase adjust
1044  * @pin: pointer to a pin
1045  * @pin_priv: private data pointer passed on pin registration
1046  * @dpll: registered dpll pointer
1047  * @dpll_priv: private data pointer passed on dpll registration
1048  * @phase_adjust: phase_adjust to be set
1049  * @extack: error reporting
1050  *
1051  * Dpll subsystem callback. Wraps a handler for setting phase adjust on output
1052  * pin.
1053  *
1054  * Context: Calls a function which acquires pf->dplls.lock
1055  * Return:
1056  * * 0 - success
1057  * * negative - error
1058  */
1059 static int
1060 ice_dpll_output_phase_adjust_set(const struct dpll_pin *pin, void *pin_priv,
1061 				 const struct dpll_device *dpll, void *dpll_priv,
1062 				 s32 phase_adjust,
1063 				 struct netlink_ext_ack *extack)
1064 {
1065 	return ice_dpll_pin_phase_adjust_set(pin, pin_priv, dpll, dpll_priv,
1066 					     phase_adjust, extack,
1067 					     ICE_DPLL_PIN_TYPE_OUTPUT);
1068 }
1069 
1070 #define ICE_DPLL_PHASE_OFFSET_DIVIDER	100
1071 #define ICE_DPLL_PHASE_OFFSET_FACTOR		\
1072 	(DPLL_PHASE_OFFSET_DIVIDER / ICE_DPLL_PHASE_OFFSET_DIVIDER)
1073 /**
1074  * ice_dpll_phase_offset_get - callback for get dpll phase shift value
1075  * @pin: pointer to a pin
1076  * @pin_priv: private data pointer passed on pin registration
1077  * @dpll: registered dpll pointer
1078  * @dpll_priv: private data pointer passed on dpll registration
1079  * @phase_offset: on success holds pin phase_offset value
1080  * @extack: error reporting
1081  *
1082  * Dpll subsystem callback. Handler for getting phase shift value between
1083  * dpll's input and output.
1084  *
1085  * Context: Acquires pf->dplls.lock
1086  * Return:
1087  * * 0 - success
1088  * * negative - error
1089  */
1090 static int
1091 ice_dpll_phase_offset_get(const struct dpll_pin *pin, void *pin_priv,
1092 			  const struct dpll_device *dpll, void *dpll_priv,
1093 			  s64 *phase_offset, struct netlink_ext_ack *extack)
1094 {
1095 	struct ice_dpll *d = dpll_priv;
1096 	struct ice_pf *pf = d->pf;
1097 
1098 	mutex_lock(&pf->dplls.lock);
1099 	if (d->active_input == pin)
1100 		*phase_offset = d->phase_offset * ICE_DPLL_PHASE_OFFSET_FACTOR;
1101 	else
1102 		*phase_offset = 0;
1103 	mutex_unlock(&pf->dplls.lock);
1104 
1105 	return 0;
1106 }
1107 
1108 /**
1109  * ice_dpll_output_esync_set - callback for setting embedded sync
1110  * @pin: pointer to a pin
1111  * @pin_priv: private data pointer passed on pin registration
1112  * @dpll: registered dpll pointer
1113  * @dpll_priv: private data pointer passed on dpll registration
1114  * @freq: requested embedded sync frequency
1115  * @extack: error reporting
1116  *
1117  * Dpll subsystem callback. Handler for setting embedded sync frequency value
1118  * on output pin.
1119  *
1120  * Context: Acquires pf->dplls.lock
1121  * Return:
1122  * * 0 - success
1123  * * negative - error
1124  */
1125 static int
1126 ice_dpll_output_esync_set(const struct dpll_pin *pin, void *pin_priv,
1127 			  const struct dpll_device *dpll, void *dpll_priv,
1128 			  u64 freq, struct netlink_ext_ack *extack)
1129 {
1130 	struct ice_dpll_pin *p = pin_priv;
1131 	struct ice_dpll *d = dpll_priv;
1132 	struct ice_pf *pf = d->pf;
1133 	u8 flags = 0;
1134 	int ret;
1135 
1136 	if (ice_dpll_is_reset(pf, extack))
1137 		return -EBUSY;
1138 	mutex_lock(&pf->dplls.lock);
1139 	if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_OUT_EN)
1140 		flags = ICE_AQC_SET_CGU_OUT_CFG_OUT_EN;
1141 	if (freq == DPLL_PIN_FREQUENCY_1_HZ) {
1142 		if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN) {
1143 			ret = 0;
1144 		} else {
1145 			flags |= ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
1146 			ret = ice_aq_set_output_pin_cfg(&pf->hw, p->idx, flags,
1147 							0, 0, 0);
1148 		}
1149 	} else {
1150 		if (!(p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN)) {
1151 			ret = 0;
1152 		} else {
1153 			flags &= ~ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
1154 			ret = ice_aq_set_output_pin_cfg(&pf->hw, p->idx, flags,
1155 							0, 0, 0);
1156 		}
1157 	}
1158 	mutex_unlock(&pf->dplls.lock);
1159 
1160 	return ret;
1161 }
1162 
1163 /**
1164  * ice_dpll_output_esync_get - callback for getting embedded sync config
1165  * @pin: pointer to a pin
1166  * @pin_priv: private data pointer passed on pin registration
1167  * @dpll: registered dpll pointer
1168  * @dpll_priv: private data pointer passed on dpll registration
1169  * @esync: on success holds embedded sync pin properties
1170  * @extack: error reporting
1171  *
1172  * Dpll subsystem callback. Handler for getting embedded sync frequency value
1173  * and capabilities on output pin.
1174  *
1175  * Context: Acquires pf->dplls.lock
1176  * Return:
1177  * * 0 - success
1178  * * negative - error
1179  */
1180 static int
1181 ice_dpll_output_esync_get(const struct dpll_pin *pin, void *pin_priv,
1182 			  const struct dpll_device *dpll, void *dpll_priv,
1183 			  struct dpll_pin_esync *esync,
1184 			  struct netlink_ext_ack *extack)
1185 {
1186 	struct ice_dpll_pin *p = pin_priv;
1187 	struct ice_dpll *d = dpll_priv;
1188 	struct ice_pf *pf = d->pf;
1189 
1190 	if (ice_dpll_is_reset(pf, extack))
1191 		return -EBUSY;
1192 	mutex_lock(&pf->dplls.lock);
1193 	if (!(p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_ABILITY) ||
1194 	    p->freq != DPLL_PIN_FREQUENCY_10_MHZ) {
1195 		mutex_unlock(&pf->dplls.lock);
1196 		return -EOPNOTSUPP;
1197 	}
1198 	esync->range = ice_esync_range;
1199 	esync->range_num = ARRAY_SIZE(ice_esync_range);
1200 	if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN) {
1201 		esync->freq = DPLL_PIN_FREQUENCY_1_HZ;
1202 		esync->pulse = ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT;
1203 	} else {
1204 		esync->freq = 0;
1205 		esync->pulse = 0;
1206 	}
1207 	mutex_unlock(&pf->dplls.lock);
1208 
1209 	return 0;
1210 }
1211 
1212 /**
1213  * ice_dpll_input_esync_set - callback for setting embedded sync
1214  * @pin: pointer to a pin
1215  * @pin_priv: private data pointer passed on pin registration
1216  * @dpll: registered dpll pointer
1217  * @dpll_priv: private data pointer passed on dpll registration
1218  * @freq: requested embedded sync frequency
1219  * @extack: error reporting
1220  *
1221  * Dpll subsystem callback. Handler for setting embedded sync frequency value
1222  * on input pin.
1223  *
1224  * Context: Acquires pf->dplls.lock
1225  * Return:
1226  * * 0 - success
1227  * * negative - error
1228  */
1229 static int
1230 ice_dpll_input_esync_set(const struct dpll_pin *pin, void *pin_priv,
1231 			 const struct dpll_device *dpll, void *dpll_priv,
1232 			 u64 freq, struct netlink_ext_ack *extack)
1233 {
1234 	struct ice_dpll_pin *p = pin_priv;
1235 	struct ice_dpll *d = dpll_priv;
1236 	struct ice_pf *pf = d->pf;
1237 	u8 flags_en = 0;
1238 	int ret;
1239 
1240 	if (ice_dpll_is_reset(pf, extack))
1241 		return -EBUSY;
1242 	mutex_lock(&pf->dplls.lock);
1243 	if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_INPUT_EN)
1244 		flags_en = ICE_AQC_SET_CGU_IN_CFG_FLG2_INPUT_EN;
1245 	if (freq == DPLL_PIN_FREQUENCY_1_HZ) {
1246 		if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN) {
1247 			ret = 0;
1248 		} else {
1249 			flags_en |= ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
1250 			ret = ice_aq_set_input_pin_cfg(&pf->hw, p->idx, 0,
1251 						       flags_en, 0, 0);
1252 		}
1253 	} else {
1254 		if (!(p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN)) {
1255 			ret = 0;
1256 		} else {
1257 			flags_en &= ~ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
1258 			ret = ice_aq_set_input_pin_cfg(&pf->hw, p->idx, 0,
1259 						       flags_en, 0, 0);
1260 		}
1261 	}
1262 	mutex_unlock(&pf->dplls.lock);
1263 
1264 	return ret;
1265 }
1266 
1267 /**
1268  * ice_dpll_input_esync_get - callback for getting embedded sync config
1269  * @pin: pointer to a pin
1270  * @pin_priv: private data pointer passed on pin registration
1271  * @dpll: registered dpll pointer
1272  * @dpll_priv: private data pointer passed on dpll registration
1273  * @esync: on success holds embedded sync pin properties
1274  * @extack: error reporting
1275  *
1276  * Dpll subsystem callback. Handler for getting embedded sync frequency value
1277  * and capabilities on input pin.
1278  *
1279  * Context: Acquires pf->dplls.lock
1280  * Return:
1281  * * 0 - success
1282  * * negative - error
1283  */
1284 static int
1285 ice_dpll_input_esync_get(const struct dpll_pin *pin, void *pin_priv,
1286 			 const struct dpll_device *dpll, void *dpll_priv,
1287 			 struct dpll_pin_esync *esync,
1288 			 struct netlink_ext_ack *extack)
1289 {
1290 	struct ice_dpll_pin *p = pin_priv;
1291 	struct ice_dpll *d = dpll_priv;
1292 	struct ice_pf *pf = d->pf;
1293 
1294 	if (ice_dpll_is_reset(pf, extack))
1295 		return -EBUSY;
1296 	mutex_lock(&pf->dplls.lock);
1297 	if (!(p->status & ICE_AQC_GET_CGU_IN_CFG_STATUS_ESYNC_CAP) ||
1298 	    p->freq != DPLL_PIN_FREQUENCY_10_MHZ) {
1299 		mutex_unlock(&pf->dplls.lock);
1300 		return -EOPNOTSUPP;
1301 	}
1302 	esync->range = ice_esync_range;
1303 	esync->range_num = ARRAY_SIZE(ice_esync_range);
1304 	if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN) {
1305 		esync->freq = DPLL_PIN_FREQUENCY_1_HZ;
1306 		esync->pulse = ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT;
1307 	} else {
1308 		esync->freq = 0;
1309 		esync->pulse = 0;
1310 	}
1311 	mutex_unlock(&pf->dplls.lock);
1312 
1313 	return 0;
1314 }
1315 
1316 /**
1317  * ice_dpll_rclk_state_on_pin_set - set a state on rclk pin
1318  * @pin: pointer to a pin
1319  * @pin_priv: private data pointer passed on pin registration
1320  * @parent_pin: pin parent pointer
1321  * @parent_pin_priv: parent private data pointer passed on pin registration
1322  * @state: state to be set on pin
1323  * @extack: error reporting
1324  *
1325  * Dpll subsystem callback, set a state of a rclk pin on a parent pin
1326  *
1327  * Context: Acquires pf->dplls.lock
1328  * Return:
1329  * * 0 - success
1330  * * negative - failure
1331  */
1332 static int
1333 ice_dpll_rclk_state_on_pin_set(const struct dpll_pin *pin, void *pin_priv,
1334 			       const struct dpll_pin *parent_pin,
1335 			       void *parent_pin_priv,
1336 			       enum dpll_pin_state state,
1337 			       struct netlink_ext_ack *extack)
1338 {
1339 	struct ice_dpll_pin *p = pin_priv, *parent = parent_pin_priv;
1340 	bool enable = state == DPLL_PIN_STATE_CONNECTED;
1341 	struct ice_pf *pf = p->pf;
1342 	int ret = -EINVAL;
1343 	u32 hw_idx;
1344 
1345 	if (ice_dpll_is_reset(pf, extack))
1346 		return -EBUSY;
1347 
1348 	mutex_lock(&pf->dplls.lock);
1349 	hw_idx = parent->idx - pf->dplls.base_rclk_idx;
1350 	if (hw_idx >= pf->dplls.num_inputs)
1351 		goto unlock;
1352 
1353 	if ((enable && p->state[hw_idx] == DPLL_PIN_STATE_CONNECTED) ||
1354 	    (!enable && p->state[hw_idx] == DPLL_PIN_STATE_DISCONNECTED)) {
1355 		NL_SET_ERR_MSG_FMT(extack,
1356 				   "pin:%u state:%u on parent:%u already set",
1357 				   p->idx, state, parent->idx);
1358 		goto unlock;
1359 	}
1360 	ret = ice_aq_set_phy_rec_clk_out(&pf->hw, hw_idx, enable,
1361 					 &p->freq);
1362 	if (ret)
1363 		NL_SET_ERR_MSG_FMT(extack,
1364 				   "err:%d %s failed to set pin state:%u for pin:%u on parent:%u\n",
1365 				   ret,
1366 				   ice_aq_str(pf->hw.adminq.sq_last_status),
1367 				   state, p->idx, parent->idx);
1368 unlock:
1369 	mutex_unlock(&pf->dplls.lock);
1370 
1371 	return ret;
1372 }
1373 
1374 /**
1375  * ice_dpll_rclk_state_on_pin_get - get a state of rclk pin
1376  * @pin: pointer to a pin
1377  * @pin_priv: private data pointer passed on pin registration
1378  * @parent_pin: pin parent pointer
1379  * @parent_pin_priv: pin parent priv data pointer passed on pin registration
1380  * @state: on success holds pin state on parent pin
1381  * @extack: error reporting
1382  *
1383  * dpll subsystem callback, get a state of a recovered clock pin.
1384  *
1385  * Context: Acquires pf->dplls.lock
1386  * Return:
1387  * * 0 - success
1388  * * negative - failure
1389  */
1390 static int
1391 ice_dpll_rclk_state_on_pin_get(const struct dpll_pin *pin, void *pin_priv,
1392 			       const struct dpll_pin *parent_pin,
1393 			       void *parent_pin_priv,
1394 			       enum dpll_pin_state *state,
1395 			       struct netlink_ext_ack *extack)
1396 {
1397 	struct ice_dpll_pin *p = pin_priv, *parent = parent_pin_priv;
1398 	struct ice_pf *pf = p->pf;
1399 	int ret = -EINVAL;
1400 	u32 hw_idx;
1401 
1402 	if (ice_dpll_is_reset(pf, extack))
1403 		return -EBUSY;
1404 
1405 	mutex_lock(&pf->dplls.lock);
1406 	hw_idx = parent->idx - pf->dplls.base_rclk_idx;
1407 	if (hw_idx >= pf->dplls.num_inputs)
1408 		goto unlock;
1409 
1410 	ret = ice_dpll_pin_state_update(pf, p, ICE_DPLL_PIN_TYPE_RCLK_INPUT,
1411 					extack);
1412 	if (ret)
1413 		goto unlock;
1414 
1415 	*state = p->state[hw_idx];
1416 	ret = 0;
1417 unlock:
1418 	mutex_unlock(&pf->dplls.lock);
1419 
1420 	return ret;
1421 }
1422 
1423 static const struct dpll_pin_ops ice_dpll_rclk_ops = {
1424 	.state_on_pin_set = ice_dpll_rclk_state_on_pin_set,
1425 	.state_on_pin_get = ice_dpll_rclk_state_on_pin_get,
1426 	.direction_get = ice_dpll_input_direction,
1427 };
1428 
1429 static const struct dpll_pin_ops ice_dpll_input_ops = {
1430 	.frequency_get = ice_dpll_input_frequency_get,
1431 	.frequency_set = ice_dpll_input_frequency_set,
1432 	.state_on_dpll_get = ice_dpll_input_state_get,
1433 	.state_on_dpll_set = ice_dpll_input_state_set,
1434 	.prio_get = ice_dpll_input_prio_get,
1435 	.prio_set = ice_dpll_input_prio_set,
1436 	.direction_get = ice_dpll_input_direction,
1437 	.phase_adjust_get = ice_dpll_pin_phase_adjust_get,
1438 	.phase_adjust_set = ice_dpll_input_phase_adjust_set,
1439 	.phase_offset_get = ice_dpll_phase_offset_get,
1440 	.esync_set = ice_dpll_input_esync_set,
1441 	.esync_get = ice_dpll_input_esync_get,
1442 };
1443 
1444 static const struct dpll_pin_ops ice_dpll_output_ops = {
1445 	.frequency_get = ice_dpll_output_frequency_get,
1446 	.frequency_set = ice_dpll_output_frequency_set,
1447 	.state_on_dpll_get = ice_dpll_output_state_get,
1448 	.state_on_dpll_set = ice_dpll_output_state_set,
1449 	.direction_get = ice_dpll_output_direction,
1450 	.phase_adjust_get = ice_dpll_pin_phase_adjust_get,
1451 	.phase_adjust_set = ice_dpll_output_phase_adjust_set,
1452 	.esync_set = ice_dpll_output_esync_set,
1453 	.esync_get = ice_dpll_output_esync_get,
1454 };
1455 
1456 static const struct dpll_device_ops ice_dpll_ops = {
1457 	.lock_status_get = ice_dpll_lock_status_get,
1458 	.mode_get = ice_dpll_mode_get,
1459 };
1460 
1461 /**
1462  * ice_generate_clock_id - generates unique clock_id for registering dpll.
1463  * @pf: board private structure
1464  *
1465  * Generates unique (per board) clock_id for allocation and search of dpll
1466  * devices in Linux dpll subsystem.
1467  *
1468  * Return: generated clock id for the board
1469  */
1470 static u64 ice_generate_clock_id(struct ice_pf *pf)
1471 {
1472 	return pci_get_dsn(pf->pdev);
1473 }
1474 
1475 /**
1476  * ice_dpll_notify_changes - notify dpll subsystem about changes
1477  * @d: pointer do dpll
1478  *
1479  * Once change detected appropriate event is submitted to the dpll subsystem.
1480  */
1481 static void ice_dpll_notify_changes(struct ice_dpll *d)
1482 {
1483 	bool pin_notified = false;
1484 
1485 	if (d->prev_dpll_state != d->dpll_state) {
1486 		d->prev_dpll_state = d->dpll_state;
1487 		dpll_device_change_ntf(d->dpll);
1488 	}
1489 	if (d->prev_input != d->active_input) {
1490 		if (d->prev_input)
1491 			dpll_pin_change_ntf(d->prev_input);
1492 		d->prev_input = d->active_input;
1493 		if (d->active_input) {
1494 			dpll_pin_change_ntf(d->active_input);
1495 			pin_notified = true;
1496 		}
1497 	}
1498 	if (d->prev_phase_offset != d->phase_offset) {
1499 		d->prev_phase_offset = d->phase_offset;
1500 		if (!pin_notified && d->active_input)
1501 			dpll_pin_change_ntf(d->active_input);
1502 	}
1503 }
1504 
1505 /**
1506  * ice_dpll_update_state - update dpll state
1507  * @pf: pf private structure
1508  * @d: pointer to queried dpll device
1509  * @init: if function called on initialization of ice dpll
1510  *
1511  * Poll current state of dpll from hw and update ice_dpll struct.
1512  *
1513  * Context: Called by kworker under pf->dplls.lock
1514  * Return:
1515  * * 0 - success
1516  * * negative - AQ failure
1517  */
1518 static int
1519 ice_dpll_update_state(struct ice_pf *pf, struct ice_dpll *d, bool init)
1520 {
1521 	struct ice_dpll_pin *p = NULL;
1522 	int ret;
1523 
1524 	ret = ice_get_cgu_state(&pf->hw, d->dpll_idx, d->prev_dpll_state,
1525 				&d->input_idx, &d->ref_state, &d->eec_mode,
1526 				&d->phase_offset, &d->dpll_state);
1527 
1528 	dev_dbg(ice_pf_to_dev(pf),
1529 		"update dpll=%d, prev_src_idx:%u, src_idx:%u, state:%d, prev:%d mode:%d\n",
1530 		d->dpll_idx, d->prev_input_idx, d->input_idx,
1531 		d->dpll_state, d->prev_dpll_state, d->mode);
1532 	if (ret) {
1533 		dev_err(ice_pf_to_dev(pf),
1534 			"update dpll=%d state failed, ret=%d %s\n",
1535 			d->dpll_idx, ret,
1536 			ice_aq_str(pf->hw.adminq.sq_last_status));
1537 		return ret;
1538 	}
1539 	if (init) {
1540 		if (d->dpll_state == DPLL_LOCK_STATUS_LOCKED ||
1541 		    d->dpll_state == DPLL_LOCK_STATUS_LOCKED_HO_ACQ)
1542 			d->active_input = pf->dplls.inputs[d->input_idx].pin;
1543 		p = &pf->dplls.inputs[d->input_idx];
1544 		return ice_dpll_pin_state_update(pf, p,
1545 						 ICE_DPLL_PIN_TYPE_INPUT, NULL);
1546 	}
1547 	if (d->dpll_state == DPLL_LOCK_STATUS_HOLDOVER ||
1548 	    d->dpll_state == DPLL_LOCK_STATUS_UNLOCKED) {
1549 		d->active_input = NULL;
1550 		if (d->input_idx != ICE_DPLL_PIN_IDX_INVALID)
1551 			p = &pf->dplls.inputs[d->input_idx];
1552 		d->prev_input_idx = ICE_DPLL_PIN_IDX_INVALID;
1553 		d->input_idx = ICE_DPLL_PIN_IDX_INVALID;
1554 		if (!p)
1555 			return 0;
1556 		ret = ice_dpll_pin_state_update(pf, p,
1557 						ICE_DPLL_PIN_TYPE_INPUT, NULL);
1558 	} else if (d->input_idx != d->prev_input_idx) {
1559 		if (d->prev_input_idx != ICE_DPLL_PIN_IDX_INVALID) {
1560 			p = &pf->dplls.inputs[d->prev_input_idx];
1561 			ice_dpll_pin_state_update(pf, p,
1562 						  ICE_DPLL_PIN_TYPE_INPUT,
1563 						  NULL);
1564 		}
1565 		if (d->input_idx != ICE_DPLL_PIN_IDX_INVALID) {
1566 			p = &pf->dplls.inputs[d->input_idx];
1567 			d->active_input = p->pin;
1568 			ice_dpll_pin_state_update(pf, p,
1569 						  ICE_DPLL_PIN_TYPE_INPUT,
1570 						  NULL);
1571 		}
1572 		d->prev_input_idx = d->input_idx;
1573 	}
1574 
1575 	return ret;
1576 }
1577 
1578 /**
1579  * ice_dpll_periodic_work - DPLLs periodic worker
1580  * @work: pointer to kthread_work structure
1581  *
1582  * DPLLs periodic worker is responsible for polling state of dpll.
1583  * Context: Holds pf->dplls.lock
1584  */
1585 static void ice_dpll_periodic_work(struct kthread_work *work)
1586 {
1587 	struct ice_dplls *d = container_of(work, struct ice_dplls, work.work);
1588 	struct ice_pf *pf = container_of(d, struct ice_pf, dplls);
1589 	struct ice_dpll *de = &pf->dplls.eec;
1590 	struct ice_dpll *dp = &pf->dplls.pps;
1591 	int ret = 0;
1592 
1593 	if (ice_is_reset_in_progress(pf->state))
1594 		goto resched;
1595 	mutex_lock(&pf->dplls.lock);
1596 	ret = ice_dpll_update_state(pf, de, false);
1597 	if (!ret)
1598 		ret = ice_dpll_update_state(pf, dp, false);
1599 	if (ret) {
1600 		d->cgu_state_acq_err_num++;
1601 		/* stop rescheduling this worker */
1602 		if (d->cgu_state_acq_err_num >
1603 		    ICE_CGU_STATE_ACQ_ERR_THRESHOLD) {
1604 			dev_err(ice_pf_to_dev(pf),
1605 				"EEC/PPS DPLLs periodic work disabled\n");
1606 			mutex_unlock(&pf->dplls.lock);
1607 			return;
1608 		}
1609 	}
1610 	mutex_unlock(&pf->dplls.lock);
1611 	ice_dpll_notify_changes(de);
1612 	ice_dpll_notify_changes(dp);
1613 
1614 resched:
1615 	/* Run twice a second or reschedule if update failed */
1616 	kthread_queue_delayed_work(d->kworker, &d->work,
1617 				   ret ? msecs_to_jiffies(10) :
1618 				   msecs_to_jiffies(500));
1619 }
1620 
1621 /**
1622  * ice_dpll_release_pins - release pins resources from dpll subsystem
1623  * @pins: pointer to pins array
1624  * @count: number of pins
1625  *
1626  * Release resources of given pins array in the dpll subsystem.
1627  */
1628 static void ice_dpll_release_pins(struct ice_dpll_pin *pins, int count)
1629 {
1630 	int i;
1631 
1632 	for (i = 0; i < count; i++)
1633 		dpll_pin_put(pins[i].pin);
1634 }
1635 
1636 /**
1637  * ice_dpll_get_pins - get pins from dpll subsystem
1638  * @pf: board private structure
1639  * @pins: pointer to pins array
1640  * @start_idx: get starts from this pin idx value
1641  * @count: number of pins
1642  * @clock_id: clock_id of dpll device
1643  *
1644  * Get pins - allocate - in dpll subsystem, store them in pin field of given
1645  * pins array.
1646  *
1647  * Return:
1648  * * 0 - success
1649  * * negative - allocation failure reason
1650  */
1651 static int
1652 ice_dpll_get_pins(struct ice_pf *pf, struct ice_dpll_pin *pins,
1653 		  int start_idx, int count, u64 clock_id)
1654 {
1655 	int i, ret;
1656 
1657 	for (i = 0; i < count; i++) {
1658 		pins[i].pin = dpll_pin_get(clock_id, i + start_idx, THIS_MODULE,
1659 					   &pins[i].prop);
1660 		if (IS_ERR(pins[i].pin)) {
1661 			ret = PTR_ERR(pins[i].pin);
1662 			goto release_pins;
1663 		}
1664 	}
1665 
1666 	return 0;
1667 
1668 release_pins:
1669 	while (--i >= 0)
1670 		dpll_pin_put(pins[i].pin);
1671 	return ret;
1672 }
1673 
1674 /**
1675  * ice_dpll_unregister_pins - unregister pins from a dpll
1676  * @dpll: dpll device pointer
1677  * @pins: pointer to pins array
1678  * @ops: callback ops registered with the pins
1679  * @count: number of pins
1680  *
1681  * Unregister pins of a given array of pins from given dpll device registered in
1682  * dpll subsystem.
1683  */
1684 static void
1685 ice_dpll_unregister_pins(struct dpll_device *dpll, struct ice_dpll_pin *pins,
1686 			 const struct dpll_pin_ops *ops, int count)
1687 {
1688 	int i;
1689 
1690 	for (i = 0; i < count; i++)
1691 		dpll_pin_unregister(dpll, pins[i].pin, ops, &pins[i]);
1692 }
1693 
1694 /**
1695  * ice_dpll_register_pins - register pins with a dpll
1696  * @dpll: dpll pointer to register pins with
1697  * @pins: pointer to pins array
1698  * @ops: callback ops registered with the pins
1699  * @count: number of pins
1700  *
1701  * Register pins of a given array with given dpll in dpll subsystem.
1702  *
1703  * Return:
1704  * * 0 - success
1705  * * negative - registration failure reason
1706  */
1707 static int
1708 ice_dpll_register_pins(struct dpll_device *dpll, struct ice_dpll_pin *pins,
1709 		       const struct dpll_pin_ops *ops, int count)
1710 {
1711 	int ret, i;
1712 
1713 	for (i = 0; i < count; i++) {
1714 		ret = dpll_pin_register(dpll, pins[i].pin, ops, &pins[i]);
1715 		if (ret)
1716 			goto unregister_pins;
1717 	}
1718 
1719 	return 0;
1720 
1721 unregister_pins:
1722 	while (--i >= 0)
1723 		dpll_pin_unregister(dpll, pins[i].pin, ops, &pins[i]);
1724 	return ret;
1725 }
1726 
1727 /**
1728  * ice_dpll_deinit_direct_pins - deinitialize direct pins
1729  * @cgu: if cgu is present and controlled by this NIC
1730  * @pins: pointer to pins array
1731  * @count: number of pins
1732  * @ops: callback ops registered with the pins
1733  * @first: dpll device pointer
1734  * @second: dpll device pointer
1735  *
1736  * If cgu is owned unregister pins from given dplls.
1737  * Release pins resources to the dpll subsystem.
1738  */
1739 static void
1740 ice_dpll_deinit_direct_pins(bool cgu, struct ice_dpll_pin *pins, int count,
1741 			    const struct dpll_pin_ops *ops,
1742 			    struct dpll_device *first,
1743 			    struct dpll_device *second)
1744 {
1745 	if (cgu) {
1746 		ice_dpll_unregister_pins(first, pins, ops, count);
1747 		ice_dpll_unregister_pins(second, pins, ops, count);
1748 	}
1749 	ice_dpll_release_pins(pins, count);
1750 }
1751 
1752 /**
1753  * ice_dpll_init_direct_pins - initialize direct pins
1754  * @pf: board private structure
1755  * @cgu: if cgu is present and controlled by this NIC
1756  * @pins: pointer to pins array
1757  * @start_idx: on which index shall allocation start in dpll subsystem
1758  * @count: number of pins
1759  * @ops: callback ops registered with the pins
1760  * @first: dpll device pointer
1761  * @second: dpll device pointer
1762  *
1763  * Allocate directly connected pins of a given array in dpll subsystem.
1764  * If cgu is owned register allocated pins with given dplls.
1765  *
1766  * Return:
1767  * * 0 - success
1768  * * negative - registration failure reason
1769  */
1770 static int
1771 ice_dpll_init_direct_pins(struct ice_pf *pf, bool cgu,
1772 			  struct ice_dpll_pin *pins, int start_idx, int count,
1773 			  const struct dpll_pin_ops *ops,
1774 			  struct dpll_device *first, struct dpll_device *second)
1775 {
1776 	int ret;
1777 
1778 	ret = ice_dpll_get_pins(pf, pins, start_idx, count, pf->dplls.clock_id);
1779 	if (ret)
1780 		return ret;
1781 	if (cgu) {
1782 		ret = ice_dpll_register_pins(first, pins, ops, count);
1783 		if (ret)
1784 			goto release_pins;
1785 		ret = ice_dpll_register_pins(second, pins, ops, count);
1786 		if (ret)
1787 			goto unregister_first;
1788 	}
1789 
1790 	return 0;
1791 
1792 unregister_first:
1793 	ice_dpll_unregister_pins(first, pins, ops, count);
1794 release_pins:
1795 	ice_dpll_release_pins(pins, count);
1796 	return ret;
1797 }
1798 
1799 /**
1800  * ice_dpll_deinit_rclk_pin - release rclk pin resources
1801  * @pf: board private structure
1802  *
1803  * Deregister rclk pin from parent pins and release resources in dpll subsystem.
1804  */
1805 static void ice_dpll_deinit_rclk_pin(struct ice_pf *pf)
1806 {
1807 	struct ice_dpll_pin *rclk = &pf->dplls.rclk;
1808 	struct ice_vsi *vsi = ice_get_main_vsi(pf);
1809 	struct dpll_pin *parent;
1810 	int i;
1811 
1812 	for (i = 0; i < rclk->num_parents; i++) {
1813 		parent = pf->dplls.inputs[rclk->parent_idx[i]].pin;
1814 		if (!parent)
1815 			continue;
1816 		dpll_pin_on_pin_unregister(parent, rclk->pin,
1817 					   &ice_dpll_rclk_ops, rclk);
1818 	}
1819 	if (WARN_ON_ONCE(!vsi || !vsi->netdev))
1820 		return;
1821 	dpll_netdev_pin_clear(vsi->netdev);
1822 	dpll_pin_put(rclk->pin);
1823 }
1824 
1825 /**
1826  * ice_dpll_init_rclk_pins - initialize recovered clock pin
1827  * @pf: board private structure
1828  * @pin: pin to register
1829  * @start_idx: on which index shall allocation start in dpll subsystem
1830  * @ops: callback ops registered with the pins
1831  *
1832  * Allocate resource for recovered clock pin in dpll subsystem. Register the
1833  * pin with the parents it has in the info. Register pin with the pf's main vsi
1834  * netdev.
1835  *
1836  * Return:
1837  * * 0 - success
1838  * * negative - registration failure reason
1839  */
1840 static int
1841 ice_dpll_init_rclk_pins(struct ice_pf *pf, struct ice_dpll_pin *pin,
1842 			int start_idx, const struct dpll_pin_ops *ops)
1843 {
1844 	struct ice_vsi *vsi = ice_get_main_vsi(pf);
1845 	struct dpll_pin *parent;
1846 	int ret, i;
1847 
1848 	if (WARN_ON((!vsi || !vsi->netdev)))
1849 		return -EINVAL;
1850 	ret = ice_dpll_get_pins(pf, pin, start_idx, ICE_DPLL_RCLK_NUM_PER_PF,
1851 				pf->dplls.clock_id);
1852 	if (ret)
1853 		return ret;
1854 	for (i = 0; i < pf->dplls.rclk.num_parents; i++) {
1855 		parent = pf->dplls.inputs[pf->dplls.rclk.parent_idx[i]].pin;
1856 		if (!parent) {
1857 			ret = -ENODEV;
1858 			goto unregister_pins;
1859 		}
1860 		ret = dpll_pin_on_pin_register(parent, pf->dplls.rclk.pin,
1861 					       ops, &pf->dplls.rclk);
1862 		if (ret)
1863 			goto unregister_pins;
1864 	}
1865 	dpll_netdev_pin_set(vsi->netdev, pf->dplls.rclk.pin);
1866 
1867 	return 0;
1868 
1869 unregister_pins:
1870 	while (i) {
1871 		parent = pf->dplls.inputs[pf->dplls.rclk.parent_idx[--i]].pin;
1872 		dpll_pin_on_pin_unregister(parent, pf->dplls.rclk.pin,
1873 					   &ice_dpll_rclk_ops, &pf->dplls.rclk);
1874 	}
1875 	ice_dpll_release_pins(pin, ICE_DPLL_RCLK_NUM_PER_PF);
1876 	return ret;
1877 }
1878 
1879 /**
1880  * ice_dpll_deinit_pins - deinitialize direct pins
1881  * @pf: board private structure
1882  * @cgu: if cgu is controlled by this pf
1883  *
1884  * If cgu is owned unregister directly connected pins from the dplls.
1885  * Release resources of directly connected pins from the dpll subsystem.
1886  */
1887 static void ice_dpll_deinit_pins(struct ice_pf *pf, bool cgu)
1888 {
1889 	struct ice_dpll_pin *outputs = pf->dplls.outputs;
1890 	struct ice_dpll_pin *inputs = pf->dplls.inputs;
1891 	int num_outputs = pf->dplls.num_outputs;
1892 	int num_inputs = pf->dplls.num_inputs;
1893 	struct ice_dplls *d = &pf->dplls;
1894 	struct ice_dpll *de = &d->eec;
1895 	struct ice_dpll *dp = &d->pps;
1896 
1897 	ice_dpll_deinit_rclk_pin(pf);
1898 	if (cgu) {
1899 		ice_dpll_unregister_pins(dp->dpll, inputs, &ice_dpll_input_ops,
1900 					 num_inputs);
1901 		ice_dpll_unregister_pins(de->dpll, inputs, &ice_dpll_input_ops,
1902 					 num_inputs);
1903 	}
1904 	ice_dpll_release_pins(inputs, num_inputs);
1905 	if (cgu) {
1906 		ice_dpll_unregister_pins(dp->dpll, outputs,
1907 					 &ice_dpll_output_ops, num_outputs);
1908 		ice_dpll_unregister_pins(de->dpll, outputs,
1909 					 &ice_dpll_output_ops, num_outputs);
1910 		ice_dpll_release_pins(outputs, num_outputs);
1911 	}
1912 }
1913 
1914 /**
1915  * ice_dpll_init_pins - init pins and register pins with a dplls
1916  * @pf: board private structure
1917  * @cgu: if cgu is present and controlled by this NIC
1918  *
1919  * Initialize directly connected pf's pins within pf's dplls in a Linux dpll
1920  * subsystem.
1921  *
1922  * Return:
1923  * * 0 - success
1924  * * negative - initialization failure reason
1925  */
1926 static int ice_dpll_init_pins(struct ice_pf *pf, bool cgu)
1927 {
1928 	u32 rclk_idx;
1929 	int ret;
1930 
1931 	ret = ice_dpll_init_direct_pins(pf, cgu, pf->dplls.inputs, 0,
1932 					pf->dplls.num_inputs,
1933 					&ice_dpll_input_ops,
1934 					pf->dplls.eec.dpll, pf->dplls.pps.dpll);
1935 	if (ret)
1936 		return ret;
1937 	if (cgu) {
1938 		ret = ice_dpll_init_direct_pins(pf, cgu, pf->dplls.outputs,
1939 						pf->dplls.num_inputs,
1940 						pf->dplls.num_outputs,
1941 						&ice_dpll_output_ops,
1942 						pf->dplls.eec.dpll,
1943 						pf->dplls.pps.dpll);
1944 		if (ret)
1945 			goto deinit_inputs;
1946 	}
1947 	rclk_idx = pf->dplls.num_inputs + pf->dplls.num_outputs + pf->hw.pf_id;
1948 	ret = ice_dpll_init_rclk_pins(pf, &pf->dplls.rclk, rclk_idx,
1949 				      &ice_dpll_rclk_ops);
1950 	if (ret)
1951 		goto deinit_outputs;
1952 
1953 	return 0;
1954 deinit_outputs:
1955 	ice_dpll_deinit_direct_pins(cgu, pf->dplls.outputs,
1956 				    pf->dplls.num_outputs,
1957 				    &ice_dpll_output_ops, pf->dplls.pps.dpll,
1958 				    pf->dplls.eec.dpll);
1959 deinit_inputs:
1960 	ice_dpll_deinit_direct_pins(cgu, pf->dplls.inputs, pf->dplls.num_inputs,
1961 				    &ice_dpll_input_ops, pf->dplls.pps.dpll,
1962 				    pf->dplls.eec.dpll);
1963 	return ret;
1964 }
1965 
1966 /**
1967  * ice_dpll_deinit_dpll - deinitialize dpll device
1968  * @pf: board private structure
1969  * @d: pointer to ice_dpll
1970  * @cgu: if cgu is present and controlled by this NIC
1971  *
1972  * If cgu is owned unregister the dpll from dpll subsystem.
1973  * Release resources of dpll device from dpll subsystem.
1974  */
1975 static void
1976 ice_dpll_deinit_dpll(struct ice_pf *pf, struct ice_dpll *d, bool cgu)
1977 {
1978 	if (cgu)
1979 		dpll_device_unregister(d->dpll, &ice_dpll_ops, d);
1980 	dpll_device_put(d->dpll);
1981 }
1982 
1983 /**
1984  * ice_dpll_init_dpll - initialize dpll device in dpll subsystem
1985  * @pf: board private structure
1986  * @d: dpll to be initialized
1987  * @cgu: if cgu is present and controlled by this NIC
1988  * @type: type of dpll being initialized
1989  *
1990  * Allocate dpll instance for this board in dpll subsystem, if cgu is controlled
1991  * by this NIC, register dpll with the callback ops.
1992  *
1993  * Return:
1994  * * 0 - success
1995  * * negative - initialization failure reason
1996  */
1997 static int
1998 ice_dpll_init_dpll(struct ice_pf *pf, struct ice_dpll *d, bool cgu,
1999 		   enum dpll_type type)
2000 {
2001 	u64 clock_id = pf->dplls.clock_id;
2002 	int ret;
2003 
2004 	d->dpll = dpll_device_get(clock_id, d->dpll_idx, THIS_MODULE);
2005 	if (IS_ERR(d->dpll)) {
2006 		ret = PTR_ERR(d->dpll);
2007 		dev_err(ice_pf_to_dev(pf),
2008 			"dpll_device_get failed (%p) err=%d\n", d, ret);
2009 		return ret;
2010 	}
2011 	d->pf = pf;
2012 	if (cgu) {
2013 		ice_dpll_update_state(pf, d, true);
2014 		ret = dpll_device_register(d->dpll, type, &ice_dpll_ops, d);
2015 		if (ret) {
2016 			dpll_device_put(d->dpll);
2017 			return ret;
2018 		}
2019 	}
2020 
2021 	return 0;
2022 }
2023 
2024 /**
2025  * ice_dpll_deinit_worker - deinitialize dpll kworker
2026  * @pf: board private structure
2027  *
2028  * Stop dpll's kworker, release it's resources.
2029  */
2030 static void ice_dpll_deinit_worker(struct ice_pf *pf)
2031 {
2032 	struct ice_dplls *d = &pf->dplls;
2033 
2034 	kthread_cancel_delayed_work_sync(&d->work);
2035 	kthread_destroy_worker(d->kworker);
2036 }
2037 
2038 /**
2039  * ice_dpll_init_worker - Initialize DPLLs periodic worker
2040  * @pf: board private structure
2041  *
2042  * Create and start DPLLs periodic worker.
2043  *
2044  * Context: Shall be called after pf->dplls.lock is initialized.
2045  * Return:
2046  * * 0 - success
2047  * * negative - create worker failure
2048  */
2049 static int ice_dpll_init_worker(struct ice_pf *pf)
2050 {
2051 	struct ice_dplls *d = &pf->dplls;
2052 	struct kthread_worker *kworker;
2053 
2054 	kthread_init_delayed_work(&d->work, ice_dpll_periodic_work);
2055 	kworker = kthread_create_worker(0, "ice-dplls-%s",
2056 					dev_name(ice_pf_to_dev(pf)));
2057 	if (IS_ERR(kworker))
2058 		return PTR_ERR(kworker);
2059 	d->kworker = kworker;
2060 	d->cgu_state_acq_err_num = 0;
2061 	kthread_queue_delayed_work(d->kworker, &d->work, 0);
2062 
2063 	return 0;
2064 }
2065 
2066 /**
2067  * ice_dpll_init_info_direct_pins - initializes direct pins info
2068  * @pf: board private structure
2069  * @pin_type: type of pins being initialized
2070  *
2071  * Init information for directly connected pins, cache them in pf's pins
2072  * structures.
2073  *
2074  * Return:
2075  * * 0 - success
2076  * * negative - init failure reason
2077  */
2078 static int
2079 ice_dpll_init_info_direct_pins(struct ice_pf *pf,
2080 			       enum ice_dpll_pin_type pin_type)
2081 {
2082 	struct ice_dpll *de = &pf->dplls.eec, *dp = &pf->dplls.pps;
2083 	int num_pins, i, ret = -EINVAL;
2084 	struct ice_hw *hw = &pf->hw;
2085 	struct ice_dpll_pin *pins;
2086 	unsigned long caps;
2087 	u8 freq_supp_num;
2088 	bool input;
2089 
2090 	switch (pin_type) {
2091 	case ICE_DPLL_PIN_TYPE_INPUT:
2092 		pins = pf->dplls.inputs;
2093 		num_pins = pf->dplls.num_inputs;
2094 		input = true;
2095 		break;
2096 	case ICE_DPLL_PIN_TYPE_OUTPUT:
2097 		pins = pf->dplls.outputs;
2098 		num_pins = pf->dplls.num_outputs;
2099 		input = false;
2100 		break;
2101 	default:
2102 		return -EINVAL;
2103 	}
2104 
2105 	for (i = 0; i < num_pins; i++) {
2106 		caps = 0;
2107 		pins[i].idx = i;
2108 		pins[i].prop.board_label = ice_cgu_get_pin_name(hw, i, input);
2109 		pins[i].prop.type = ice_cgu_get_pin_type(hw, i, input);
2110 		if (input) {
2111 			ret = ice_aq_get_cgu_ref_prio(hw, de->dpll_idx, i,
2112 						      &de->input_prio[i]);
2113 			if (ret)
2114 				return ret;
2115 			ret = ice_aq_get_cgu_ref_prio(hw, dp->dpll_idx, i,
2116 						      &dp->input_prio[i]);
2117 			if (ret)
2118 				return ret;
2119 			caps |= (DPLL_PIN_CAPABILITIES_PRIORITY_CAN_CHANGE |
2120 				 DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE);
2121 			pins[i].prop.phase_range.min =
2122 				pf->dplls.input_phase_adj_max;
2123 			pins[i].prop.phase_range.max =
2124 				-pf->dplls.input_phase_adj_max;
2125 		} else {
2126 			pins[i].prop.phase_range.min =
2127 				pf->dplls.output_phase_adj_max;
2128 			pins[i].prop.phase_range.max =
2129 				-pf->dplls.output_phase_adj_max;
2130 			ret = ice_cgu_get_output_pin_state_caps(hw, i, &caps);
2131 			if (ret)
2132 				return ret;
2133 		}
2134 		pins[i].prop.capabilities = caps;
2135 		ret = ice_dpll_pin_state_update(pf, &pins[i], pin_type, NULL);
2136 		if (ret)
2137 			return ret;
2138 		pins[i].prop.freq_supported =
2139 			ice_cgu_get_pin_freq_supp(hw, i, input, &freq_supp_num);
2140 		pins[i].prop.freq_supported_num = freq_supp_num;
2141 		pins[i].pf = pf;
2142 	}
2143 
2144 	return ret;
2145 }
2146 
2147 /**
2148  * ice_dpll_init_info_rclk_pin - initializes rclk pin information
2149  * @pf: board private structure
2150  *
2151  * Init information for rclk pin, cache them in pf->dplls.rclk.
2152  *
2153  * Return:
2154  * * 0 - success
2155  * * negative - init failure reason
2156  */
2157 static int ice_dpll_init_info_rclk_pin(struct ice_pf *pf)
2158 {
2159 	struct ice_dpll_pin *pin = &pf->dplls.rclk;
2160 
2161 	pin->prop.type = DPLL_PIN_TYPE_SYNCE_ETH_PORT;
2162 	pin->prop.capabilities |= DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE;
2163 	pin->pf = pf;
2164 
2165 	return ice_dpll_pin_state_update(pf, pin,
2166 					 ICE_DPLL_PIN_TYPE_RCLK_INPUT, NULL);
2167 }
2168 
2169 /**
2170  * ice_dpll_init_pins_info - init pins info wrapper
2171  * @pf: board private structure
2172  * @pin_type: type of pins being initialized
2173  *
2174  * Wraps functions for pin initialization.
2175  *
2176  * Return:
2177  * * 0 - success
2178  * * negative - init failure reason
2179  */
2180 static int
2181 ice_dpll_init_pins_info(struct ice_pf *pf, enum ice_dpll_pin_type pin_type)
2182 {
2183 	switch (pin_type) {
2184 	case ICE_DPLL_PIN_TYPE_INPUT:
2185 	case ICE_DPLL_PIN_TYPE_OUTPUT:
2186 		return ice_dpll_init_info_direct_pins(pf, pin_type);
2187 	case ICE_DPLL_PIN_TYPE_RCLK_INPUT:
2188 		return ice_dpll_init_info_rclk_pin(pf);
2189 	default:
2190 		return -EINVAL;
2191 	}
2192 }
2193 
2194 /**
2195  * ice_dpll_deinit_info - release memory allocated for pins info
2196  * @pf: board private structure
2197  *
2198  * Release memory allocated for pins by ice_dpll_init_info function.
2199  */
2200 static void ice_dpll_deinit_info(struct ice_pf *pf)
2201 {
2202 	kfree(pf->dplls.inputs);
2203 	kfree(pf->dplls.outputs);
2204 	kfree(pf->dplls.eec.input_prio);
2205 	kfree(pf->dplls.pps.input_prio);
2206 }
2207 
2208 /**
2209  * ice_dpll_init_info - prepare pf's dpll information structure
2210  * @pf: board private structure
2211  * @cgu: if cgu is present and controlled by this NIC
2212  *
2213  * Acquire (from HW) and set basic dpll information (on pf->dplls struct).
2214  *
2215  * Return:
2216  * * 0 - success
2217  * * negative - init failure reason
2218  */
2219 static int ice_dpll_init_info(struct ice_pf *pf, bool cgu)
2220 {
2221 	struct ice_aqc_get_cgu_abilities abilities;
2222 	struct ice_dpll *de = &pf->dplls.eec;
2223 	struct ice_dpll *dp = &pf->dplls.pps;
2224 	struct ice_dplls *d = &pf->dplls;
2225 	struct ice_hw *hw = &pf->hw;
2226 	int ret, alloc_size, i;
2227 
2228 	d->clock_id = ice_generate_clock_id(pf);
2229 	ret = ice_aq_get_cgu_abilities(hw, &abilities);
2230 	if (ret) {
2231 		dev_err(ice_pf_to_dev(pf),
2232 			"err:%d %s failed to read cgu abilities\n",
2233 			ret, ice_aq_str(hw->adminq.sq_last_status));
2234 		return ret;
2235 	}
2236 
2237 	de->dpll_idx = abilities.eec_dpll_idx;
2238 	dp->dpll_idx = abilities.pps_dpll_idx;
2239 	d->num_inputs = abilities.num_inputs;
2240 	d->num_outputs = abilities.num_outputs;
2241 	d->input_phase_adj_max = le32_to_cpu(abilities.max_in_phase_adj);
2242 	d->output_phase_adj_max = le32_to_cpu(abilities.max_out_phase_adj);
2243 
2244 	alloc_size = sizeof(*d->inputs) * d->num_inputs;
2245 	d->inputs = kzalloc(alloc_size, GFP_KERNEL);
2246 	if (!d->inputs)
2247 		return -ENOMEM;
2248 
2249 	alloc_size = sizeof(*de->input_prio) * d->num_inputs;
2250 	de->input_prio = kzalloc(alloc_size, GFP_KERNEL);
2251 	if (!de->input_prio)
2252 		return -ENOMEM;
2253 
2254 	dp->input_prio = kzalloc(alloc_size, GFP_KERNEL);
2255 	if (!dp->input_prio)
2256 		return -ENOMEM;
2257 
2258 	ret = ice_dpll_init_pins_info(pf, ICE_DPLL_PIN_TYPE_INPUT);
2259 	if (ret)
2260 		goto deinit_info;
2261 
2262 	if (cgu) {
2263 		alloc_size = sizeof(*d->outputs) * d->num_outputs;
2264 		d->outputs = kzalloc(alloc_size, GFP_KERNEL);
2265 		if (!d->outputs) {
2266 			ret = -ENOMEM;
2267 			goto deinit_info;
2268 		}
2269 
2270 		ret = ice_dpll_init_pins_info(pf, ICE_DPLL_PIN_TYPE_OUTPUT);
2271 		if (ret)
2272 			goto deinit_info;
2273 	}
2274 
2275 	ret = ice_get_cgu_rclk_pin_info(&pf->hw, &d->base_rclk_idx,
2276 					&pf->dplls.rclk.num_parents);
2277 	if (ret)
2278 		return ret;
2279 	for (i = 0; i < pf->dplls.rclk.num_parents; i++)
2280 		pf->dplls.rclk.parent_idx[i] = d->base_rclk_idx + i;
2281 	ret = ice_dpll_init_pins_info(pf, ICE_DPLL_PIN_TYPE_RCLK_INPUT);
2282 	if (ret)
2283 		return ret;
2284 	de->mode = DPLL_MODE_AUTOMATIC;
2285 	dp->mode = DPLL_MODE_AUTOMATIC;
2286 
2287 	dev_dbg(ice_pf_to_dev(pf),
2288 		"%s - success, inputs:%u, outputs:%u rclk-parents:%u\n",
2289 		__func__, d->num_inputs, d->num_outputs, d->rclk.num_parents);
2290 
2291 	return 0;
2292 
2293 deinit_info:
2294 	dev_err(ice_pf_to_dev(pf),
2295 		"%s - fail: d->inputs:%p, de->input_prio:%p, dp->input_prio:%p, d->outputs:%p\n",
2296 		__func__, d->inputs, de->input_prio,
2297 		dp->input_prio, d->outputs);
2298 	ice_dpll_deinit_info(pf);
2299 	return ret;
2300 }
2301 
2302 /**
2303  * ice_dpll_deinit - Disable the driver/HW support for dpll subsystem
2304  * the dpll device.
2305  * @pf: board private structure
2306  *
2307  * Handles the cleanup work required after dpll initialization, freeing
2308  * resources and unregistering the dpll, pin and all resources used for
2309  * handling them.
2310  *
2311  * Context: Destroys pf->dplls.lock mutex. Call only if ICE_FLAG_DPLL was set.
2312  */
2313 void ice_dpll_deinit(struct ice_pf *pf)
2314 {
2315 	bool cgu = ice_is_feature_supported(pf, ICE_F_CGU);
2316 
2317 	clear_bit(ICE_FLAG_DPLL, pf->flags);
2318 	if (cgu)
2319 		ice_dpll_deinit_worker(pf);
2320 
2321 	ice_dpll_deinit_pins(pf, cgu);
2322 	ice_dpll_deinit_dpll(pf, &pf->dplls.pps, cgu);
2323 	ice_dpll_deinit_dpll(pf, &pf->dplls.eec, cgu);
2324 	ice_dpll_deinit_info(pf);
2325 	mutex_destroy(&pf->dplls.lock);
2326 }
2327 
2328 /**
2329  * ice_dpll_init - initialize support for dpll subsystem
2330  * @pf: board private structure
2331  *
2332  * Set up the device dplls, register them and pins connected within Linux dpll
2333  * subsystem. Allow userspace to obtain state of DPLL and handling of DPLL
2334  * configuration requests.
2335  *
2336  * Context: Initializes pf->dplls.lock mutex.
2337  */
2338 void ice_dpll_init(struct ice_pf *pf)
2339 {
2340 	bool cgu = ice_is_feature_supported(pf, ICE_F_CGU);
2341 	struct ice_dplls *d = &pf->dplls;
2342 	int err = 0;
2343 
2344 	mutex_init(&d->lock);
2345 	err = ice_dpll_init_info(pf, cgu);
2346 	if (err)
2347 		goto err_exit;
2348 	err = ice_dpll_init_dpll(pf, &pf->dplls.eec, cgu, DPLL_TYPE_EEC);
2349 	if (err)
2350 		goto deinit_info;
2351 	err = ice_dpll_init_dpll(pf, &pf->dplls.pps, cgu, DPLL_TYPE_PPS);
2352 	if (err)
2353 		goto deinit_eec;
2354 	err = ice_dpll_init_pins(pf, cgu);
2355 	if (err)
2356 		goto deinit_pps;
2357 	if (cgu) {
2358 		err = ice_dpll_init_worker(pf);
2359 		if (err)
2360 			goto deinit_pins;
2361 	}
2362 	set_bit(ICE_FLAG_DPLL, pf->flags);
2363 
2364 	return;
2365 
2366 deinit_pins:
2367 	ice_dpll_deinit_pins(pf, cgu);
2368 deinit_pps:
2369 	ice_dpll_deinit_dpll(pf, &pf->dplls.pps, cgu);
2370 deinit_eec:
2371 	ice_dpll_deinit_dpll(pf, &pf->dplls.eec, cgu);
2372 deinit_info:
2373 	ice_dpll_deinit_info(pf);
2374 err_exit:
2375 	mutex_destroy(&d->lock);
2376 	dev_warn(ice_pf_to_dev(pf), "DPLLs init failure err:%d\n", err);
2377 }
2378