162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* Microchip Sparx5 Switch SerDes driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2020 Microchip Technology Inc. and its subsidiaries. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * The Sparx5 Chip Register Model can be browsed at this location: 762306a36Sopenharmony_ci * https://github.com/microchip-ung/sparx-5_reginfo 862306a36Sopenharmony_ci * and the datasheet is available here: 962306a36Sopenharmony_ci * https://ww1.microchip.com/downloads/en/DeviceDoc/SparX-5_Family_L2L3_Enterprise_10G_Ethernet_Switches_Datasheet_00003822B.pdf 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci#include <linux/printk.h> 1262306a36Sopenharmony_ci#include <linux/module.h> 1362306a36Sopenharmony_ci#include <linux/device.h> 1462306a36Sopenharmony_ci#include <linux/netdevice.h> 1562306a36Sopenharmony_ci#include <linux/platform_device.h> 1662306a36Sopenharmony_ci#include <linux/of.h> 1762306a36Sopenharmony_ci#include <linux/io.h> 1862306a36Sopenharmony_ci#include <linux/clk.h> 1962306a36Sopenharmony_ci#include <linux/phy.h> 2062306a36Sopenharmony_ci#include <linux/phy/phy.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include "sparx5_serdes.h" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define SPX5_CMU_MAX 14 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define SPX5_SERDES_10G_START 13 2762306a36Sopenharmony_ci#define SPX5_SERDES_25G_START 25 2862306a36Sopenharmony_ci#define SPX5_SERDES_6G10G_CNT SPX5_SERDES_25G_START 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* Optimal power settings from GUC */ 3162306a36Sopenharmony_ci#define SPX5_SERDES_QUIET_MODE_VAL 0x01ef4e0c 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cienum sparx5_10g28cmu_mode { 3462306a36Sopenharmony_ci SPX5_SD10G28_CMU_MAIN = 0, 3562306a36Sopenharmony_ci SPX5_SD10G28_CMU_AUX1 = 1, 3662306a36Sopenharmony_ci SPX5_SD10G28_CMU_AUX2 = 3, 3762306a36Sopenharmony_ci SPX5_SD10G28_CMU_NONE = 4, 3862306a36Sopenharmony_ci SPX5_SD10G28_CMU_MAX, 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cienum sparx5_sd25g28_mode_preset_type { 4262306a36Sopenharmony_ci SPX5_SD25G28_MODE_PRESET_25000, 4362306a36Sopenharmony_ci SPX5_SD25G28_MODE_PRESET_10000, 4462306a36Sopenharmony_ci SPX5_SD25G28_MODE_PRESET_5000, 4562306a36Sopenharmony_ci SPX5_SD25G28_MODE_PRESET_SD_2G5, 4662306a36Sopenharmony_ci SPX5_SD25G28_MODE_PRESET_1000BASEX, 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cienum sparx5_sd10g28_mode_preset_type { 5062306a36Sopenharmony_ci SPX5_SD10G28_MODE_PRESET_10000, 5162306a36Sopenharmony_ci SPX5_SD10G28_MODE_PRESET_SFI_5000_6G, 5262306a36Sopenharmony_ci SPX5_SD10G28_MODE_PRESET_SFI_5000_10G, 5362306a36Sopenharmony_ci SPX5_SD10G28_MODE_PRESET_QSGMII, 5462306a36Sopenharmony_ci SPX5_SD10G28_MODE_PRESET_SD_2G5, 5562306a36Sopenharmony_ci SPX5_SD10G28_MODE_PRESET_1000BASEX, 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct sparx5_serdes_io_resource { 5962306a36Sopenharmony_ci enum sparx5_serdes_target id; 6062306a36Sopenharmony_ci phys_addr_t offset; 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct sparx5_sd25g28_mode_preset { 6462306a36Sopenharmony_ci u8 bitwidth; 6562306a36Sopenharmony_ci u8 tx_pre_div; 6662306a36Sopenharmony_ci u8 fifo_ck_div; 6762306a36Sopenharmony_ci u8 pre_divsel; 6862306a36Sopenharmony_ci u8 vco_div_mode; 6962306a36Sopenharmony_ci u8 sel_div; 7062306a36Sopenharmony_ci u8 ck_bitwidth; 7162306a36Sopenharmony_ci u8 subrate; 7262306a36Sopenharmony_ci u8 com_txcal_en; 7362306a36Sopenharmony_ci u8 com_tx_reserve_msb; 7462306a36Sopenharmony_ci u8 com_tx_reserve_lsb; 7562306a36Sopenharmony_ci u8 cfg_itx_ipcml_base; 7662306a36Sopenharmony_ci u8 tx_reserve_lsb; 7762306a36Sopenharmony_ci u8 tx_reserve_msb; 7862306a36Sopenharmony_ci u8 bw; 7962306a36Sopenharmony_ci u8 rxterm; 8062306a36Sopenharmony_ci u8 dfe_tap; 8162306a36Sopenharmony_ci u8 dfe_enable; 8262306a36Sopenharmony_ci bool txmargin; 8362306a36Sopenharmony_ci u8 cfg_ctle_rstn; 8462306a36Sopenharmony_ci u8 r_dfe_rstn; 8562306a36Sopenharmony_ci u8 cfg_pi_bw_3_0; 8662306a36Sopenharmony_ci u8 tx_tap_dly; 8762306a36Sopenharmony_ci u8 tx_tap_adv; 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct sparx5_sd25g28_media_preset { 9162306a36Sopenharmony_ci u8 cfg_eq_c_force_3_0; 9262306a36Sopenharmony_ci u8 cfg_vga_ctrl_byp_4_0; 9362306a36Sopenharmony_ci u8 cfg_eq_r_force_3_0; 9462306a36Sopenharmony_ci u8 cfg_en_adv; 9562306a36Sopenharmony_ci u8 cfg_en_main; 9662306a36Sopenharmony_ci u8 cfg_en_dly; 9762306a36Sopenharmony_ci u8 cfg_tap_adv_3_0; 9862306a36Sopenharmony_ci u8 cfg_tap_main; 9962306a36Sopenharmony_ci u8 cfg_tap_dly_4_0; 10062306a36Sopenharmony_ci u8 cfg_alos_thr_2_0; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistruct sparx5_sd25g28_args { 10462306a36Sopenharmony_ci u8 if_width; /* UDL if-width: 10/16/20/32/64 */ 10562306a36Sopenharmony_ci bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 10662306a36Sopenharmony_ci enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 10762306a36Sopenharmony_ci bool no_pwrcycle:1; /* Omit initial power-cycle */ 10862306a36Sopenharmony_ci bool txinvert:1; /* Enable inversion of output data */ 10962306a36Sopenharmony_ci bool rxinvert:1; /* Enable inversion of input data */ 11062306a36Sopenharmony_ci u16 txswing; /* Set output level */ 11162306a36Sopenharmony_ci u8 rate; /* Rate of network interface */ 11262306a36Sopenharmony_ci u8 pi_bw_gen1; 11362306a36Sopenharmony_ci u8 duty_cycle; /* Set output level to half/full */ 11462306a36Sopenharmony_ci bool mute:1; /* Mute Output Buffer */ 11562306a36Sopenharmony_ci bool reg_rst:1; 11662306a36Sopenharmony_ci u8 com_pll_reserve; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct sparx5_sd25g28_params { 12062306a36Sopenharmony_ci u8 reg_rst; 12162306a36Sopenharmony_ci u8 cfg_jc_byp; 12262306a36Sopenharmony_ci u8 cfg_common_reserve_7_0; 12362306a36Sopenharmony_ci u8 r_reg_manual; 12462306a36Sopenharmony_ci u8 r_d_width_ctrl_from_hwt; 12562306a36Sopenharmony_ci u8 r_d_width_ctrl_2_0; 12662306a36Sopenharmony_ci u8 r_txfifo_ck_div_pmad_2_0; 12762306a36Sopenharmony_ci u8 r_rxfifo_ck_div_pmad_2_0; 12862306a36Sopenharmony_ci u8 cfg_pll_lol_set; 12962306a36Sopenharmony_ci u8 cfg_vco_div_mode_1_0; 13062306a36Sopenharmony_ci u8 cfg_pre_divsel_1_0; 13162306a36Sopenharmony_ci u8 cfg_sel_div_3_0; 13262306a36Sopenharmony_ci u8 cfg_vco_start_code_3_0; 13362306a36Sopenharmony_ci u8 cfg_pma_tx_ck_bitwidth_2_0; 13462306a36Sopenharmony_ci u8 cfg_tx_prediv_1_0; 13562306a36Sopenharmony_ci u8 cfg_rxdiv_sel_2_0; 13662306a36Sopenharmony_ci u8 cfg_tx_subrate_2_0; 13762306a36Sopenharmony_ci u8 cfg_rx_subrate_2_0; 13862306a36Sopenharmony_ci u8 r_multi_lane_mode; 13962306a36Sopenharmony_ci u8 cfg_cdrck_en; 14062306a36Sopenharmony_ci u8 cfg_dfeck_en; 14162306a36Sopenharmony_ci u8 cfg_dfe_pd; 14262306a36Sopenharmony_ci u8 cfg_dfedmx_pd; 14362306a36Sopenharmony_ci u8 cfg_dfetap_en_5_1; 14462306a36Sopenharmony_ci u8 cfg_dmux_pd; 14562306a36Sopenharmony_ci u8 cfg_dmux_clk_pd; 14662306a36Sopenharmony_ci u8 cfg_erramp_pd; 14762306a36Sopenharmony_ci u8 cfg_pi_dfe_en; 14862306a36Sopenharmony_ci u8 cfg_pi_en; 14962306a36Sopenharmony_ci u8 cfg_pd_ctle; 15062306a36Sopenharmony_ci u8 cfg_summer_en; 15162306a36Sopenharmony_ci u8 cfg_pmad_ck_pd; 15262306a36Sopenharmony_ci u8 cfg_pd_clk; 15362306a36Sopenharmony_ci u8 cfg_pd_cml; 15462306a36Sopenharmony_ci u8 cfg_pd_driver; 15562306a36Sopenharmony_ci u8 cfg_rx_reg_pu; 15662306a36Sopenharmony_ci u8 cfg_pd_rms_det; 15762306a36Sopenharmony_ci u8 cfg_dcdr_pd; 15862306a36Sopenharmony_ci u8 cfg_ecdr_pd; 15962306a36Sopenharmony_ci u8 cfg_pd_sq; 16062306a36Sopenharmony_ci u8 cfg_itx_ipdriver_base_2_0; 16162306a36Sopenharmony_ci u8 cfg_tap_dly_4_0; 16262306a36Sopenharmony_ci u8 cfg_tap_main; 16362306a36Sopenharmony_ci u8 cfg_en_main; 16462306a36Sopenharmony_ci u8 cfg_tap_adv_3_0; 16562306a36Sopenharmony_ci u8 cfg_en_adv; 16662306a36Sopenharmony_ci u8 cfg_en_dly; 16762306a36Sopenharmony_ci u8 cfg_iscan_en; 16862306a36Sopenharmony_ci u8 l1_pcs_en_fast_iscan; 16962306a36Sopenharmony_ci u8 l0_cfg_bw_1_0; 17062306a36Sopenharmony_ci u8 l0_cfg_txcal_en; 17162306a36Sopenharmony_ci u8 cfg_en_dummy; 17262306a36Sopenharmony_ci u8 cfg_pll_reserve_3_0; 17362306a36Sopenharmony_ci u8 l0_cfg_tx_reserve_15_8; 17462306a36Sopenharmony_ci u8 l0_cfg_tx_reserve_7_0; 17562306a36Sopenharmony_ci u8 cfg_tx_reserve_15_8; 17662306a36Sopenharmony_ci u8 cfg_tx_reserve_7_0; 17762306a36Sopenharmony_ci u8 cfg_bw_1_0; 17862306a36Sopenharmony_ci u8 cfg_txcal_man_en; 17962306a36Sopenharmony_ci u8 cfg_phase_man_4_0; 18062306a36Sopenharmony_ci u8 cfg_quad_man_1_0; 18162306a36Sopenharmony_ci u8 cfg_txcal_shift_code_5_0; 18262306a36Sopenharmony_ci u8 cfg_txcal_valid_sel_3_0; 18362306a36Sopenharmony_ci u8 cfg_txcal_en; 18462306a36Sopenharmony_ci u8 cfg_cdr_kf_2_0; 18562306a36Sopenharmony_ci u8 cfg_cdr_m_7_0; 18662306a36Sopenharmony_ci u8 cfg_pi_bw_3_0; 18762306a36Sopenharmony_ci u8 cfg_pi_steps_1_0; 18862306a36Sopenharmony_ci u8 cfg_dis_2ndorder; 18962306a36Sopenharmony_ci u8 cfg_ctle_rstn; 19062306a36Sopenharmony_ci u8 r_dfe_rstn; 19162306a36Sopenharmony_ci u8 cfg_alos_thr_2_0; 19262306a36Sopenharmony_ci u8 cfg_itx_ipcml_base_1_0; 19362306a36Sopenharmony_ci u8 cfg_rx_reserve_7_0; 19462306a36Sopenharmony_ci u8 cfg_rx_reserve_15_8; 19562306a36Sopenharmony_ci u8 cfg_rxterm_2_0; 19662306a36Sopenharmony_ci u8 cfg_fom_selm; 19762306a36Sopenharmony_ci u8 cfg_rx_sp_ctle_1_0; 19862306a36Sopenharmony_ci u8 cfg_isel_ctle_1_0; 19962306a36Sopenharmony_ci u8 cfg_vga_ctrl_byp_4_0; 20062306a36Sopenharmony_ci u8 cfg_vga_byp; 20162306a36Sopenharmony_ci u8 cfg_agc_adpt_byp; 20262306a36Sopenharmony_ci u8 cfg_eqr_byp; 20362306a36Sopenharmony_ci u8 cfg_eqr_force_3_0; 20462306a36Sopenharmony_ci u8 cfg_eqc_force_3_0; 20562306a36Sopenharmony_ci u8 cfg_sum_setcm_en; 20662306a36Sopenharmony_ci u8 cfg_init_pos_iscan_6_0; 20762306a36Sopenharmony_ci u8 cfg_init_pos_ipi_6_0; 20862306a36Sopenharmony_ci u8 cfg_dfedig_m_2_0; 20962306a36Sopenharmony_ci u8 cfg_en_dfedig; 21062306a36Sopenharmony_ci u8 cfg_pi_DFE_en; 21162306a36Sopenharmony_ci u8 cfg_tx2rx_lp_en; 21262306a36Sopenharmony_ci u8 cfg_txlb_en; 21362306a36Sopenharmony_ci u8 cfg_rx2tx_lp_en; 21462306a36Sopenharmony_ci u8 cfg_rxlb_en; 21562306a36Sopenharmony_ci u8 r_tx_pol_inv; 21662306a36Sopenharmony_ci u8 r_rx_pol_inv; 21762306a36Sopenharmony_ci}; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistruct sparx5_sd10g28_media_preset { 22062306a36Sopenharmony_ci u8 cfg_en_adv; 22162306a36Sopenharmony_ci u8 cfg_en_main; 22262306a36Sopenharmony_ci u8 cfg_en_dly; 22362306a36Sopenharmony_ci u8 cfg_tap_adv_3_0; 22462306a36Sopenharmony_ci u8 cfg_tap_main; 22562306a36Sopenharmony_ci u8 cfg_tap_dly_4_0; 22662306a36Sopenharmony_ci u8 cfg_vga_ctrl_3_0; 22762306a36Sopenharmony_ci u8 cfg_vga_cp_2_0; 22862306a36Sopenharmony_ci u8 cfg_eq_res_3_0; 22962306a36Sopenharmony_ci u8 cfg_eq_r_byp; 23062306a36Sopenharmony_ci u8 cfg_eq_c_force_3_0; 23162306a36Sopenharmony_ci u8 cfg_alos_thr_3_0; 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistruct sparx5_sd10g28_mode_preset { 23562306a36Sopenharmony_ci u8 bwidth; /* interface width: 10/16/20/32/64 */ 23662306a36Sopenharmony_ci enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 23762306a36Sopenharmony_ci u8 rate; /* Rate of network interface */ 23862306a36Sopenharmony_ci u8 dfe_tap; 23962306a36Sopenharmony_ci u8 dfe_enable; 24062306a36Sopenharmony_ci u8 pi_bw_gen1; 24162306a36Sopenharmony_ci u8 duty_cycle; /* Set output level to half/full */ 24262306a36Sopenharmony_ci}; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistruct sparx5_sd10g28_args { 24562306a36Sopenharmony_ci bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 24662306a36Sopenharmony_ci bool no_pwrcycle:1; /* Omit initial power-cycle */ 24762306a36Sopenharmony_ci bool txinvert:1; /* Enable inversion of output data */ 24862306a36Sopenharmony_ci bool rxinvert:1; /* Enable inversion of input data */ 24962306a36Sopenharmony_ci bool txmargin:1; /* Set output level to half/full */ 25062306a36Sopenharmony_ci u16 txswing; /* Set output level */ 25162306a36Sopenharmony_ci bool mute:1; /* Mute Output Buffer */ 25262306a36Sopenharmony_ci bool is_6g:1; 25362306a36Sopenharmony_ci bool reg_rst:1; 25462306a36Sopenharmony_ci}; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_cistruct sparx5_sd10g28_params { 25762306a36Sopenharmony_ci u8 cmu_sel; 25862306a36Sopenharmony_ci u8 is_6g; 25962306a36Sopenharmony_ci u8 skip_cmu_cfg; 26062306a36Sopenharmony_ci u8 cfg_lane_reserve_7_0; 26162306a36Sopenharmony_ci u8 cfg_ssc_rtl_clk_sel; 26262306a36Sopenharmony_ci u8 cfg_lane_reserve_15_8; 26362306a36Sopenharmony_ci u8 cfg_txrate_1_0; 26462306a36Sopenharmony_ci u8 cfg_rxrate_1_0; 26562306a36Sopenharmony_ci u8 r_d_width_ctrl_2_0; 26662306a36Sopenharmony_ci u8 cfg_pma_tx_ck_bitwidth_2_0; 26762306a36Sopenharmony_ci u8 cfg_rxdiv_sel_2_0; 26862306a36Sopenharmony_ci u8 r_pcs2pma_phymode_4_0; 26962306a36Sopenharmony_ci u8 cfg_lane_id_2_0; 27062306a36Sopenharmony_ci u8 cfg_cdrck_en; 27162306a36Sopenharmony_ci u8 cfg_dfeck_en; 27262306a36Sopenharmony_ci u8 cfg_dfe_pd; 27362306a36Sopenharmony_ci u8 cfg_dfetap_en_5_1; 27462306a36Sopenharmony_ci u8 cfg_erramp_pd; 27562306a36Sopenharmony_ci u8 cfg_pi_DFE_en; 27662306a36Sopenharmony_ci u8 cfg_pi_en; 27762306a36Sopenharmony_ci u8 cfg_pd_ctle; 27862306a36Sopenharmony_ci u8 cfg_summer_en; 27962306a36Sopenharmony_ci u8 cfg_pd_rx_cktree; 28062306a36Sopenharmony_ci u8 cfg_pd_clk; 28162306a36Sopenharmony_ci u8 cfg_pd_cml; 28262306a36Sopenharmony_ci u8 cfg_pd_driver; 28362306a36Sopenharmony_ci u8 cfg_rx_reg_pu; 28462306a36Sopenharmony_ci u8 cfg_d_cdr_pd; 28562306a36Sopenharmony_ci u8 cfg_pd_sq; 28662306a36Sopenharmony_ci u8 cfg_rxdet_en; 28762306a36Sopenharmony_ci u8 cfg_rxdet_str; 28862306a36Sopenharmony_ci u8 r_multi_lane_mode; 28962306a36Sopenharmony_ci u8 cfg_en_adv; 29062306a36Sopenharmony_ci u8 cfg_en_main; 29162306a36Sopenharmony_ci u8 cfg_en_dly; 29262306a36Sopenharmony_ci u8 cfg_tap_adv_3_0; 29362306a36Sopenharmony_ci u8 cfg_tap_main; 29462306a36Sopenharmony_ci u8 cfg_tap_dly_4_0; 29562306a36Sopenharmony_ci u8 cfg_vga_ctrl_3_0; 29662306a36Sopenharmony_ci u8 cfg_vga_cp_2_0; 29762306a36Sopenharmony_ci u8 cfg_eq_res_3_0; 29862306a36Sopenharmony_ci u8 cfg_eq_r_byp; 29962306a36Sopenharmony_ci u8 cfg_eq_c_force_3_0; 30062306a36Sopenharmony_ci u8 cfg_en_dfedig; 30162306a36Sopenharmony_ci u8 cfg_sum_setcm_en; 30262306a36Sopenharmony_ci u8 cfg_en_preemph; 30362306a36Sopenharmony_ci u8 cfg_itx_ippreemp_base_1_0; 30462306a36Sopenharmony_ci u8 cfg_itx_ipdriver_base_2_0; 30562306a36Sopenharmony_ci u8 cfg_ibias_tune_reserve_5_0; 30662306a36Sopenharmony_ci u8 cfg_txswing_half; 30762306a36Sopenharmony_ci u8 cfg_dis_2nd_order; 30862306a36Sopenharmony_ci u8 cfg_rx_ssc_lh; 30962306a36Sopenharmony_ci u8 cfg_pi_floop_steps_1_0; 31062306a36Sopenharmony_ci u8 cfg_pi_ext_dac_23_16; 31162306a36Sopenharmony_ci u8 cfg_pi_ext_dac_15_8; 31262306a36Sopenharmony_ci u8 cfg_iscan_ext_dac_7_0; 31362306a36Sopenharmony_ci u8 cfg_cdr_kf_gen1_2_0; 31462306a36Sopenharmony_ci u8 cfg_cdr_kf_gen2_2_0; 31562306a36Sopenharmony_ci u8 cfg_cdr_kf_gen3_2_0; 31662306a36Sopenharmony_ci u8 cfg_cdr_kf_gen4_2_0; 31762306a36Sopenharmony_ci u8 r_cdr_m_gen1_7_0; 31862306a36Sopenharmony_ci u8 cfg_pi_bw_gen1_3_0; 31962306a36Sopenharmony_ci u8 cfg_pi_bw_gen2; 32062306a36Sopenharmony_ci u8 cfg_pi_bw_gen3; 32162306a36Sopenharmony_ci u8 cfg_pi_bw_gen4; 32262306a36Sopenharmony_ci u8 cfg_pi_ext_dac_7_0; 32362306a36Sopenharmony_ci u8 cfg_pi_steps; 32462306a36Sopenharmony_ci u8 cfg_mp_max_3_0; 32562306a36Sopenharmony_ci u8 cfg_rstn_dfedig; 32662306a36Sopenharmony_ci u8 cfg_alos_thr_3_0; 32762306a36Sopenharmony_ci u8 cfg_predrv_slewrate_1_0; 32862306a36Sopenharmony_ci u8 cfg_itx_ipcml_base_1_0; 32962306a36Sopenharmony_ci u8 cfg_ip_pre_base_1_0; 33062306a36Sopenharmony_ci u8 r_cdr_m_gen2_7_0; 33162306a36Sopenharmony_ci u8 r_cdr_m_gen3_7_0; 33262306a36Sopenharmony_ci u8 r_cdr_m_gen4_7_0; 33362306a36Sopenharmony_ci u8 r_en_auto_cdr_rstn; 33462306a36Sopenharmony_ci u8 cfg_oscal_afe; 33562306a36Sopenharmony_ci u8 cfg_pd_osdac_afe; 33662306a36Sopenharmony_ci u8 cfg_resetb_oscal_afe[2]; 33762306a36Sopenharmony_ci u8 cfg_center_spreading; 33862306a36Sopenharmony_ci u8 cfg_m_cnt_maxval_4_0; 33962306a36Sopenharmony_ci u8 cfg_ncnt_maxval_7_0; 34062306a36Sopenharmony_ci u8 cfg_ncnt_maxval_10_8; 34162306a36Sopenharmony_ci u8 cfg_ssc_en; 34262306a36Sopenharmony_ci u8 cfg_tx2rx_lp_en; 34362306a36Sopenharmony_ci u8 cfg_txlb_en; 34462306a36Sopenharmony_ci u8 cfg_rx2tx_lp_en; 34562306a36Sopenharmony_ci u8 cfg_rxlb_en; 34662306a36Sopenharmony_ci u8 r_tx_pol_inv; 34762306a36Sopenharmony_ci u8 r_rx_pol_inv; 34862306a36Sopenharmony_ci u8 fx_100; 34962306a36Sopenharmony_ci}; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_cistatic struct sparx5_sd25g28_media_preset media_presets_25g[] = { 35262306a36Sopenharmony_ci { /* ETH_MEDIA_DEFAULT */ 35362306a36Sopenharmony_ci .cfg_en_adv = 0, 35462306a36Sopenharmony_ci .cfg_en_main = 1, 35562306a36Sopenharmony_ci .cfg_en_dly = 0, 35662306a36Sopenharmony_ci .cfg_tap_adv_3_0 = 0, 35762306a36Sopenharmony_ci .cfg_tap_main = 1, 35862306a36Sopenharmony_ci .cfg_tap_dly_4_0 = 0, 35962306a36Sopenharmony_ci .cfg_eq_c_force_3_0 = 0xf, 36062306a36Sopenharmony_ci .cfg_vga_ctrl_byp_4_0 = 4, 36162306a36Sopenharmony_ci .cfg_eq_r_force_3_0 = 12, 36262306a36Sopenharmony_ci .cfg_alos_thr_2_0 = 7, 36362306a36Sopenharmony_ci }, 36462306a36Sopenharmony_ci { /* ETH_MEDIA_SR */ 36562306a36Sopenharmony_ci .cfg_en_adv = 1, 36662306a36Sopenharmony_ci .cfg_en_main = 1, 36762306a36Sopenharmony_ci .cfg_en_dly = 1, 36862306a36Sopenharmony_ci .cfg_tap_adv_3_0 = 0, 36962306a36Sopenharmony_ci .cfg_tap_main = 1, 37062306a36Sopenharmony_ci .cfg_tap_dly_4_0 = 0x10, 37162306a36Sopenharmony_ci .cfg_eq_c_force_3_0 = 0xf, 37262306a36Sopenharmony_ci .cfg_vga_ctrl_byp_4_0 = 8, 37362306a36Sopenharmony_ci .cfg_eq_r_force_3_0 = 4, 37462306a36Sopenharmony_ci .cfg_alos_thr_2_0 = 0, 37562306a36Sopenharmony_ci }, 37662306a36Sopenharmony_ci { /* ETH_MEDIA_DAC */ 37762306a36Sopenharmony_ci .cfg_en_adv = 0, 37862306a36Sopenharmony_ci .cfg_en_main = 1, 37962306a36Sopenharmony_ci .cfg_en_dly = 0, 38062306a36Sopenharmony_ci .cfg_tap_adv_3_0 = 0, 38162306a36Sopenharmony_ci .cfg_tap_main = 1, 38262306a36Sopenharmony_ci .cfg_tap_dly_4_0 = 0, 38362306a36Sopenharmony_ci .cfg_eq_c_force_3_0 = 0xf, 38462306a36Sopenharmony_ci .cfg_vga_ctrl_byp_4_0 = 8, 38562306a36Sopenharmony_ci .cfg_eq_r_force_3_0 = 0xc, 38662306a36Sopenharmony_ci .cfg_alos_thr_2_0 = 0, 38762306a36Sopenharmony_ci }, 38862306a36Sopenharmony_ci}; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_cistatic struct sparx5_sd25g28_mode_preset mode_presets_25g[] = { 39162306a36Sopenharmony_ci { /* SPX5_SD25G28_MODE_PRESET_25000 */ 39262306a36Sopenharmony_ci .bitwidth = 40, 39362306a36Sopenharmony_ci .tx_pre_div = 0, 39462306a36Sopenharmony_ci .fifo_ck_div = 0, 39562306a36Sopenharmony_ci .pre_divsel = 1, 39662306a36Sopenharmony_ci .vco_div_mode = 0, 39762306a36Sopenharmony_ci .sel_div = 15, 39862306a36Sopenharmony_ci .ck_bitwidth = 3, 39962306a36Sopenharmony_ci .subrate = 0, 40062306a36Sopenharmony_ci .com_txcal_en = 0, 40162306a36Sopenharmony_ci .com_tx_reserve_msb = (0x26 << 1), 40262306a36Sopenharmony_ci .com_tx_reserve_lsb = 0xf0, 40362306a36Sopenharmony_ci .cfg_itx_ipcml_base = 0, 40462306a36Sopenharmony_ci .tx_reserve_msb = 0xcc, 40562306a36Sopenharmony_ci .tx_reserve_lsb = 0xfe, 40662306a36Sopenharmony_ci .bw = 3, 40762306a36Sopenharmony_ci .rxterm = 0, 40862306a36Sopenharmony_ci .dfe_enable = 1, 40962306a36Sopenharmony_ci .dfe_tap = 0x1f, 41062306a36Sopenharmony_ci .txmargin = 1, 41162306a36Sopenharmony_ci .cfg_ctle_rstn = 1, 41262306a36Sopenharmony_ci .r_dfe_rstn = 1, 41362306a36Sopenharmony_ci .cfg_pi_bw_3_0 = 0, 41462306a36Sopenharmony_ci .tx_tap_dly = 8, 41562306a36Sopenharmony_ci .tx_tap_adv = 0xc, 41662306a36Sopenharmony_ci }, 41762306a36Sopenharmony_ci { /* SPX5_SD25G28_MODE_PRESET_10000 */ 41862306a36Sopenharmony_ci .bitwidth = 64, 41962306a36Sopenharmony_ci .tx_pre_div = 0, 42062306a36Sopenharmony_ci .fifo_ck_div = 2, 42162306a36Sopenharmony_ci .pre_divsel = 0, 42262306a36Sopenharmony_ci .vco_div_mode = 1, 42362306a36Sopenharmony_ci .sel_div = 9, 42462306a36Sopenharmony_ci .ck_bitwidth = 0, 42562306a36Sopenharmony_ci .subrate = 0, 42662306a36Sopenharmony_ci .com_txcal_en = 1, 42762306a36Sopenharmony_ci .com_tx_reserve_msb = (0x20 << 1), 42862306a36Sopenharmony_ci .com_tx_reserve_lsb = 0x40, 42962306a36Sopenharmony_ci .cfg_itx_ipcml_base = 0, 43062306a36Sopenharmony_ci .tx_reserve_msb = 0x4c, 43162306a36Sopenharmony_ci .tx_reserve_lsb = 0x44, 43262306a36Sopenharmony_ci .bw = 3, 43362306a36Sopenharmony_ci .cfg_pi_bw_3_0 = 0, 43462306a36Sopenharmony_ci .rxterm = 3, 43562306a36Sopenharmony_ci .dfe_enable = 1, 43662306a36Sopenharmony_ci .dfe_tap = 0x1f, 43762306a36Sopenharmony_ci .txmargin = 0, 43862306a36Sopenharmony_ci .cfg_ctle_rstn = 1, 43962306a36Sopenharmony_ci .r_dfe_rstn = 1, 44062306a36Sopenharmony_ci .tx_tap_dly = 0, 44162306a36Sopenharmony_ci .tx_tap_adv = 0, 44262306a36Sopenharmony_ci }, 44362306a36Sopenharmony_ci { /* SPX5_SD25G28_MODE_PRESET_5000 */ 44462306a36Sopenharmony_ci .bitwidth = 64, 44562306a36Sopenharmony_ci .tx_pre_div = 0, 44662306a36Sopenharmony_ci .fifo_ck_div = 2, 44762306a36Sopenharmony_ci .pre_divsel = 0, 44862306a36Sopenharmony_ci .vco_div_mode = 2, 44962306a36Sopenharmony_ci .sel_div = 9, 45062306a36Sopenharmony_ci .ck_bitwidth = 0, 45162306a36Sopenharmony_ci .subrate = 0, 45262306a36Sopenharmony_ci .com_txcal_en = 1, 45362306a36Sopenharmony_ci .com_tx_reserve_msb = (0x20 << 1), 45462306a36Sopenharmony_ci .com_tx_reserve_lsb = 0, 45562306a36Sopenharmony_ci .cfg_itx_ipcml_base = 0, 45662306a36Sopenharmony_ci .tx_reserve_msb = 0xe, 45762306a36Sopenharmony_ci .tx_reserve_lsb = 0x80, 45862306a36Sopenharmony_ci .bw = 0, 45962306a36Sopenharmony_ci .rxterm = 0, 46062306a36Sopenharmony_ci .cfg_pi_bw_3_0 = 6, 46162306a36Sopenharmony_ci .dfe_enable = 0, 46262306a36Sopenharmony_ci .dfe_tap = 0, 46362306a36Sopenharmony_ci .tx_tap_dly = 0, 46462306a36Sopenharmony_ci .tx_tap_adv = 0, 46562306a36Sopenharmony_ci }, 46662306a36Sopenharmony_ci { /* SPX5_SD25G28_MODE_PRESET_SD_2G5 */ 46762306a36Sopenharmony_ci .bitwidth = 10, 46862306a36Sopenharmony_ci .tx_pre_div = 0, 46962306a36Sopenharmony_ci .fifo_ck_div = 0, 47062306a36Sopenharmony_ci .pre_divsel = 0, 47162306a36Sopenharmony_ci .vco_div_mode = 1, 47262306a36Sopenharmony_ci .sel_div = 6, 47362306a36Sopenharmony_ci .ck_bitwidth = 3, 47462306a36Sopenharmony_ci .subrate = 2, 47562306a36Sopenharmony_ci .com_txcal_en = 1, 47662306a36Sopenharmony_ci .com_tx_reserve_msb = (0x26 << 1), 47762306a36Sopenharmony_ci .com_tx_reserve_lsb = (0xf << 4), 47862306a36Sopenharmony_ci .cfg_itx_ipcml_base = 2, 47962306a36Sopenharmony_ci .tx_reserve_msb = 0x8, 48062306a36Sopenharmony_ci .tx_reserve_lsb = 0x8a, 48162306a36Sopenharmony_ci .bw = 0, 48262306a36Sopenharmony_ci .cfg_pi_bw_3_0 = 0, 48362306a36Sopenharmony_ci .rxterm = (1 << 2), 48462306a36Sopenharmony_ci .dfe_enable = 0, 48562306a36Sopenharmony_ci .dfe_tap = 0, 48662306a36Sopenharmony_ci .tx_tap_dly = 0, 48762306a36Sopenharmony_ci .tx_tap_adv = 0, 48862306a36Sopenharmony_ci }, 48962306a36Sopenharmony_ci { /* SPX5_SD25G28_MODE_PRESET_1000BASEX */ 49062306a36Sopenharmony_ci .bitwidth = 10, 49162306a36Sopenharmony_ci .tx_pre_div = 0, 49262306a36Sopenharmony_ci .fifo_ck_div = 1, 49362306a36Sopenharmony_ci .pre_divsel = 0, 49462306a36Sopenharmony_ci .vco_div_mode = 1, 49562306a36Sopenharmony_ci .sel_div = 8, 49662306a36Sopenharmony_ci .ck_bitwidth = 3, 49762306a36Sopenharmony_ci .subrate = 3, 49862306a36Sopenharmony_ci .com_txcal_en = 1, 49962306a36Sopenharmony_ci .com_tx_reserve_msb = (0x26 << 1), 50062306a36Sopenharmony_ci .com_tx_reserve_lsb = 0xf0, 50162306a36Sopenharmony_ci .cfg_itx_ipcml_base = 0, 50262306a36Sopenharmony_ci .tx_reserve_msb = 0x8, 50362306a36Sopenharmony_ci .tx_reserve_lsb = 0xce, 50462306a36Sopenharmony_ci .bw = 0, 50562306a36Sopenharmony_ci .rxterm = 0, 50662306a36Sopenharmony_ci .cfg_pi_bw_3_0 = 0, 50762306a36Sopenharmony_ci .dfe_enable = 0, 50862306a36Sopenharmony_ci .dfe_tap = 0, 50962306a36Sopenharmony_ci .tx_tap_dly = 0, 51062306a36Sopenharmony_ci .tx_tap_adv = 0, 51162306a36Sopenharmony_ci }, 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_cistatic struct sparx5_sd10g28_media_preset media_presets_10g[] = { 51562306a36Sopenharmony_ci { /* ETH_MEDIA_DEFAULT */ 51662306a36Sopenharmony_ci .cfg_en_adv = 0, 51762306a36Sopenharmony_ci .cfg_en_main = 1, 51862306a36Sopenharmony_ci .cfg_en_dly = 0, 51962306a36Sopenharmony_ci .cfg_tap_adv_3_0 = 0, 52062306a36Sopenharmony_ci .cfg_tap_main = 1, 52162306a36Sopenharmony_ci .cfg_tap_dly_4_0 = 0, 52262306a36Sopenharmony_ci .cfg_vga_ctrl_3_0 = 5, 52362306a36Sopenharmony_ci .cfg_vga_cp_2_0 = 0, 52462306a36Sopenharmony_ci .cfg_eq_res_3_0 = 0xa, 52562306a36Sopenharmony_ci .cfg_eq_r_byp = 1, 52662306a36Sopenharmony_ci .cfg_eq_c_force_3_0 = 0x8, 52762306a36Sopenharmony_ci .cfg_alos_thr_3_0 = 0x3, 52862306a36Sopenharmony_ci }, 52962306a36Sopenharmony_ci { /* ETH_MEDIA_SR */ 53062306a36Sopenharmony_ci .cfg_en_adv = 1, 53162306a36Sopenharmony_ci .cfg_en_main = 1, 53262306a36Sopenharmony_ci .cfg_en_dly = 1, 53362306a36Sopenharmony_ci .cfg_tap_adv_3_0 = 0, 53462306a36Sopenharmony_ci .cfg_tap_main = 1, 53562306a36Sopenharmony_ci .cfg_tap_dly_4_0 = 0xc, 53662306a36Sopenharmony_ci .cfg_vga_ctrl_3_0 = 0xa, 53762306a36Sopenharmony_ci .cfg_vga_cp_2_0 = 0x4, 53862306a36Sopenharmony_ci .cfg_eq_res_3_0 = 0xa, 53962306a36Sopenharmony_ci .cfg_eq_r_byp = 1, 54062306a36Sopenharmony_ci .cfg_eq_c_force_3_0 = 0xF, 54162306a36Sopenharmony_ci .cfg_alos_thr_3_0 = 0x3, 54262306a36Sopenharmony_ci }, 54362306a36Sopenharmony_ci { /* ETH_MEDIA_DAC */ 54462306a36Sopenharmony_ci .cfg_en_adv = 1, 54562306a36Sopenharmony_ci .cfg_en_main = 1, 54662306a36Sopenharmony_ci .cfg_en_dly = 1, 54762306a36Sopenharmony_ci .cfg_tap_adv_3_0 = 12, 54862306a36Sopenharmony_ci .cfg_tap_main = 1, 54962306a36Sopenharmony_ci .cfg_tap_dly_4_0 = 8, 55062306a36Sopenharmony_ci .cfg_vga_ctrl_3_0 = 0xa, 55162306a36Sopenharmony_ci .cfg_vga_cp_2_0 = 4, 55262306a36Sopenharmony_ci .cfg_eq_res_3_0 = 0xa, 55362306a36Sopenharmony_ci .cfg_eq_r_byp = 1, 55462306a36Sopenharmony_ci .cfg_eq_c_force_3_0 = 0xf, 55562306a36Sopenharmony_ci .cfg_alos_thr_3_0 = 0x0, 55662306a36Sopenharmony_ci } 55762306a36Sopenharmony_ci}; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_cistatic struct sparx5_sd10g28_mode_preset mode_presets_10g[] = { 56062306a36Sopenharmony_ci { /* SPX5_SD10G28_MODE_PRESET_10000 */ 56162306a36Sopenharmony_ci .bwidth = 64, 56262306a36Sopenharmony_ci .cmu_sel = SPX5_SD10G28_CMU_MAIN, 56362306a36Sopenharmony_ci .rate = 0x0, 56462306a36Sopenharmony_ci .dfe_enable = 1, 56562306a36Sopenharmony_ci .dfe_tap = 0x1f, 56662306a36Sopenharmony_ci .pi_bw_gen1 = 0x0, 56762306a36Sopenharmony_ci .duty_cycle = 0x2, 56862306a36Sopenharmony_ci }, 56962306a36Sopenharmony_ci { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_6G */ 57062306a36Sopenharmony_ci .bwidth = 16, 57162306a36Sopenharmony_ci .cmu_sel = SPX5_SD10G28_CMU_MAIN, 57262306a36Sopenharmony_ci .rate = 0x1, 57362306a36Sopenharmony_ci .dfe_enable = 0, 57462306a36Sopenharmony_ci .dfe_tap = 0, 57562306a36Sopenharmony_ci .pi_bw_gen1 = 0x5, 57662306a36Sopenharmony_ci .duty_cycle = 0x0, 57762306a36Sopenharmony_ci }, 57862306a36Sopenharmony_ci { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_10G */ 57962306a36Sopenharmony_ci .bwidth = 64, 58062306a36Sopenharmony_ci .cmu_sel = SPX5_SD10G28_CMU_MAIN, 58162306a36Sopenharmony_ci .rate = 0x1, 58262306a36Sopenharmony_ci .dfe_enable = 0, 58362306a36Sopenharmony_ci .dfe_tap = 0, 58462306a36Sopenharmony_ci .pi_bw_gen1 = 0x5, 58562306a36Sopenharmony_ci .duty_cycle = 0x0, 58662306a36Sopenharmony_ci }, 58762306a36Sopenharmony_ci { /* SPX5_SD10G28_MODE_PRESET_QSGMII */ 58862306a36Sopenharmony_ci .bwidth = 20, 58962306a36Sopenharmony_ci .cmu_sel = SPX5_SD10G28_CMU_AUX1, 59062306a36Sopenharmony_ci .rate = 0x1, 59162306a36Sopenharmony_ci .dfe_enable = 0, 59262306a36Sopenharmony_ci .dfe_tap = 0, 59362306a36Sopenharmony_ci .pi_bw_gen1 = 0x5, 59462306a36Sopenharmony_ci .duty_cycle = 0x0, 59562306a36Sopenharmony_ci }, 59662306a36Sopenharmony_ci { /* SPX5_SD10G28_MODE_PRESET_SD_2G5 */ 59762306a36Sopenharmony_ci .bwidth = 10, 59862306a36Sopenharmony_ci .cmu_sel = SPX5_SD10G28_CMU_AUX2, 59962306a36Sopenharmony_ci .rate = 0x2, 60062306a36Sopenharmony_ci .dfe_enable = 0, 60162306a36Sopenharmony_ci .dfe_tap = 0, 60262306a36Sopenharmony_ci .pi_bw_gen1 = 0x7, 60362306a36Sopenharmony_ci .duty_cycle = 0x0, 60462306a36Sopenharmony_ci }, 60562306a36Sopenharmony_ci { /* SPX5_SD10G28_MODE_PRESET_1000BASEX */ 60662306a36Sopenharmony_ci .bwidth = 10, 60762306a36Sopenharmony_ci .cmu_sel = SPX5_SD10G28_CMU_AUX1, 60862306a36Sopenharmony_ci .rate = 0x3, 60962306a36Sopenharmony_ci .dfe_enable = 0, 61062306a36Sopenharmony_ci .dfe_tap = 0, 61162306a36Sopenharmony_ci .pi_bw_gen1 = 0x7, 61262306a36Sopenharmony_ci .duty_cycle = 0x0, 61362306a36Sopenharmony_ci }, 61462306a36Sopenharmony_ci}; 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci/* map from SD25G28 interface width to configuration value */ 61762306a36Sopenharmony_cistatic u8 sd25g28_get_iw_setting(struct device *dev, const u8 interface_width) 61862306a36Sopenharmony_ci{ 61962306a36Sopenharmony_ci switch (interface_width) { 62062306a36Sopenharmony_ci case 10: return 0; 62162306a36Sopenharmony_ci case 16: return 1; 62262306a36Sopenharmony_ci case 32: return 3; 62362306a36Sopenharmony_ci case 40: return 4; 62462306a36Sopenharmony_ci case 64: return 5; 62562306a36Sopenharmony_ci default: 62662306a36Sopenharmony_ci dev_err(dev, "%s: Illegal value %d for interface width\n", 62762306a36Sopenharmony_ci __func__, interface_width); 62862306a36Sopenharmony_ci } 62962306a36Sopenharmony_ci return 0; 63062306a36Sopenharmony_ci} 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci/* map from SD10G28 interface width to configuration value */ 63362306a36Sopenharmony_cistatic u8 sd10g28_get_iw_setting(struct device *dev, const u8 interface_width) 63462306a36Sopenharmony_ci{ 63562306a36Sopenharmony_ci switch (interface_width) { 63662306a36Sopenharmony_ci case 10: return 0; 63762306a36Sopenharmony_ci case 16: return 1; 63862306a36Sopenharmony_ci case 20: return 2; 63962306a36Sopenharmony_ci case 32: return 3; 64062306a36Sopenharmony_ci case 40: return 4; 64162306a36Sopenharmony_ci case 64: return 7; 64262306a36Sopenharmony_ci default: 64362306a36Sopenharmony_ci dev_err(dev, "%s: Illegal value %d for interface width\n", __func__, 64462306a36Sopenharmony_ci interface_width); 64562306a36Sopenharmony_ci return 0; 64662306a36Sopenharmony_ci } 64762306a36Sopenharmony_ci} 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_cistatic int sparx5_sd10g25_get_mode_preset(struct sparx5_serdes_macro *macro, 65062306a36Sopenharmony_ci struct sparx5_sd25g28_mode_preset *mode) 65162306a36Sopenharmony_ci{ 65262306a36Sopenharmony_ci switch (macro->serdesmode) { 65362306a36Sopenharmony_ci case SPX5_SD_MODE_SFI: 65462306a36Sopenharmony_ci if (macro->speed == SPEED_25000) 65562306a36Sopenharmony_ci *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 65662306a36Sopenharmony_ci else if (macro->speed == SPEED_10000) 65762306a36Sopenharmony_ci *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_10000]; 65862306a36Sopenharmony_ci else if (macro->speed == SPEED_5000) 65962306a36Sopenharmony_ci *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_5000]; 66062306a36Sopenharmony_ci break; 66162306a36Sopenharmony_ci case SPX5_SD_MODE_2G5: 66262306a36Sopenharmony_ci *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_SD_2G5]; 66362306a36Sopenharmony_ci break; 66462306a36Sopenharmony_ci case SPX5_SD_MODE_1000BASEX: 66562306a36Sopenharmony_ci *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_1000BASEX]; 66662306a36Sopenharmony_ci break; 66762306a36Sopenharmony_ci case SPX5_SD_MODE_100FX: 66862306a36Sopenharmony_ci /* Not supported */ 66962306a36Sopenharmony_ci return -EINVAL; 67062306a36Sopenharmony_ci default: 67162306a36Sopenharmony_ci *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 67262306a36Sopenharmony_ci break; 67362306a36Sopenharmony_ci } 67462306a36Sopenharmony_ci return 0; 67562306a36Sopenharmony_ci} 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_cistatic int sparx5_sd10g28_get_mode_preset(struct sparx5_serdes_macro *macro, 67862306a36Sopenharmony_ci struct sparx5_sd10g28_mode_preset *mode, 67962306a36Sopenharmony_ci struct sparx5_sd10g28_args *args) 68062306a36Sopenharmony_ci{ 68162306a36Sopenharmony_ci switch (macro->serdesmode) { 68262306a36Sopenharmony_ci case SPX5_SD_MODE_SFI: 68362306a36Sopenharmony_ci if (macro->speed == SPEED_10000) { 68462306a36Sopenharmony_ci *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 68562306a36Sopenharmony_ci } else if (macro->speed == SPEED_5000) { 68662306a36Sopenharmony_ci if (args->is_6g) 68762306a36Sopenharmony_ci *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_6G]; 68862306a36Sopenharmony_ci else 68962306a36Sopenharmony_ci *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_10G]; 69062306a36Sopenharmony_ci } else { 69162306a36Sopenharmony_ci dev_err(macro->priv->dev, "%s: Illegal speed: %02u, sidx: %02u, mode (%u)", 69262306a36Sopenharmony_ci __func__, macro->speed, macro->sidx, 69362306a36Sopenharmony_ci macro->serdesmode); 69462306a36Sopenharmony_ci return -EINVAL; 69562306a36Sopenharmony_ci } 69662306a36Sopenharmony_ci break; 69762306a36Sopenharmony_ci case SPX5_SD_MODE_QSGMII: 69862306a36Sopenharmony_ci *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_QSGMII]; 69962306a36Sopenharmony_ci break; 70062306a36Sopenharmony_ci case SPX5_SD_MODE_2G5: 70162306a36Sopenharmony_ci *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SD_2G5]; 70262306a36Sopenharmony_ci break; 70362306a36Sopenharmony_ci case SPX5_SD_MODE_100FX: 70462306a36Sopenharmony_ci case SPX5_SD_MODE_1000BASEX: 70562306a36Sopenharmony_ci *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_1000BASEX]; 70662306a36Sopenharmony_ci break; 70762306a36Sopenharmony_ci default: 70862306a36Sopenharmony_ci *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 70962306a36Sopenharmony_ci break; 71062306a36Sopenharmony_ci } 71162306a36Sopenharmony_ci return 0; 71262306a36Sopenharmony_ci} 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_cistatic void sparx5_sd25g28_get_params(struct sparx5_serdes_macro *macro, 71562306a36Sopenharmony_ci struct sparx5_sd25g28_media_preset *media, 71662306a36Sopenharmony_ci struct sparx5_sd25g28_mode_preset *mode, 71762306a36Sopenharmony_ci struct sparx5_sd25g28_args *args, 71862306a36Sopenharmony_ci struct sparx5_sd25g28_params *params) 71962306a36Sopenharmony_ci{ 72062306a36Sopenharmony_ci u8 iw = sd25g28_get_iw_setting(macro->priv->dev, mode->bitwidth); 72162306a36Sopenharmony_ci struct sparx5_sd25g28_params init = { 72262306a36Sopenharmony_ci .r_d_width_ctrl_2_0 = iw, 72362306a36Sopenharmony_ci .r_txfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 72462306a36Sopenharmony_ci .r_rxfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 72562306a36Sopenharmony_ci .cfg_vco_div_mode_1_0 = mode->vco_div_mode, 72662306a36Sopenharmony_ci .cfg_pre_divsel_1_0 = mode->pre_divsel, 72762306a36Sopenharmony_ci .cfg_sel_div_3_0 = mode->sel_div, 72862306a36Sopenharmony_ci .cfg_vco_start_code_3_0 = 0, 72962306a36Sopenharmony_ci .cfg_pma_tx_ck_bitwidth_2_0 = mode->ck_bitwidth, 73062306a36Sopenharmony_ci .cfg_tx_prediv_1_0 = mode->tx_pre_div, 73162306a36Sopenharmony_ci .cfg_rxdiv_sel_2_0 = mode->ck_bitwidth, 73262306a36Sopenharmony_ci .cfg_tx_subrate_2_0 = mode->subrate, 73362306a36Sopenharmony_ci .cfg_rx_subrate_2_0 = mode->subrate, 73462306a36Sopenharmony_ci .r_multi_lane_mode = 0, 73562306a36Sopenharmony_ci .cfg_cdrck_en = 1, 73662306a36Sopenharmony_ci .cfg_dfeck_en = mode->dfe_enable, 73762306a36Sopenharmony_ci .cfg_dfe_pd = mode->dfe_enable == 1 ? 0 : 1, 73862306a36Sopenharmony_ci .cfg_dfedmx_pd = 1, 73962306a36Sopenharmony_ci .cfg_dfetap_en_5_1 = mode->dfe_tap, 74062306a36Sopenharmony_ci .cfg_dmux_pd = 0, 74162306a36Sopenharmony_ci .cfg_dmux_clk_pd = 1, 74262306a36Sopenharmony_ci .cfg_erramp_pd = mode->dfe_enable == 1 ? 0 : 1, 74362306a36Sopenharmony_ci .cfg_pi_DFE_en = mode->dfe_enable, 74462306a36Sopenharmony_ci .cfg_pi_en = 1, 74562306a36Sopenharmony_ci .cfg_pd_ctle = 0, 74662306a36Sopenharmony_ci .cfg_summer_en = 1, 74762306a36Sopenharmony_ci .cfg_pmad_ck_pd = 0, 74862306a36Sopenharmony_ci .cfg_pd_clk = 0, 74962306a36Sopenharmony_ci .cfg_pd_cml = 0, 75062306a36Sopenharmony_ci .cfg_pd_driver = 0, 75162306a36Sopenharmony_ci .cfg_rx_reg_pu = 1, 75262306a36Sopenharmony_ci .cfg_pd_rms_det = 1, 75362306a36Sopenharmony_ci .cfg_dcdr_pd = 0, 75462306a36Sopenharmony_ci .cfg_ecdr_pd = 1, 75562306a36Sopenharmony_ci .cfg_pd_sq = 1, 75662306a36Sopenharmony_ci .cfg_itx_ipdriver_base_2_0 = mode->txmargin, 75762306a36Sopenharmony_ci .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 75862306a36Sopenharmony_ci .cfg_tap_main = media->cfg_tap_main, 75962306a36Sopenharmony_ci .cfg_en_main = media->cfg_en_main, 76062306a36Sopenharmony_ci .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 76162306a36Sopenharmony_ci .cfg_en_adv = media->cfg_en_adv, 76262306a36Sopenharmony_ci .cfg_en_dly = media->cfg_en_dly, 76362306a36Sopenharmony_ci .cfg_iscan_en = 0, 76462306a36Sopenharmony_ci .l1_pcs_en_fast_iscan = 0, 76562306a36Sopenharmony_ci .l0_cfg_bw_1_0 = 0, 76662306a36Sopenharmony_ci .cfg_en_dummy = 0, 76762306a36Sopenharmony_ci .cfg_pll_reserve_3_0 = args->com_pll_reserve, 76862306a36Sopenharmony_ci .l0_cfg_txcal_en = mode->com_txcal_en, 76962306a36Sopenharmony_ci .l0_cfg_tx_reserve_15_8 = mode->com_tx_reserve_msb, 77062306a36Sopenharmony_ci .l0_cfg_tx_reserve_7_0 = mode->com_tx_reserve_lsb, 77162306a36Sopenharmony_ci .cfg_tx_reserve_15_8 = mode->tx_reserve_msb, 77262306a36Sopenharmony_ci .cfg_tx_reserve_7_0 = mode->tx_reserve_lsb, 77362306a36Sopenharmony_ci .cfg_bw_1_0 = mode->bw, 77462306a36Sopenharmony_ci .cfg_txcal_man_en = 1, 77562306a36Sopenharmony_ci .cfg_phase_man_4_0 = 0, 77662306a36Sopenharmony_ci .cfg_quad_man_1_0 = 0, 77762306a36Sopenharmony_ci .cfg_txcal_shift_code_5_0 = 2, 77862306a36Sopenharmony_ci .cfg_txcal_valid_sel_3_0 = 4, 77962306a36Sopenharmony_ci .cfg_txcal_en = 0, 78062306a36Sopenharmony_ci .cfg_cdr_kf_2_0 = 1, 78162306a36Sopenharmony_ci .cfg_cdr_m_7_0 = 6, 78262306a36Sopenharmony_ci .cfg_pi_bw_3_0 = mode->cfg_pi_bw_3_0, 78362306a36Sopenharmony_ci .cfg_pi_steps_1_0 = 0, 78462306a36Sopenharmony_ci .cfg_dis_2ndorder = 1, 78562306a36Sopenharmony_ci .cfg_ctle_rstn = mode->cfg_ctle_rstn, 78662306a36Sopenharmony_ci .r_dfe_rstn = mode->r_dfe_rstn, 78762306a36Sopenharmony_ci .cfg_alos_thr_2_0 = media->cfg_alos_thr_2_0, 78862306a36Sopenharmony_ci .cfg_itx_ipcml_base_1_0 = mode->cfg_itx_ipcml_base, 78962306a36Sopenharmony_ci .cfg_rx_reserve_7_0 = 0xbf, 79062306a36Sopenharmony_ci .cfg_rx_reserve_15_8 = 0x61, 79162306a36Sopenharmony_ci .cfg_rxterm_2_0 = mode->rxterm, 79262306a36Sopenharmony_ci .cfg_fom_selm = 0, 79362306a36Sopenharmony_ci .cfg_rx_sp_ctle_1_0 = 0, 79462306a36Sopenharmony_ci .cfg_isel_ctle_1_0 = 0, 79562306a36Sopenharmony_ci .cfg_vga_ctrl_byp_4_0 = media->cfg_vga_ctrl_byp_4_0, 79662306a36Sopenharmony_ci .cfg_vga_byp = 1, 79762306a36Sopenharmony_ci .cfg_agc_adpt_byp = 1, 79862306a36Sopenharmony_ci .cfg_eqr_byp = 1, 79962306a36Sopenharmony_ci .cfg_eqr_force_3_0 = media->cfg_eq_r_force_3_0, 80062306a36Sopenharmony_ci .cfg_eqc_force_3_0 = media->cfg_eq_c_force_3_0, 80162306a36Sopenharmony_ci .cfg_sum_setcm_en = 1, 80262306a36Sopenharmony_ci .cfg_pi_dfe_en = 1, 80362306a36Sopenharmony_ci .cfg_init_pos_iscan_6_0 = 6, 80462306a36Sopenharmony_ci .cfg_init_pos_ipi_6_0 = 9, 80562306a36Sopenharmony_ci .cfg_dfedig_m_2_0 = 6, 80662306a36Sopenharmony_ci .cfg_en_dfedig = mode->dfe_enable, 80762306a36Sopenharmony_ci .r_d_width_ctrl_from_hwt = 0, 80862306a36Sopenharmony_ci .r_reg_manual = 1, 80962306a36Sopenharmony_ci .reg_rst = args->reg_rst, 81062306a36Sopenharmony_ci .cfg_jc_byp = 1, 81162306a36Sopenharmony_ci .cfg_common_reserve_7_0 = 1, 81262306a36Sopenharmony_ci .cfg_pll_lol_set = 1, 81362306a36Sopenharmony_ci .cfg_tx2rx_lp_en = 0, 81462306a36Sopenharmony_ci .cfg_txlb_en = 0, 81562306a36Sopenharmony_ci .cfg_rx2tx_lp_en = 0, 81662306a36Sopenharmony_ci .cfg_rxlb_en = 0, 81762306a36Sopenharmony_ci .r_tx_pol_inv = args->txinvert, 81862306a36Sopenharmony_ci .r_rx_pol_inv = args->rxinvert, 81962306a36Sopenharmony_ci }; 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci *params = init; 82262306a36Sopenharmony_ci} 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_cistatic void sparx5_sd10g28_get_params(struct sparx5_serdes_macro *macro, 82562306a36Sopenharmony_ci struct sparx5_sd10g28_media_preset *media, 82662306a36Sopenharmony_ci struct sparx5_sd10g28_mode_preset *mode, 82762306a36Sopenharmony_ci struct sparx5_sd10g28_args *args, 82862306a36Sopenharmony_ci struct sparx5_sd10g28_params *params) 82962306a36Sopenharmony_ci{ 83062306a36Sopenharmony_ci u8 iw = sd10g28_get_iw_setting(macro->priv->dev, mode->bwidth); 83162306a36Sopenharmony_ci struct sparx5_sd10g28_params init = { 83262306a36Sopenharmony_ci .skip_cmu_cfg = args->skip_cmu_cfg, 83362306a36Sopenharmony_ci .is_6g = args->is_6g, 83462306a36Sopenharmony_ci .cmu_sel = mode->cmu_sel, 83562306a36Sopenharmony_ci .cfg_lane_reserve_7_0 = (mode->cmu_sel % 2) << 6, 83662306a36Sopenharmony_ci .cfg_ssc_rtl_clk_sel = (mode->cmu_sel / 2), 83762306a36Sopenharmony_ci .cfg_lane_reserve_15_8 = mode->duty_cycle, 83862306a36Sopenharmony_ci .cfg_txrate_1_0 = mode->rate, 83962306a36Sopenharmony_ci .cfg_rxrate_1_0 = mode->rate, 84062306a36Sopenharmony_ci .fx_100 = macro->serdesmode == SPX5_SD_MODE_100FX, 84162306a36Sopenharmony_ci .r_d_width_ctrl_2_0 = iw, 84262306a36Sopenharmony_ci .cfg_pma_tx_ck_bitwidth_2_0 = iw, 84362306a36Sopenharmony_ci .cfg_rxdiv_sel_2_0 = iw, 84462306a36Sopenharmony_ci .r_pcs2pma_phymode_4_0 = 0, 84562306a36Sopenharmony_ci .cfg_lane_id_2_0 = 0, 84662306a36Sopenharmony_ci .cfg_cdrck_en = 1, 84762306a36Sopenharmony_ci .cfg_dfeck_en = mode->dfe_enable, 84862306a36Sopenharmony_ci .cfg_dfe_pd = (mode->dfe_enable == 1) ? 0 : 1, 84962306a36Sopenharmony_ci .cfg_dfetap_en_5_1 = mode->dfe_tap, 85062306a36Sopenharmony_ci .cfg_erramp_pd = (mode->dfe_enable == 1) ? 0 : 1, 85162306a36Sopenharmony_ci .cfg_pi_DFE_en = mode->dfe_enable, 85262306a36Sopenharmony_ci .cfg_pi_en = 1, 85362306a36Sopenharmony_ci .cfg_pd_ctle = 0, 85462306a36Sopenharmony_ci .cfg_summer_en = 1, 85562306a36Sopenharmony_ci .cfg_pd_rx_cktree = 0, 85662306a36Sopenharmony_ci .cfg_pd_clk = 0, 85762306a36Sopenharmony_ci .cfg_pd_cml = 0, 85862306a36Sopenharmony_ci .cfg_pd_driver = 0, 85962306a36Sopenharmony_ci .cfg_rx_reg_pu = 1, 86062306a36Sopenharmony_ci .cfg_d_cdr_pd = 0, 86162306a36Sopenharmony_ci .cfg_pd_sq = mode->dfe_enable, 86262306a36Sopenharmony_ci .cfg_rxdet_en = 0, 86362306a36Sopenharmony_ci .cfg_rxdet_str = 0, 86462306a36Sopenharmony_ci .r_multi_lane_mode = 0, 86562306a36Sopenharmony_ci .cfg_en_adv = media->cfg_en_adv, 86662306a36Sopenharmony_ci .cfg_en_main = 1, 86762306a36Sopenharmony_ci .cfg_en_dly = media->cfg_en_dly, 86862306a36Sopenharmony_ci .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 86962306a36Sopenharmony_ci .cfg_tap_main = media->cfg_tap_main, 87062306a36Sopenharmony_ci .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 87162306a36Sopenharmony_ci .cfg_vga_ctrl_3_0 = media->cfg_vga_ctrl_3_0, 87262306a36Sopenharmony_ci .cfg_vga_cp_2_0 = media->cfg_vga_cp_2_0, 87362306a36Sopenharmony_ci .cfg_eq_res_3_0 = media->cfg_eq_res_3_0, 87462306a36Sopenharmony_ci .cfg_eq_r_byp = media->cfg_eq_r_byp, 87562306a36Sopenharmony_ci .cfg_eq_c_force_3_0 = media->cfg_eq_c_force_3_0, 87662306a36Sopenharmony_ci .cfg_en_dfedig = mode->dfe_enable, 87762306a36Sopenharmony_ci .cfg_sum_setcm_en = 1, 87862306a36Sopenharmony_ci .cfg_en_preemph = 0, 87962306a36Sopenharmony_ci .cfg_itx_ippreemp_base_1_0 = 0, 88062306a36Sopenharmony_ci .cfg_itx_ipdriver_base_2_0 = (args->txswing >> 6), 88162306a36Sopenharmony_ci .cfg_ibias_tune_reserve_5_0 = (args->txswing & 63), 88262306a36Sopenharmony_ci .cfg_txswing_half = (args->txmargin), 88362306a36Sopenharmony_ci .cfg_dis_2nd_order = 0x1, 88462306a36Sopenharmony_ci .cfg_rx_ssc_lh = 0x0, 88562306a36Sopenharmony_ci .cfg_pi_floop_steps_1_0 = 0x0, 88662306a36Sopenharmony_ci .cfg_pi_ext_dac_23_16 = (1 << 5), 88762306a36Sopenharmony_ci .cfg_pi_ext_dac_15_8 = (0 << 6), 88862306a36Sopenharmony_ci .cfg_iscan_ext_dac_7_0 = (1 << 7) + 9, 88962306a36Sopenharmony_ci .cfg_cdr_kf_gen1_2_0 = 1, 89062306a36Sopenharmony_ci .cfg_cdr_kf_gen2_2_0 = 1, 89162306a36Sopenharmony_ci .cfg_cdr_kf_gen3_2_0 = 1, 89262306a36Sopenharmony_ci .cfg_cdr_kf_gen4_2_0 = 1, 89362306a36Sopenharmony_ci .r_cdr_m_gen1_7_0 = 4, 89462306a36Sopenharmony_ci .cfg_pi_bw_gen1_3_0 = mode->pi_bw_gen1, 89562306a36Sopenharmony_ci .cfg_pi_bw_gen2 = mode->pi_bw_gen1, 89662306a36Sopenharmony_ci .cfg_pi_bw_gen3 = mode->pi_bw_gen1, 89762306a36Sopenharmony_ci .cfg_pi_bw_gen4 = mode->pi_bw_gen1, 89862306a36Sopenharmony_ci .cfg_pi_ext_dac_7_0 = 3, 89962306a36Sopenharmony_ci .cfg_pi_steps = 0, 90062306a36Sopenharmony_ci .cfg_mp_max_3_0 = 1, 90162306a36Sopenharmony_ci .cfg_rstn_dfedig = mode->dfe_enable, 90262306a36Sopenharmony_ci .cfg_alos_thr_3_0 = media->cfg_alos_thr_3_0, 90362306a36Sopenharmony_ci .cfg_predrv_slewrate_1_0 = 3, 90462306a36Sopenharmony_ci .cfg_itx_ipcml_base_1_0 = 0, 90562306a36Sopenharmony_ci .cfg_ip_pre_base_1_0 = 0, 90662306a36Sopenharmony_ci .r_cdr_m_gen2_7_0 = 2, 90762306a36Sopenharmony_ci .r_cdr_m_gen3_7_0 = 2, 90862306a36Sopenharmony_ci .r_cdr_m_gen4_7_0 = 2, 90962306a36Sopenharmony_ci .r_en_auto_cdr_rstn = 0, 91062306a36Sopenharmony_ci .cfg_oscal_afe = 1, 91162306a36Sopenharmony_ci .cfg_pd_osdac_afe = 0, 91262306a36Sopenharmony_ci .cfg_resetb_oscal_afe[0] = 0, 91362306a36Sopenharmony_ci .cfg_resetb_oscal_afe[1] = 1, 91462306a36Sopenharmony_ci .cfg_center_spreading = 0, 91562306a36Sopenharmony_ci .cfg_m_cnt_maxval_4_0 = 15, 91662306a36Sopenharmony_ci .cfg_ncnt_maxval_7_0 = 32, 91762306a36Sopenharmony_ci .cfg_ncnt_maxval_10_8 = 6, 91862306a36Sopenharmony_ci .cfg_ssc_en = 1, 91962306a36Sopenharmony_ci .cfg_tx2rx_lp_en = 0, 92062306a36Sopenharmony_ci .cfg_txlb_en = 0, 92162306a36Sopenharmony_ci .cfg_rx2tx_lp_en = 0, 92262306a36Sopenharmony_ci .cfg_rxlb_en = 0, 92362306a36Sopenharmony_ci .r_tx_pol_inv = args->txinvert, 92462306a36Sopenharmony_ci .r_rx_pol_inv = args->rxinvert, 92562306a36Sopenharmony_ci }; 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_ci *params = init; 92862306a36Sopenharmony_ci} 92962306a36Sopenharmony_ci 93062306a36Sopenharmony_cistatic int sparx5_cmu_apply_cfg(struct sparx5_serdes_private *priv, 93162306a36Sopenharmony_ci u32 cmu_idx, 93262306a36Sopenharmony_ci void __iomem *cmu_tgt, 93362306a36Sopenharmony_ci void __iomem *cmu_cfg_tgt, 93462306a36Sopenharmony_ci u32 spd10g) 93562306a36Sopenharmony_ci{ 93662306a36Sopenharmony_ci void __iomem **regs = priv->regs; 93762306a36Sopenharmony_ci struct device *dev = priv->dev; 93862306a36Sopenharmony_ci int value; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 94162306a36Sopenharmony_ci cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_ci if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 94462306a36Sopenharmony_ci cmu_idx == 10 || cmu_idx == 13) { 94562306a36Sopenharmony_ci spd10g = 0; 94662306a36Sopenharmony_ci } 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(1), 94962306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 95062306a36Sopenharmony_ci cmu_cfg_tgt, 95162306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(0), 95462306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 95562306a36Sopenharmony_ci cmu_cfg_tgt, 95662306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(1), 95962306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 96062306a36Sopenharmony_ci cmu_cfg_tgt, 96162306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT_SET(0x1) | 96462306a36Sopenharmony_ci SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT_SET(0x1) | 96562306a36Sopenharmony_ci SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT_SET(0x1) | 96662306a36Sopenharmony_ci SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT_SET(0x1) | 96762306a36Sopenharmony_ci SD_CMU_CMU_45_R_EN_RATECHG_CTRL_SET(0x0), 96862306a36Sopenharmony_ci SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT | 96962306a36Sopenharmony_ci SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT | 97062306a36Sopenharmony_ci SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT | 97162306a36Sopenharmony_ci SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT | 97262306a36Sopenharmony_ci SD_CMU_CMU_45_R_EN_RATECHG_CTRL, 97362306a36Sopenharmony_ci cmu_tgt, 97462306a36Sopenharmony_ci SD_CMU_CMU_45(cmu_idx)); 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0_SET(0), 97762306a36Sopenharmony_ci SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0, 97862306a36Sopenharmony_ci cmu_tgt, 97962306a36Sopenharmony_ci SD_CMU_CMU_47(cmu_idx)); 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_1B_CFG_RESERVE_7_0_SET(0), 98262306a36Sopenharmony_ci SD_CMU_CMU_1B_CFG_RESERVE_7_0, 98362306a36Sopenharmony_ci cmu_tgt, 98462306a36Sopenharmony_ci SD_CMU_CMU_1B(cmu_idx)); 98562306a36Sopenharmony_ci 98662306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_JC_BYP_SET(0x1), 98762306a36Sopenharmony_ci SD_CMU_CMU_0D_CFG_JC_BYP, 98862306a36Sopenharmony_ci cmu_tgt, 98962306a36Sopenharmony_ci SD_CMU_CMU_0D(cmu_idx)); 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_1F_CFG_VTUNE_SEL_SET(1), 99262306a36Sopenharmony_ci SD_CMU_CMU_1F_CFG_VTUNE_SEL, 99362306a36Sopenharmony_ci cmu_tgt, 99462306a36Sopenharmony_ci SD_CMU_CMU_1F(cmu_idx)); 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0_SET(3), 99762306a36Sopenharmony_ci SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0, 99862306a36Sopenharmony_ci cmu_tgt, 99962306a36Sopenharmony_ci SD_CMU_CMU_00(cmu_idx)); 100062306a36Sopenharmony_ci 100162306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0_SET(3), 100262306a36Sopenharmony_ci SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0, 100362306a36Sopenharmony_ci cmu_tgt, 100462306a36Sopenharmony_ci SD_CMU_CMU_05(cmu_idx)); 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_30_R_PLL_DLOL_EN_SET(1), 100762306a36Sopenharmony_ci SD_CMU_CMU_30_R_PLL_DLOL_EN, 100862306a36Sopenharmony_ci cmu_tgt, 100962306a36Sopenharmony_ci SD_CMU_CMU_30(cmu_idx)); 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_09_CFG_SW_10G_SET(spd10g), 101262306a36Sopenharmony_ci SD_CMU_CMU_09_CFG_SW_10G, 101362306a36Sopenharmony_ci cmu_tgt, 101462306a36Sopenharmony_ci SD_CMU_CMU_09(cmu_idx)); 101562306a36Sopenharmony_ci 101662306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(0), 101762306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 101862306a36Sopenharmony_ci cmu_cfg_tgt, 101962306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 102062306a36Sopenharmony_ci 102162306a36Sopenharmony_ci msleep(20); 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(0), 102462306a36Sopenharmony_ci SD_CMU_CMU_44_R_PLL_RSTN, 102562306a36Sopenharmony_ci cmu_tgt, 102662306a36Sopenharmony_ci SD_CMU_CMU_44(cmu_idx)); 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(1), 102962306a36Sopenharmony_ci SD_CMU_CMU_44_R_PLL_RSTN, 103062306a36Sopenharmony_ci cmu_tgt, 103162306a36Sopenharmony_ci SD_CMU_CMU_44(cmu_idx)); 103262306a36Sopenharmony_ci 103362306a36Sopenharmony_ci msleep(20); 103462306a36Sopenharmony_ci 103562306a36Sopenharmony_ci value = readl(sdx5_addr(regs, SD_CMU_CMU_E0(cmu_idx))); 103662306a36Sopenharmony_ci value = SD_CMU_CMU_E0_PLL_LOL_UDL_GET(value); 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_ci if (value) { 103962306a36Sopenharmony_ci dev_err(dev, "CMU PLL Loss of Lock: 0x%x\n", value); 104062306a36Sopenharmony_ci return -EINVAL; 104162306a36Sopenharmony_ci } 104262306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD_SET(0), 104362306a36Sopenharmony_ci SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD, 104462306a36Sopenharmony_ci cmu_tgt, 104562306a36Sopenharmony_ci SD_CMU_CMU_0D(cmu_idx)); 104662306a36Sopenharmony_ci return 0; 104762306a36Sopenharmony_ci} 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_cistatic int sparx5_cmu_cfg(struct sparx5_serdes_private *priv, u32 cmu_idx) 105062306a36Sopenharmony_ci{ 105162306a36Sopenharmony_ci void __iomem *cmu_tgt, *cmu_cfg_tgt; 105262306a36Sopenharmony_ci u32 spd10g = 1; 105362306a36Sopenharmony_ci 105462306a36Sopenharmony_ci if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 105562306a36Sopenharmony_ci cmu_idx == 10 || cmu_idx == 13) { 105662306a36Sopenharmony_ci spd10g = 0; 105762306a36Sopenharmony_ci } 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_ci cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 106062306a36Sopenharmony_ci cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci return sparx5_cmu_apply_cfg(priv, cmu_idx, cmu_tgt, cmu_cfg_tgt, spd10g); 106362306a36Sopenharmony_ci} 106462306a36Sopenharmony_ci 106562306a36Sopenharmony_ci/* Map of 6G/10G serdes mode and index to CMU index. */ 106662306a36Sopenharmony_cistatic const int 106762306a36Sopenharmony_cisparx5_serdes_cmu_map[SPX5_SD10G28_CMU_MAX][SPX5_SERDES_6G10G_CNT] = { 106862306a36Sopenharmony_ci [SPX5_SD10G28_CMU_MAIN] = { 2, 2, 2, 2, 2, 106962306a36Sopenharmony_ci 2, 2, 2, 5, 5, 107062306a36Sopenharmony_ci 5, 5, 5, 5, 5, 107162306a36Sopenharmony_ci 5, 8, 11, 11, 11, 107262306a36Sopenharmony_ci 11, 11, 11, 11, 11 }, 107362306a36Sopenharmony_ci [SPX5_SD10G28_CMU_AUX1] = { 0, 0, 3, 3, 3, 107462306a36Sopenharmony_ci 3, 3, 3, 3, 3, 107562306a36Sopenharmony_ci 6, 6, 6, 6, 6, 107662306a36Sopenharmony_ci 6, 6, 9, 9, 12, 107762306a36Sopenharmony_ci 12, 12, 12, 12, 12 }, 107862306a36Sopenharmony_ci [SPX5_SD10G28_CMU_AUX2] = { 1, 1, 1, 1, 4, 107962306a36Sopenharmony_ci 4, 4, 4, 4, 4, 108062306a36Sopenharmony_ci 4, 4, 7, 7, 7, 108162306a36Sopenharmony_ci 7, 7, 10, 10, 10, 108262306a36Sopenharmony_ci 10, 13, 13, 13, 13 }, 108362306a36Sopenharmony_ci [SPX5_SD10G28_CMU_NONE] = { 1, 1, 1, 1, 4, 108462306a36Sopenharmony_ci 4, 4, 4, 4, 4, 108562306a36Sopenharmony_ci 4, 4, 7, 7, 7, 108662306a36Sopenharmony_ci 7, 7, 10, 10, 10, 108762306a36Sopenharmony_ci 10, 13, 13, 13, 13 }, 108862306a36Sopenharmony_ci}; 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_ci/* Get the index of the CMU which provides the clock for the specified serdes 109162306a36Sopenharmony_ci * mode and index. 109262306a36Sopenharmony_ci */ 109362306a36Sopenharmony_cistatic int sparx5_serdes_cmu_get(enum sparx5_10g28cmu_mode mode, int sd_index) 109462306a36Sopenharmony_ci{ 109562306a36Sopenharmony_ci return sparx5_serdes_cmu_map[mode][sd_index]; 109662306a36Sopenharmony_ci} 109762306a36Sopenharmony_ci 109862306a36Sopenharmony_cistatic void sparx5_serdes_cmu_power_off(struct sparx5_serdes_private *priv) 109962306a36Sopenharmony_ci{ 110062306a36Sopenharmony_ci void __iomem *cmu_inst, *cmu_cfg_inst; 110162306a36Sopenharmony_ci int i; 110262306a36Sopenharmony_ci 110362306a36Sopenharmony_ci /* Power down each CMU */ 110462306a36Sopenharmony_ci for (i = 0; i < SPX5_CMU_MAX; i++) { 110562306a36Sopenharmony_ci cmu_inst = sdx5_inst_get(priv, TARGET_SD_CMU, i); 110662306a36Sopenharmony_ci cmu_cfg_inst = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, i); 110762306a36Sopenharmony_ci 110862306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(0), 110962306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, cmu_cfg_inst, 111062306a36Sopenharmony_ci SD_CMU_CFG_SD_CMU_CFG(0)); 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_05_CFG_REFCK_TERM_EN_SET(0), 111362306a36Sopenharmony_ci SD_CMU_CMU_05_CFG_REFCK_TERM_EN, cmu_inst, 111462306a36Sopenharmony_ci SD_CMU_CMU_05(0)); 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_09_CFG_EN_TX_CK_DN_SET(0), 111762306a36Sopenharmony_ci SD_CMU_CMU_09_CFG_EN_TX_CK_DN, cmu_inst, 111862306a36Sopenharmony_ci SD_CMU_CMU_09(0)); 111962306a36Sopenharmony_ci 112062306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_06_CFG_VCO_PD_SET(1), 112162306a36Sopenharmony_ci SD_CMU_CMU_06_CFG_VCO_PD, cmu_inst, 112262306a36Sopenharmony_ci SD_CMU_CMU_06(0)); 112362306a36Sopenharmony_ci 112462306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_09_CFG_EN_TX_CK_UP_SET(0), 112562306a36Sopenharmony_ci SD_CMU_CMU_09_CFG_EN_TX_CK_UP, cmu_inst, 112662306a36Sopenharmony_ci SD_CMU_CMU_09(0)); 112762306a36Sopenharmony_ci 112862306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_08_CFG_CK_TREE_PD_SET(1), 112962306a36Sopenharmony_ci SD_CMU_CMU_08_CFG_CK_TREE_PD, cmu_inst, 113062306a36Sopenharmony_ci SD_CMU_CMU_08(0)); 113162306a36Sopenharmony_ci 113262306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_REFCK_PD_SET(1) | 113362306a36Sopenharmony_ci SD_CMU_CMU_0D_CFG_PD_DIV64_SET(1) | 113462306a36Sopenharmony_ci SD_CMU_CMU_0D_CFG_PD_DIV66_SET(1), 113562306a36Sopenharmony_ci SD_CMU_CMU_0D_CFG_REFCK_PD | 113662306a36Sopenharmony_ci SD_CMU_CMU_0D_CFG_PD_DIV64 | 113762306a36Sopenharmony_ci SD_CMU_CMU_0D_CFG_PD_DIV66, cmu_inst, 113862306a36Sopenharmony_ci SD_CMU_CMU_0D(0)); 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_ci sdx5_inst_rmw(SD_CMU_CMU_06_CFG_CTRL_LOGIC_PD_SET(1), 114162306a36Sopenharmony_ci SD_CMU_CMU_06_CFG_CTRL_LOGIC_PD, cmu_inst, 114262306a36Sopenharmony_ci SD_CMU_CMU_06(0)); 114362306a36Sopenharmony_ci } 114462306a36Sopenharmony_ci} 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_cistatic void sparx5_sd25g28_reset(void __iomem *regs[], 114762306a36Sopenharmony_ci struct sparx5_sd25g28_params *params, 114862306a36Sopenharmony_ci u32 sd_index) 114962306a36Sopenharmony_ci{ 115062306a36Sopenharmony_ci if (params->reg_rst == 1) { 115162306a36Sopenharmony_ci sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(1), 115262306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 115362306a36Sopenharmony_ci sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 115462306a36Sopenharmony_ci 115562306a36Sopenharmony_ci usleep_range(1000, 2000); 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(0), 115862306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 115962306a36Sopenharmony_ci sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 116062306a36Sopenharmony_ci } 116162306a36Sopenharmony_ci} 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_cistatic int sparx5_sd25g28_apply_params(struct sparx5_serdes_macro *macro, 116462306a36Sopenharmony_ci struct sparx5_sd25g28_params *params) 116562306a36Sopenharmony_ci{ 116662306a36Sopenharmony_ci struct sparx5_serdes_private *priv = macro->priv; 116762306a36Sopenharmony_ci void __iomem **regs = priv->regs; 116862306a36Sopenharmony_ci struct device *dev = priv->dev; 116962306a36Sopenharmony_ci u32 sd_index = macro->stpidx; 117062306a36Sopenharmony_ci u32 value; 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(1), 117362306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 117462306a36Sopenharmony_ci priv, 117562306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG(sd_index)); 117662306a36Sopenharmony_ci 117762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xFF), 117862306a36Sopenharmony_ci SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 117962306a36Sopenharmony_ci priv, 118062306a36Sopenharmony_ci SD25G_LANE_CMU_FF(sd_index)); 118162306a36Sopenharmony_ci 118262306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT_SET 118362306a36Sopenharmony_ci (params->r_d_width_ctrl_from_hwt) | 118462306a36Sopenharmony_ci SD25G_LANE_CMU_1A_R_REG_MANUAL_SET(params->r_reg_manual), 118562306a36Sopenharmony_ci SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT | 118662306a36Sopenharmony_ci SD25G_LANE_CMU_1A_R_REG_MANUAL, 118762306a36Sopenharmony_ci priv, 118862306a36Sopenharmony_ci SD25G_LANE_CMU_1A(sd_index)); 118962306a36Sopenharmony_ci 119062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0_SET 119162306a36Sopenharmony_ci (params->cfg_common_reserve_7_0), 119262306a36Sopenharmony_ci SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0, 119362306a36Sopenharmony_ci priv, 119462306a36Sopenharmony_ci SD25G_LANE_CMU_31(sd_index)); 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_09_CFG_EN_DUMMY_SET(params->cfg_en_dummy), 119762306a36Sopenharmony_ci SD25G_LANE_CMU_09_CFG_EN_DUMMY, 119862306a36Sopenharmony_ci priv, 119962306a36Sopenharmony_ci SD25G_LANE_CMU_09(sd_index)); 120062306a36Sopenharmony_ci 120162306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0_SET 120262306a36Sopenharmony_ci (params->cfg_pll_reserve_3_0), 120362306a36Sopenharmony_ci SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0, 120462306a36Sopenharmony_ci priv, 120562306a36Sopenharmony_ci SD25G_LANE_CMU_13(sd_index)); 120662306a36Sopenharmony_ci 120762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN_SET(params->l0_cfg_txcal_en), 120862306a36Sopenharmony_ci SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN, 120962306a36Sopenharmony_ci priv, 121062306a36Sopenharmony_ci SD25G_LANE_CMU_40(sd_index)); 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8_SET 121362306a36Sopenharmony_ci (params->l0_cfg_tx_reserve_15_8), 121462306a36Sopenharmony_ci SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8, 121562306a36Sopenharmony_ci priv, 121662306a36Sopenharmony_ci SD25G_LANE_CMU_46(sd_index)); 121762306a36Sopenharmony_ci 121862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0_SET 121962306a36Sopenharmony_ci (params->l0_cfg_tx_reserve_7_0), 122062306a36Sopenharmony_ci SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0, 122162306a36Sopenharmony_ci priv, 122262306a36Sopenharmony_ci SD25G_LANE_CMU_45(sd_index)); 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(0), 122562306a36Sopenharmony_ci SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 122662306a36Sopenharmony_ci priv, 122762306a36Sopenharmony_ci SD25G_LANE_CMU_0B(sd_index)); 122862306a36Sopenharmony_ci 122962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(1), 123062306a36Sopenharmony_ci SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 123162306a36Sopenharmony_ci priv, 123262306a36Sopenharmony_ci SD25G_LANE_CMU_0B(sd_index)); 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(0), 123562306a36Sopenharmony_ci SD25G_LANE_CMU_19_R_CK_RESETB, 123662306a36Sopenharmony_ci priv, 123762306a36Sopenharmony_ci SD25G_LANE_CMU_19(sd_index)); 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(1), 124062306a36Sopenharmony_ci SD25G_LANE_CMU_19_R_CK_RESETB, 124162306a36Sopenharmony_ci priv, 124262306a36Sopenharmony_ci SD25G_LANE_CMU_19(sd_index)); 124362306a36Sopenharmony_ci 124462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(0), 124562306a36Sopenharmony_ci SD25G_LANE_CMU_18_R_PLL_RSTN, 124662306a36Sopenharmony_ci priv, 124762306a36Sopenharmony_ci SD25G_LANE_CMU_18(sd_index)); 124862306a36Sopenharmony_ci 124962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(1), 125062306a36Sopenharmony_ci SD25G_LANE_CMU_18_R_PLL_RSTN, 125162306a36Sopenharmony_ci priv, 125262306a36Sopenharmony_ci SD25G_LANE_CMU_18(sd_index)); 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0_SET(params->r_d_width_ctrl_2_0), 125562306a36Sopenharmony_ci SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0, 125662306a36Sopenharmony_ci priv, 125762306a36Sopenharmony_ci SD25G_LANE_CMU_1A(sd_index)); 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0_SET 126062306a36Sopenharmony_ci (params->r_txfifo_ck_div_pmad_2_0) | 126162306a36Sopenharmony_ci SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0_SET 126262306a36Sopenharmony_ci (params->r_rxfifo_ck_div_pmad_2_0), 126362306a36Sopenharmony_ci SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0 | 126462306a36Sopenharmony_ci SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0, 126562306a36Sopenharmony_ci priv, 126662306a36Sopenharmony_ci SD25G_LANE_CMU_30(sd_index)); 126762306a36Sopenharmony_ci 126862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET_SET(params->cfg_pll_lol_set) | 126962306a36Sopenharmony_ci SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0_SET 127062306a36Sopenharmony_ci (params->cfg_vco_div_mode_1_0), 127162306a36Sopenharmony_ci SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET | 127262306a36Sopenharmony_ci SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0, 127362306a36Sopenharmony_ci priv, 127462306a36Sopenharmony_ci SD25G_LANE_CMU_0C(sd_index)); 127562306a36Sopenharmony_ci 127662306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0_SET 127762306a36Sopenharmony_ci (params->cfg_pre_divsel_1_0), 127862306a36Sopenharmony_ci SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0, 127962306a36Sopenharmony_ci priv, 128062306a36Sopenharmony_ci SD25G_LANE_CMU_0D(sd_index)); 128162306a36Sopenharmony_ci 128262306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0_SET(params->cfg_sel_div_3_0), 128362306a36Sopenharmony_ci SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0, 128462306a36Sopenharmony_ci priv, 128562306a36Sopenharmony_ci SD25G_LANE_CMU_0E(sd_index)); 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0x00), 128862306a36Sopenharmony_ci SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 128962306a36Sopenharmony_ci priv, 129062306a36Sopenharmony_ci SD25G_LANE_CMU_FF(sd_index)); 129162306a36Sopenharmony_ci 129262306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 129362306a36Sopenharmony_ci (params->cfg_pma_tx_ck_bitwidth_2_0), 129462306a36Sopenharmony_ci SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0, 129562306a36Sopenharmony_ci priv, 129662306a36Sopenharmony_ci SD25G_LANE_LANE_0C(sd_index)); 129762306a36Sopenharmony_ci 129862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0_SET 129962306a36Sopenharmony_ci (params->cfg_tx_prediv_1_0), 130062306a36Sopenharmony_ci SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0, 130162306a36Sopenharmony_ci priv, 130262306a36Sopenharmony_ci SD25G_LANE_LANE_01(sd_index)); 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0_SET 130562306a36Sopenharmony_ci (params->cfg_rxdiv_sel_2_0), 130662306a36Sopenharmony_ci SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0, 130762306a36Sopenharmony_ci priv, 130862306a36Sopenharmony_ci SD25G_LANE_LANE_18(sd_index)); 130962306a36Sopenharmony_ci 131062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0_SET 131162306a36Sopenharmony_ci (params->cfg_tx_subrate_2_0), 131262306a36Sopenharmony_ci SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0, 131362306a36Sopenharmony_ci priv, 131462306a36Sopenharmony_ci SD25G_LANE_LANE_2C(sd_index)); 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0_SET 131762306a36Sopenharmony_ci (params->cfg_rx_subrate_2_0), 131862306a36Sopenharmony_ci SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0, 131962306a36Sopenharmony_ci priv, 132062306a36Sopenharmony_ci SD25G_LANE_LANE_28(sd_index)); 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 132362306a36Sopenharmony_ci SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN, 132462306a36Sopenharmony_ci priv, 132562306a36Sopenharmony_ci SD25G_LANE_LANE_18(sd_index)); 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1_SET 132862306a36Sopenharmony_ci (params->cfg_dfetap_en_5_1), 132962306a36Sopenharmony_ci SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1, 133062306a36Sopenharmony_ci priv, 133162306a36Sopenharmony_ci SD25G_LANE_LANE_0F(sd_index)); 133262306a36Sopenharmony_ci 133362306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 133462306a36Sopenharmony_ci SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 133562306a36Sopenharmony_ci priv, 133662306a36Sopenharmony_ci SD25G_LANE_LANE_18(sd_index)); 133762306a36Sopenharmony_ci 133862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN_SET(params->cfg_pi_dfe_en), 133962306a36Sopenharmony_ci SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN, 134062306a36Sopenharmony_ci priv, 134162306a36Sopenharmony_ci SD25G_LANE_LANE_1D(sd_index)); 134262306a36Sopenharmony_ci 134362306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_ECDR_PD_SET(params->cfg_ecdr_pd), 134462306a36Sopenharmony_ci SD25G_LANE_LANE_19_LN_CFG_ECDR_PD, 134562306a36Sopenharmony_ci priv, 134662306a36Sopenharmony_ci SD25G_LANE_LANE_19(sd_index)); 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0_SET 134962306a36Sopenharmony_ci (params->cfg_itx_ipdriver_base_2_0), 135062306a36Sopenharmony_ci SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0, 135162306a36Sopenharmony_ci priv, 135262306a36Sopenharmony_ci SD25G_LANE_LANE_01(sd_index)); 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0_SET(params->cfg_tap_dly_4_0), 135562306a36Sopenharmony_ci SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0, 135662306a36Sopenharmony_ci priv, 135762306a36Sopenharmony_ci SD25G_LANE_LANE_03(sd_index)); 135862306a36Sopenharmony_ci 135962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0_SET(params->cfg_tap_adv_3_0), 136062306a36Sopenharmony_ci SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0, 136162306a36Sopenharmony_ci priv, 136262306a36Sopenharmony_ci SD25G_LANE_LANE_06(sd_index)); 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_07_LN_CFG_EN_ADV_SET(params->cfg_en_adv) | 136562306a36Sopenharmony_ci SD25G_LANE_LANE_07_LN_CFG_EN_DLY_SET(params->cfg_en_dly), 136662306a36Sopenharmony_ci SD25G_LANE_LANE_07_LN_CFG_EN_ADV | 136762306a36Sopenharmony_ci SD25G_LANE_LANE_07_LN_CFG_EN_DLY, 136862306a36Sopenharmony_ci priv, 136962306a36Sopenharmony_ci SD25G_LANE_LANE_07(sd_index)); 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8_SET 137262306a36Sopenharmony_ci (params->cfg_tx_reserve_15_8), 137362306a36Sopenharmony_ci SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8, 137462306a36Sopenharmony_ci priv, 137562306a36Sopenharmony_ci SD25G_LANE_LANE_43(sd_index)); 137662306a36Sopenharmony_ci 137762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0_SET 137862306a36Sopenharmony_ci (params->cfg_tx_reserve_7_0), 137962306a36Sopenharmony_ci SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0, 138062306a36Sopenharmony_ci priv, 138162306a36Sopenharmony_ci SD25G_LANE_LANE_42(sd_index)); 138262306a36Sopenharmony_ci 138362306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_05_LN_CFG_BW_1_0_SET(params->cfg_bw_1_0), 138462306a36Sopenharmony_ci SD25G_LANE_LANE_05_LN_CFG_BW_1_0, 138562306a36Sopenharmony_ci priv, 138662306a36Sopenharmony_ci SD25G_LANE_LANE_05(sd_index)); 138762306a36Sopenharmony_ci 138862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN_SET 138962306a36Sopenharmony_ci (params->cfg_txcal_man_en), 139062306a36Sopenharmony_ci SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN, 139162306a36Sopenharmony_ci priv, 139262306a36Sopenharmony_ci SD25G_LANE_LANE_0B(sd_index)); 139362306a36Sopenharmony_ci 139462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0_SET 139562306a36Sopenharmony_ci (params->cfg_txcal_shift_code_5_0), 139662306a36Sopenharmony_ci SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0, 139762306a36Sopenharmony_ci priv, 139862306a36Sopenharmony_ci SD25G_LANE_LANE_0A(sd_index)); 139962306a36Sopenharmony_ci 140062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0_SET 140162306a36Sopenharmony_ci (params->cfg_txcal_valid_sel_3_0), 140262306a36Sopenharmony_ci SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0, 140362306a36Sopenharmony_ci priv, 140462306a36Sopenharmony_ci SD25G_LANE_LANE_09(sd_index)); 140562306a36Sopenharmony_ci 140662306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0_SET(params->cfg_cdr_kf_2_0), 140762306a36Sopenharmony_ci SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0, 140862306a36Sopenharmony_ci priv, 140962306a36Sopenharmony_ci SD25G_LANE_LANE_1A(sd_index)); 141062306a36Sopenharmony_ci 141162306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0_SET(params->cfg_cdr_m_7_0), 141262306a36Sopenharmony_ci SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0, 141362306a36Sopenharmony_ci priv, 141462306a36Sopenharmony_ci SD25G_LANE_LANE_1B(sd_index)); 141562306a36Sopenharmony_ci 141662306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0_SET(params->cfg_pi_bw_3_0), 141762306a36Sopenharmony_ci SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0, 141862306a36Sopenharmony_ci priv, 141962306a36Sopenharmony_ci SD25G_LANE_LANE_2B(sd_index)); 142062306a36Sopenharmony_ci 142162306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER_SET 142262306a36Sopenharmony_ci (params->cfg_dis_2ndorder), 142362306a36Sopenharmony_ci SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER, 142462306a36Sopenharmony_ci priv, 142562306a36Sopenharmony_ci SD25G_LANE_LANE_2C(sd_index)); 142662306a36Sopenharmony_ci 142762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN_SET(params->cfg_ctle_rstn), 142862306a36Sopenharmony_ci SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN, 142962306a36Sopenharmony_ci priv, 143062306a36Sopenharmony_ci SD25G_LANE_LANE_2E(sd_index)); 143162306a36Sopenharmony_ci 143262306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0_SET 143362306a36Sopenharmony_ci (params->cfg_itx_ipcml_base_1_0), 143462306a36Sopenharmony_ci SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0, 143562306a36Sopenharmony_ci priv, 143662306a36Sopenharmony_ci SD25G_LANE_LANE_00(sd_index)); 143762306a36Sopenharmony_ci 143862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0_SET 143962306a36Sopenharmony_ci (params->cfg_rx_reserve_7_0), 144062306a36Sopenharmony_ci SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0, 144162306a36Sopenharmony_ci priv, 144262306a36Sopenharmony_ci SD25G_LANE_LANE_44(sd_index)); 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8_SET 144562306a36Sopenharmony_ci (params->cfg_rx_reserve_15_8), 144662306a36Sopenharmony_ci SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8, 144762306a36Sopenharmony_ci priv, 144862306a36Sopenharmony_ci SD25G_LANE_LANE_45(sd_index)); 144962306a36Sopenharmony_ci 145062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN_SET(params->cfg_dfeck_en) | 145162306a36Sopenharmony_ci SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0_SET(params->cfg_rxterm_2_0), 145262306a36Sopenharmony_ci SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN | 145362306a36Sopenharmony_ci SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0, 145462306a36Sopenharmony_ci priv, 145562306a36Sopenharmony_ci SD25G_LANE_LANE_0D(sd_index)); 145662306a36Sopenharmony_ci 145762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0_SET 145862306a36Sopenharmony_ci (params->cfg_vga_ctrl_byp_4_0), 145962306a36Sopenharmony_ci SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0, 146062306a36Sopenharmony_ci priv, 146162306a36Sopenharmony_ci SD25G_LANE_LANE_21(sd_index)); 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0_SET 146462306a36Sopenharmony_ci (params->cfg_eqr_force_3_0), 146562306a36Sopenharmony_ci SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0, 146662306a36Sopenharmony_ci priv, 146762306a36Sopenharmony_ci SD25G_LANE_LANE_22(sd_index)); 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0_SET 147062306a36Sopenharmony_ci (params->cfg_eqc_force_3_0) | 147162306a36Sopenharmony_ci SD25G_LANE_LANE_1C_LN_CFG_DFE_PD_SET(params->cfg_dfe_pd), 147262306a36Sopenharmony_ci SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0 | 147362306a36Sopenharmony_ci SD25G_LANE_LANE_1C_LN_CFG_DFE_PD, 147462306a36Sopenharmony_ci priv, 147562306a36Sopenharmony_ci SD25G_LANE_LANE_1C(sd_index)); 147662306a36Sopenharmony_ci 147762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN_SET 147862306a36Sopenharmony_ci (params->cfg_sum_setcm_en), 147962306a36Sopenharmony_ci SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN, 148062306a36Sopenharmony_ci priv, 148162306a36Sopenharmony_ci SD25G_LANE_LANE_1E(sd_index)); 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0_SET 148462306a36Sopenharmony_ci (params->cfg_init_pos_iscan_6_0), 148562306a36Sopenharmony_ci SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0, 148662306a36Sopenharmony_ci priv, 148762306a36Sopenharmony_ci SD25G_LANE_LANE_25(sd_index)); 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0_SET 149062306a36Sopenharmony_ci (params->cfg_init_pos_ipi_6_0), 149162306a36Sopenharmony_ci SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0, 149262306a36Sopenharmony_ci priv, 149362306a36Sopenharmony_ci SD25G_LANE_LANE_26(sd_index)); 149462306a36Sopenharmony_ci 149562306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 149662306a36Sopenharmony_ci SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 149762306a36Sopenharmony_ci priv, 149862306a36Sopenharmony_ci SD25G_LANE_LANE_18(sd_index)); 149962306a36Sopenharmony_ci 150062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0_SET 150162306a36Sopenharmony_ci (params->cfg_dfedig_m_2_0), 150262306a36Sopenharmony_ci SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0, 150362306a36Sopenharmony_ci priv, 150462306a36Sopenharmony_ci SD25G_LANE_LANE_0E(sd_index)); 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG_SET(params->cfg_en_dfedig), 150762306a36Sopenharmony_ci SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG, 150862306a36Sopenharmony_ci priv, 150962306a36Sopenharmony_ci SD25G_LANE_LANE_0E(sd_index)); 151062306a36Sopenharmony_ci 151162306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_40_LN_R_TX_POL_INV_SET(params->r_tx_pol_inv) | 151262306a36Sopenharmony_ci SD25G_LANE_LANE_40_LN_R_RX_POL_INV_SET(params->r_rx_pol_inv), 151362306a36Sopenharmony_ci SD25G_LANE_LANE_40_LN_R_TX_POL_INV | 151462306a36Sopenharmony_ci SD25G_LANE_LANE_40_LN_R_RX_POL_INV, 151562306a36Sopenharmony_ci priv, 151662306a36Sopenharmony_ci SD25G_LANE_LANE_40(sd_index)); 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN_SET(params->cfg_rx2tx_lp_en) | 151962306a36Sopenharmony_ci SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN_SET(params->cfg_tx2rx_lp_en), 152062306a36Sopenharmony_ci SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN | 152162306a36Sopenharmony_ci SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN, 152262306a36Sopenharmony_ci priv, 152362306a36Sopenharmony_ci SD25G_LANE_LANE_04(sd_index)); 152462306a36Sopenharmony_ci 152562306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN_SET(params->cfg_rxlb_en), 152662306a36Sopenharmony_ci SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN, 152762306a36Sopenharmony_ci priv, 152862306a36Sopenharmony_ci SD25G_LANE_LANE_1E(sd_index)); 152962306a36Sopenharmony_ci 153062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_TXLB_EN_SET(params->cfg_txlb_en), 153162306a36Sopenharmony_ci SD25G_LANE_LANE_19_LN_CFG_TXLB_EN, 153262306a36Sopenharmony_ci priv, 153362306a36Sopenharmony_ci SD25G_LANE_LANE_19(sd_index)); 153462306a36Sopenharmony_ci 153562306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(0), 153662306a36Sopenharmony_ci SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 153762306a36Sopenharmony_ci priv, 153862306a36Sopenharmony_ci SD25G_LANE_LANE_2E(sd_index)); 153962306a36Sopenharmony_ci 154062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(1), 154162306a36Sopenharmony_ci SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 154262306a36Sopenharmony_ci priv, 154362306a36Sopenharmony_ci SD25G_LANE_LANE_2E(sd_index)); 154462306a36Sopenharmony_ci 154562306a36Sopenharmony_ci sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(0), 154662306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 154762306a36Sopenharmony_ci priv, 154862306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG(sd_index)); 154962306a36Sopenharmony_ci 155062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(0), 155162306a36Sopenharmony_ci SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 155262306a36Sopenharmony_ci priv, 155362306a36Sopenharmony_ci SD25G_LANE_LANE_1C(sd_index)); 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_ci usleep_range(1000, 2000); 155662306a36Sopenharmony_ci 155762306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(1), 155862306a36Sopenharmony_ci SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 155962306a36Sopenharmony_ci priv, 156062306a36Sopenharmony_ci SD25G_LANE_LANE_1C(sd_index)); 156162306a36Sopenharmony_ci 156262306a36Sopenharmony_ci usleep_range(10000, 20000); 156362306a36Sopenharmony_ci 156462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xff), 156562306a36Sopenharmony_ci SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 156662306a36Sopenharmony_ci priv, 156762306a36Sopenharmony_ci SD25G_LANE_CMU_FF(sd_index)); 156862306a36Sopenharmony_ci 156962306a36Sopenharmony_ci value = readl(sdx5_addr(regs, SD25G_LANE_CMU_C0(sd_index))); 157062306a36Sopenharmony_ci value = SD25G_LANE_CMU_C0_PLL_LOL_UDL_GET(value); 157162306a36Sopenharmony_ci 157262306a36Sopenharmony_ci if (value) { 157362306a36Sopenharmony_ci dev_err(dev, "25G PLL Loss of Lock: 0x%x\n", value); 157462306a36Sopenharmony_ci return -EINVAL; 157562306a36Sopenharmony_ci } 157662306a36Sopenharmony_ci 157762306a36Sopenharmony_ci value = readl(sdx5_addr(regs, SD_LANE_25G_SD_LANE_STAT(sd_index))); 157862306a36Sopenharmony_ci value = SD_LANE_25G_SD_LANE_STAT_PMA_RST_DONE_GET(value); 157962306a36Sopenharmony_ci 158062306a36Sopenharmony_ci if (value != 0x1) { 158162306a36Sopenharmony_ci dev_err(dev, "25G PMA Reset failed: 0x%x\n", value); 158262306a36Sopenharmony_ci return -EINVAL; 158362306a36Sopenharmony_ci } 158462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS_SET(0x1), 158562306a36Sopenharmony_ci SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS, 158662306a36Sopenharmony_ci priv, 158762306a36Sopenharmony_ci SD25G_LANE_CMU_2A(sd_index)); 158862306a36Sopenharmony_ci 158962306a36Sopenharmony_ci sdx5_rmw(SD_LANE_25G_SD_SER_RST_SER_RST_SET(0x0), 159062306a36Sopenharmony_ci SD_LANE_25G_SD_SER_RST_SER_RST, 159162306a36Sopenharmony_ci priv, 159262306a36Sopenharmony_ci SD_LANE_25G_SD_SER_RST(sd_index)); 159362306a36Sopenharmony_ci 159462306a36Sopenharmony_ci sdx5_rmw(SD_LANE_25G_SD_DES_RST_DES_RST_SET(0x0), 159562306a36Sopenharmony_ci SD_LANE_25G_SD_DES_RST_DES_RST, 159662306a36Sopenharmony_ci priv, 159762306a36Sopenharmony_ci SD_LANE_25G_SD_DES_RST(sd_index)); 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0), 160062306a36Sopenharmony_ci SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 160162306a36Sopenharmony_ci priv, 160262306a36Sopenharmony_ci SD25G_LANE_CMU_FF(sd_index)); 160362306a36Sopenharmony_ci 160462306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0_SET 160562306a36Sopenharmony_ci (params->cfg_alos_thr_2_0), 160662306a36Sopenharmony_ci SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0, 160762306a36Sopenharmony_ci priv, 160862306a36Sopenharmony_ci SD25G_LANE_LANE_2D(sd_index)); 160962306a36Sopenharmony_ci 161062306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ_SET(0), 161162306a36Sopenharmony_ci SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ, 161262306a36Sopenharmony_ci priv, 161362306a36Sopenharmony_ci SD25G_LANE_LANE_2E(sd_index)); 161462306a36Sopenharmony_ci 161562306a36Sopenharmony_ci sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_PD_SQ_SET(0), 161662306a36Sopenharmony_ci SD25G_LANE_LANE_2E_LN_CFG_PD_SQ, 161762306a36Sopenharmony_ci priv, 161862306a36Sopenharmony_ci SD25G_LANE_LANE_2E(sd_index)); 161962306a36Sopenharmony_ci 162062306a36Sopenharmony_ci return 0; 162162306a36Sopenharmony_ci} 162262306a36Sopenharmony_ci 162362306a36Sopenharmony_cistatic void sparx5_sd10g28_reset(void __iomem *regs[], u32 lane_index) 162462306a36Sopenharmony_ci{ 162562306a36Sopenharmony_ci /* Note: SerDes SD10G_LANE_1 is configured in 10G_LAN mode */ 162662306a36Sopenharmony_ci sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(1), 162762306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 162862306a36Sopenharmony_ci sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 162962306a36Sopenharmony_ci 163062306a36Sopenharmony_ci usleep_range(1000, 2000); 163162306a36Sopenharmony_ci 163262306a36Sopenharmony_ci sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 163362306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 163462306a36Sopenharmony_ci sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 163562306a36Sopenharmony_ci} 163662306a36Sopenharmony_ci 163762306a36Sopenharmony_cistatic int sparx5_sd10g28_apply_params(struct sparx5_serdes_macro *macro, 163862306a36Sopenharmony_ci struct sparx5_sd10g28_params *params) 163962306a36Sopenharmony_ci{ 164062306a36Sopenharmony_ci struct sparx5_serdes_private *priv = macro->priv; 164162306a36Sopenharmony_ci void __iomem **regs = priv->regs; 164262306a36Sopenharmony_ci struct device *dev = priv->dev; 164362306a36Sopenharmony_ci u32 lane_index = macro->sidx; 164462306a36Sopenharmony_ci u32 sd_index = macro->stpidx; 164562306a36Sopenharmony_ci void __iomem *sd_inst; 164662306a36Sopenharmony_ci u32 value, cmu_idx; 164762306a36Sopenharmony_ci int err; 164862306a36Sopenharmony_ci 164962306a36Sopenharmony_ci /* Do not configure serdes if CMU is not to be configured too */ 165062306a36Sopenharmony_ci if (params->skip_cmu_cfg) 165162306a36Sopenharmony_ci return 0; 165262306a36Sopenharmony_ci 165362306a36Sopenharmony_ci cmu_idx = sparx5_serdes_cmu_get(params->cmu_sel, lane_index); 165462306a36Sopenharmony_ci err = sparx5_cmu_cfg(priv, cmu_idx); 165562306a36Sopenharmony_ci if (err) 165662306a36Sopenharmony_ci return err; 165762306a36Sopenharmony_ci 165862306a36Sopenharmony_ci if (params->is_6g) 165962306a36Sopenharmony_ci sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, sd_index); 166062306a36Sopenharmony_ci else 166162306a36Sopenharmony_ci sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, sd_index); 166262306a36Sopenharmony_ci 166362306a36Sopenharmony_ci sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(1), 166462306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_MACRO_RST, 166562306a36Sopenharmony_ci priv, 166662306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG(lane_index)); 166762306a36Sopenharmony_ci 166862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT_SET(0x0) | 166962306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_REG_MANUAL_SET(0x1) | 167062306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT_SET(0x1) | 167162306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT_SET(0x1) | 167262306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL_SET(0x0), 167362306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT | 167462306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_REG_MANUAL | 167562306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT | 167662306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT | 167762306a36Sopenharmony_ci SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL, 167862306a36Sopenharmony_ci sd_inst, 167962306a36Sopenharmony_ci SD10G_LANE_LANE_93(sd_index)); 168062306a36Sopenharmony_ci 168162306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_94_R_ISCAN_REG_SET(0x1) | 168262306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_TXEQ_REG_SET(0x1) | 168362306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_MISC_REG_SET(0x1) | 168462306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_SWING_REG_SET(0x1), 168562306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_ISCAN_REG | 168662306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_TXEQ_REG | 168762306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_MISC_REG | 168862306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_SWING_REG, 168962306a36Sopenharmony_ci sd_inst, 169062306a36Sopenharmony_ci SD10G_LANE_LANE_94(sd_index)); 169162306a36Sopenharmony_ci 169262306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_RXEQ_REG_SET(0x1), 169362306a36Sopenharmony_ci SD10G_LANE_LANE_9E_R_RXEQ_REG, 169462306a36Sopenharmony_ci sd_inst, 169562306a36Sopenharmony_ci SD10G_LANE_LANE_9E(sd_index)); 169662306a36Sopenharmony_ci 169762306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_A1_R_SSC_FROM_HWT_SET(0x0) | 169862306a36Sopenharmony_ci SD10G_LANE_LANE_A1_R_CDR_FROM_HWT_SET(0x0) | 169962306a36Sopenharmony_ci SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT_SET(0x1), 170062306a36Sopenharmony_ci SD10G_LANE_LANE_A1_R_SSC_FROM_HWT | 170162306a36Sopenharmony_ci SD10G_LANE_LANE_A1_R_CDR_FROM_HWT | 170262306a36Sopenharmony_ci SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT, 170362306a36Sopenharmony_ci sd_inst, 170462306a36Sopenharmony_ci SD10G_LANE_LANE_A1(sd_index)); 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_ci sdx5_rmw(SD_LANE_SD_LANE_CFG_RX_REF_SEL_SET(params->cmu_sel) | 170762306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_TX_REF_SEL_SET(params->cmu_sel), 170862306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_RX_REF_SEL | 170962306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_TX_REF_SEL, 171062306a36Sopenharmony_ci priv, 171162306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG(lane_index)); 171262306a36Sopenharmony_ci 171362306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0_SET 171462306a36Sopenharmony_ci (params->cfg_lane_reserve_7_0), 171562306a36Sopenharmony_ci SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0, 171662306a36Sopenharmony_ci sd_inst, 171762306a36Sopenharmony_ci SD10G_LANE_LANE_40(sd_index)); 171862306a36Sopenharmony_ci 171962306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL_SET 172062306a36Sopenharmony_ci (params->cfg_ssc_rtl_clk_sel), 172162306a36Sopenharmony_ci SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL, 172262306a36Sopenharmony_ci sd_inst, 172362306a36Sopenharmony_ci SD10G_LANE_LANE_50(sd_index)); 172462306a36Sopenharmony_ci 172562306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_35_CFG_TXRATE_1_0_SET 172662306a36Sopenharmony_ci (params->cfg_txrate_1_0) | 172762306a36Sopenharmony_ci SD10G_LANE_LANE_35_CFG_RXRATE_1_0_SET 172862306a36Sopenharmony_ci (params->cfg_rxrate_1_0), 172962306a36Sopenharmony_ci SD10G_LANE_LANE_35_CFG_TXRATE_1_0 | 173062306a36Sopenharmony_ci SD10G_LANE_LANE_35_CFG_RXRATE_1_0, 173162306a36Sopenharmony_ci sd_inst, 173262306a36Sopenharmony_ci SD10G_LANE_LANE_35(sd_index)); 173362306a36Sopenharmony_ci 173462306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0_SET 173562306a36Sopenharmony_ci (params->r_d_width_ctrl_2_0), 173662306a36Sopenharmony_ci SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0, 173762306a36Sopenharmony_ci sd_inst, 173862306a36Sopenharmony_ci SD10G_LANE_LANE_94(sd_index)); 173962306a36Sopenharmony_ci 174062306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 174162306a36Sopenharmony_ci (params->cfg_pma_tx_ck_bitwidth_2_0), 174262306a36Sopenharmony_ci SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0, 174362306a36Sopenharmony_ci sd_inst, 174462306a36Sopenharmony_ci SD10G_LANE_LANE_01(sd_index)); 174562306a36Sopenharmony_ci 174662306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0_SET 174762306a36Sopenharmony_ci (params->cfg_rxdiv_sel_2_0), 174862306a36Sopenharmony_ci SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0, 174962306a36Sopenharmony_ci sd_inst, 175062306a36Sopenharmony_ci SD10G_LANE_LANE_30(sd_index)); 175162306a36Sopenharmony_ci 175262306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0_SET 175362306a36Sopenharmony_ci (params->r_pcs2pma_phymode_4_0), 175462306a36Sopenharmony_ci SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0, 175562306a36Sopenharmony_ci sd_inst, 175662306a36Sopenharmony_ci SD10G_LANE_LANE_A2(sd_index)); 175762306a36Sopenharmony_ci 175862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_13_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 175962306a36Sopenharmony_ci SD10G_LANE_LANE_13_CFG_CDRCK_EN, 176062306a36Sopenharmony_ci sd_inst, 176162306a36Sopenharmony_ci SD10G_LANE_LANE_13(sd_index)); 176262306a36Sopenharmony_ci 176362306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_DFECK_EN_SET 176462306a36Sopenharmony_ci (params->cfg_dfeck_en) | 176562306a36Sopenharmony_ci SD10G_LANE_LANE_23_CFG_DFE_PD_SET(params->cfg_dfe_pd) | 176662306a36Sopenharmony_ci SD10G_LANE_LANE_23_CFG_ERRAMP_PD_SET 176762306a36Sopenharmony_ci (params->cfg_erramp_pd), 176862306a36Sopenharmony_ci SD10G_LANE_LANE_23_CFG_DFECK_EN | 176962306a36Sopenharmony_ci SD10G_LANE_LANE_23_CFG_DFE_PD | 177062306a36Sopenharmony_ci SD10G_LANE_LANE_23_CFG_ERRAMP_PD, 177162306a36Sopenharmony_ci sd_inst, 177262306a36Sopenharmony_ci SD10G_LANE_LANE_23(sd_index)); 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1_SET 177562306a36Sopenharmony_ci (params->cfg_dfetap_en_5_1), 177662306a36Sopenharmony_ci SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1, 177762306a36Sopenharmony_ci sd_inst, 177862306a36Sopenharmony_ci SD10G_LANE_LANE_22(sd_index)); 177962306a36Sopenharmony_ci 178062306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_DFE_EN_SET 178162306a36Sopenharmony_ci (params->cfg_pi_DFE_en), 178262306a36Sopenharmony_ci SD10G_LANE_LANE_1A_CFG_PI_DFE_EN, 178362306a36Sopenharmony_ci sd_inst, 178462306a36Sopenharmony_ci SD10G_LANE_LANE_1A(sd_index)); 178562306a36Sopenharmony_ci 178662306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_02_CFG_EN_ADV_SET(params->cfg_en_adv) | 178762306a36Sopenharmony_ci SD10G_LANE_LANE_02_CFG_EN_MAIN_SET(params->cfg_en_main) | 178862306a36Sopenharmony_ci SD10G_LANE_LANE_02_CFG_EN_DLY_SET(params->cfg_en_dly) | 178962306a36Sopenharmony_ci SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0_SET 179062306a36Sopenharmony_ci (params->cfg_tap_adv_3_0), 179162306a36Sopenharmony_ci SD10G_LANE_LANE_02_CFG_EN_ADV | 179262306a36Sopenharmony_ci SD10G_LANE_LANE_02_CFG_EN_MAIN | 179362306a36Sopenharmony_ci SD10G_LANE_LANE_02_CFG_EN_DLY | 179462306a36Sopenharmony_ci SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0, 179562306a36Sopenharmony_ci sd_inst, 179662306a36Sopenharmony_ci SD10G_LANE_LANE_02(sd_index)); 179762306a36Sopenharmony_ci 179862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_03_CFG_TAP_MAIN_SET(params->cfg_tap_main), 179962306a36Sopenharmony_ci SD10G_LANE_LANE_03_CFG_TAP_MAIN, 180062306a36Sopenharmony_ci sd_inst, 180162306a36Sopenharmony_ci SD10G_LANE_LANE_03(sd_index)); 180262306a36Sopenharmony_ci 180362306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0_SET 180462306a36Sopenharmony_ci (params->cfg_tap_dly_4_0), 180562306a36Sopenharmony_ci SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0, 180662306a36Sopenharmony_ci sd_inst, 180762306a36Sopenharmony_ci SD10G_LANE_LANE_04(sd_index)); 180862306a36Sopenharmony_ci 180962306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0_SET 181062306a36Sopenharmony_ci (params->cfg_vga_ctrl_3_0), 181162306a36Sopenharmony_ci SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0, 181262306a36Sopenharmony_ci sd_inst, 181362306a36Sopenharmony_ci SD10G_LANE_LANE_2F(sd_index)); 181462306a36Sopenharmony_ci 181562306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0_SET 181662306a36Sopenharmony_ci (params->cfg_vga_cp_2_0), 181762306a36Sopenharmony_ci SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0, 181862306a36Sopenharmony_ci sd_inst, 181962306a36Sopenharmony_ci SD10G_LANE_LANE_2F(sd_index)); 182062306a36Sopenharmony_ci 182162306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0_SET 182262306a36Sopenharmony_ci (params->cfg_eq_res_3_0), 182362306a36Sopenharmony_ci SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0, 182462306a36Sopenharmony_ci sd_inst, 182562306a36Sopenharmony_ci SD10G_LANE_LANE_0B(sd_index)); 182662306a36Sopenharmony_ci 182762306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0D_CFG_EQR_BYP_SET(params->cfg_eq_r_byp), 182862306a36Sopenharmony_ci SD10G_LANE_LANE_0D_CFG_EQR_BYP, 182962306a36Sopenharmony_ci sd_inst, 183062306a36Sopenharmony_ci SD10G_LANE_LANE_0D(sd_index)); 183162306a36Sopenharmony_ci 183262306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0_SET 183362306a36Sopenharmony_ci (params->cfg_eq_c_force_3_0) | 183462306a36Sopenharmony_ci SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN_SET 183562306a36Sopenharmony_ci (params->cfg_sum_setcm_en), 183662306a36Sopenharmony_ci SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0 | 183762306a36Sopenharmony_ci SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN, 183862306a36Sopenharmony_ci sd_inst, 183962306a36Sopenharmony_ci SD10G_LANE_LANE_0E(sd_index)); 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_EN_DFEDIG_SET 184262306a36Sopenharmony_ci (params->cfg_en_dfedig), 184362306a36Sopenharmony_ci SD10G_LANE_LANE_23_CFG_EN_DFEDIG, 184462306a36Sopenharmony_ci sd_inst, 184562306a36Sopenharmony_ci SD10G_LANE_LANE_23(sd_index)); 184662306a36Sopenharmony_ci 184762306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_EN_PREEMPH_SET 184862306a36Sopenharmony_ci (params->cfg_en_preemph), 184962306a36Sopenharmony_ci SD10G_LANE_LANE_06_CFG_EN_PREEMPH, 185062306a36Sopenharmony_ci sd_inst, 185162306a36Sopenharmony_ci SD10G_LANE_LANE_06(sd_index)); 185262306a36Sopenharmony_ci 185362306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0_SET 185462306a36Sopenharmony_ci (params->cfg_itx_ippreemp_base_1_0) | 185562306a36Sopenharmony_ci SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0_SET 185662306a36Sopenharmony_ci (params->cfg_itx_ipdriver_base_2_0), 185762306a36Sopenharmony_ci SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0 | 185862306a36Sopenharmony_ci SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0, 185962306a36Sopenharmony_ci sd_inst, 186062306a36Sopenharmony_ci SD10G_LANE_LANE_33(sd_index)); 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0_SET 186362306a36Sopenharmony_ci (params->cfg_ibias_tune_reserve_5_0), 186462306a36Sopenharmony_ci SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0, 186562306a36Sopenharmony_ci sd_inst, 186662306a36Sopenharmony_ci SD10G_LANE_LANE_52(sd_index)); 186762306a36Sopenharmony_ci 186862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_TXSWING_HALF_SET 186962306a36Sopenharmony_ci (params->cfg_txswing_half), 187062306a36Sopenharmony_ci SD10G_LANE_LANE_37_CFG_TXSWING_HALF, 187162306a36Sopenharmony_ci sd_inst, 187262306a36Sopenharmony_ci SD10G_LANE_LANE_37(sd_index)); 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER_SET 187562306a36Sopenharmony_ci (params->cfg_dis_2nd_order), 187662306a36Sopenharmony_ci SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER, 187762306a36Sopenharmony_ci sd_inst, 187862306a36Sopenharmony_ci SD10G_LANE_LANE_3C(sd_index)); 187962306a36Sopenharmony_ci 188062306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_39_CFG_RX_SSC_LH_SET 188162306a36Sopenharmony_ci (params->cfg_rx_ssc_lh), 188262306a36Sopenharmony_ci SD10G_LANE_LANE_39_CFG_RX_SSC_LH, 188362306a36Sopenharmony_ci sd_inst, 188462306a36Sopenharmony_ci SD10G_LANE_LANE_39(sd_index)); 188562306a36Sopenharmony_ci 188662306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0_SET 188762306a36Sopenharmony_ci (params->cfg_pi_floop_steps_1_0), 188862306a36Sopenharmony_ci SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0, 188962306a36Sopenharmony_ci sd_inst, 189062306a36Sopenharmony_ci SD10G_LANE_LANE_1A(sd_index)); 189162306a36Sopenharmony_ci 189262306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16_SET 189362306a36Sopenharmony_ci (params->cfg_pi_ext_dac_23_16), 189462306a36Sopenharmony_ci SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16, 189562306a36Sopenharmony_ci sd_inst, 189662306a36Sopenharmony_ci SD10G_LANE_LANE_16(sd_index)); 189762306a36Sopenharmony_ci 189862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8_SET 189962306a36Sopenharmony_ci (params->cfg_pi_ext_dac_15_8), 190062306a36Sopenharmony_ci SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8, 190162306a36Sopenharmony_ci sd_inst, 190262306a36Sopenharmony_ci SD10G_LANE_LANE_15(sd_index)); 190362306a36Sopenharmony_ci 190462306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0_SET 190562306a36Sopenharmony_ci (params->cfg_iscan_ext_dac_7_0), 190662306a36Sopenharmony_ci SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0, 190762306a36Sopenharmony_ci sd_inst, 190862306a36Sopenharmony_ci SD10G_LANE_LANE_26(sd_index)); 190962306a36Sopenharmony_ci 191062306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0_SET 191162306a36Sopenharmony_ci (params->cfg_cdr_kf_gen1_2_0), 191262306a36Sopenharmony_ci SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0, 191362306a36Sopenharmony_ci sd_inst, 191462306a36Sopenharmony_ci SD10G_LANE_LANE_42(sd_index)); 191562306a36Sopenharmony_ci 191662306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0_SET 191762306a36Sopenharmony_ci (params->r_cdr_m_gen1_7_0), 191862306a36Sopenharmony_ci SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0, 191962306a36Sopenharmony_ci sd_inst, 192062306a36Sopenharmony_ci SD10G_LANE_LANE_0F(sd_index)); 192162306a36Sopenharmony_ci 192262306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0_SET 192362306a36Sopenharmony_ci (params->cfg_pi_bw_gen1_3_0), 192462306a36Sopenharmony_ci SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0, 192562306a36Sopenharmony_ci sd_inst, 192662306a36Sopenharmony_ci SD10G_LANE_LANE_24(sd_index)); 192762306a36Sopenharmony_ci 192862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0_SET 192962306a36Sopenharmony_ci (params->cfg_pi_ext_dac_7_0), 193062306a36Sopenharmony_ci SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0, 193162306a36Sopenharmony_ci sd_inst, 193262306a36Sopenharmony_ci SD10G_LANE_LANE_14(sd_index)); 193362306a36Sopenharmony_ci 193462306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_STEPS_SET(params->cfg_pi_steps), 193562306a36Sopenharmony_ci SD10G_LANE_LANE_1A_CFG_PI_STEPS, 193662306a36Sopenharmony_ci sd_inst, 193762306a36Sopenharmony_ci SD10G_LANE_LANE_1A(sd_index)); 193862306a36Sopenharmony_ci 193962306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0_SET 194062306a36Sopenharmony_ci (params->cfg_mp_max_3_0), 194162306a36Sopenharmony_ci SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0, 194262306a36Sopenharmony_ci sd_inst, 194362306a36Sopenharmony_ci SD10G_LANE_LANE_3A(sd_index)); 194462306a36Sopenharmony_ci 194562306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG_SET 194662306a36Sopenharmony_ci (params->cfg_rstn_dfedig), 194762306a36Sopenharmony_ci SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG, 194862306a36Sopenharmony_ci sd_inst, 194962306a36Sopenharmony_ci SD10G_LANE_LANE_31(sd_index)); 195062306a36Sopenharmony_ci 195162306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0_SET 195262306a36Sopenharmony_ci (params->cfg_alos_thr_3_0), 195362306a36Sopenharmony_ci SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0, 195462306a36Sopenharmony_ci sd_inst, 195562306a36Sopenharmony_ci SD10G_LANE_LANE_48(sd_index)); 195662306a36Sopenharmony_ci 195762306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0_SET 195862306a36Sopenharmony_ci (params->cfg_predrv_slewrate_1_0), 195962306a36Sopenharmony_ci SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0, 196062306a36Sopenharmony_ci sd_inst, 196162306a36Sopenharmony_ci SD10G_LANE_LANE_36(sd_index)); 196262306a36Sopenharmony_ci 196362306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0_SET 196462306a36Sopenharmony_ci (params->cfg_itx_ipcml_base_1_0), 196562306a36Sopenharmony_ci SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0, 196662306a36Sopenharmony_ci sd_inst, 196762306a36Sopenharmony_ci SD10G_LANE_LANE_32(sd_index)); 196862306a36Sopenharmony_ci 196962306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0_SET 197062306a36Sopenharmony_ci (params->cfg_ip_pre_base_1_0), 197162306a36Sopenharmony_ci SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0, 197262306a36Sopenharmony_ci sd_inst, 197362306a36Sopenharmony_ci SD10G_LANE_LANE_37(sd_index)); 197462306a36Sopenharmony_ci 197562306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8_SET 197662306a36Sopenharmony_ci (params->cfg_lane_reserve_15_8), 197762306a36Sopenharmony_ci SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8, 197862306a36Sopenharmony_ci sd_inst, 197962306a36Sopenharmony_ci SD10G_LANE_LANE_41(sd_index)); 198062306a36Sopenharmony_ci 198162306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN_SET 198262306a36Sopenharmony_ci (params->r_en_auto_cdr_rstn), 198362306a36Sopenharmony_ci SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN, 198462306a36Sopenharmony_ci sd_inst, 198562306a36Sopenharmony_ci SD10G_LANE_LANE_9E(sd_index)); 198662306a36Sopenharmony_ci 198762306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0C_CFG_OSCAL_AFE_SET 198862306a36Sopenharmony_ci (params->cfg_oscal_afe) | 198962306a36Sopenharmony_ci SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE_SET 199062306a36Sopenharmony_ci (params->cfg_pd_osdac_afe), 199162306a36Sopenharmony_ci SD10G_LANE_LANE_0C_CFG_OSCAL_AFE | 199262306a36Sopenharmony_ci SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE, 199362306a36Sopenharmony_ci sd_inst, 199462306a36Sopenharmony_ci SD10G_LANE_LANE_0C(sd_index)); 199562306a36Sopenharmony_ci 199662306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 199762306a36Sopenharmony_ci (params->cfg_resetb_oscal_afe[0]), 199862306a36Sopenharmony_ci SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 199962306a36Sopenharmony_ci sd_inst, 200062306a36Sopenharmony_ci SD10G_LANE_LANE_0B(sd_index)); 200162306a36Sopenharmony_ci 200262306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 200362306a36Sopenharmony_ci (params->cfg_resetb_oscal_afe[1]), 200462306a36Sopenharmony_ci SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 200562306a36Sopenharmony_ci sd_inst, 200662306a36Sopenharmony_ci SD10G_LANE_LANE_0B(sd_index)); 200762306a36Sopenharmony_ci 200862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_83_R_TX_POL_INV_SET 200962306a36Sopenharmony_ci (params->r_tx_pol_inv) | 201062306a36Sopenharmony_ci SD10G_LANE_LANE_83_R_RX_POL_INV_SET 201162306a36Sopenharmony_ci (params->r_rx_pol_inv), 201262306a36Sopenharmony_ci SD10G_LANE_LANE_83_R_TX_POL_INV | 201362306a36Sopenharmony_ci SD10G_LANE_LANE_83_R_RX_POL_INV, 201462306a36Sopenharmony_ci sd_inst, 201562306a36Sopenharmony_ci SD10G_LANE_LANE_83(sd_index)); 201662306a36Sopenharmony_ci 201762306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN_SET 201862306a36Sopenharmony_ci (params->cfg_rx2tx_lp_en) | 201962306a36Sopenharmony_ci SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN_SET 202062306a36Sopenharmony_ci (params->cfg_tx2rx_lp_en), 202162306a36Sopenharmony_ci SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN | 202262306a36Sopenharmony_ci SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN, 202362306a36Sopenharmony_ci sd_inst, 202462306a36Sopenharmony_ci SD10G_LANE_LANE_06(sd_index)); 202562306a36Sopenharmony_ci 202662306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_RXLB_EN_SET(params->cfg_rxlb_en) | 202762306a36Sopenharmony_ci SD10G_LANE_LANE_0E_CFG_TXLB_EN_SET(params->cfg_txlb_en), 202862306a36Sopenharmony_ci SD10G_LANE_LANE_0E_CFG_RXLB_EN | 202962306a36Sopenharmony_ci SD10G_LANE_LANE_0E_CFG_TXLB_EN, 203062306a36Sopenharmony_ci sd_inst, 203162306a36Sopenharmony_ci SD10G_LANE_LANE_0E(sd_index)); 203262306a36Sopenharmony_ci 203362306a36Sopenharmony_ci sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(0), 203462306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_MACRO_RST, 203562306a36Sopenharmony_ci priv, 203662306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG(lane_index)); 203762306a36Sopenharmony_ci 203862306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 203962306a36Sopenharmony_ci SD10G_LANE_LANE_50_CFG_SSC_RESETB, 204062306a36Sopenharmony_ci sd_inst, 204162306a36Sopenharmony_ci SD10G_LANE_LANE_50(sd_index)); 204262306a36Sopenharmony_ci 204362306a36Sopenharmony_ci sdx5_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 204462306a36Sopenharmony_ci SD10G_LANE_LANE_50_CFG_SSC_RESETB, 204562306a36Sopenharmony_ci priv, 204662306a36Sopenharmony_ci SD10G_LANE_LANE_50(sd_index)); 204762306a36Sopenharmony_ci 204862306a36Sopenharmony_ci sdx5_rmw(SD_LANE_MISC_SD_125_RST_DIS_SET(params->fx_100), 204962306a36Sopenharmony_ci SD_LANE_MISC_SD_125_RST_DIS, 205062306a36Sopenharmony_ci priv, 205162306a36Sopenharmony_ci SD_LANE_MISC(lane_index)); 205262306a36Sopenharmony_ci 205362306a36Sopenharmony_ci sdx5_rmw(SD_LANE_MISC_RX_ENA_SET(params->fx_100), 205462306a36Sopenharmony_ci SD_LANE_MISC_RX_ENA, 205562306a36Sopenharmony_ci priv, 205662306a36Sopenharmony_ci SD_LANE_MISC(lane_index)); 205762306a36Sopenharmony_ci 205862306a36Sopenharmony_ci sdx5_rmw(SD_LANE_MISC_MUX_ENA_SET(params->fx_100), 205962306a36Sopenharmony_ci SD_LANE_MISC_MUX_ENA, 206062306a36Sopenharmony_ci priv, 206162306a36Sopenharmony_ci SD_LANE_MISC(lane_index)); 206262306a36Sopenharmony_ci 206362306a36Sopenharmony_ci usleep_range(3000, 6000); 206462306a36Sopenharmony_ci 206562306a36Sopenharmony_ci value = readl(sdx5_addr(regs, SD_LANE_SD_LANE_STAT(lane_index))); 206662306a36Sopenharmony_ci value = SD_LANE_SD_LANE_STAT_PMA_RST_DONE_GET(value); 206762306a36Sopenharmony_ci if (value != 1) { 206862306a36Sopenharmony_ci dev_err(dev, "10G PMA Reset failed: 0x%x\n", value); 206962306a36Sopenharmony_ci return -EINVAL; 207062306a36Sopenharmony_ci } 207162306a36Sopenharmony_ci 207262306a36Sopenharmony_ci sdx5_rmw(SD_LANE_SD_SER_RST_SER_RST_SET(0x0), 207362306a36Sopenharmony_ci SD_LANE_SD_SER_RST_SER_RST, 207462306a36Sopenharmony_ci priv, 207562306a36Sopenharmony_ci SD_LANE_SD_SER_RST(lane_index)); 207662306a36Sopenharmony_ci 207762306a36Sopenharmony_ci sdx5_rmw(SD_LANE_SD_DES_RST_DES_RST_SET(0x0), 207862306a36Sopenharmony_ci SD_LANE_SD_DES_RST_DES_RST, 207962306a36Sopenharmony_ci priv, 208062306a36Sopenharmony_ci SD_LANE_SD_DES_RST(lane_index)); 208162306a36Sopenharmony_ci 208262306a36Sopenharmony_ci return 0; 208362306a36Sopenharmony_ci} 208462306a36Sopenharmony_ci 208562306a36Sopenharmony_cistatic int sparx5_sd25g28_config(struct sparx5_serdes_macro *macro, bool reset) 208662306a36Sopenharmony_ci{ 208762306a36Sopenharmony_ci struct sparx5_sd25g28_media_preset media = media_presets_25g[macro->media]; 208862306a36Sopenharmony_ci struct sparx5_sd25g28_mode_preset mode; 208962306a36Sopenharmony_ci struct sparx5_sd25g28_args args = { 209062306a36Sopenharmony_ci .rxinvert = 1, 209162306a36Sopenharmony_ci .txinvert = 0, 209262306a36Sopenharmony_ci .txswing = 240, 209362306a36Sopenharmony_ci .com_pll_reserve = 0xf, 209462306a36Sopenharmony_ci .reg_rst = reset, 209562306a36Sopenharmony_ci }; 209662306a36Sopenharmony_ci struct sparx5_sd25g28_params params; 209762306a36Sopenharmony_ci int err; 209862306a36Sopenharmony_ci 209962306a36Sopenharmony_ci err = sparx5_sd10g25_get_mode_preset(macro, &mode); 210062306a36Sopenharmony_ci if (err) 210162306a36Sopenharmony_ci return err; 210262306a36Sopenharmony_ci sparx5_sd25g28_get_params(macro, &media, &mode, &args, ¶ms); 210362306a36Sopenharmony_ci sparx5_sd25g28_reset(macro->priv->regs, ¶ms, macro->stpidx); 210462306a36Sopenharmony_ci return sparx5_sd25g28_apply_params(macro, ¶ms); 210562306a36Sopenharmony_ci} 210662306a36Sopenharmony_ci 210762306a36Sopenharmony_cistatic int sparx5_sd10g28_config(struct sparx5_serdes_macro *macro, bool reset) 210862306a36Sopenharmony_ci{ 210962306a36Sopenharmony_ci struct sparx5_sd10g28_media_preset media = media_presets_10g[macro->media]; 211062306a36Sopenharmony_ci struct sparx5_sd10g28_mode_preset mode; 211162306a36Sopenharmony_ci struct sparx5_sd10g28_params params; 211262306a36Sopenharmony_ci struct sparx5_sd10g28_args args = { 211362306a36Sopenharmony_ci .is_6g = (macro->serdestype == SPX5_SDT_6G), 211462306a36Sopenharmony_ci .txinvert = 0, 211562306a36Sopenharmony_ci .rxinvert = 1, 211662306a36Sopenharmony_ci .txswing = 240, 211762306a36Sopenharmony_ci .reg_rst = reset, 211862306a36Sopenharmony_ci .skip_cmu_cfg = reset, 211962306a36Sopenharmony_ci }; 212062306a36Sopenharmony_ci int err; 212162306a36Sopenharmony_ci 212262306a36Sopenharmony_ci err = sparx5_sd10g28_get_mode_preset(macro, &mode, &args); 212362306a36Sopenharmony_ci if (err) 212462306a36Sopenharmony_ci return err; 212562306a36Sopenharmony_ci sparx5_sd10g28_get_params(macro, &media, &mode, &args, ¶ms); 212662306a36Sopenharmony_ci sparx5_sd10g28_reset(macro->priv->regs, macro->sidx); 212762306a36Sopenharmony_ci return sparx5_sd10g28_apply_params(macro, ¶ms); 212862306a36Sopenharmony_ci} 212962306a36Sopenharmony_ci 213062306a36Sopenharmony_ci/* Power down serdes TX driver */ 213162306a36Sopenharmony_cistatic int sparx5_serdes_power_save(struct sparx5_serdes_macro *macro, u32 pwdn) 213262306a36Sopenharmony_ci{ 213362306a36Sopenharmony_ci struct sparx5_serdes_private *priv = macro->priv; 213462306a36Sopenharmony_ci void __iomem *sd_inst, *sd_lane_inst; 213562306a36Sopenharmony_ci 213662306a36Sopenharmony_ci if (macro->serdestype == SPX5_SDT_6G) 213762306a36Sopenharmony_ci sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, macro->stpidx); 213862306a36Sopenharmony_ci else if (macro->serdestype == SPX5_SDT_10G) 213962306a36Sopenharmony_ci sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, macro->stpidx); 214062306a36Sopenharmony_ci else 214162306a36Sopenharmony_ci sd_inst = sdx5_inst_get(priv, TARGET_SD25G_LANE, macro->stpidx); 214262306a36Sopenharmony_ci 214362306a36Sopenharmony_ci if (macro->serdestype == SPX5_SDT_25G) { 214462306a36Sopenharmony_ci sd_lane_inst = sdx5_inst_get(priv, TARGET_SD_LANE_25G, 214562306a36Sopenharmony_ci macro->stpidx); 214662306a36Sopenharmony_ci /* Take serdes out of reset */ 214762306a36Sopenharmony_ci sdx5_inst_rmw(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(0), 214862306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, sd_lane_inst, 214962306a36Sopenharmony_ci SD_LANE_25G_SD_LANE_CFG(0)); 215062306a36Sopenharmony_ci 215162306a36Sopenharmony_ci /* Configure optimal settings for quiet mode */ 215262306a36Sopenharmony_ci sdx5_inst_rmw(SD_LANE_25G_QUIET_MODE_6G_QUIET_MODE_SET(SPX5_SERDES_QUIET_MODE_VAL), 215362306a36Sopenharmony_ci SD_LANE_25G_QUIET_MODE_6G_QUIET_MODE, 215462306a36Sopenharmony_ci sd_lane_inst, SD_LANE_25G_QUIET_MODE_6G(0)); 215562306a36Sopenharmony_ci 215662306a36Sopenharmony_ci sdx5_inst_rmw(SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER_SET(pwdn), 215762306a36Sopenharmony_ci SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER, 215862306a36Sopenharmony_ci sd_inst, 215962306a36Sopenharmony_ci SD25G_LANE_LANE_04(0)); 216062306a36Sopenharmony_ci } else { 216162306a36Sopenharmony_ci /* 6G and 10G */ 216262306a36Sopenharmony_ci sd_lane_inst = sdx5_inst_get(priv, TARGET_SD_LANE, macro->sidx); 216362306a36Sopenharmony_ci 216462306a36Sopenharmony_ci /* Take serdes out of reset */ 216562306a36Sopenharmony_ci sdx5_inst_rmw(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 216662306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG_EXT_CFG_RST, sd_lane_inst, 216762306a36Sopenharmony_ci SD_LANE_SD_LANE_CFG(0)); 216862306a36Sopenharmony_ci 216962306a36Sopenharmony_ci /* Configure optimal settings for quiet mode */ 217062306a36Sopenharmony_ci sdx5_inst_rmw(SD_LANE_QUIET_MODE_6G_QUIET_MODE_SET(SPX5_SERDES_QUIET_MODE_VAL), 217162306a36Sopenharmony_ci SD_LANE_QUIET_MODE_6G_QUIET_MODE, sd_lane_inst, 217262306a36Sopenharmony_ci SD_LANE_QUIET_MODE_6G(0)); 217362306a36Sopenharmony_ci 217462306a36Sopenharmony_ci sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_PD_DRIVER_SET(pwdn), 217562306a36Sopenharmony_ci SD10G_LANE_LANE_06_CFG_PD_DRIVER, 217662306a36Sopenharmony_ci sd_inst, 217762306a36Sopenharmony_ci SD10G_LANE_LANE_06(0)); 217862306a36Sopenharmony_ci } 217962306a36Sopenharmony_ci return 0; 218062306a36Sopenharmony_ci} 218162306a36Sopenharmony_ci 218262306a36Sopenharmony_cistatic int sparx5_serdes_clock_config(struct sparx5_serdes_macro *macro) 218362306a36Sopenharmony_ci{ 218462306a36Sopenharmony_ci struct sparx5_serdes_private *priv = macro->priv; 218562306a36Sopenharmony_ci 218662306a36Sopenharmony_ci if (macro->serdesmode == SPX5_SD_MODE_100FX) { 218762306a36Sopenharmony_ci u32 freq = priv->coreclock == 250000000 ? 2 : 218862306a36Sopenharmony_ci priv->coreclock == 500000000 ? 1 : 0; 218962306a36Sopenharmony_ci 219062306a36Sopenharmony_ci sdx5_rmw(SD_LANE_MISC_CORE_CLK_FREQ_SET(freq), 219162306a36Sopenharmony_ci SD_LANE_MISC_CORE_CLK_FREQ, 219262306a36Sopenharmony_ci priv, 219362306a36Sopenharmony_ci SD_LANE_MISC(macro->sidx)); 219462306a36Sopenharmony_ci } 219562306a36Sopenharmony_ci return 0; 219662306a36Sopenharmony_ci} 219762306a36Sopenharmony_ci 219862306a36Sopenharmony_cistatic int sparx5_serdes_get_serdesmode(phy_interface_t portmode, int speed) 219962306a36Sopenharmony_ci{ 220062306a36Sopenharmony_ci switch (portmode) { 220162306a36Sopenharmony_ci case PHY_INTERFACE_MODE_1000BASEX: 220262306a36Sopenharmony_ci case PHY_INTERFACE_MODE_2500BASEX: 220362306a36Sopenharmony_ci if (speed == SPEED_2500) 220462306a36Sopenharmony_ci return SPX5_SD_MODE_2G5; 220562306a36Sopenharmony_ci if (speed == SPEED_100) 220662306a36Sopenharmony_ci return SPX5_SD_MODE_100FX; 220762306a36Sopenharmony_ci return SPX5_SD_MODE_1000BASEX; 220862306a36Sopenharmony_ci case PHY_INTERFACE_MODE_SGMII: 220962306a36Sopenharmony_ci /* The same Serdes mode is used for both SGMII and 1000BaseX */ 221062306a36Sopenharmony_ci return SPX5_SD_MODE_1000BASEX; 221162306a36Sopenharmony_ci case PHY_INTERFACE_MODE_QSGMII: 221262306a36Sopenharmony_ci return SPX5_SD_MODE_QSGMII; 221362306a36Sopenharmony_ci case PHY_INTERFACE_MODE_10GBASER: 221462306a36Sopenharmony_ci return SPX5_SD_MODE_SFI; 221562306a36Sopenharmony_ci default: 221662306a36Sopenharmony_ci return -EINVAL; 221762306a36Sopenharmony_ci } 221862306a36Sopenharmony_ci} 221962306a36Sopenharmony_ci 222062306a36Sopenharmony_cistatic int sparx5_serdes_config(struct sparx5_serdes_macro *macro) 222162306a36Sopenharmony_ci{ 222262306a36Sopenharmony_ci struct device *dev = macro->priv->dev; 222362306a36Sopenharmony_ci int serdesmode; 222462306a36Sopenharmony_ci int err; 222562306a36Sopenharmony_ci 222662306a36Sopenharmony_ci serdesmode = sparx5_serdes_get_serdesmode(macro->portmode, macro->speed); 222762306a36Sopenharmony_ci if (serdesmode < 0) { 222862306a36Sopenharmony_ci dev_err(dev, "SerDes %u, interface not supported: %s\n", 222962306a36Sopenharmony_ci macro->sidx, 223062306a36Sopenharmony_ci phy_modes(macro->portmode)); 223162306a36Sopenharmony_ci return serdesmode; 223262306a36Sopenharmony_ci } 223362306a36Sopenharmony_ci macro->serdesmode = serdesmode; 223462306a36Sopenharmony_ci 223562306a36Sopenharmony_ci sparx5_serdes_clock_config(macro); 223662306a36Sopenharmony_ci 223762306a36Sopenharmony_ci if (macro->serdestype == SPX5_SDT_25G) 223862306a36Sopenharmony_ci err = sparx5_sd25g28_config(macro, false); 223962306a36Sopenharmony_ci else 224062306a36Sopenharmony_ci err = sparx5_sd10g28_config(macro, false); 224162306a36Sopenharmony_ci if (err) { 224262306a36Sopenharmony_ci dev_err(dev, "SerDes %u, config error: %d\n", 224362306a36Sopenharmony_ci macro->sidx, err); 224462306a36Sopenharmony_ci } 224562306a36Sopenharmony_ci return err; 224662306a36Sopenharmony_ci} 224762306a36Sopenharmony_ci 224862306a36Sopenharmony_cistatic int sparx5_serdes_power_on(struct phy *phy) 224962306a36Sopenharmony_ci{ 225062306a36Sopenharmony_ci struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 225162306a36Sopenharmony_ci 225262306a36Sopenharmony_ci return sparx5_serdes_power_save(macro, false); 225362306a36Sopenharmony_ci} 225462306a36Sopenharmony_ci 225562306a36Sopenharmony_cistatic int sparx5_serdes_power_off(struct phy *phy) 225662306a36Sopenharmony_ci{ 225762306a36Sopenharmony_ci struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 225862306a36Sopenharmony_ci 225962306a36Sopenharmony_ci return sparx5_serdes_power_save(macro, true); 226062306a36Sopenharmony_ci} 226162306a36Sopenharmony_ci 226262306a36Sopenharmony_cistatic int sparx5_serdes_set_mode(struct phy *phy, enum phy_mode mode, int submode) 226362306a36Sopenharmony_ci{ 226462306a36Sopenharmony_ci struct sparx5_serdes_macro *macro; 226562306a36Sopenharmony_ci 226662306a36Sopenharmony_ci if (mode != PHY_MODE_ETHERNET) 226762306a36Sopenharmony_ci return -EINVAL; 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci switch (submode) { 227062306a36Sopenharmony_ci case PHY_INTERFACE_MODE_1000BASEX: 227162306a36Sopenharmony_ci case PHY_INTERFACE_MODE_2500BASEX: 227262306a36Sopenharmony_ci case PHY_INTERFACE_MODE_SGMII: 227362306a36Sopenharmony_ci case PHY_INTERFACE_MODE_QSGMII: 227462306a36Sopenharmony_ci case PHY_INTERFACE_MODE_10GBASER: 227562306a36Sopenharmony_ci macro = phy_get_drvdata(phy); 227662306a36Sopenharmony_ci macro->portmode = submode; 227762306a36Sopenharmony_ci sparx5_serdes_config(macro); 227862306a36Sopenharmony_ci return 0; 227962306a36Sopenharmony_ci default: 228062306a36Sopenharmony_ci return -EINVAL; 228162306a36Sopenharmony_ci } 228262306a36Sopenharmony_ci} 228362306a36Sopenharmony_ci 228462306a36Sopenharmony_cistatic int sparx5_serdes_set_media(struct phy *phy, enum phy_media media) 228562306a36Sopenharmony_ci{ 228662306a36Sopenharmony_ci struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 228762306a36Sopenharmony_ci 228862306a36Sopenharmony_ci if (media != macro->media) { 228962306a36Sopenharmony_ci macro->media = media; 229062306a36Sopenharmony_ci if (macro->serdesmode != SPX5_SD_MODE_NONE) 229162306a36Sopenharmony_ci sparx5_serdes_config(macro); 229262306a36Sopenharmony_ci } 229362306a36Sopenharmony_ci return 0; 229462306a36Sopenharmony_ci} 229562306a36Sopenharmony_ci 229662306a36Sopenharmony_cistatic int sparx5_serdes_set_speed(struct phy *phy, int speed) 229762306a36Sopenharmony_ci{ 229862306a36Sopenharmony_ci struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 229962306a36Sopenharmony_ci 230062306a36Sopenharmony_ci if (macro->sidx < SPX5_SERDES_10G_START && speed > SPEED_5000) 230162306a36Sopenharmony_ci return -EINVAL; 230262306a36Sopenharmony_ci if (macro->sidx < SPX5_SERDES_25G_START && speed > SPEED_10000) 230362306a36Sopenharmony_ci return -EINVAL; 230462306a36Sopenharmony_ci if (speed != macro->speed) { 230562306a36Sopenharmony_ci macro->speed = speed; 230662306a36Sopenharmony_ci if (macro->serdesmode != SPX5_SD_MODE_NONE) 230762306a36Sopenharmony_ci sparx5_serdes_config(macro); 230862306a36Sopenharmony_ci } 230962306a36Sopenharmony_ci return 0; 231062306a36Sopenharmony_ci} 231162306a36Sopenharmony_ci 231262306a36Sopenharmony_cistatic int sparx5_serdes_reset(struct phy *phy) 231362306a36Sopenharmony_ci{ 231462306a36Sopenharmony_ci struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 231562306a36Sopenharmony_ci int err; 231662306a36Sopenharmony_ci 231762306a36Sopenharmony_ci if (macro->serdestype == SPX5_SDT_25G) 231862306a36Sopenharmony_ci err = sparx5_sd25g28_config(macro, true); 231962306a36Sopenharmony_ci else 232062306a36Sopenharmony_ci err = sparx5_sd10g28_config(macro, true); 232162306a36Sopenharmony_ci if (err) { 232262306a36Sopenharmony_ci dev_err(&phy->dev, "SerDes %u, reset error: %d\n", 232362306a36Sopenharmony_ci macro->sidx, err); 232462306a36Sopenharmony_ci } 232562306a36Sopenharmony_ci return err; 232662306a36Sopenharmony_ci} 232762306a36Sopenharmony_ci 232862306a36Sopenharmony_cistatic int sparx5_serdes_validate(struct phy *phy, enum phy_mode mode, 232962306a36Sopenharmony_ci int submode, 233062306a36Sopenharmony_ci union phy_configure_opts *opts) 233162306a36Sopenharmony_ci{ 233262306a36Sopenharmony_ci struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 233362306a36Sopenharmony_ci 233462306a36Sopenharmony_ci if (mode != PHY_MODE_ETHERNET) 233562306a36Sopenharmony_ci return -EINVAL; 233662306a36Sopenharmony_ci 233762306a36Sopenharmony_ci if (macro->speed == 0) 233862306a36Sopenharmony_ci return -EINVAL; 233962306a36Sopenharmony_ci 234062306a36Sopenharmony_ci if (macro->sidx < SPX5_SERDES_10G_START && macro->speed > SPEED_5000) 234162306a36Sopenharmony_ci return -EINVAL; 234262306a36Sopenharmony_ci if (macro->sidx < SPX5_SERDES_25G_START && macro->speed > SPEED_10000) 234362306a36Sopenharmony_ci return -EINVAL; 234462306a36Sopenharmony_ci 234562306a36Sopenharmony_ci switch (submode) { 234662306a36Sopenharmony_ci case PHY_INTERFACE_MODE_1000BASEX: 234762306a36Sopenharmony_ci if (macro->speed != SPEED_100 && /* This is for 100BASE-FX */ 234862306a36Sopenharmony_ci macro->speed != SPEED_1000) 234962306a36Sopenharmony_ci return -EINVAL; 235062306a36Sopenharmony_ci break; 235162306a36Sopenharmony_ci case PHY_INTERFACE_MODE_SGMII: 235262306a36Sopenharmony_ci case PHY_INTERFACE_MODE_2500BASEX: 235362306a36Sopenharmony_ci case PHY_INTERFACE_MODE_QSGMII: 235462306a36Sopenharmony_ci if (macro->speed >= SPEED_5000) 235562306a36Sopenharmony_ci return -EINVAL; 235662306a36Sopenharmony_ci break; 235762306a36Sopenharmony_ci case PHY_INTERFACE_MODE_10GBASER: 235862306a36Sopenharmony_ci if (macro->speed < SPEED_5000) 235962306a36Sopenharmony_ci return -EINVAL; 236062306a36Sopenharmony_ci break; 236162306a36Sopenharmony_ci default: 236262306a36Sopenharmony_ci return -EINVAL; 236362306a36Sopenharmony_ci } 236462306a36Sopenharmony_ci return 0; 236562306a36Sopenharmony_ci} 236662306a36Sopenharmony_ci 236762306a36Sopenharmony_cistatic const struct phy_ops sparx5_serdes_ops = { 236862306a36Sopenharmony_ci .power_on = sparx5_serdes_power_on, 236962306a36Sopenharmony_ci .power_off = sparx5_serdes_power_off, 237062306a36Sopenharmony_ci .set_mode = sparx5_serdes_set_mode, 237162306a36Sopenharmony_ci .set_media = sparx5_serdes_set_media, 237262306a36Sopenharmony_ci .set_speed = sparx5_serdes_set_speed, 237362306a36Sopenharmony_ci .reset = sparx5_serdes_reset, 237462306a36Sopenharmony_ci .validate = sparx5_serdes_validate, 237562306a36Sopenharmony_ci .owner = THIS_MODULE, 237662306a36Sopenharmony_ci}; 237762306a36Sopenharmony_ci 237862306a36Sopenharmony_cistatic int sparx5_phy_create(struct sparx5_serdes_private *priv, 237962306a36Sopenharmony_ci int idx, struct phy **phy) 238062306a36Sopenharmony_ci{ 238162306a36Sopenharmony_ci struct sparx5_serdes_macro *macro; 238262306a36Sopenharmony_ci 238362306a36Sopenharmony_ci *phy = devm_phy_create(priv->dev, NULL, &sparx5_serdes_ops); 238462306a36Sopenharmony_ci if (IS_ERR(*phy)) 238562306a36Sopenharmony_ci return PTR_ERR(*phy); 238662306a36Sopenharmony_ci 238762306a36Sopenharmony_ci macro = devm_kzalloc(priv->dev, sizeof(*macro), GFP_KERNEL); 238862306a36Sopenharmony_ci if (!macro) 238962306a36Sopenharmony_ci return -ENOMEM; 239062306a36Sopenharmony_ci 239162306a36Sopenharmony_ci macro->sidx = idx; 239262306a36Sopenharmony_ci macro->priv = priv; 239362306a36Sopenharmony_ci macro->speed = SPEED_UNKNOWN; 239462306a36Sopenharmony_ci if (idx < SPX5_SERDES_10G_START) { 239562306a36Sopenharmony_ci macro->serdestype = SPX5_SDT_6G; 239662306a36Sopenharmony_ci macro->stpidx = macro->sidx; 239762306a36Sopenharmony_ci } else if (idx < SPX5_SERDES_25G_START) { 239862306a36Sopenharmony_ci macro->serdestype = SPX5_SDT_10G; 239962306a36Sopenharmony_ci macro->stpidx = macro->sidx - SPX5_SERDES_10G_START; 240062306a36Sopenharmony_ci } else { 240162306a36Sopenharmony_ci macro->serdestype = SPX5_SDT_25G; 240262306a36Sopenharmony_ci macro->stpidx = macro->sidx - SPX5_SERDES_25G_START; 240362306a36Sopenharmony_ci } 240462306a36Sopenharmony_ci 240562306a36Sopenharmony_ci phy_set_drvdata(*phy, macro); 240662306a36Sopenharmony_ci 240762306a36Sopenharmony_ci /* Power off serdes by default */ 240862306a36Sopenharmony_ci sparx5_serdes_power_off(*phy); 240962306a36Sopenharmony_ci 241062306a36Sopenharmony_ci return 0; 241162306a36Sopenharmony_ci} 241262306a36Sopenharmony_ci 241362306a36Sopenharmony_cistatic struct sparx5_serdes_io_resource sparx5_serdes_iomap[] = { 241462306a36Sopenharmony_ci { TARGET_SD_CMU, 0x0 }, /* 0x610808000: sd_cmu_0 */ 241562306a36Sopenharmony_ci { TARGET_SD_CMU + 1, 0x8000 }, /* 0x610810000: sd_cmu_1 */ 241662306a36Sopenharmony_ci { TARGET_SD_CMU + 2, 0x10000 }, /* 0x610818000: sd_cmu_2 */ 241762306a36Sopenharmony_ci { TARGET_SD_CMU + 3, 0x18000 }, /* 0x610820000: sd_cmu_3 */ 241862306a36Sopenharmony_ci { TARGET_SD_CMU + 4, 0x20000 }, /* 0x610828000: sd_cmu_4 */ 241962306a36Sopenharmony_ci { TARGET_SD_CMU + 5, 0x28000 }, /* 0x610830000: sd_cmu_5 */ 242062306a36Sopenharmony_ci { TARGET_SD_CMU + 6, 0x30000 }, /* 0x610838000: sd_cmu_6 */ 242162306a36Sopenharmony_ci { TARGET_SD_CMU + 7, 0x38000 }, /* 0x610840000: sd_cmu_7 */ 242262306a36Sopenharmony_ci { TARGET_SD_CMU + 8, 0x40000 }, /* 0x610848000: sd_cmu_8 */ 242362306a36Sopenharmony_ci { TARGET_SD_CMU_CFG, 0x48000 }, /* 0x610850000: sd_cmu_cfg_0 */ 242462306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 1, 0x50000 }, /* 0x610858000: sd_cmu_cfg_1 */ 242562306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 2, 0x58000 }, /* 0x610860000: sd_cmu_cfg_2 */ 242662306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 3, 0x60000 }, /* 0x610868000: sd_cmu_cfg_3 */ 242762306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 4, 0x68000 }, /* 0x610870000: sd_cmu_cfg_4 */ 242862306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 5, 0x70000 }, /* 0x610878000: sd_cmu_cfg_5 */ 242962306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 6, 0x78000 }, /* 0x610880000: sd_cmu_cfg_6 */ 243062306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 7, 0x80000 }, /* 0x610888000: sd_cmu_cfg_7 */ 243162306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 8, 0x88000 }, /* 0x610890000: sd_cmu_cfg_8 */ 243262306a36Sopenharmony_ci { TARGET_SD6G_LANE, 0x90000 }, /* 0x610898000: sd6g_lane_0 */ 243362306a36Sopenharmony_ci { TARGET_SD6G_LANE + 1, 0x98000 }, /* 0x6108a0000: sd6g_lane_1 */ 243462306a36Sopenharmony_ci { TARGET_SD6G_LANE + 2, 0xa0000 }, /* 0x6108a8000: sd6g_lane_2 */ 243562306a36Sopenharmony_ci { TARGET_SD6G_LANE + 3, 0xa8000 }, /* 0x6108b0000: sd6g_lane_3 */ 243662306a36Sopenharmony_ci { TARGET_SD6G_LANE + 4, 0xb0000 }, /* 0x6108b8000: sd6g_lane_4 */ 243762306a36Sopenharmony_ci { TARGET_SD6G_LANE + 5, 0xb8000 }, /* 0x6108c0000: sd6g_lane_5 */ 243862306a36Sopenharmony_ci { TARGET_SD6G_LANE + 6, 0xc0000 }, /* 0x6108c8000: sd6g_lane_6 */ 243962306a36Sopenharmony_ci { TARGET_SD6G_LANE + 7, 0xc8000 }, /* 0x6108d0000: sd6g_lane_7 */ 244062306a36Sopenharmony_ci { TARGET_SD6G_LANE + 8, 0xd0000 }, /* 0x6108d8000: sd6g_lane_8 */ 244162306a36Sopenharmony_ci { TARGET_SD6G_LANE + 9, 0xd8000 }, /* 0x6108e0000: sd6g_lane_9 */ 244262306a36Sopenharmony_ci { TARGET_SD6G_LANE + 10, 0xe0000 }, /* 0x6108e8000: sd6g_lane_10 */ 244362306a36Sopenharmony_ci { TARGET_SD6G_LANE + 11, 0xe8000 }, /* 0x6108f0000: sd6g_lane_11 */ 244462306a36Sopenharmony_ci { TARGET_SD6G_LANE + 12, 0xf0000 }, /* 0x6108f8000: sd6g_lane_12 */ 244562306a36Sopenharmony_ci { TARGET_SD10G_LANE, 0xf8000 }, /* 0x610900000: sd10g_lane_0 */ 244662306a36Sopenharmony_ci { TARGET_SD10G_LANE + 1, 0x100000 }, /* 0x610908000: sd10g_lane_1 */ 244762306a36Sopenharmony_ci { TARGET_SD10G_LANE + 2, 0x108000 }, /* 0x610910000: sd10g_lane_2 */ 244862306a36Sopenharmony_ci { TARGET_SD10G_LANE + 3, 0x110000 }, /* 0x610918000: sd10g_lane_3 */ 244962306a36Sopenharmony_ci { TARGET_SD_LANE, 0x1a0000 }, /* 0x6109a8000: sd_lane_0 */ 245062306a36Sopenharmony_ci { TARGET_SD_LANE + 1, 0x1a8000 }, /* 0x6109b0000: sd_lane_1 */ 245162306a36Sopenharmony_ci { TARGET_SD_LANE + 2, 0x1b0000 }, /* 0x6109b8000: sd_lane_2 */ 245262306a36Sopenharmony_ci { TARGET_SD_LANE + 3, 0x1b8000 }, /* 0x6109c0000: sd_lane_3 */ 245362306a36Sopenharmony_ci { TARGET_SD_LANE + 4, 0x1c0000 }, /* 0x6109c8000: sd_lane_4 */ 245462306a36Sopenharmony_ci { TARGET_SD_LANE + 5, 0x1c8000 }, /* 0x6109d0000: sd_lane_5 */ 245562306a36Sopenharmony_ci { TARGET_SD_LANE + 6, 0x1d0000 }, /* 0x6109d8000: sd_lane_6 */ 245662306a36Sopenharmony_ci { TARGET_SD_LANE + 7, 0x1d8000 }, /* 0x6109e0000: sd_lane_7 */ 245762306a36Sopenharmony_ci { TARGET_SD_LANE + 8, 0x1e0000 }, /* 0x6109e8000: sd_lane_8 */ 245862306a36Sopenharmony_ci { TARGET_SD_LANE + 9, 0x1e8000 }, /* 0x6109f0000: sd_lane_9 */ 245962306a36Sopenharmony_ci { TARGET_SD_LANE + 10, 0x1f0000 }, /* 0x6109f8000: sd_lane_10 */ 246062306a36Sopenharmony_ci { TARGET_SD_LANE + 11, 0x1f8000 }, /* 0x610a00000: sd_lane_11 */ 246162306a36Sopenharmony_ci { TARGET_SD_LANE + 12, 0x200000 }, /* 0x610a08000: sd_lane_12 */ 246262306a36Sopenharmony_ci { TARGET_SD_LANE + 13, 0x208000 }, /* 0x610a10000: sd_lane_13 */ 246362306a36Sopenharmony_ci { TARGET_SD_LANE + 14, 0x210000 }, /* 0x610a18000: sd_lane_14 */ 246462306a36Sopenharmony_ci { TARGET_SD_LANE + 15, 0x218000 }, /* 0x610a20000: sd_lane_15 */ 246562306a36Sopenharmony_ci { TARGET_SD_LANE + 16, 0x220000 }, /* 0x610a28000: sd_lane_16 */ 246662306a36Sopenharmony_ci { TARGET_SD_CMU + 9, 0x400000 }, /* 0x610c08000: sd_cmu_9 */ 246762306a36Sopenharmony_ci { TARGET_SD_CMU + 10, 0x408000 }, /* 0x610c10000: sd_cmu_10 */ 246862306a36Sopenharmony_ci { TARGET_SD_CMU + 11, 0x410000 }, /* 0x610c18000: sd_cmu_11 */ 246962306a36Sopenharmony_ci { TARGET_SD_CMU + 12, 0x418000 }, /* 0x610c20000: sd_cmu_12 */ 247062306a36Sopenharmony_ci { TARGET_SD_CMU + 13, 0x420000 }, /* 0x610c28000: sd_cmu_13 */ 247162306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 9, 0x428000 }, /* 0x610c30000: sd_cmu_cfg_9 */ 247262306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 10, 0x430000 }, /* 0x610c38000: sd_cmu_cfg_10 */ 247362306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 11, 0x438000 }, /* 0x610c40000: sd_cmu_cfg_11 */ 247462306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 12, 0x440000 }, /* 0x610c48000: sd_cmu_cfg_12 */ 247562306a36Sopenharmony_ci { TARGET_SD_CMU_CFG + 13, 0x448000 }, /* 0x610c50000: sd_cmu_cfg_13 */ 247662306a36Sopenharmony_ci { TARGET_SD10G_LANE + 4, 0x450000 }, /* 0x610c58000: sd10g_lane_4 */ 247762306a36Sopenharmony_ci { TARGET_SD10G_LANE + 5, 0x458000 }, /* 0x610c60000: sd10g_lane_5 */ 247862306a36Sopenharmony_ci { TARGET_SD10G_LANE + 6, 0x460000 }, /* 0x610c68000: sd10g_lane_6 */ 247962306a36Sopenharmony_ci { TARGET_SD10G_LANE + 7, 0x468000 }, /* 0x610c70000: sd10g_lane_7 */ 248062306a36Sopenharmony_ci { TARGET_SD10G_LANE + 8, 0x470000 }, /* 0x610c78000: sd10g_lane_8 */ 248162306a36Sopenharmony_ci { TARGET_SD10G_LANE + 9, 0x478000 }, /* 0x610c80000: sd10g_lane_9 */ 248262306a36Sopenharmony_ci { TARGET_SD10G_LANE + 10, 0x480000 }, /* 0x610c88000: sd10g_lane_10 */ 248362306a36Sopenharmony_ci { TARGET_SD10G_LANE + 11, 0x488000 }, /* 0x610c90000: sd10g_lane_11 */ 248462306a36Sopenharmony_ci { TARGET_SD25G_LANE, 0x490000 }, /* 0x610c98000: sd25g_lane_0 */ 248562306a36Sopenharmony_ci { TARGET_SD25G_LANE + 1, 0x498000 }, /* 0x610ca0000: sd25g_lane_1 */ 248662306a36Sopenharmony_ci { TARGET_SD25G_LANE + 2, 0x4a0000 }, /* 0x610ca8000: sd25g_lane_2 */ 248762306a36Sopenharmony_ci { TARGET_SD25G_LANE + 3, 0x4a8000 }, /* 0x610cb0000: sd25g_lane_3 */ 248862306a36Sopenharmony_ci { TARGET_SD25G_LANE + 4, 0x4b0000 }, /* 0x610cb8000: sd25g_lane_4 */ 248962306a36Sopenharmony_ci { TARGET_SD25G_LANE + 5, 0x4b8000 }, /* 0x610cc0000: sd25g_lane_5 */ 249062306a36Sopenharmony_ci { TARGET_SD25G_LANE + 6, 0x4c0000 }, /* 0x610cc8000: sd25g_lane_6 */ 249162306a36Sopenharmony_ci { TARGET_SD25G_LANE + 7, 0x4c8000 }, /* 0x610cd0000: sd25g_lane_7 */ 249262306a36Sopenharmony_ci { TARGET_SD_LANE + 17, 0x550000 }, /* 0x610d58000: sd_lane_17 */ 249362306a36Sopenharmony_ci { TARGET_SD_LANE + 18, 0x558000 }, /* 0x610d60000: sd_lane_18 */ 249462306a36Sopenharmony_ci { TARGET_SD_LANE + 19, 0x560000 }, /* 0x610d68000: sd_lane_19 */ 249562306a36Sopenharmony_ci { TARGET_SD_LANE + 20, 0x568000 }, /* 0x610d70000: sd_lane_20 */ 249662306a36Sopenharmony_ci { TARGET_SD_LANE + 21, 0x570000 }, /* 0x610d78000: sd_lane_21 */ 249762306a36Sopenharmony_ci { TARGET_SD_LANE + 22, 0x578000 }, /* 0x610d80000: sd_lane_22 */ 249862306a36Sopenharmony_ci { TARGET_SD_LANE + 23, 0x580000 }, /* 0x610d88000: sd_lane_23 */ 249962306a36Sopenharmony_ci { TARGET_SD_LANE + 24, 0x588000 }, /* 0x610d90000: sd_lane_24 */ 250062306a36Sopenharmony_ci { TARGET_SD_LANE_25G, 0x590000 }, /* 0x610d98000: sd_lane_25g_25 */ 250162306a36Sopenharmony_ci { TARGET_SD_LANE_25G + 1, 0x598000 }, /* 0x610da0000: sd_lane_25g_26 */ 250262306a36Sopenharmony_ci { TARGET_SD_LANE_25G + 2, 0x5a0000 }, /* 0x610da8000: sd_lane_25g_27 */ 250362306a36Sopenharmony_ci { TARGET_SD_LANE_25G + 3, 0x5a8000 }, /* 0x610db0000: sd_lane_25g_28 */ 250462306a36Sopenharmony_ci { TARGET_SD_LANE_25G + 4, 0x5b0000 }, /* 0x610db8000: sd_lane_25g_29 */ 250562306a36Sopenharmony_ci { TARGET_SD_LANE_25G + 5, 0x5b8000 }, /* 0x610dc0000: sd_lane_25g_30 */ 250662306a36Sopenharmony_ci { TARGET_SD_LANE_25G + 6, 0x5c0000 }, /* 0x610dc8000: sd_lane_25g_31 */ 250762306a36Sopenharmony_ci { TARGET_SD_LANE_25G + 7, 0x5c8000 }, /* 0x610dd0000: sd_lane_25g_32 */ 250862306a36Sopenharmony_ci}; 250962306a36Sopenharmony_ci 251062306a36Sopenharmony_ci/* Client lookup function, uses serdes index */ 251162306a36Sopenharmony_cistatic struct phy *sparx5_serdes_xlate(struct device *dev, 251262306a36Sopenharmony_ci struct of_phandle_args *args) 251362306a36Sopenharmony_ci{ 251462306a36Sopenharmony_ci struct sparx5_serdes_private *priv = dev_get_drvdata(dev); 251562306a36Sopenharmony_ci int idx; 251662306a36Sopenharmony_ci unsigned int sidx; 251762306a36Sopenharmony_ci 251862306a36Sopenharmony_ci if (args->args_count != 1) 251962306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 252062306a36Sopenharmony_ci 252162306a36Sopenharmony_ci sidx = args->args[0]; 252262306a36Sopenharmony_ci 252362306a36Sopenharmony_ci /* Check validity: ERR_PTR(-ENODEV) if not valid */ 252462306a36Sopenharmony_ci for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 252562306a36Sopenharmony_ci struct sparx5_serdes_macro *macro = 252662306a36Sopenharmony_ci phy_get_drvdata(priv->phys[idx]); 252762306a36Sopenharmony_ci 252862306a36Sopenharmony_ci if (sidx != macro->sidx) 252962306a36Sopenharmony_ci continue; 253062306a36Sopenharmony_ci 253162306a36Sopenharmony_ci return priv->phys[idx]; 253262306a36Sopenharmony_ci } 253362306a36Sopenharmony_ci return ERR_PTR(-ENODEV); 253462306a36Sopenharmony_ci} 253562306a36Sopenharmony_ci 253662306a36Sopenharmony_cistatic int sparx5_serdes_probe(struct platform_device *pdev) 253762306a36Sopenharmony_ci{ 253862306a36Sopenharmony_ci struct device_node *np = pdev->dev.of_node; 253962306a36Sopenharmony_ci struct sparx5_serdes_private *priv; 254062306a36Sopenharmony_ci struct phy_provider *provider; 254162306a36Sopenharmony_ci struct resource *iores; 254262306a36Sopenharmony_ci void __iomem *iomem; 254362306a36Sopenharmony_ci unsigned long clock; 254462306a36Sopenharmony_ci struct clk *clk; 254562306a36Sopenharmony_ci int idx; 254662306a36Sopenharmony_ci int err; 254762306a36Sopenharmony_ci 254862306a36Sopenharmony_ci if (!np && !pdev->dev.platform_data) 254962306a36Sopenharmony_ci return -ENODEV; 255062306a36Sopenharmony_ci 255162306a36Sopenharmony_ci priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 255262306a36Sopenharmony_ci if (!priv) 255362306a36Sopenharmony_ci return -ENOMEM; 255462306a36Sopenharmony_ci 255562306a36Sopenharmony_ci platform_set_drvdata(pdev, priv); 255662306a36Sopenharmony_ci priv->dev = &pdev->dev; 255762306a36Sopenharmony_ci 255862306a36Sopenharmony_ci /* Get coreclock */ 255962306a36Sopenharmony_ci clk = devm_clk_get(priv->dev, NULL); 256062306a36Sopenharmony_ci if (IS_ERR(clk)) { 256162306a36Sopenharmony_ci dev_err(priv->dev, "Failed to get coreclock\n"); 256262306a36Sopenharmony_ci return PTR_ERR(clk); 256362306a36Sopenharmony_ci } 256462306a36Sopenharmony_ci clock = clk_get_rate(clk); 256562306a36Sopenharmony_ci if (clock == 0) { 256662306a36Sopenharmony_ci dev_err(priv->dev, "Invalid coreclock %lu\n", clock); 256762306a36Sopenharmony_ci return -EINVAL; 256862306a36Sopenharmony_ci } 256962306a36Sopenharmony_ci priv->coreclock = clock; 257062306a36Sopenharmony_ci 257162306a36Sopenharmony_ci iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); 257262306a36Sopenharmony_ci if (!iores) { 257362306a36Sopenharmony_ci dev_err(priv->dev, "Invalid resource\n"); 257462306a36Sopenharmony_ci return -EINVAL; 257562306a36Sopenharmony_ci } 257662306a36Sopenharmony_ci iomem = devm_ioremap(priv->dev, iores->start, resource_size(iores)); 257762306a36Sopenharmony_ci if (!iomem) { 257862306a36Sopenharmony_ci dev_err(priv->dev, "Unable to get serdes registers: %s\n", 257962306a36Sopenharmony_ci iores->name); 258062306a36Sopenharmony_ci return -ENOMEM; 258162306a36Sopenharmony_ci } 258262306a36Sopenharmony_ci for (idx = 0; idx < ARRAY_SIZE(sparx5_serdes_iomap); idx++) { 258362306a36Sopenharmony_ci struct sparx5_serdes_io_resource *iomap = &sparx5_serdes_iomap[idx]; 258462306a36Sopenharmony_ci 258562306a36Sopenharmony_ci priv->regs[iomap->id] = iomem + iomap->offset; 258662306a36Sopenharmony_ci } 258762306a36Sopenharmony_ci for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 258862306a36Sopenharmony_ci err = sparx5_phy_create(priv, idx, &priv->phys[idx]); 258962306a36Sopenharmony_ci if (err) 259062306a36Sopenharmony_ci return err; 259162306a36Sopenharmony_ci } 259262306a36Sopenharmony_ci 259362306a36Sopenharmony_ci /* Power down all CMUs by default */ 259462306a36Sopenharmony_ci sparx5_serdes_cmu_power_off(priv); 259562306a36Sopenharmony_ci 259662306a36Sopenharmony_ci provider = devm_of_phy_provider_register(priv->dev, sparx5_serdes_xlate); 259762306a36Sopenharmony_ci 259862306a36Sopenharmony_ci return PTR_ERR_OR_ZERO(provider); 259962306a36Sopenharmony_ci} 260062306a36Sopenharmony_ci 260162306a36Sopenharmony_cistatic const struct of_device_id sparx5_serdes_match[] = { 260262306a36Sopenharmony_ci { .compatible = "microchip,sparx5-serdes" }, 260362306a36Sopenharmony_ci { } 260462306a36Sopenharmony_ci}; 260562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, sparx5_serdes_match); 260662306a36Sopenharmony_ci 260762306a36Sopenharmony_cistatic struct platform_driver sparx5_serdes_driver = { 260862306a36Sopenharmony_ci .probe = sparx5_serdes_probe, 260962306a36Sopenharmony_ci .driver = { 261062306a36Sopenharmony_ci .name = "sparx5-serdes", 261162306a36Sopenharmony_ci .of_match_table = sparx5_serdes_match, 261262306a36Sopenharmony_ci }, 261362306a36Sopenharmony_ci}; 261462306a36Sopenharmony_ci 261562306a36Sopenharmony_cimodule_platform_driver(sparx5_serdes_driver); 261662306a36Sopenharmony_ci 261762306a36Sopenharmony_ciMODULE_DESCRIPTION("Microchip Sparx5 switch serdes driver"); 261862306a36Sopenharmony_ciMODULE_AUTHOR("Steen Hegelund <steen.hegelund@microchip.com>"); 261962306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 2620