xref: /linux/drivers/net/ethernet/intel/ice/ice_dpll.c (revision c94cd9508b1335b949fd13ebd269313c65492df0)
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 (!enable && p->state[d->dpll_idx] == DPLL_PIN_STATE_DISCONNECTED)
660 		return 0;
661 
662 	return ice_dpll_pin_state_set(pin, pin_priv, dpll, dpll_priv, enable,
663 				      extack, ICE_DPLL_PIN_TYPE_OUTPUT);
664 }
665 
666 /**
667  * ice_dpll_input_state_set - enable/disable input pin on dpll levice
668  * @pin: pointer to a pin
669  * @pin_priv: private data pointer passed on pin registration
670  * @dpll: dpll being configured
671  * @dpll_priv: private data pointer passed on dpll registration
672  * @state: state of pin to be set
673  * @extack: error reporting
674  *
675  * Dpll subsystem callback. Enables given mode on input type pin.
676  *
677  * Context: Calls a function which acquires pf->dplls.lock
678  * Return:
679  * * 0 - successfully enabled mode
680  * * negative - failed to enable mode
681  */
682 static int
683 ice_dpll_input_state_set(const struct dpll_pin *pin, void *pin_priv,
684 			 const struct dpll_device *dpll, void *dpll_priv,
685 			 enum dpll_pin_state state,
686 			 struct netlink_ext_ack *extack)
687 {
688 	bool enable = state == DPLL_PIN_STATE_SELECTABLE;
689 
690 	return ice_dpll_pin_state_set(pin, pin_priv, dpll, dpll_priv, enable,
691 				      extack, ICE_DPLL_PIN_TYPE_INPUT);
692 }
693 
694 /**
695  * ice_dpll_pin_state_get - set pin's state on dpll
696  * @pin: pointer to a pin
697  * @pin_priv: private data pointer passed on pin registration
698  * @dpll: registered dpll pointer
699  * @dpll_priv: private data pointer passed on dpll registration
700  * @state: on success holds state of the pin
701  * @extack: error reporting
702  * @pin_type: type of questioned pin
703  *
704  * Determine pin state set it on a pin.
705  *
706  * Context: Acquires pf->dplls.lock
707  * Return:
708  * * 0 - success
709  * * negative - failed to get state
710  */
711 static int
712 ice_dpll_pin_state_get(const struct dpll_pin *pin, void *pin_priv,
713 		       const struct dpll_device *dpll, void *dpll_priv,
714 		       enum dpll_pin_state *state,
715 		       struct netlink_ext_ack *extack,
716 		       enum ice_dpll_pin_type pin_type)
717 {
718 	struct ice_dpll_pin *p = pin_priv;
719 	struct ice_dpll *d = dpll_priv;
720 	struct ice_pf *pf = d->pf;
721 	int ret;
722 
723 	if (ice_dpll_is_reset(pf, extack))
724 		return -EBUSY;
725 
726 	mutex_lock(&pf->dplls.lock);
727 	ret = ice_dpll_pin_state_update(pf, p, pin_type, extack);
728 	if (ret)
729 		goto unlock;
730 	if (pin_type == ICE_DPLL_PIN_TYPE_INPUT ||
731 	    pin_type == ICE_DPLL_PIN_TYPE_OUTPUT)
732 		*state = p->state[d->dpll_idx];
733 	ret = 0;
734 unlock:
735 	mutex_unlock(&pf->dplls.lock);
736 
737 	return ret;
738 }
739 
740 /**
741  * ice_dpll_output_state_get - get output pin state on dpll device
742  * @pin: pointer to a pin
743  * @pin_priv: private data pointer passed on pin registration
744  * @dpll: registered dpll pointer
745  * @dpll_priv: private data pointer passed on dpll registration
746  * @state: on success holds state of the pin
747  * @extack: error reporting
748  *
749  * Dpll subsystem callback. Check state of a pin.
750  *
751  * Context: Calls a function which acquires pf->dplls.lock
752  * Return:
753  * * 0 - success
754  * * negative - failed to get state
755  */
756 static int
757 ice_dpll_output_state_get(const struct dpll_pin *pin, void *pin_priv,
758 			  const struct dpll_device *dpll, void *dpll_priv,
759 			  enum dpll_pin_state *state,
760 			  struct netlink_ext_ack *extack)
761 {
762 	return ice_dpll_pin_state_get(pin, pin_priv, dpll, dpll_priv, state,
763 				      extack, ICE_DPLL_PIN_TYPE_OUTPUT);
764 }
765 
766 /**
767  * ice_dpll_input_state_get - get input pin state on dpll device
768  * @pin: pointer to a pin
769  * @pin_priv: private data pointer passed on pin registration
770  * @dpll: registered dpll pointer
771  * @dpll_priv: private data pointer passed on dpll registration
772  * @state: on success holds state of the pin
773  * @extack: error reporting
774  *
775  * Dpll subsystem callback. Check state of a input pin.
776  *
777  * Context: Calls a function which acquires pf->dplls.lock
778  * Return:
779  * * 0 - success
780  * * negative - failed to get state
781  */
782 static int
783 ice_dpll_input_state_get(const struct dpll_pin *pin, void *pin_priv,
784 			 const struct dpll_device *dpll, void *dpll_priv,
785 			 enum dpll_pin_state *state,
786 			 struct netlink_ext_ack *extack)
787 {
788 	return ice_dpll_pin_state_get(pin, pin_priv, dpll, dpll_priv, state,
789 				      extack, ICE_DPLL_PIN_TYPE_INPUT);
790 }
791 
792 /**
793  * ice_dpll_input_prio_get - get dpll's input prio
794  * @pin: pointer to a pin
795  * @pin_priv: private data pointer passed on pin registration
796  * @dpll: registered dpll pointer
797  * @dpll_priv: private data pointer passed on dpll registration
798  * @prio: on success - returns input priority on dpll
799  * @extack: error reporting
800  *
801  * Dpll subsystem callback. Handler for getting priority of a input pin.
802  *
803  * Context: Acquires pf->dplls.lock
804  * Return:
805  * * 0 - success
806  * * negative - failure
807  */
808 static int
809 ice_dpll_input_prio_get(const struct dpll_pin *pin, void *pin_priv,
810 			const struct dpll_device *dpll, void *dpll_priv,
811 			u32 *prio, struct netlink_ext_ack *extack)
812 {
813 	struct ice_dpll_pin *p = pin_priv;
814 	struct ice_dpll *d = dpll_priv;
815 	struct ice_pf *pf = d->pf;
816 
817 	mutex_lock(&pf->dplls.lock);
818 	*prio = d->input_prio[p->idx];
819 	mutex_unlock(&pf->dplls.lock);
820 
821 	return 0;
822 }
823 
824 /**
825  * ice_dpll_input_prio_set - set dpll input prio
826  * @pin: pointer to a pin
827  * @pin_priv: private data pointer passed on pin registration
828  * @dpll: registered dpll pointer
829  * @dpll_priv: private data pointer passed on dpll registration
830  * @prio: input priority to be set on dpll
831  * @extack: error reporting
832  *
833  * Dpll subsystem callback. Handler for setting priority of a input pin.
834  *
835  * Context: Acquires pf->dplls.lock
836  * Return:
837  * * 0 - success
838  * * negative - failure
839  */
840 static int
841 ice_dpll_input_prio_set(const struct dpll_pin *pin, void *pin_priv,
842 			const struct dpll_device *dpll, void *dpll_priv,
843 			u32 prio, struct netlink_ext_ack *extack)
844 {
845 	struct ice_dpll_pin *p = pin_priv;
846 	struct ice_dpll *d = dpll_priv;
847 	struct ice_pf *pf = d->pf;
848 	int ret;
849 
850 	if (ice_dpll_is_reset(pf, extack))
851 		return -EBUSY;
852 
853 	mutex_lock(&pf->dplls.lock);
854 	ret = ice_dpll_hw_input_prio_set(pf, d, p, prio, extack);
855 	mutex_unlock(&pf->dplls.lock);
856 
857 	return ret;
858 }
859 
860 /**
861  * ice_dpll_input_direction - callback for get input pin direction
862  * @pin: pointer to a pin
863  * @pin_priv: private data pointer passed on pin registration
864  * @dpll: registered dpll pointer
865  * @dpll_priv: private data pointer passed on dpll registration
866  * @direction: holds input pin direction
867  * @extack: error reporting
868  *
869  * Dpll subsystem callback. Handler for getting direction of a input pin.
870  *
871  * Return:
872  * * 0 - success
873  */
874 static int
875 ice_dpll_input_direction(const struct dpll_pin *pin, void *pin_priv,
876 			 const struct dpll_device *dpll, void *dpll_priv,
877 			 enum dpll_pin_direction *direction,
878 			 struct netlink_ext_ack *extack)
879 {
880 	*direction = DPLL_PIN_DIRECTION_INPUT;
881 
882 	return 0;
883 }
884 
885 /**
886  * ice_dpll_output_direction - callback for get output pin direction
887  * @pin: pointer to a pin
888  * @pin_priv: private data pointer passed on pin registration
889  * @dpll: registered dpll pointer
890  * @dpll_priv: private data pointer passed on dpll registration
891  * @direction: holds output pin direction
892  * @extack: error reporting
893  *
894  * Dpll subsystem callback. Handler for getting direction of an output pin.
895  *
896  * Return:
897  * * 0 - success
898  */
899 static int
900 ice_dpll_output_direction(const struct dpll_pin *pin, void *pin_priv,
901 			  const struct dpll_device *dpll, void *dpll_priv,
902 			  enum dpll_pin_direction *direction,
903 			  struct netlink_ext_ack *extack)
904 {
905 	*direction = DPLL_PIN_DIRECTION_OUTPUT;
906 
907 	return 0;
908 }
909 
910 /**
911  * ice_dpll_pin_phase_adjust_get - callback for get pin phase adjust value
912  * @pin: pointer to a pin
913  * @pin_priv: private data pointer passed on pin registration
914  * @dpll: registered dpll pointer
915  * @dpll_priv: private data pointer passed on dpll registration
916  * @phase_adjust: on success holds pin phase_adjust value
917  * @extack: error reporting
918  *
919  * Dpll subsystem callback. Handler for getting phase adjust value of a pin.
920  *
921  * Context: Acquires pf->dplls.lock
922  * Return:
923  * * 0 - success
924  * * negative - error
925  */
926 static int
927 ice_dpll_pin_phase_adjust_get(const struct dpll_pin *pin, void *pin_priv,
928 			      const struct dpll_device *dpll, void *dpll_priv,
929 			      s32 *phase_adjust,
930 			      struct netlink_ext_ack *extack)
931 {
932 	struct ice_dpll_pin *p = pin_priv;
933 	struct ice_pf *pf = p->pf;
934 
935 	mutex_lock(&pf->dplls.lock);
936 	*phase_adjust = p->phase_adjust;
937 	mutex_unlock(&pf->dplls.lock);
938 
939 	return 0;
940 }
941 
942 /**
943  * ice_dpll_pin_phase_adjust_set - helper for setting a pin phase adjust value
944  * @pin: pointer to a pin
945  * @pin_priv: private data pointer passed on pin registration
946  * @dpll: registered dpll pointer
947  * @dpll_priv: private data pointer passed on dpll registration
948  * @phase_adjust: phase_adjust to be set
949  * @extack: error reporting
950  * @type: type of a pin
951  *
952  * Helper for dpll subsystem callback. Handler for setting phase adjust value
953  * of a pin.
954  *
955  * Context: Acquires pf->dplls.lock
956  * Return:
957  * * 0 - success
958  * * negative - error
959  */
960 static int
961 ice_dpll_pin_phase_adjust_set(const struct dpll_pin *pin, void *pin_priv,
962 			      const struct dpll_device *dpll, void *dpll_priv,
963 			      s32 phase_adjust,
964 			      struct netlink_ext_ack *extack,
965 			      enum ice_dpll_pin_type type)
966 {
967 	struct ice_dpll_pin *p = pin_priv;
968 	struct ice_dpll *d = dpll_priv;
969 	struct ice_pf *pf = d->pf;
970 	u8 flag, flags_en = 0;
971 	int ret;
972 
973 	if (ice_dpll_is_reset(pf, extack))
974 		return -EBUSY;
975 
976 	mutex_lock(&pf->dplls.lock);
977 	switch (type) {
978 	case ICE_DPLL_PIN_TYPE_INPUT:
979 		flag = ICE_AQC_SET_CGU_IN_CFG_FLG1_UPDATE_DELAY;
980 		if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN)
981 			flags_en |= ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
982 		if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_INPUT_EN)
983 			flags_en |= ICE_AQC_SET_CGU_IN_CFG_FLG2_INPUT_EN;
984 		ret = ice_aq_set_input_pin_cfg(&pf->hw, p->idx, flag, flags_en,
985 					       0, phase_adjust);
986 		break;
987 	case ICE_DPLL_PIN_TYPE_OUTPUT:
988 		flag = ICE_AQC_SET_CGU_OUT_CFG_UPDATE_PHASE;
989 		if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_OUT_EN)
990 			flag |= ICE_AQC_SET_CGU_OUT_CFG_OUT_EN;
991 		if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN)
992 			flag |= ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
993 		ret = ice_aq_set_output_pin_cfg(&pf->hw, p->idx, flag, 0, 0,
994 						phase_adjust);
995 		break;
996 	default:
997 		ret = -EINVAL;
998 	}
999 	if (!ret)
1000 		p->phase_adjust = phase_adjust;
1001 	mutex_unlock(&pf->dplls.lock);
1002 	if (ret)
1003 		NL_SET_ERR_MSG_FMT(extack,
1004 				   "err:%d %s failed to set pin phase_adjust:%d for pin:%u on dpll:%u\n",
1005 				   ret,
1006 				   ice_aq_str(pf->hw.adminq.sq_last_status),
1007 				   phase_adjust, p->idx, d->dpll_idx);
1008 
1009 	return ret;
1010 }
1011 
1012 /**
1013  * ice_dpll_input_phase_adjust_set - callback for set input pin phase adjust
1014  * @pin: pointer to a pin
1015  * @pin_priv: private data pointer passed on pin registration
1016  * @dpll: registered dpll pointer
1017  * @dpll_priv: private data pointer passed on dpll registration
1018  * @phase_adjust: phase_adjust to be set
1019  * @extack: error reporting
1020  *
1021  * Dpll subsystem callback. Wraps a handler for setting phase adjust on input
1022  * pin.
1023  *
1024  * Context: Calls a function which acquires pf->dplls.lock
1025  * Return:
1026  * * 0 - success
1027  * * negative - error
1028  */
1029 static int
1030 ice_dpll_input_phase_adjust_set(const struct dpll_pin *pin, void *pin_priv,
1031 				const struct dpll_device *dpll, void *dpll_priv,
1032 				s32 phase_adjust,
1033 				struct netlink_ext_ack *extack)
1034 {
1035 	return ice_dpll_pin_phase_adjust_set(pin, pin_priv, dpll, dpll_priv,
1036 					     phase_adjust, extack,
1037 					     ICE_DPLL_PIN_TYPE_INPUT);
1038 }
1039 
1040 /**
1041  * ice_dpll_output_phase_adjust_set - callback for set output pin phase adjust
1042  * @pin: pointer to a pin
1043  * @pin_priv: private data pointer passed on pin registration
1044  * @dpll: registered dpll pointer
1045  * @dpll_priv: private data pointer passed on dpll registration
1046  * @phase_adjust: phase_adjust to be set
1047  * @extack: error reporting
1048  *
1049  * Dpll subsystem callback. Wraps a handler for setting phase adjust on output
1050  * pin.
1051  *
1052  * Context: Calls a function which acquires pf->dplls.lock
1053  * Return:
1054  * * 0 - success
1055  * * negative - error
1056  */
1057 static int
1058 ice_dpll_output_phase_adjust_set(const struct dpll_pin *pin, void *pin_priv,
1059 				 const struct dpll_device *dpll, void *dpll_priv,
1060 				 s32 phase_adjust,
1061 				 struct netlink_ext_ack *extack)
1062 {
1063 	return ice_dpll_pin_phase_adjust_set(pin, pin_priv, dpll, dpll_priv,
1064 					     phase_adjust, extack,
1065 					     ICE_DPLL_PIN_TYPE_OUTPUT);
1066 }
1067 
1068 #define ICE_DPLL_PHASE_OFFSET_DIVIDER	100
1069 #define ICE_DPLL_PHASE_OFFSET_FACTOR		\
1070 	(DPLL_PHASE_OFFSET_DIVIDER / ICE_DPLL_PHASE_OFFSET_DIVIDER)
1071 /**
1072  * ice_dpll_phase_offset_get - callback for get dpll phase shift value
1073  * @pin: pointer to a pin
1074  * @pin_priv: private data pointer passed on pin registration
1075  * @dpll: registered dpll pointer
1076  * @dpll_priv: private data pointer passed on dpll registration
1077  * @phase_offset: on success holds pin phase_offset value
1078  * @extack: error reporting
1079  *
1080  * Dpll subsystem callback. Handler for getting phase shift value between
1081  * dpll's input and output.
1082  *
1083  * Context: Acquires pf->dplls.lock
1084  * Return:
1085  * * 0 - success
1086  * * negative - error
1087  */
1088 static int
1089 ice_dpll_phase_offset_get(const struct dpll_pin *pin, void *pin_priv,
1090 			  const struct dpll_device *dpll, void *dpll_priv,
1091 			  s64 *phase_offset, struct netlink_ext_ack *extack)
1092 {
1093 	struct ice_dpll *d = dpll_priv;
1094 	struct ice_pf *pf = d->pf;
1095 
1096 	mutex_lock(&pf->dplls.lock);
1097 	if (d->active_input == pin)
1098 		*phase_offset = d->phase_offset * ICE_DPLL_PHASE_OFFSET_FACTOR;
1099 	else
1100 		*phase_offset = 0;
1101 	mutex_unlock(&pf->dplls.lock);
1102 
1103 	return 0;
1104 }
1105 
1106 /**
1107  * ice_dpll_output_esync_set - callback for setting embedded sync
1108  * @pin: pointer to a pin
1109  * @pin_priv: private data pointer passed on pin registration
1110  * @dpll: registered dpll pointer
1111  * @dpll_priv: private data pointer passed on dpll registration
1112  * @freq: requested embedded sync frequency
1113  * @extack: error reporting
1114  *
1115  * Dpll subsystem callback. Handler for setting embedded sync frequency value
1116  * on output pin.
1117  *
1118  * Context: Acquires pf->dplls.lock
1119  * Return:
1120  * * 0 - success
1121  * * negative - error
1122  */
1123 static int
1124 ice_dpll_output_esync_set(const struct dpll_pin *pin, void *pin_priv,
1125 			  const struct dpll_device *dpll, void *dpll_priv,
1126 			  u64 freq, struct netlink_ext_ack *extack)
1127 {
1128 	struct ice_dpll_pin *p = pin_priv;
1129 	struct ice_dpll *d = dpll_priv;
1130 	struct ice_pf *pf = d->pf;
1131 	u8 flags = 0;
1132 	int ret;
1133 
1134 	if (ice_dpll_is_reset(pf, extack))
1135 		return -EBUSY;
1136 	mutex_lock(&pf->dplls.lock);
1137 	if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_OUT_EN)
1138 		flags = ICE_AQC_SET_CGU_OUT_CFG_OUT_EN;
1139 	if (freq == DPLL_PIN_FREQUENCY_1_HZ) {
1140 		if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN) {
1141 			ret = 0;
1142 		} else {
1143 			flags |= ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
1144 			ret = ice_aq_set_output_pin_cfg(&pf->hw, p->idx, flags,
1145 							0, 0, 0);
1146 		}
1147 	} else {
1148 		if (!(p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN)) {
1149 			ret = 0;
1150 		} else {
1151 			flags &= ~ICE_AQC_SET_CGU_OUT_CFG_ESYNC_EN;
1152 			ret = ice_aq_set_output_pin_cfg(&pf->hw, p->idx, flags,
1153 							0, 0, 0);
1154 		}
1155 	}
1156 	mutex_unlock(&pf->dplls.lock);
1157 
1158 	return ret;
1159 }
1160 
1161 /**
1162  * ice_dpll_output_esync_get - callback for getting embedded sync config
1163  * @pin: pointer to a pin
1164  * @pin_priv: private data pointer passed on pin registration
1165  * @dpll: registered dpll pointer
1166  * @dpll_priv: private data pointer passed on dpll registration
1167  * @esync: on success holds embedded sync pin properties
1168  * @extack: error reporting
1169  *
1170  * Dpll subsystem callback. Handler for getting embedded sync frequency value
1171  * and capabilities on output pin.
1172  *
1173  * Context: Acquires pf->dplls.lock
1174  * Return:
1175  * * 0 - success
1176  * * negative - error
1177  */
1178 static int
1179 ice_dpll_output_esync_get(const struct dpll_pin *pin, void *pin_priv,
1180 			  const struct dpll_device *dpll, void *dpll_priv,
1181 			  struct dpll_pin_esync *esync,
1182 			  struct netlink_ext_ack *extack)
1183 {
1184 	struct ice_dpll_pin *p = pin_priv;
1185 	struct ice_dpll *d = dpll_priv;
1186 	struct ice_pf *pf = d->pf;
1187 
1188 	if (ice_dpll_is_reset(pf, extack))
1189 		return -EBUSY;
1190 	mutex_lock(&pf->dplls.lock);
1191 	if (!(p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_ABILITY) ||
1192 	    p->freq != DPLL_PIN_FREQUENCY_10_MHZ) {
1193 		mutex_unlock(&pf->dplls.lock);
1194 		return -EOPNOTSUPP;
1195 	}
1196 	esync->range = ice_esync_range;
1197 	esync->range_num = ARRAY_SIZE(ice_esync_range);
1198 	if (p->flags[0] & ICE_AQC_GET_CGU_OUT_CFG_ESYNC_EN) {
1199 		esync->freq = DPLL_PIN_FREQUENCY_1_HZ;
1200 		esync->pulse = ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT;
1201 	} else {
1202 		esync->freq = 0;
1203 		esync->pulse = 0;
1204 	}
1205 	mutex_unlock(&pf->dplls.lock);
1206 
1207 	return 0;
1208 }
1209 
1210 /**
1211  * ice_dpll_input_esync_set - callback for setting embedded sync
1212  * @pin: pointer to a pin
1213  * @pin_priv: private data pointer passed on pin registration
1214  * @dpll: registered dpll pointer
1215  * @dpll_priv: private data pointer passed on dpll registration
1216  * @freq: requested embedded sync frequency
1217  * @extack: error reporting
1218  *
1219  * Dpll subsystem callback. Handler for setting embedded sync frequency value
1220  * on input pin.
1221  *
1222  * Context: Acquires pf->dplls.lock
1223  * Return:
1224  * * 0 - success
1225  * * negative - error
1226  */
1227 static int
1228 ice_dpll_input_esync_set(const struct dpll_pin *pin, void *pin_priv,
1229 			 const struct dpll_device *dpll, void *dpll_priv,
1230 			 u64 freq, struct netlink_ext_ack *extack)
1231 {
1232 	struct ice_dpll_pin *p = pin_priv;
1233 	struct ice_dpll *d = dpll_priv;
1234 	struct ice_pf *pf = d->pf;
1235 	u8 flags_en = 0;
1236 	int ret;
1237 
1238 	if (ice_dpll_is_reset(pf, extack))
1239 		return -EBUSY;
1240 	mutex_lock(&pf->dplls.lock);
1241 	if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_INPUT_EN)
1242 		flags_en = ICE_AQC_SET_CGU_IN_CFG_FLG2_INPUT_EN;
1243 	if (freq == DPLL_PIN_FREQUENCY_1_HZ) {
1244 		if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN) {
1245 			ret = 0;
1246 		} else {
1247 			flags_en |= ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
1248 			ret = ice_aq_set_input_pin_cfg(&pf->hw, p->idx, 0,
1249 						       flags_en, 0, 0);
1250 		}
1251 	} else {
1252 		if (!(p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN)) {
1253 			ret = 0;
1254 		} else {
1255 			flags_en &= ~ICE_AQC_SET_CGU_IN_CFG_FLG2_ESYNC_EN;
1256 			ret = ice_aq_set_input_pin_cfg(&pf->hw, p->idx, 0,
1257 						       flags_en, 0, 0);
1258 		}
1259 	}
1260 	mutex_unlock(&pf->dplls.lock);
1261 
1262 	return ret;
1263 }
1264 
1265 /**
1266  * ice_dpll_input_esync_get - callback for getting embedded sync config
1267  * @pin: pointer to a pin
1268  * @pin_priv: private data pointer passed on pin registration
1269  * @dpll: registered dpll pointer
1270  * @dpll_priv: private data pointer passed on dpll registration
1271  * @esync: on success holds embedded sync pin properties
1272  * @extack: error reporting
1273  *
1274  * Dpll subsystem callback. Handler for getting embedded sync frequency value
1275  * and capabilities on input pin.
1276  *
1277  * Context: Acquires pf->dplls.lock
1278  * Return:
1279  * * 0 - success
1280  * * negative - error
1281  */
1282 static int
1283 ice_dpll_input_esync_get(const struct dpll_pin *pin, void *pin_priv,
1284 			 const struct dpll_device *dpll, void *dpll_priv,
1285 			 struct dpll_pin_esync *esync,
1286 			 struct netlink_ext_ack *extack)
1287 {
1288 	struct ice_dpll_pin *p = pin_priv;
1289 	struct ice_dpll *d = dpll_priv;
1290 	struct ice_pf *pf = d->pf;
1291 
1292 	if (ice_dpll_is_reset(pf, extack))
1293 		return -EBUSY;
1294 	mutex_lock(&pf->dplls.lock);
1295 	if (!(p->status & ICE_AQC_GET_CGU_IN_CFG_STATUS_ESYNC_CAP) ||
1296 	    p->freq != DPLL_PIN_FREQUENCY_10_MHZ) {
1297 		mutex_unlock(&pf->dplls.lock);
1298 		return -EOPNOTSUPP;
1299 	}
1300 	esync->range = ice_esync_range;
1301 	esync->range_num = ARRAY_SIZE(ice_esync_range);
1302 	if (p->flags[0] & ICE_AQC_GET_CGU_IN_CFG_FLG2_ESYNC_EN) {
1303 		esync->freq = DPLL_PIN_FREQUENCY_1_HZ;
1304 		esync->pulse = ICE_DPLL_PIN_ESYNC_PULSE_HIGH_PERCENT;
1305 	} else {
1306 		esync->freq = 0;
1307 		esync->pulse = 0;
1308 	}
1309 	mutex_unlock(&pf->dplls.lock);
1310 
1311 	return 0;
1312 }
1313 
1314 /**
1315  * ice_dpll_rclk_state_on_pin_set - set a state on rclk pin
1316  * @pin: pointer to a pin
1317  * @pin_priv: private data pointer passed on pin registration
1318  * @parent_pin: pin parent pointer
1319  * @parent_pin_priv: parent private data pointer passed on pin registration
1320  * @state: state to be set on pin
1321  * @extack: error reporting
1322  *
1323  * Dpll subsystem callback, set a state of a rclk pin on a parent pin
1324  *
1325  * Context: Acquires pf->dplls.lock
1326  * Return:
1327  * * 0 - success
1328  * * negative - failure
1329  */
1330 static int
1331 ice_dpll_rclk_state_on_pin_set(const struct dpll_pin *pin, void *pin_priv,
1332 			       const struct dpll_pin *parent_pin,
1333 			       void *parent_pin_priv,
1334 			       enum dpll_pin_state state,
1335 			       struct netlink_ext_ack *extack)
1336 {
1337 	struct ice_dpll_pin *p = pin_priv, *parent = parent_pin_priv;
1338 	bool enable = state == DPLL_PIN_STATE_CONNECTED;
1339 	struct ice_pf *pf = p->pf;
1340 	int ret = -EINVAL;
1341 	u32 hw_idx;
1342 
1343 	if (ice_dpll_is_reset(pf, extack))
1344 		return -EBUSY;
1345 
1346 	mutex_lock(&pf->dplls.lock);
1347 	hw_idx = parent->idx - pf->dplls.base_rclk_idx;
1348 	if (hw_idx >= pf->dplls.num_inputs)
1349 		goto unlock;
1350 
1351 	if ((enable && p->state[hw_idx] == DPLL_PIN_STATE_CONNECTED) ||
1352 	    (!enable && p->state[hw_idx] == DPLL_PIN_STATE_DISCONNECTED)) {
1353 		NL_SET_ERR_MSG_FMT(extack,
1354 				   "pin:%u state:%u on parent:%u already set",
1355 				   p->idx, state, parent->idx);
1356 		goto unlock;
1357 	}
1358 	ret = ice_aq_set_phy_rec_clk_out(&pf->hw, hw_idx, enable,
1359 					 &p->freq);
1360 	if (ret)
1361 		NL_SET_ERR_MSG_FMT(extack,
1362 				   "err:%d %s failed to set pin state:%u for pin:%u on parent:%u\n",
1363 				   ret,
1364 				   ice_aq_str(pf->hw.adminq.sq_last_status),
1365 				   state, p->idx, parent->idx);
1366 unlock:
1367 	mutex_unlock(&pf->dplls.lock);
1368 
1369 	return ret;
1370 }
1371 
1372 /**
1373  * ice_dpll_rclk_state_on_pin_get - get a state of rclk pin
1374  * @pin: pointer to a pin
1375  * @pin_priv: private data pointer passed on pin registration
1376  * @parent_pin: pin parent pointer
1377  * @parent_pin_priv: pin parent priv data pointer passed on pin registration
1378  * @state: on success holds pin state on parent pin
1379  * @extack: error reporting
1380  *
1381  * dpll subsystem callback, get a state of a recovered clock pin.
1382  *
1383  * Context: Acquires pf->dplls.lock
1384  * Return:
1385  * * 0 - success
1386  * * negative - failure
1387  */
1388 static int
1389 ice_dpll_rclk_state_on_pin_get(const struct dpll_pin *pin, void *pin_priv,
1390 			       const struct dpll_pin *parent_pin,
1391 			       void *parent_pin_priv,
1392 			       enum dpll_pin_state *state,
1393 			       struct netlink_ext_ack *extack)
1394 {
1395 	struct ice_dpll_pin *p = pin_priv, *parent = parent_pin_priv;
1396 	struct ice_pf *pf = p->pf;
1397 	int ret = -EINVAL;
1398 	u32 hw_idx;
1399 
1400 	if (ice_dpll_is_reset(pf, extack))
1401 		return -EBUSY;
1402 
1403 	mutex_lock(&pf->dplls.lock);
1404 	hw_idx = parent->idx - pf->dplls.base_rclk_idx;
1405 	if (hw_idx >= pf->dplls.num_inputs)
1406 		goto unlock;
1407 
1408 	ret = ice_dpll_pin_state_update(pf, p, ICE_DPLL_PIN_TYPE_RCLK_INPUT,
1409 					extack);
1410 	if (ret)
1411 		goto unlock;
1412 
1413 	*state = p->state[hw_idx];
1414 	ret = 0;
1415 unlock:
1416 	mutex_unlock(&pf->dplls.lock);
1417 
1418 	return ret;
1419 }
1420 
1421 static const struct dpll_pin_ops ice_dpll_rclk_ops = {
1422 	.state_on_pin_set = ice_dpll_rclk_state_on_pin_set,
1423 	.state_on_pin_get = ice_dpll_rclk_state_on_pin_get,
1424 	.direction_get = ice_dpll_input_direction,
1425 };
1426 
1427 static const struct dpll_pin_ops ice_dpll_input_ops = {
1428 	.frequency_get = ice_dpll_input_frequency_get,
1429 	.frequency_set = ice_dpll_input_frequency_set,
1430 	.state_on_dpll_get = ice_dpll_input_state_get,
1431 	.state_on_dpll_set = ice_dpll_input_state_set,
1432 	.prio_get = ice_dpll_input_prio_get,
1433 	.prio_set = ice_dpll_input_prio_set,
1434 	.direction_get = ice_dpll_input_direction,
1435 	.phase_adjust_get = ice_dpll_pin_phase_adjust_get,
1436 	.phase_adjust_set = ice_dpll_input_phase_adjust_set,
1437 	.phase_offset_get = ice_dpll_phase_offset_get,
1438 	.esync_set = ice_dpll_input_esync_set,
1439 	.esync_get = ice_dpll_input_esync_get,
1440 };
1441 
1442 static const struct dpll_pin_ops ice_dpll_output_ops = {
1443 	.frequency_get = ice_dpll_output_frequency_get,
1444 	.frequency_set = ice_dpll_output_frequency_set,
1445 	.state_on_dpll_get = ice_dpll_output_state_get,
1446 	.state_on_dpll_set = ice_dpll_output_state_set,
1447 	.direction_get = ice_dpll_output_direction,
1448 	.phase_adjust_get = ice_dpll_pin_phase_adjust_get,
1449 	.phase_adjust_set = ice_dpll_output_phase_adjust_set,
1450 	.esync_set = ice_dpll_output_esync_set,
1451 	.esync_get = ice_dpll_output_esync_get,
1452 };
1453 
1454 static const struct dpll_device_ops ice_dpll_ops = {
1455 	.lock_status_get = ice_dpll_lock_status_get,
1456 	.mode_get = ice_dpll_mode_get,
1457 };
1458 
1459 /**
1460  * ice_generate_clock_id - generates unique clock_id for registering dpll.
1461  * @pf: board private structure
1462  *
1463  * Generates unique (per board) clock_id for allocation and search of dpll
1464  * devices in Linux dpll subsystem.
1465  *
1466  * Return: generated clock id for the board
1467  */
1468 static u64 ice_generate_clock_id(struct ice_pf *pf)
1469 {
1470 	return pci_get_dsn(pf->pdev);
1471 }
1472 
1473 /**
1474  * ice_dpll_notify_changes - notify dpll subsystem about changes
1475  * @d: pointer do dpll
1476  *
1477  * Once change detected appropriate event is submitted to the dpll subsystem.
1478  */
1479 static void ice_dpll_notify_changes(struct ice_dpll *d)
1480 {
1481 	bool pin_notified = false;
1482 
1483 	if (d->prev_dpll_state != d->dpll_state) {
1484 		d->prev_dpll_state = d->dpll_state;
1485 		dpll_device_change_ntf(d->dpll);
1486 	}
1487 	if (d->prev_input != d->active_input) {
1488 		if (d->prev_input)
1489 			dpll_pin_change_ntf(d->prev_input);
1490 		d->prev_input = d->active_input;
1491 		if (d->active_input) {
1492 			dpll_pin_change_ntf(d->active_input);
1493 			pin_notified = true;
1494 		}
1495 	}
1496 	if (d->prev_phase_offset != d->phase_offset) {
1497 		d->prev_phase_offset = d->phase_offset;
1498 		if (!pin_notified && d->active_input)
1499 			dpll_pin_change_ntf(d->active_input);
1500 	}
1501 }
1502 
1503 /**
1504  * ice_dpll_update_state - update dpll state
1505  * @pf: pf private structure
1506  * @d: pointer to queried dpll device
1507  * @init: if function called on initialization of ice dpll
1508  *
1509  * Poll current state of dpll from hw and update ice_dpll struct.
1510  *
1511  * Context: Called by kworker under pf->dplls.lock
1512  * Return:
1513  * * 0 - success
1514  * * negative - AQ failure
1515  */
1516 static int
1517 ice_dpll_update_state(struct ice_pf *pf, struct ice_dpll *d, bool init)
1518 {
1519 	struct ice_dpll_pin *p = NULL;
1520 	int ret;
1521 
1522 	ret = ice_get_cgu_state(&pf->hw, d->dpll_idx, d->prev_dpll_state,
1523 				&d->input_idx, &d->ref_state, &d->eec_mode,
1524 				&d->phase_offset, &d->dpll_state);
1525 
1526 	dev_dbg(ice_pf_to_dev(pf),
1527 		"update dpll=%d, prev_src_idx:%u, src_idx:%u, state:%d, prev:%d mode:%d\n",
1528 		d->dpll_idx, d->prev_input_idx, d->input_idx,
1529 		d->dpll_state, d->prev_dpll_state, d->mode);
1530 	if (ret) {
1531 		dev_err(ice_pf_to_dev(pf),
1532 			"update dpll=%d state failed, ret=%d %s\n",
1533 			d->dpll_idx, ret,
1534 			ice_aq_str(pf->hw.adminq.sq_last_status));
1535 		return ret;
1536 	}
1537 	if (init) {
1538 		if (d->dpll_state == DPLL_LOCK_STATUS_LOCKED ||
1539 		    d->dpll_state == DPLL_LOCK_STATUS_LOCKED_HO_ACQ)
1540 			d->active_input = pf->dplls.inputs[d->input_idx].pin;
1541 		p = &pf->dplls.inputs[d->input_idx];
1542 		return ice_dpll_pin_state_update(pf, p,
1543 						 ICE_DPLL_PIN_TYPE_INPUT, NULL);
1544 	}
1545 	if (d->dpll_state == DPLL_LOCK_STATUS_HOLDOVER ||
1546 	    d->dpll_state == DPLL_LOCK_STATUS_UNLOCKED) {
1547 		d->active_input = NULL;
1548 		if (d->input_idx != ICE_DPLL_PIN_IDX_INVALID)
1549 			p = &pf->dplls.inputs[d->input_idx];
1550 		d->prev_input_idx = ICE_DPLL_PIN_IDX_INVALID;
1551 		d->input_idx = ICE_DPLL_PIN_IDX_INVALID;
1552 		if (!p)
1553 			return 0;
1554 		ret = ice_dpll_pin_state_update(pf, p,
1555 						ICE_DPLL_PIN_TYPE_INPUT, NULL);
1556 	} else if (d->input_idx != d->prev_input_idx) {
1557 		if (d->prev_input_idx != ICE_DPLL_PIN_IDX_INVALID) {
1558 			p = &pf->dplls.inputs[d->prev_input_idx];
1559 			ice_dpll_pin_state_update(pf, p,
1560 						  ICE_DPLL_PIN_TYPE_INPUT,
1561 						  NULL);
1562 		}
1563 		if (d->input_idx != ICE_DPLL_PIN_IDX_INVALID) {
1564 			p = &pf->dplls.inputs[d->input_idx];
1565 			d->active_input = p->pin;
1566 			ice_dpll_pin_state_update(pf, p,
1567 						  ICE_DPLL_PIN_TYPE_INPUT,
1568 						  NULL);
1569 		}
1570 		d->prev_input_idx = d->input_idx;
1571 	}
1572 
1573 	return ret;
1574 }
1575 
1576 /**
1577  * ice_dpll_periodic_work - DPLLs periodic worker
1578  * @work: pointer to kthread_work structure
1579  *
1580  * DPLLs periodic worker is responsible for polling state of dpll.
1581  * Context: Holds pf->dplls.lock
1582  */
1583 static void ice_dpll_periodic_work(struct kthread_work *work)
1584 {
1585 	struct ice_dplls *d = container_of(work, struct ice_dplls, work.work);
1586 	struct ice_pf *pf = container_of(d, struct ice_pf, dplls);
1587 	struct ice_dpll *de = &pf->dplls.eec;
1588 	struct ice_dpll *dp = &pf->dplls.pps;
1589 	int ret = 0;
1590 
1591 	if (ice_is_reset_in_progress(pf->state))
1592 		goto resched;
1593 	mutex_lock(&pf->dplls.lock);
1594 	ret = ice_dpll_update_state(pf, de, false);
1595 	if (!ret)
1596 		ret = ice_dpll_update_state(pf, dp, false);
1597 	if (ret) {
1598 		d->cgu_state_acq_err_num++;
1599 		/* stop rescheduling this worker */
1600 		if (d->cgu_state_acq_err_num >
1601 		    ICE_CGU_STATE_ACQ_ERR_THRESHOLD) {
1602 			dev_err(ice_pf_to_dev(pf),
1603 				"EEC/PPS DPLLs periodic work disabled\n");
1604 			mutex_unlock(&pf->dplls.lock);
1605 			return;
1606 		}
1607 	}
1608 	mutex_unlock(&pf->dplls.lock);
1609 	ice_dpll_notify_changes(de);
1610 	ice_dpll_notify_changes(dp);
1611 
1612 resched:
1613 	/* Run twice a second or reschedule if update failed */
1614 	kthread_queue_delayed_work(d->kworker, &d->work,
1615 				   ret ? msecs_to_jiffies(10) :
1616 				   msecs_to_jiffies(500));
1617 }
1618 
1619 /**
1620  * ice_dpll_release_pins - release pins resources from dpll subsystem
1621  * @pins: pointer to pins array
1622  * @count: number of pins
1623  *
1624  * Release resources of given pins array in the dpll subsystem.
1625  */
1626 static void ice_dpll_release_pins(struct ice_dpll_pin *pins, int count)
1627 {
1628 	int i;
1629 
1630 	for (i = 0; i < count; i++)
1631 		dpll_pin_put(pins[i].pin);
1632 }
1633 
1634 /**
1635  * ice_dpll_get_pins - get pins from dpll subsystem
1636  * @pf: board private structure
1637  * @pins: pointer to pins array
1638  * @start_idx: get starts from this pin idx value
1639  * @count: number of pins
1640  * @clock_id: clock_id of dpll device
1641  *
1642  * Get pins - allocate - in dpll subsystem, store them in pin field of given
1643  * pins array.
1644  *
1645  * Return:
1646  * * 0 - success
1647  * * negative - allocation failure reason
1648  */
1649 static int
1650 ice_dpll_get_pins(struct ice_pf *pf, struct ice_dpll_pin *pins,
1651 		  int start_idx, int count, u64 clock_id)
1652 {
1653 	int i, ret;
1654 
1655 	for (i = 0; i < count; i++) {
1656 		pins[i].pin = dpll_pin_get(clock_id, i + start_idx, THIS_MODULE,
1657 					   &pins[i].prop);
1658 		if (IS_ERR(pins[i].pin)) {
1659 			ret = PTR_ERR(pins[i].pin);
1660 			goto release_pins;
1661 		}
1662 	}
1663 
1664 	return 0;
1665 
1666 release_pins:
1667 	while (--i >= 0)
1668 		dpll_pin_put(pins[i].pin);
1669 	return ret;
1670 }
1671 
1672 /**
1673  * ice_dpll_unregister_pins - unregister pins from a dpll
1674  * @dpll: dpll device pointer
1675  * @pins: pointer to pins array
1676  * @ops: callback ops registered with the pins
1677  * @count: number of pins
1678  *
1679  * Unregister pins of a given array of pins from given dpll device registered in
1680  * dpll subsystem.
1681  */
1682 static void
1683 ice_dpll_unregister_pins(struct dpll_device *dpll, struct ice_dpll_pin *pins,
1684 			 const struct dpll_pin_ops *ops, int count)
1685 {
1686 	int i;
1687 
1688 	for (i = 0; i < count; i++)
1689 		dpll_pin_unregister(dpll, pins[i].pin, ops, &pins[i]);
1690 }
1691 
1692 /**
1693  * ice_dpll_register_pins - register pins with a dpll
1694  * @dpll: dpll pointer to register pins with
1695  * @pins: pointer to pins array
1696  * @ops: callback ops registered with the pins
1697  * @count: number of pins
1698  *
1699  * Register pins of a given array with given dpll in dpll subsystem.
1700  *
1701  * Return:
1702  * * 0 - success
1703  * * negative - registration failure reason
1704  */
1705 static int
1706 ice_dpll_register_pins(struct dpll_device *dpll, struct ice_dpll_pin *pins,
1707 		       const struct dpll_pin_ops *ops, int count)
1708 {
1709 	int ret, i;
1710 
1711 	for (i = 0; i < count; i++) {
1712 		ret = dpll_pin_register(dpll, pins[i].pin, ops, &pins[i]);
1713 		if (ret)
1714 			goto unregister_pins;
1715 	}
1716 
1717 	return 0;
1718 
1719 unregister_pins:
1720 	while (--i >= 0)
1721 		dpll_pin_unregister(dpll, pins[i].pin, ops, &pins[i]);
1722 	return ret;
1723 }
1724 
1725 /**
1726  * ice_dpll_deinit_direct_pins - deinitialize direct pins
1727  * @cgu: if cgu is present and controlled by this NIC
1728  * @pins: pointer to pins array
1729  * @count: number of pins
1730  * @ops: callback ops registered with the pins
1731  * @first: dpll device pointer
1732  * @second: dpll device pointer
1733  *
1734  * If cgu is owned unregister pins from given dplls.
1735  * Release pins resources to the dpll subsystem.
1736  */
1737 static void
1738 ice_dpll_deinit_direct_pins(bool cgu, struct ice_dpll_pin *pins, int count,
1739 			    const struct dpll_pin_ops *ops,
1740 			    struct dpll_device *first,
1741 			    struct dpll_device *second)
1742 {
1743 	if (cgu) {
1744 		ice_dpll_unregister_pins(first, pins, ops, count);
1745 		ice_dpll_unregister_pins(second, pins, ops, count);
1746 	}
1747 	ice_dpll_release_pins(pins, count);
1748 }
1749 
1750 /**
1751  * ice_dpll_init_direct_pins - initialize direct pins
1752  * @pf: board private structure
1753  * @cgu: if cgu is present and controlled by this NIC
1754  * @pins: pointer to pins array
1755  * @start_idx: on which index shall allocation start in dpll subsystem
1756  * @count: number of pins
1757  * @ops: callback ops registered with the pins
1758  * @first: dpll device pointer
1759  * @second: dpll device pointer
1760  *
1761  * Allocate directly connected pins of a given array in dpll subsystem.
1762  * If cgu is owned register allocated pins with given dplls.
1763  *
1764  * Return:
1765  * * 0 - success
1766  * * negative - registration failure reason
1767  */
1768 static int
1769 ice_dpll_init_direct_pins(struct ice_pf *pf, bool cgu,
1770 			  struct ice_dpll_pin *pins, int start_idx, int count,
1771 			  const struct dpll_pin_ops *ops,
1772 			  struct dpll_device *first, struct dpll_device *second)
1773 {
1774 	int ret;
1775 
1776 	ret = ice_dpll_get_pins(pf, pins, start_idx, count, pf->dplls.clock_id);
1777 	if (ret)
1778 		return ret;
1779 	if (cgu) {
1780 		ret = ice_dpll_register_pins(first, pins, ops, count);
1781 		if (ret)
1782 			goto release_pins;
1783 		ret = ice_dpll_register_pins(second, pins, ops, count);
1784 		if (ret)
1785 			goto unregister_first;
1786 	}
1787 
1788 	return 0;
1789 
1790 unregister_first:
1791 	ice_dpll_unregister_pins(first, pins, ops, count);
1792 release_pins:
1793 	ice_dpll_release_pins(pins, count);
1794 	return ret;
1795 }
1796 
1797 /**
1798  * ice_dpll_deinit_rclk_pin - release rclk pin resources
1799  * @pf: board private structure
1800  *
1801  * Deregister rclk pin from parent pins and release resources in dpll subsystem.
1802  */
1803 static void ice_dpll_deinit_rclk_pin(struct ice_pf *pf)
1804 {
1805 	struct ice_dpll_pin *rclk = &pf->dplls.rclk;
1806 	struct ice_vsi *vsi = ice_get_main_vsi(pf);
1807 	struct dpll_pin *parent;
1808 	int i;
1809 
1810 	for (i = 0; i < rclk->num_parents; i++) {
1811 		parent = pf->dplls.inputs[rclk->parent_idx[i]].pin;
1812 		if (!parent)
1813 			continue;
1814 		dpll_pin_on_pin_unregister(parent, rclk->pin,
1815 					   &ice_dpll_rclk_ops, rclk);
1816 	}
1817 	if (WARN_ON_ONCE(!vsi || !vsi->netdev))
1818 		return;
1819 	dpll_netdev_pin_clear(vsi->netdev);
1820 	dpll_pin_put(rclk->pin);
1821 }
1822 
1823 /**
1824  * ice_dpll_init_rclk_pins - initialize recovered clock pin
1825  * @pf: board private structure
1826  * @pin: pin to register
1827  * @start_idx: on which index shall allocation start in dpll subsystem
1828  * @ops: callback ops registered with the pins
1829  *
1830  * Allocate resource for recovered clock pin in dpll subsystem. Register the
1831  * pin with the parents it has in the info. Register pin with the pf's main vsi
1832  * netdev.
1833  *
1834  * Return:
1835  * * 0 - success
1836  * * negative - registration failure reason
1837  */
1838 static int
1839 ice_dpll_init_rclk_pins(struct ice_pf *pf, struct ice_dpll_pin *pin,
1840 			int start_idx, const struct dpll_pin_ops *ops)
1841 {
1842 	struct ice_vsi *vsi = ice_get_main_vsi(pf);
1843 	struct dpll_pin *parent;
1844 	int ret, i;
1845 
1846 	ret = ice_dpll_get_pins(pf, pin, start_idx, ICE_DPLL_RCLK_NUM_PER_PF,
1847 				pf->dplls.clock_id);
1848 	if (ret)
1849 		return ret;
1850 	for (i = 0; i < pf->dplls.rclk.num_parents; i++) {
1851 		parent = pf->dplls.inputs[pf->dplls.rclk.parent_idx[i]].pin;
1852 		if (!parent) {
1853 			ret = -ENODEV;
1854 			goto unregister_pins;
1855 		}
1856 		ret = dpll_pin_on_pin_register(parent, pf->dplls.rclk.pin,
1857 					       ops, &pf->dplls.rclk);
1858 		if (ret)
1859 			goto unregister_pins;
1860 	}
1861 	if (WARN_ON((!vsi || !vsi->netdev)))
1862 		return -EINVAL;
1863 	dpll_netdev_pin_set(vsi->netdev, pf->dplls.rclk.pin);
1864 
1865 	return 0;
1866 
1867 unregister_pins:
1868 	while (i) {
1869 		parent = pf->dplls.inputs[pf->dplls.rclk.parent_idx[--i]].pin;
1870 		dpll_pin_on_pin_unregister(parent, pf->dplls.rclk.pin,
1871 					   &ice_dpll_rclk_ops, &pf->dplls.rclk);
1872 	}
1873 	ice_dpll_release_pins(pin, ICE_DPLL_RCLK_NUM_PER_PF);
1874 	return ret;
1875 }
1876 
1877 /**
1878  * ice_dpll_deinit_pins - deinitialize direct pins
1879  * @pf: board private structure
1880  * @cgu: if cgu is controlled by this pf
1881  *
1882  * If cgu is owned unregister directly connected pins from the dplls.
1883  * Release resources of directly connected pins from the dpll subsystem.
1884  */
1885 static void ice_dpll_deinit_pins(struct ice_pf *pf, bool cgu)
1886 {
1887 	struct ice_dpll_pin *outputs = pf->dplls.outputs;
1888 	struct ice_dpll_pin *inputs = pf->dplls.inputs;
1889 	int num_outputs = pf->dplls.num_outputs;
1890 	int num_inputs = pf->dplls.num_inputs;
1891 	struct ice_dplls *d = &pf->dplls;
1892 	struct ice_dpll *de = &d->eec;
1893 	struct ice_dpll *dp = &d->pps;
1894 
1895 	ice_dpll_deinit_rclk_pin(pf);
1896 	if (cgu) {
1897 		ice_dpll_unregister_pins(dp->dpll, inputs, &ice_dpll_input_ops,
1898 					 num_inputs);
1899 		ice_dpll_unregister_pins(de->dpll, inputs, &ice_dpll_input_ops,
1900 					 num_inputs);
1901 	}
1902 	ice_dpll_release_pins(inputs, num_inputs);
1903 	if (cgu) {
1904 		ice_dpll_unregister_pins(dp->dpll, outputs,
1905 					 &ice_dpll_output_ops, num_outputs);
1906 		ice_dpll_unregister_pins(de->dpll, outputs,
1907 					 &ice_dpll_output_ops, num_outputs);
1908 		ice_dpll_release_pins(outputs, num_outputs);
1909 	}
1910 }
1911 
1912 /**
1913  * ice_dpll_init_pins - init pins and register pins with a dplls
1914  * @pf: board private structure
1915  * @cgu: if cgu is present and controlled by this NIC
1916  *
1917  * Initialize directly connected pf's pins within pf's dplls in a Linux dpll
1918  * subsystem.
1919  *
1920  * Return:
1921  * * 0 - success
1922  * * negative - initialization failure reason
1923  */
1924 static int ice_dpll_init_pins(struct ice_pf *pf, bool cgu)
1925 {
1926 	u32 rclk_idx;
1927 	int ret;
1928 
1929 	ret = ice_dpll_init_direct_pins(pf, cgu, pf->dplls.inputs, 0,
1930 					pf->dplls.num_inputs,
1931 					&ice_dpll_input_ops,
1932 					pf->dplls.eec.dpll, pf->dplls.pps.dpll);
1933 	if (ret)
1934 		return ret;
1935 	if (cgu) {
1936 		ret = ice_dpll_init_direct_pins(pf, cgu, pf->dplls.outputs,
1937 						pf->dplls.num_inputs,
1938 						pf->dplls.num_outputs,
1939 						&ice_dpll_output_ops,
1940 						pf->dplls.eec.dpll,
1941 						pf->dplls.pps.dpll);
1942 		if (ret)
1943 			goto deinit_inputs;
1944 	}
1945 	rclk_idx = pf->dplls.num_inputs + pf->dplls.num_outputs + pf->hw.pf_id;
1946 	ret = ice_dpll_init_rclk_pins(pf, &pf->dplls.rclk, rclk_idx,
1947 				      &ice_dpll_rclk_ops);
1948 	if (ret)
1949 		goto deinit_outputs;
1950 
1951 	return 0;
1952 deinit_outputs:
1953 	ice_dpll_deinit_direct_pins(cgu, pf->dplls.outputs,
1954 				    pf->dplls.num_outputs,
1955 				    &ice_dpll_output_ops, pf->dplls.pps.dpll,
1956 				    pf->dplls.eec.dpll);
1957 deinit_inputs:
1958 	ice_dpll_deinit_direct_pins(cgu, pf->dplls.inputs, pf->dplls.num_inputs,
1959 				    &ice_dpll_input_ops, pf->dplls.pps.dpll,
1960 				    pf->dplls.eec.dpll);
1961 	return ret;
1962 }
1963 
1964 /**
1965  * ice_dpll_deinit_dpll - deinitialize dpll device
1966  * @pf: board private structure
1967  * @d: pointer to ice_dpll
1968  * @cgu: if cgu is present and controlled by this NIC
1969  *
1970  * If cgu is owned unregister the dpll from dpll subsystem.
1971  * Release resources of dpll device from dpll subsystem.
1972  */
1973 static void
1974 ice_dpll_deinit_dpll(struct ice_pf *pf, struct ice_dpll *d, bool cgu)
1975 {
1976 	if (cgu)
1977 		dpll_device_unregister(d->dpll, &ice_dpll_ops, d);
1978 	dpll_device_put(d->dpll);
1979 }
1980 
1981 /**
1982  * ice_dpll_init_dpll - initialize dpll device in dpll subsystem
1983  * @pf: board private structure
1984  * @d: dpll to be initialized
1985  * @cgu: if cgu is present and controlled by this NIC
1986  * @type: type of dpll being initialized
1987  *
1988  * Allocate dpll instance for this board in dpll subsystem, if cgu is controlled
1989  * by this NIC, register dpll with the callback ops.
1990  *
1991  * Return:
1992  * * 0 - success
1993  * * negative - initialization failure reason
1994  */
1995 static int
1996 ice_dpll_init_dpll(struct ice_pf *pf, struct ice_dpll *d, bool cgu,
1997 		   enum dpll_type type)
1998 {
1999 	u64 clock_id = pf->dplls.clock_id;
2000 	int ret;
2001 
2002 	d->dpll = dpll_device_get(clock_id, d->dpll_idx, THIS_MODULE);
2003 	if (IS_ERR(d->dpll)) {
2004 		ret = PTR_ERR(d->dpll);
2005 		dev_err(ice_pf_to_dev(pf),
2006 			"dpll_device_get failed (%p) err=%d\n", d, ret);
2007 		return ret;
2008 	}
2009 	d->pf = pf;
2010 	if (cgu) {
2011 		ice_dpll_update_state(pf, d, true);
2012 		ret = dpll_device_register(d->dpll, type, &ice_dpll_ops, d);
2013 		if (ret) {
2014 			dpll_device_put(d->dpll);
2015 			return ret;
2016 		}
2017 	}
2018 
2019 	return 0;
2020 }
2021 
2022 /**
2023  * ice_dpll_deinit_worker - deinitialize dpll kworker
2024  * @pf: board private structure
2025  *
2026  * Stop dpll's kworker, release it's resources.
2027  */
2028 static void ice_dpll_deinit_worker(struct ice_pf *pf)
2029 {
2030 	struct ice_dplls *d = &pf->dplls;
2031 
2032 	kthread_cancel_delayed_work_sync(&d->work);
2033 	kthread_destroy_worker(d->kworker);
2034 }
2035 
2036 /**
2037  * ice_dpll_init_worker - Initialize DPLLs periodic worker
2038  * @pf: board private structure
2039  *
2040  * Create and start DPLLs periodic worker.
2041  *
2042  * Context: Shall be called after pf->dplls.lock is initialized.
2043  * Return:
2044  * * 0 - success
2045  * * negative - create worker failure
2046  */
2047 static int ice_dpll_init_worker(struct ice_pf *pf)
2048 {
2049 	struct ice_dplls *d = &pf->dplls;
2050 	struct kthread_worker *kworker;
2051 
2052 	kthread_init_delayed_work(&d->work, ice_dpll_periodic_work);
2053 	kworker = kthread_create_worker(0, "ice-dplls-%s",
2054 					dev_name(ice_pf_to_dev(pf)));
2055 	if (IS_ERR(kworker))
2056 		return PTR_ERR(kworker);
2057 	d->kworker = kworker;
2058 	d->cgu_state_acq_err_num = 0;
2059 	kthread_queue_delayed_work(d->kworker, &d->work, 0);
2060 
2061 	return 0;
2062 }
2063 
2064 /**
2065  * ice_dpll_init_info_direct_pins - initializes direct pins info
2066  * @pf: board private structure
2067  * @pin_type: type of pins being initialized
2068  *
2069  * Init information for directly connected pins, cache them in pf's pins
2070  * structures.
2071  *
2072  * Return:
2073  * * 0 - success
2074  * * negative - init failure reason
2075  */
2076 static int
2077 ice_dpll_init_info_direct_pins(struct ice_pf *pf,
2078 			       enum ice_dpll_pin_type pin_type)
2079 {
2080 	struct ice_dpll *de = &pf->dplls.eec, *dp = &pf->dplls.pps;
2081 	int num_pins, i, ret = -EINVAL;
2082 	struct ice_hw *hw = &pf->hw;
2083 	struct ice_dpll_pin *pins;
2084 	unsigned long caps;
2085 	u8 freq_supp_num;
2086 	bool input;
2087 
2088 	switch (pin_type) {
2089 	case ICE_DPLL_PIN_TYPE_INPUT:
2090 		pins = pf->dplls.inputs;
2091 		num_pins = pf->dplls.num_inputs;
2092 		input = true;
2093 		break;
2094 	case ICE_DPLL_PIN_TYPE_OUTPUT:
2095 		pins = pf->dplls.outputs;
2096 		num_pins = pf->dplls.num_outputs;
2097 		input = false;
2098 		break;
2099 	default:
2100 		return -EINVAL;
2101 	}
2102 
2103 	for (i = 0; i < num_pins; i++) {
2104 		caps = 0;
2105 		pins[i].idx = i;
2106 		pins[i].prop.board_label = ice_cgu_get_pin_name(hw, i, input);
2107 		pins[i].prop.type = ice_cgu_get_pin_type(hw, i, input);
2108 		if (input) {
2109 			ret = ice_aq_get_cgu_ref_prio(hw, de->dpll_idx, i,
2110 						      &de->input_prio[i]);
2111 			if (ret)
2112 				return ret;
2113 			ret = ice_aq_get_cgu_ref_prio(hw, dp->dpll_idx, i,
2114 						      &dp->input_prio[i]);
2115 			if (ret)
2116 				return ret;
2117 			caps |= (DPLL_PIN_CAPABILITIES_PRIORITY_CAN_CHANGE |
2118 				 DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE);
2119 			pins[i].prop.phase_range.min =
2120 				pf->dplls.input_phase_adj_max;
2121 			pins[i].prop.phase_range.max =
2122 				-pf->dplls.input_phase_adj_max;
2123 		} else {
2124 			pins[i].prop.phase_range.min =
2125 				pf->dplls.output_phase_adj_max;
2126 			pins[i].prop.phase_range.max =
2127 				-pf->dplls.output_phase_adj_max;
2128 			ret = ice_cgu_get_output_pin_state_caps(hw, i, &caps);
2129 			if (ret)
2130 				return ret;
2131 		}
2132 		pins[i].prop.capabilities = caps;
2133 		ret = ice_dpll_pin_state_update(pf, &pins[i], pin_type, NULL);
2134 		if (ret)
2135 			return ret;
2136 		pins[i].prop.freq_supported =
2137 			ice_cgu_get_pin_freq_supp(hw, i, input, &freq_supp_num);
2138 		pins[i].prop.freq_supported_num = freq_supp_num;
2139 		pins[i].pf = pf;
2140 	}
2141 
2142 	return ret;
2143 }
2144 
2145 /**
2146  * ice_dpll_init_info_rclk_pin - initializes rclk pin information
2147  * @pf: board private structure
2148  *
2149  * Init information for rclk pin, cache them in pf->dplls.rclk.
2150  *
2151  * Return:
2152  * * 0 - success
2153  * * negative - init failure reason
2154  */
2155 static int ice_dpll_init_info_rclk_pin(struct ice_pf *pf)
2156 {
2157 	struct ice_dpll_pin *pin = &pf->dplls.rclk;
2158 
2159 	pin->prop.type = DPLL_PIN_TYPE_SYNCE_ETH_PORT;
2160 	pin->prop.capabilities |= DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE;
2161 	pin->pf = pf;
2162 
2163 	return ice_dpll_pin_state_update(pf, pin,
2164 					 ICE_DPLL_PIN_TYPE_RCLK_INPUT, NULL);
2165 }
2166 
2167 /**
2168  * ice_dpll_init_pins_info - init pins info wrapper
2169  * @pf: board private structure
2170  * @pin_type: type of pins being initialized
2171  *
2172  * Wraps functions for pin initialization.
2173  *
2174  * Return:
2175  * * 0 - success
2176  * * negative - init failure reason
2177  */
2178 static int
2179 ice_dpll_init_pins_info(struct ice_pf *pf, enum ice_dpll_pin_type pin_type)
2180 {
2181 	switch (pin_type) {
2182 	case ICE_DPLL_PIN_TYPE_INPUT:
2183 	case ICE_DPLL_PIN_TYPE_OUTPUT:
2184 		return ice_dpll_init_info_direct_pins(pf, pin_type);
2185 	case ICE_DPLL_PIN_TYPE_RCLK_INPUT:
2186 		return ice_dpll_init_info_rclk_pin(pf);
2187 	default:
2188 		return -EINVAL;
2189 	}
2190 }
2191 
2192 /**
2193  * ice_dpll_deinit_info - release memory allocated for pins info
2194  * @pf: board private structure
2195  *
2196  * Release memory allocated for pins by ice_dpll_init_info function.
2197  */
2198 static void ice_dpll_deinit_info(struct ice_pf *pf)
2199 {
2200 	kfree(pf->dplls.inputs);
2201 	kfree(pf->dplls.outputs);
2202 	kfree(pf->dplls.eec.input_prio);
2203 	kfree(pf->dplls.pps.input_prio);
2204 }
2205 
2206 /**
2207  * ice_dpll_init_info - prepare pf's dpll information structure
2208  * @pf: board private structure
2209  * @cgu: if cgu is present and controlled by this NIC
2210  *
2211  * Acquire (from HW) and set basic dpll information (on pf->dplls struct).
2212  *
2213  * Return:
2214  * * 0 - success
2215  * * negative - init failure reason
2216  */
2217 static int ice_dpll_init_info(struct ice_pf *pf, bool cgu)
2218 {
2219 	struct ice_aqc_get_cgu_abilities abilities;
2220 	struct ice_dpll *de = &pf->dplls.eec;
2221 	struct ice_dpll *dp = &pf->dplls.pps;
2222 	struct ice_dplls *d = &pf->dplls;
2223 	struct ice_hw *hw = &pf->hw;
2224 	int ret, alloc_size, i;
2225 
2226 	d->clock_id = ice_generate_clock_id(pf);
2227 	ret = ice_aq_get_cgu_abilities(hw, &abilities);
2228 	if (ret) {
2229 		dev_err(ice_pf_to_dev(pf),
2230 			"err:%d %s failed to read cgu abilities\n",
2231 			ret, ice_aq_str(hw->adminq.sq_last_status));
2232 		return ret;
2233 	}
2234 
2235 	de->dpll_idx = abilities.eec_dpll_idx;
2236 	dp->dpll_idx = abilities.pps_dpll_idx;
2237 	d->num_inputs = abilities.num_inputs;
2238 	d->num_outputs = abilities.num_outputs;
2239 	d->input_phase_adj_max = le32_to_cpu(abilities.max_in_phase_adj);
2240 	d->output_phase_adj_max = le32_to_cpu(abilities.max_out_phase_adj);
2241 
2242 	alloc_size = sizeof(*d->inputs) * d->num_inputs;
2243 	d->inputs = kzalloc(alloc_size, GFP_KERNEL);
2244 	if (!d->inputs)
2245 		return -ENOMEM;
2246 
2247 	alloc_size = sizeof(*de->input_prio) * d->num_inputs;
2248 	de->input_prio = kzalloc(alloc_size, GFP_KERNEL);
2249 	if (!de->input_prio)
2250 		return -ENOMEM;
2251 
2252 	dp->input_prio = kzalloc(alloc_size, GFP_KERNEL);
2253 	if (!dp->input_prio)
2254 		return -ENOMEM;
2255 
2256 	ret = ice_dpll_init_pins_info(pf, ICE_DPLL_PIN_TYPE_INPUT);
2257 	if (ret)
2258 		goto deinit_info;
2259 
2260 	if (cgu) {
2261 		alloc_size = sizeof(*d->outputs) * d->num_outputs;
2262 		d->outputs = kzalloc(alloc_size, GFP_KERNEL);
2263 		if (!d->outputs) {
2264 			ret = -ENOMEM;
2265 			goto deinit_info;
2266 		}
2267 
2268 		ret = ice_dpll_init_pins_info(pf, ICE_DPLL_PIN_TYPE_OUTPUT);
2269 		if (ret)
2270 			goto deinit_info;
2271 	}
2272 
2273 	ret = ice_get_cgu_rclk_pin_info(&pf->hw, &d->base_rclk_idx,
2274 					&pf->dplls.rclk.num_parents);
2275 	if (ret)
2276 		return ret;
2277 	for (i = 0; i < pf->dplls.rclk.num_parents; i++)
2278 		pf->dplls.rclk.parent_idx[i] = d->base_rclk_idx + i;
2279 	ret = ice_dpll_init_pins_info(pf, ICE_DPLL_PIN_TYPE_RCLK_INPUT);
2280 	if (ret)
2281 		return ret;
2282 	de->mode = DPLL_MODE_AUTOMATIC;
2283 	dp->mode = DPLL_MODE_AUTOMATIC;
2284 
2285 	dev_dbg(ice_pf_to_dev(pf),
2286 		"%s - success, inputs:%u, outputs:%u rclk-parents:%u\n",
2287 		__func__, d->num_inputs, d->num_outputs, d->rclk.num_parents);
2288 
2289 	return 0;
2290 
2291 deinit_info:
2292 	dev_err(ice_pf_to_dev(pf),
2293 		"%s - fail: d->inputs:%p, de->input_prio:%p, dp->input_prio:%p, d->outputs:%p\n",
2294 		__func__, d->inputs, de->input_prio,
2295 		dp->input_prio, d->outputs);
2296 	ice_dpll_deinit_info(pf);
2297 	return ret;
2298 }
2299 
2300 /**
2301  * ice_dpll_deinit - Disable the driver/HW support for dpll subsystem
2302  * the dpll device.
2303  * @pf: board private structure
2304  *
2305  * Handles the cleanup work required after dpll initialization, freeing
2306  * resources and unregistering the dpll, pin and all resources used for
2307  * handling them.
2308  *
2309  * Context: Destroys pf->dplls.lock mutex. Call only if ICE_FLAG_DPLL was set.
2310  */
2311 void ice_dpll_deinit(struct ice_pf *pf)
2312 {
2313 	bool cgu = ice_is_feature_supported(pf, ICE_F_CGU);
2314 
2315 	clear_bit(ICE_FLAG_DPLL, pf->flags);
2316 	if (cgu)
2317 		ice_dpll_deinit_worker(pf);
2318 
2319 	ice_dpll_deinit_pins(pf, cgu);
2320 	ice_dpll_deinit_dpll(pf, &pf->dplls.pps, cgu);
2321 	ice_dpll_deinit_dpll(pf, &pf->dplls.eec, cgu);
2322 	ice_dpll_deinit_info(pf);
2323 	mutex_destroy(&pf->dplls.lock);
2324 }
2325 
2326 /**
2327  * ice_dpll_init - initialize support for dpll subsystem
2328  * @pf: board private structure
2329  *
2330  * Set up the device dplls, register them and pins connected within Linux dpll
2331  * subsystem. Allow userspace to obtain state of DPLL and handling of DPLL
2332  * configuration requests.
2333  *
2334  * Context: Initializes pf->dplls.lock mutex.
2335  */
2336 void ice_dpll_init(struct ice_pf *pf)
2337 {
2338 	bool cgu = ice_is_feature_supported(pf, ICE_F_CGU);
2339 	struct ice_dplls *d = &pf->dplls;
2340 	int err = 0;
2341 
2342 	mutex_init(&d->lock);
2343 	err = ice_dpll_init_info(pf, cgu);
2344 	if (err)
2345 		goto err_exit;
2346 	err = ice_dpll_init_dpll(pf, &pf->dplls.eec, cgu, DPLL_TYPE_EEC);
2347 	if (err)
2348 		goto deinit_info;
2349 	err = ice_dpll_init_dpll(pf, &pf->dplls.pps, cgu, DPLL_TYPE_PPS);
2350 	if (err)
2351 		goto deinit_eec;
2352 	err = ice_dpll_init_pins(pf, cgu);
2353 	if (err)
2354 		goto deinit_pps;
2355 	if (cgu) {
2356 		err = ice_dpll_init_worker(pf);
2357 		if (err)
2358 			goto deinit_pins;
2359 	}
2360 	set_bit(ICE_FLAG_DPLL, pf->flags);
2361 
2362 	return;
2363 
2364 deinit_pins:
2365 	ice_dpll_deinit_pins(pf, cgu);
2366 deinit_pps:
2367 	ice_dpll_deinit_dpll(pf, &pf->dplls.pps, cgu);
2368 deinit_eec:
2369 	ice_dpll_deinit_dpll(pf, &pf->dplls.eec, cgu);
2370 deinit_info:
2371 	ice_dpll_deinit_info(pf);
2372 err_exit:
2373 	mutex_destroy(&d->lock);
2374 	dev_warn(ice_pf_to_dev(pf), "DPLLs init failure err:%d\n", err);
2375 }
2376