/* Disable the PLL before changing the clock source or frequency */ if (FIELD_GET(ICE_CGU_R23_R24_TSPLL_ENABLE, r24)) {
r24 &= ~ICE_CGU_R23_R24_TSPLL_ENABLE;
err = ice_write_cgu_reg(hw, ICE_CGU_R24, r24); if (err) return err;
}
/* Set the frequency */
r9 &= ~ICE_CGU_R9_TIME_REF_FREQ_SEL;
r9 |= FIELD_PREP(ICE_CGU_R9_TIME_REF_FREQ_SEL, clk_freq);
err = ice_write_cgu_reg(hw, ICE_CGU_R9, r9); if (err) return err;
/* Configure the TSPLL feedback divisor */
err = ice_read_cgu_reg(hw, ICE_CGU_R19, &val); if (err) return err;
val &= ~(ICE_CGU_R19_TSPLL_FBDIV_INTGR_E82X | ICE_CGU_R19_TSPLL_NDIVRATIO);
val |= FIELD_PREP(ICE_CGU_R19_TSPLL_FBDIV_INTGR_E82X,
e82x_tspll_params[clk_freq].feedback_div);
val |= FIELD_PREP(ICE_CGU_R19_TSPLL_NDIVRATIO, 1);
err = ice_write_cgu_reg(hw, ICE_CGU_R19, val); if (err) return err;
/* Configure the TSPLL post divisor */
err = ice_read_cgu_reg(hw, ICE_CGU_R22, &val); if (err) return err;
val &= ~(ICE_CGU_R22_TIME1588CLK_DIV |
ICE_CGU_R22_TIME1588CLK_DIV2);
val |= FIELD_PREP(ICE_CGU_R22_TIME1588CLK_DIV,
e82x_tspll_params[clk_freq].post_pll_div);
err = ice_write_cgu_reg(hw, ICE_CGU_R22, val); if (err) return err;
/* Configure the TSPLL pre divisor and clock source */
err = ice_read_cgu_reg(hw, ICE_CGU_R24, &r24); if (err) return err;
/* Disable the PLL before changing the clock source or frequency */ if (FIELD_GET(ICE_CGU_R23_R24_TSPLL_ENABLE, r23)) {
r23 &= ~ICE_CGU_R23_R24_TSPLL_ENABLE;
err = ice_write_cgu_reg(hw, ICE_CGU_R23, r23); if (err) return err;
}
if (FIELD_GET(ICE_CGU_R9_TIME_SYNC_EN, r9)) {
r9 &= ~ICE_CGU_R9_TIME_SYNC_EN;
err = ice_write_cgu_reg(hw, ICE_CGU_R9, r9); if (err) return err;
}
/* Set the frequency and enable the correct receiver */
r9 &= ~(ICE_CGU_R9_TIME_REF_FREQ_SEL | ICE_CGU_R9_CLK_EREF0_EN |
ICE_CGU_R9_TIME_REF_EN);
r9 |= FIELD_PREP(ICE_CGU_R9_TIME_REF_FREQ_SEL, clk_freq); if (clk_src == ICE_CLK_SRC_TCXO)
r9 |= ICE_CGU_R9_CLK_EREF0_EN; else
r9 |= ICE_CGU_R9_TIME_REF_EN;
r9 |= ICE_CGU_R9_TIME_SYNC_EN;
err = ice_write_cgu_reg(hw, ICE_CGU_R9, r9); if (err) return err;
/* Choose the referenced frequency */
err = ice_read_cgu_reg(hw, ICE_CGU_R16, &val); if (err) return err;
val &= ~ICE_CGU_R16_TSPLL_CK_REFCLKFREQ;
val |= FIELD_PREP(ICE_CGU_R16_TSPLL_CK_REFCLKFREQ,
ICE_TSPLL_CK_REFCLKFREQ_E825);
err = ice_write_cgu_reg(hw, ICE_CGU_R16, val); if (err) return err;
/* Configure the TSPLL feedback divisor */
err = ice_read_cgu_reg(hw, ICE_CGU_R19, &val); if (err) return err;
val &= ~(ICE_CGU_R19_TSPLL_FBDIV_INTGR_E825 |
ICE_CGU_R19_TSPLL_NDIVRATIO);
val |= FIELD_PREP(ICE_CGU_R19_TSPLL_FBDIV_INTGR_E825,
ICE_TSPLL_FBDIV_INTGR_E825);
val |= FIELD_PREP(ICE_CGU_R19_TSPLL_NDIVRATIO,
ICE_TSPLL_NDIVRATIO_E825);
err = ice_write_cgu_reg(hw, ICE_CGU_R19, val); if (err) return err;
/* Configure the TSPLL post divisor, these two are constant */
err = ice_read_cgu_reg(hw, ICE_CGU_R22, &val); if (err) return err;
val &= ~(ICE_CGU_R22_TIME1588CLK_DIV |
ICE_CGU_R22_TIME1588CLK_DIV2);
val |= FIELD_PREP(ICE_CGU_R22_TIME1588CLK_DIV, 5);
err = ice_write_cgu_reg(hw, ICE_CGU_R22, val); if (err) return err;
/* Configure the TSPLL pre divisor (constant) and clock source */
err = ice_read_cgu_reg(hw, ICE_CGU_R23, &r23); if (err) return err;
/* Disable sticky lock detection so lock status reported is accurate */
err = ice_tspll_dis_sticky_bits(hw); if (err) return err;
/* Configure the TSPLL using the parameters from the function *capabilities.
*/
err = ice_tspll_cfg(hw, tspll_freq, clk_src); if (err) {
dev_warn(ice_hw_to_dev(hw), "Failed to lock TSPLL to predefined frequency. Retrying with fallback frequency.\n");
/* Try to lock to internal TCXO as a fallback. */
tspll_freq = ice_tspll_default_freq(hw->mac_type);
clk_src = ICE_CLK_SRC_TCXO;
err = ice_tspll_cfg(hw, tspll_freq, clk_src); if (err)
dev_warn(ice_hw_to_dev(hw), "Failed to lock TSPLL to fallback frequency.\n");
}
return err;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-10-03)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.