12ff8a1eeSSteen Hegelund // SPDX-License-Identifier: GPL-2.0-or-later 22ff8a1eeSSteen Hegelund /* Microchip Sparx5 Switch SerDes driver 32ff8a1eeSSteen Hegelund * 42ff8a1eeSSteen Hegelund * Copyright (c) 2020 Microchip Technology Inc. and its subsidiaries. 52ff8a1eeSSteen Hegelund * 62ff8a1eeSSteen Hegelund * The Sparx5 Chip Register Model can be browsed at this location: 72ff8a1eeSSteen Hegelund * https://github.com/microchip-ung/sparx-5_reginfo 82ff8a1eeSSteen Hegelund * and the datasheet is available here: 92ff8a1eeSSteen Hegelund * https://ww1.microchip.com/downloads/en/DeviceDoc/SparX-5_Family_L2L3_Enterprise_10G_Ethernet_Switches_Datasheet_00003822B.pdf 102ff8a1eeSSteen Hegelund */ 112ff8a1eeSSteen Hegelund #include <linux/printk.h> 122ff8a1eeSSteen Hegelund #include <linux/module.h> 132ff8a1eeSSteen Hegelund #include <linux/device.h> 142ff8a1eeSSteen Hegelund #include <linux/netdevice.h> 152ff8a1eeSSteen Hegelund #include <linux/platform_device.h> 162ff8a1eeSSteen Hegelund #include <linux/of.h> 172ff8a1eeSSteen Hegelund #include <linux/io.h> 182ff8a1eeSSteen Hegelund #include <linux/clk.h> 192ff8a1eeSSteen Hegelund #include <linux/phy.h> 202ff8a1eeSSteen Hegelund #include <linux/phy/phy.h> 212ff8a1eeSSteen Hegelund 222ff8a1eeSSteen Hegelund #include "sparx5_serdes.h" 232ff8a1eeSSteen Hegelund 242ff8a1eeSSteen Hegelund #define SPX5_CMU_MAX 14 252ff8a1eeSSteen Hegelund 262ff8a1eeSSteen Hegelund #define SPX5_SERDES_10G_START 13 272ff8a1eeSSteen Hegelund #define SPX5_SERDES_25G_START 25 282ff8a1eeSSteen Hegelund 293d61a1f8SDaniel Machon /* Optimal power settings from GUC */ 303d61a1f8SDaniel Machon #define SPX5_SERDES_QUIET_MODE_VAL 0x01ef4e0c 313d61a1f8SDaniel Machon 322ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode { 332ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_MAIN = 0, 342ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_AUX1 = 1, 352ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_AUX2 = 3, 362ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_NONE = 4, 372ff8a1eeSSteen Hegelund }; 382ff8a1eeSSteen Hegelund 392ff8a1eeSSteen Hegelund enum sparx5_sd25g28_mode_preset_type { 402ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_25000, 412ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_10000, 422ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_5000, 432ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_SD_2G5, 442ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_1000BASEX, 452ff8a1eeSSteen Hegelund }; 462ff8a1eeSSteen Hegelund 472ff8a1eeSSteen Hegelund enum sparx5_sd10g28_mode_preset_type { 482ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_10000, 492ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SFI_5000_6G, 502ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SFI_5000_10G, 512ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_QSGMII, 522ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SD_2G5, 532ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_1000BASEX, 542ff8a1eeSSteen Hegelund }; 552ff8a1eeSSteen Hegelund 562ff8a1eeSSteen Hegelund struct sparx5_serdes_io_resource { 572ff8a1eeSSteen Hegelund enum sparx5_serdes_target id; 582ff8a1eeSSteen Hegelund phys_addr_t offset; 592ff8a1eeSSteen Hegelund }; 602ff8a1eeSSteen Hegelund 612ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset { 622ff8a1eeSSteen Hegelund u8 bitwidth; 632ff8a1eeSSteen Hegelund u8 tx_pre_div; 642ff8a1eeSSteen Hegelund u8 fifo_ck_div; 652ff8a1eeSSteen Hegelund u8 pre_divsel; 662ff8a1eeSSteen Hegelund u8 vco_div_mode; 672ff8a1eeSSteen Hegelund u8 sel_div; 682ff8a1eeSSteen Hegelund u8 ck_bitwidth; 692ff8a1eeSSteen Hegelund u8 subrate; 702ff8a1eeSSteen Hegelund u8 com_txcal_en; 712ff8a1eeSSteen Hegelund u8 com_tx_reserve_msb; 722ff8a1eeSSteen Hegelund u8 com_tx_reserve_lsb; 732ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base; 742ff8a1eeSSteen Hegelund u8 tx_reserve_lsb; 752ff8a1eeSSteen Hegelund u8 tx_reserve_msb; 762ff8a1eeSSteen Hegelund u8 bw; 772ff8a1eeSSteen Hegelund u8 rxterm; 782ff8a1eeSSteen Hegelund u8 dfe_tap; 792ff8a1eeSSteen Hegelund u8 dfe_enable; 802ff8a1eeSSteen Hegelund bool txmargin; 812ff8a1eeSSteen Hegelund u8 cfg_ctle_rstn; 822ff8a1eeSSteen Hegelund u8 r_dfe_rstn; 832ff8a1eeSSteen Hegelund u8 cfg_pi_bw_3_0; 842ff8a1eeSSteen Hegelund u8 tx_tap_dly; 852ff8a1eeSSteen Hegelund u8 tx_tap_adv; 862ff8a1eeSSteen Hegelund }; 872ff8a1eeSSteen Hegelund 882ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset { 892ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 902ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_byp_4_0; 912ff8a1eeSSteen Hegelund u8 cfg_eq_r_force_3_0; 922ff8a1eeSSteen Hegelund u8 cfg_en_adv; 932ff8a1eeSSteen Hegelund u8 cfg_en_main; 942ff8a1eeSSteen Hegelund u8 cfg_en_dly; 952ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 962ff8a1eeSSteen Hegelund u8 cfg_tap_main; 972ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 982ff8a1eeSSteen Hegelund u8 cfg_alos_thr_2_0; 992ff8a1eeSSteen Hegelund }; 1002ff8a1eeSSteen Hegelund 1012ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args { 1022ff8a1eeSSteen Hegelund u8 if_width; /* UDL if-width: 10/16/20/32/64 */ 1032ff8a1eeSSteen Hegelund bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 1042ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 1052ff8a1eeSSteen Hegelund bool no_pwrcycle:1; /* Omit initial power-cycle */ 1062ff8a1eeSSteen Hegelund bool txinvert:1; /* Enable inversion of output data */ 1072ff8a1eeSSteen Hegelund bool rxinvert:1; /* Enable inversion of input data */ 1082ff8a1eeSSteen Hegelund u16 txswing; /* Set output level */ 1092ff8a1eeSSteen Hegelund u8 rate; /* Rate of network interface */ 1102ff8a1eeSSteen Hegelund u8 pi_bw_gen1; 1112ff8a1eeSSteen Hegelund u8 duty_cycle; /* Set output level to half/full */ 1122ff8a1eeSSteen Hegelund bool mute:1; /* Mute Output Buffer */ 1132ff8a1eeSSteen Hegelund bool reg_rst:1; 1142ff8a1eeSSteen Hegelund u8 com_pll_reserve; 1152ff8a1eeSSteen Hegelund }; 1162ff8a1eeSSteen Hegelund 1172ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params { 1182ff8a1eeSSteen Hegelund u8 reg_rst; 1192ff8a1eeSSteen Hegelund u8 cfg_jc_byp; 1202ff8a1eeSSteen Hegelund u8 cfg_common_reserve_7_0; 1212ff8a1eeSSteen Hegelund u8 r_reg_manual; 1222ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_from_hwt; 1232ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_2_0; 1242ff8a1eeSSteen Hegelund u8 r_txfifo_ck_div_pmad_2_0; 1252ff8a1eeSSteen Hegelund u8 r_rxfifo_ck_div_pmad_2_0; 1262ff8a1eeSSteen Hegelund u8 cfg_pll_lol_set; 1272ff8a1eeSSteen Hegelund u8 cfg_vco_div_mode_1_0; 1282ff8a1eeSSteen Hegelund u8 cfg_pre_divsel_1_0; 1292ff8a1eeSSteen Hegelund u8 cfg_sel_div_3_0; 1302ff8a1eeSSteen Hegelund u8 cfg_vco_start_code_3_0; 1312ff8a1eeSSteen Hegelund u8 cfg_pma_tx_ck_bitwidth_2_0; 1322ff8a1eeSSteen Hegelund u8 cfg_tx_prediv_1_0; 1332ff8a1eeSSteen Hegelund u8 cfg_rxdiv_sel_2_0; 1342ff8a1eeSSteen Hegelund u8 cfg_tx_subrate_2_0; 1352ff8a1eeSSteen Hegelund u8 cfg_rx_subrate_2_0; 1362ff8a1eeSSteen Hegelund u8 r_multi_lane_mode; 1372ff8a1eeSSteen Hegelund u8 cfg_cdrck_en; 1382ff8a1eeSSteen Hegelund u8 cfg_dfeck_en; 1392ff8a1eeSSteen Hegelund u8 cfg_dfe_pd; 1402ff8a1eeSSteen Hegelund u8 cfg_dfedmx_pd; 1412ff8a1eeSSteen Hegelund u8 cfg_dfetap_en_5_1; 1422ff8a1eeSSteen Hegelund u8 cfg_dmux_pd; 1432ff8a1eeSSteen Hegelund u8 cfg_dmux_clk_pd; 1442ff8a1eeSSteen Hegelund u8 cfg_erramp_pd; 1452ff8a1eeSSteen Hegelund u8 cfg_pi_dfe_en; 1462ff8a1eeSSteen Hegelund u8 cfg_pi_en; 1472ff8a1eeSSteen Hegelund u8 cfg_pd_ctle; 1482ff8a1eeSSteen Hegelund u8 cfg_summer_en; 1492ff8a1eeSSteen Hegelund u8 cfg_pmad_ck_pd; 1502ff8a1eeSSteen Hegelund u8 cfg_pd_clk; 1512ff8a1eeSSteen Hegelund u8 cfg_pd_cml; 1522ff8a1eeSSteen Hegelund u8 cfg_pd_driver; 1532ff8a1eeSSteen Hegelund u8 cfg_rx_reg_pu; 1542ff8a1eeSSteen Hegelund u8 cfg_pd_rms_det; 1552ff8a1eeSSteen Hegelund u8 cfg_dcdr_pd; 1562ff8a1eeSSteen Hegelund u8 cfg_ecdr_pd; 1572ff8a1eeSSteen Hegelund u8 cfg_pd_sq; 1582ff8a1eeSSteen Hegelund u8 cfg_itx_ipdriver_base_2_0; 1592ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 1602ff8a1eeSSteen Hegelund u8 cfg_tap_main; 1612ff8a1eeSSteen Hegelund u8 cfg_en_main; 1622ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 1632ff8a1eeSSteen Hegelund u8 cfg_en_adv; 1642ff8a1eeSSteen Hegelund u8 cfg_en_dly; 1652ff8a1eeSSteen Hegelund u8 cfg_iscan_en; 1662ff8a1eeSSteen Hegelund u8 l1_pcs_en_fast_iscan; 1672ff8a1eeSSteen Hegelund u8 l0_cfg_bw_1_0; 1682ff8a1eeSSteen Hegelund u8 l0_cfg_txcal_en; 1692ff8a1eeSSteen Hegelund u8 cfg_en_dummy; 1702ff8a1eeSSteen Hegelund u8 cfg_pll_reserve_3_0; 1712ff8a1eeSSteen Hegelund u8 l0_cfg_tx_reserve_15_8; 1722ff8a1eeSSteen Hegelund u8 l0_cfg_tx_reserve_7_0; 1732ff8a1eeSSteen Hegelund u8 cfg_tx_reserve_15_8; 1742ff8a1eeSSteen Hegelund u8 cfg_tx_reserve_7_0; 1752ff8a1eeSSteen Hegelund u8 cfg_bw_1_0; 1762ff8a1eeSSteen Hegelund u8 cfg_txcal_man_en; 1772ff8a1eeSSteen Hegelund u8 cfg_phase_man_4_0; 1782ff8a1eeSSteen Hegelund u8 cfg_quad_man_1_0; 1792ff8a1eeSSteen Hegelund u8 cfg_txcal_shift_code_5_0; 1802ff8a1eeSSteen Hegelund u8 cfg_txcal_valid_sel_3_0; 1812ff8a1eeSSteen Hegelund u8 cfg_txcal_en; 1822ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_2_0; 1832ff8a1eeSSteen Hegelund u8 cfg_cdr_m_7_0; 1842ff8a1eeSSteen Hegelund u8 cfg_pi_bw_3_0; 1852ff8a1eeSSteen Hegelund u8 cfg_pi_steps_1_0; 1862ff8a1eeSSteen Hegelund u8 cfg_dis_2ndorder; 1872ff8a1eeSSteen Hegelund u8 cfg_ctle_rstn; 1882ff8a1eeSSteen Hegelund u8 r_dfe_rstn; 1892ff8a1eeSSteen Hegelund u8 cfg_alos_thr_2_0; 1902ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base_1_0; 1912ff8a1eeSSteen Hegelund u8 cfg_rx_reserve_7_0; 1922ff8a1eeSSteen Hegelund u8 cfg_rx_reserve_15_8; 1932ff8a1eeSSteen Hegelund u8 cfg_rxterm_2_0; 1942ff8a1eeSSteen Hegelund u8 cfg_fom_selm; 1952ff8a1eeSSteen Hegelund u8 cfg_rx_sp_ctle_1_0; 1962ff8a1eeSSteen Hegelund u8 cfg_isel_ctle_1_0; 1972ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_byp_4_0; 1982ff8a1eeSSteen Hegelund u8 cfg_vga_byp; 1992ff8a1eeSSteen Hegelund u8 cfg_agc_adpt_byp; 2002ff8a1eeSSteen Hegelund u8 cfg_eqr_byp; 2012ff8a1eeSSteen Hegelund u8 cfg_eqr_force_3_0; 2022ff8a1eeSSteen Hegelund u8 cfg_eqc_force_3_0; 2032ff8a1eeSSteen Hegelund u8 cfg_sum_setcm_en; 2042ff8a1eeSSteen Hegelund u8 cfg_init_pos_iscan_6_0; 2052ff8a1eeSSteen Hegelund u8 cfg_init_pos_ipi_6_0; 2062ff8a1eeSSteen Hegelund u8 cfg_dfedig_m_2_0; 2072ff8a1eeSSteen Hegelund u8 cfg_en_dfedig; 2082ff8a1eeSSteen Hegelund u8 cfg_pi_DFE_en; 2092ff8a1eeSSteen Hegelund u8 cfg_tx2rx_lp_en; 2102ff8a1eeSSteen Hegelund u8 cfg_txlb_en; 2112ff8a1eeSSteen Hegelund u8 cfg_rx2tx_lp_en; 2122ff8a1eeSSteen Hegelund u8 cfg_rxlb_en; 2132ff8a1eeSSteen Hegelund u8 r_tx_pol_inv; 2142ff8a1eeSSteen Hegelund u8 r_rx_pol_inv; 2152ff8a1eeSSteen Hegelund }; 2162ff8a1eeSSteen Hegelund 2172ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset { 2182ff8a1eeSSteen Hegelund u8 cfg_en_adv; 2192ff8a1eeSSteen Hegelund u8 cfg_en_main; 2202ff8a1eeSSteen Hegelund u8 cfg_en_dly; 2212ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 2222ff8a1eeSSteen Hegelund u8 cfg_tap_main; 2232ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 2242ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_3_0; 2252ff8a1eeSSteen Hegelund u8 cfg_vga_cp_2_0; 2262ff8a1eeSSteen Hegelund u8 cfg_eq_res_3_0; 2272ff8a1eeSSteen Hegelund u8 cfg_eq_r_byp; 2282ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 2292ff8a1eeSSteen Hegelund u8 cfg_alos_thr_3_0; 2302ff8a1eeSSteen Hegelund }; 2312ff8a1eeSSteen Hegelund 2322ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset { 2332ff8a1eeSSteen Hegelund u8 bwidth; /* interface width: 10/16/20/32/64 */ 2342ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 2352ff8a1eeSSteen Hegelund u8 rate; /* Rate of network interface */ 2362ff8a1eeSSteen Hegelund u8 dfe_tap; 2372ff8a1eeSSteen Hegelund u8 dfe_enable; 2382ff8a1eeSSteen Hegelund u8 pi_bw_gen1; 2392ff8a1eeSSteen Hegelund u8 duty_cycle; /* Set output level to half/full */ 2402ff8a1eeSSteen Hegelund }; 2412ff8a1eeSSteen Hegelund 2422ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args { 2432ff8a1eeSSteen Hegelund bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 2442ff8a1eeSSteen Hegelund bool no_pwrcycle:1; /* Omit initial power-cycle */ 2452ff8a1eeSSteen Hegelund bool txinvert:1; /* Enable inversion of output data */ 2462ff8a1eeSSteen Hegelund bool rxinvert:1; /* Enable inversion of input data */ 2472ff8a1eeSSteen Hegelund bool txmargin:1; /* Set output level to half/full */ 2482ff8a1eeSSteen Hegelund u16 txswing; /* Set output level */ 2492ff8a1eeSSteen Hegelund bool mute:1; /* Mute Output Buffer */ 2502ff8a1eeSSteen Hegelund bool is_6g:1; 2512ff8a1eeSSteen Hegelund bool reg_rst:1; 2522ff8a1eeSSteen Hegelund }; 2532ff8a1eeSSteen Hegelund 2542ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params { 2552ff8a1eeSSteen Hegelund u8 cmu_sel; 2562ff8a1eeSSteen Hegelund u8 is_6g; 2572ff8a1eeSSteen Hegelund u8 skip_cmu_cfg; 2582ff8a1eeSSteen Hegelund u8 cfg_lane_reserve_7_0; 2592ff8a1eeSSteen Hegelund u8 cfg_ssc_rtl_clk_sel; 2602ff8a1eeSSteen Hegelund u8 cfg_lane_reserve_15_8; 2612ff8a1eeSSteen Hegelund u8 cfg_txrate_1_0; 2622ff8a1eeSSteen Hegelund u8 cfg_rxrate_1_0; 2632ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_2_0; 2642ff8a1eeSSteen Hegelund u8 cfg_pma_tx_ck_bitwidth_2_0; 2652ff8a1eeSSteen Hegelund u8 cfg_rxdiv_sel_2_0; 2662ff8a1eeSSteen Hegelund u8 r_pcs2pma_phymode_4_0; 2672ff8a1eeSSteen Hegelund u8 cfg_lane_id_2_0; 2682ff8a1eeSSteen Hegelund u8 cfg_cdrck_en; 2692ff8a1eeSSteen Hegelund u8 cfg_dfeck_en; 2702ff8a1eeSSteen Hegelund u8 cfg_dfe_pd; 2712ff8a1eeSSteen Hegelund u8 cfg_dfetap_en_5_1; 2722ff8a1eeSSteen Hegelund u8 cfg_erramp_pd; 2732ff8a1eeSSteen Hegelund u8 cfg_pi_DFE_en; 2742ff8a1eeSSteen Hegelund u8 cfg_pi_en; 2752ff8a1eeSSteen Hegelund u8 cfg_pd_ctle; 2762ff8a1eeSSteen Hegelund u8 cfg_summer_en; 2772ff8a1eeSSteen Hegelund u8 cfg_pd_rx_cktree; 2782ff8a1eeSSteen Hegelund u8 cfg_pd_clk; 2792ff8a1eeSSteen Hegelund u8 cfg_pd_cml; 2802ff8a1eeSSteen Hegelund u8 cfg_pd_driver; 2812ff8a1eeSSteen Hegelund u8 cfg_rx_reg_pu; 2822ff8a1eeSSteen Hegelund u8 cfg_d_cdr_pd; 2832ff8a1eeSSteen Hegelund u8 cfg_pd_sq; 2842ff8a1eeSSteen Hegelund u8 cfg_rxdet_en; 2852ff8a1eeSSteen Hegelund u8 cfg_rxdet_str; 2862ff8a1eeSSteen Hegelund u8 r_multi_lane_mode; 2872ff8a1eeSSteen Hegelund u8 cfg_en_adv; 2882ff8a1eeSSteen Hegelund u8 cfg_en_main; 2892ff8a1eeSSteen Hegelund u8 cfg_en_dly; 2902ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 2912ff8a1eeSSteen Hegelund u8 cfg_tap_main; 2922ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 2932ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_3_0; 2942ff8a1eeSSteen Hegelund u8 cfg_vga_cp_2_0; 2952ff8a1eeSSteen Hegelund u8 cfg_eq_res_3_0; 2962ff8a1eeSSteen Hegelund u8 cfg_eq_r_byp; 2972ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 2982ff8a1eeSSteen Hegelund u8 cfg_en_dfedig; 2992ff8a1eeSSteen Hegelund u8 cfg_sum_setcm_en; 3002ff8a1eeSSteen Hegelund u8 cfg_en_preemph; 3012ff8a1eeSSteen Hegelund u8 cfg_itx_ippreemp_base_1_0; 3022ff8a1eeSSteen Hegelund u8 cfg_itx_ipdriver_base_2_0; 3032ff8a1eeSSteen Hegelund u8 cfg_ibias_tune_reserve_5_0; 3042ff8a1eeSSteen Hegelund u8 cfg_txswing_half; 3052ff8a1eeSSteen Hegelund u8 cfg_dis_2nd_order; 3062ff8a1eeSSteen Hegelund u8 cfg_rx_ssc_lh; 3072ff8a1eeSSteen Hegelund u8 cfg_pi_floop_steps_1_0; 3082ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_23_16; 3092ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_15_8; 3102ff8a1eeSSteen Hegelund u8 cfg_iscan_ext_dac_7_0; 3112ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen1_2_0; 3122ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen2_2_0; 3132ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen3_2_0; 3142ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen4_2_0; 3152ff8a1eeSSteen Hegelund u8 r_cdr_m_gen1_7_0; 3162ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen1_3_0; 3172ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen2; 3182ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen3; 3192ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen4; 3202ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_7_0; 3212ff8a1eeSSteen Hegelund u8 cfg_pi_steps; 3222ff8a1eeSSteen Hegelund u8 cfg_mp_max_3_0; 3232ff8a1eeSSteen Hegelund u8 cfg_rstn_dfedig; 3242ff8a1eeSSteen Hegelund u8 cfg_alos_thr_3_0; 3252ff8a1eeSSteen Hegelund u8 cfg_predrv_slewrate_1_0; 3262ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base_1_0; 3272ff8a1eeSSteen Hegelund u8 cfg_ip_pre_base_1_0; 3282ff8a1eeSSteen Hegelund u8 r_cdr_m_gen2_7_0; 3292ff8a1eeSSteen Hegelund u8 r_cdr_m_gen3_7_0; 3302ff8a1eeSSteen Hegelund u8 r_cdr_m_gen4_7_0; 3312ff8a1eeSSteen Hegelund u8 r_en_auto_cdr_rstn; 3322ff8a1eeSSteen Hegelund u8 cfg_oscal_afe; 3332ff8a1eeSSteen Hegelund u8 cfg_pd_osdac_afe; 3342ff8a1eeSSteen Hegelund u8 cfg_resetb_oscal_afe[2]; 3352ff8a1eeSSteen Hegelund u8 cfg_center_spreading; 3362ff8a1eeSSteen Hegelund u8 cfg_m_cnt_maxval_4_0; 3372ff8a1eeSSteen Hegelund u8 cfg_ncnt_maxval_7_0; 3382ff8a1eeSSteen Hegelund u8 cfg_ncnt_maxval_10_8; 3392ff8a1eeSSteen Hegelund u8 cfg_ssc_en; 3402ff8a1eeSSteen Hegelund u8 cfg_tx2rx_lp_en; 3412ff8a1eeSSteen Hegelund u8 cfg_txlb_en; 3422ff8a1eeSSteen Hegelund u8 cfg_rx2tx_lp_en; 3432ff8a1eeSSteen Hegelund u8 cfg_rxlb_en; 3442ff8a1eeSSteen Hegelund u8 r_tx_pol_inv; 3452ff8a1eeSSteen Hegelund u8 r_rx_pol_inv; 3462ff8a1eeSSteen Hegelund u8 fx_100; 3472ff8a1eeSSteen Hegelund }; 3482ff8a1eeSSteen Hegelund 3492ff8a1eeSSteen Hegelund static struct sparx5_sd25g28_media_preset media_presets_25g[] = { 3502ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DEFAULT */ 3512ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 3522ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3532ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 3542ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3552ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3562ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 3572ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3582ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 4, 3592ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 12, 3602ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 7, 3612ff8a1eeSSteen Hegelund }, 3622ff8a1eeSSteen Hegelund { /* ETH_MEDIA_SR */ 3632ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 3642ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3652ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 3662ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3672ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3682ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0x10, 3692ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3702ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 8, 3712ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 4, 3722ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 0, 3732ff8a1eeSSteen Hegelund }, 3742ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DAC */ 3752ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 3762ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3772ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 3782ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3792ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3802ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 3812ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3822ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 8, 3832ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 0xc, 3842ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 0, 3852ff8a1eeSSteen Hegelund }, 3862ff8a1eeSSteen Hegelund }; 3872ff8a1eeSSteen Hegelund 3882ff8a1eeSSteen Hegelund static struct sparx5_sd25g28_mode_preset mode_presets_25g[] = { 3892ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_25000 */ 3902ff8a1eeSSteen Hegelund .bitwidth = 40, 3912ff8a1eeSSteen Hegelund .tx_pre_div = 0, 3922ff8a1eeSSteen Hegelund .fifo_ck_div = 0, 3932ff8a1eeSSteen Hegelund .pre_divsel = 1, 3942ff8a1eeSSteen Hegelund .vco_div_mode = 0, 3952ff8a1eeSSteen Hegelund .sel_div = 15, 3962ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 3972ff8a1eeSSteen Hegelund .subrate = 0, 3982ff8a1eeSSteen Hegelund .com_txcal_en = 0, 3992ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 4002ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0xf0, 4012ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4022ff8a1eeSSteen Hegelund .tx_reserve_msb = 0xcc, 4032ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0xfe, 4042ff8a1eeSSteen Hegelund .bw = 3, 4052ff8a1eeSSteen Hegelund .rxterm = 0, 4062ff8a1eeSSteen Hegelund .dfe_enable = 1, 4072ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 4082ff8a1eeSSteen Hegelund .txmargin = 1, 4092ff8a1eeSSteen Hegelund .cfg_ctle_rstn = 1, 4102ff8a1eeSSteen Hegelund .r_dfe_rstn = 1, 4112ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4122ff8a1eeSSteen Hegelund .tx_tap_dly = 8, 4132ff8a1eeSSteen Hegelund .tx_tap_adv = 0xc, 4142ff8a1eeSSteen Hegelund }, 4152ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_10000 */ 4162ff8a1eeSSteen Hegelund .bitwidth = 64, 4172ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4182ff8a1eeSSteen Hegelund .fifo_ck_div = 2, 4192ff8a1eeSSteen Hegelund .pre_divsel = 0, 4202ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4212ff8a1eeSSteen Hegelund .sel_div = 9, 4222ff8a1eeSSteen Hegelund .ck_bitwidth = 0, 4232ff8a1eeSSteen Hegelund .subrate = 0, 4242ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4252ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x20 << 1), 4262ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0x40, 4272ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4282ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x4c, 4292ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x44, 4302ff8a1eeSSteen Hegelund .bw = 3, 4312ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4322ff8a1eeSSteen Hegelund .rxterm = 3, 4332ff8a1eeSSteen Hegelund .dfe_enable = 1, 4342ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 4352ff8a1eeSSteen Hegelund .txmargin = 0, 4362ff8a1eeSSteen Hegelund .cfg_ctle_rstn = 1, 4372ff8a1eeSSteen Hegelund .r_dfe_rstn = 1, 4382ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4392ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4402ff8a1eeSSteen Hegelund }, 4412ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_5000 */ 4422ff8a1eeSSteen Hegelund .bitwidth = 64, 4432ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4442ff8a1eeSSteen Hegelund .fifo_ck_div = 2, 4452ff8a1eeSSteen Hegelund .pre_divsel = 0, 4462ff8a1eeSSteen Hegelund .vco_div_mode = 2, 4472ff8a1eeSSteen Hegelund .sel_div = 9, 4482ff8a1eeSSteen Hegelund .ck_bitwidth = 0, 4492ff8a1eeSSteen Hegelund .subrate = 0, 4502ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4512ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x20 << 1), 4522ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0, 4532ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4542ff8a1eeSSteen Hegelund .tx_reserve_msb = 0xe, 4552ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x80, 4562ff8a1eeSSteen Hegelund .bw = 0, 4572ff8a1eeSSteen Hegelund .rxterm = 0, 4582ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 6, 4592ff8a1eeSSteen Hegelund .dfe_enable = 0, 4602ff8a1eeSSteen Hegelund .dfe_tap = 0, 4612ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4622ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4632ff8a1eeSSteen Hegelund }, 4642ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_SD_2G5 */ 4652ff8a1eeSSteen Hegelund .bitwidth = 10, 4662ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4672ff8a1eeSSteen Hegelund .fifo_ck_div = 0, 4682ff8a1eeSSteen Hegelund .pre_divsel = 0, 4692ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4702ff8a1eeSSteen Hegelund .sel_div = 6, 4712ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 4722ff8a1eeSSteen Hegelund .subrate = 2, 4732ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4742ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 4752ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = (0xf << 4), 4762ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 2, 4772ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x8, 4782ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x8a, 4792ff8a1eeSSteen Hegelund .bw = 0, 4802ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4812ff8a1eeSSteen Hegelund .rxterm = (1 << 2), 4822ff8a1eeSSteen Hegelund .dfe_enable = 0, 4832ff8a1eeSSteen Hegelund .dfe_tap = 0, 4842ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4852ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4862ff8a1eeSSteen Hegelund }, 4872ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_1000BASEX */ 4882ff8a1eeSSteen Hegelund .bitwidth = 10, 4892ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4902ff8a1eeSSteen Hegelund .fifo_ck_div = 1, 4912ff8a1eeSSteen Hegelund .pre_divsel = 0, 4922ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4932ff8a1eeSSteen Hegelund .sel_div = 8, 4942ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 4952ff8a1eeSSteen Hegelund .subrate = 3, 4962ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4972ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 4982ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0xf0, 4992ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 5002ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x8, 5012ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0xce, 5022ff8a1eeSSteen Hegelund .bw = 0, 5032ff8a1eeSSteen Hegelund .rxterm = 0, 5042ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 5052ff8a1eeSSteen Hegelund .dfe_enable = 0, 5062ff8a1eeSSteen Hegelund .dfe_tap = 0, 5072ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 5082ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 5092ff8a1eeSSteen Hegelund }, 5102ff8a1eeSSteen Hegelund }; 5112ff8a1eeSSteen Hegelund 5122ff8a1eeSSteen Hegelund static struct sparx5_sd10g28_media_preset media_presets_10g[] = { 5132ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DEFAULT */ 5142ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 5152ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5162ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 5172ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 5182ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5192ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 5202ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 5, 5212ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 0, 5222ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5232ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5242ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0x8, 5252ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x3, 5262ff8a1eeSSteen Hegelund }, 5272ff8a1eeSSteen Hegelund { /* ETH_MEDIA_SR */ 5282ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 5292ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5302ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 5312ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 5322ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5332ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0xc, 5342ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 0xa, 5352ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 0x4, 5362ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5372ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5382ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xF, 5392ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x3, 5402ff8a1eeSSteen Hegelund }, 5412ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DAC */ 5422ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 5432ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5442ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 5452ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 12, 5462ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5472ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 8, 5482ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 0xa, 5492ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 4, 5502ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5512ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5522ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 5532ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x0, 5542ff8a1eeSSteen Hegelund } 5552ff8a1eeSSteen Hegelund }; 5562ff8a1eeSSteen Hegelund 5572ff8a1eeSSteen Hegelund static struct sparx5_sd10g28_mode_preset mode_presets_10g[] = { 5582ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_10000 */ 5592ff8a1eeSSteen Hegelund .bwidth = 64, 5602ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5612ff8a1eeSSteen Hegelund .rate = 0x0, 5622ff8a1eeSSteen Hegelund .dfe_enable = 1, 5632ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 5642ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x0, 5652ff8a1eeSSteen Hegelund .duty_cycle = 0x2, 5662ff8a1eeSSteen Hegelund }, 5672ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_6G */ 5682ff8a1eeSSteen Hegelund .bwidth = 16, 5692ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5702ff8a1eeSSteen Hegelund .rate = 0x1, 5712ff8a1eeSSteen Hegelund .dfe_enable = 0, 5722ff8a1eeSSteen Hegelund .dfe_tap = 0, 5732ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5742ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5752ff8a1eeSSteen Hegelund }, 5762ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_10G */ 5772ff8a1eeSSteen Hegelund .bwidth = 64, 5782ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5792ff8a1eeSSteen Hegelund .rate = 0x1, 5802ff8a1eeSSteen Hegelund .dfe_enable = 0, 5812ff8a1eeSSteen Hegelund .dfe_tap = 0, 5822ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5832ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5842ff8a1eeSSteen Hegelund }, 5852ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_QSGMII */ 5862ff8a1eeSSteen Hegelund .bwidth = 20, 5872ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX1, 5882ff8a1eeSSteen Hegelund .rate = 0x1, 5892ff8a1eeSSteen Hegelund .dfe_enable = 0, 5902ff8a1eeSSteen Hegelund .dfe_tap = 0, 5912ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5922ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5932ff8a1eeSSteen Hegelund }, 5942ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SD_2G5 */ 5952ff8a1eeSSteen Hegelund .bwidth = 10, 5962ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX2, 5972ff8a1eeSSteen Hegelund .rate = 0x2, 5982ff8a1eeSSteen Hegelund .dfe_enable = 0, 5992ff8a1eeSSteen Hegelund .dfe_tap = 0, 6002ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x7, 6012ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 6022ff8a1eeSSteen Hegelund }, 6032ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_1000BASEX */ 6042ff8a1eeSSteen Hegelund .bwidth = 10, 6052ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX1, 6062ff8a1eeSSteen Hegelund .rate = 0x3, 6072ff8a1eeSSteen Hegelund .dfe_enable = 0, 6082ff8a1eeSSteen Hegelund .dfe_tap = 0, 6092ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x7, 6102ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 6112ff8a1eeSSteen Hegelund }, 6122ff8a1eeSSteen Hegelund }; 6132ff8a1eeSSteen Hegelund 6142ff8a1eeSSteen Hegelund /* map from SD25G28 interface width to configuration value */ 6152ff8a1eeSSteen Hegelund static u8 sd25g28_get_iw_setting(struct device *dev, const u8 interface_width) 6162ff8a1eeSSteen Hegelund { 6172ff8a1eeSSteen Hegelund switch (interface_width) { 6182ff8a1eeSSteen Hegelund case 10: return 0; 6192ff8a1eeSSteen Hegelund case 16: return 1; 6202ff8a1eeSSteen Hegelund case 32: return 3; 6212ff8a1eeSSteen Hegelund case 40: return 4; 6222ff8a1eeSSteen Hegelund case 64: return 5; 6232ff8a1eeSSteen Hegelund default: 6242ff8a1eeSSteen Hegelund dev_err(dev, "%s: Illegal value %d for interface width\n", 6252ff8a1eeSSteen Hegelund __func__, interface_width); 6262ff8a1eeSSteen Hegelund } 6272ff8a1eeSSteen Hegelund return 0; 6282ff8a1eeSSteen Hegelund } 6292ff8a1eeSSteen Hegelund 6302ff8a1eeSSteen Hegelund /* map from SD10G28 interface width to configuration value */ 6312ff8a1eeSSteen Hegelund static u8 sd10g28_get_iw_setting(struct device *dev, const u8 interface_width) 6322ff8a1eeSSteen Hegelund { 6332ff8a1eeSSteen Hegelund switch (interface_width) { 6342ff8a1eeSSteen Hegelund case 10: return 0; 6352ff8a1eeSSteen Hegelund case 16: return 1; 6362ff8a1eeSSteen Hegelund case 20: return 2; 6372ff8a1eeSSteen Hegelund case 32: return 3; 6382ff8a1eeSSteen Hegelund case 40: return 4; 6392ff8a1eeSSteen Hegelund case 64: return 7; 6402ff8a1eeSSteen Hegelund default: 6412ff8a1eeSSteen Hegelund dev_err(dev, "%s: Illegal value %d for interface width\n", __func__, 6422ff8a1eeSSteen Hegelund interface_width); 6432ff8a1eeSSteen Hegelund return 0; 6442ff8a1eeSSteen Hegelund } 6452ff8a1eeSSteen Hegelund } 6462ff8a1eeSSteen Hegelund 6472ff8a1eeSSteen Hegelund static int sparx5_sd10g25_get_mode_preset(struct sparx5_serdes_macro *macro, 6482ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset *mode) 6492ff8a1eeSSteen Hegelund { 6502ff8a1eeSSteen Hegelund switch (macro->serdesmode) { 6512ff8a1eeSSteen Hegelund case SPX5_SD_MODE_SFI: 6522ff8a1eeSSteen Hegelund if (macro->speed == SPEED_25000) 6532ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 6542ff8a1eeSSteen Hegelund else if (macro->speed == SPEED_10000) 6552ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_10000]; 6562ff8a1eeSSteen Hegelund else if (macro->speed == SPEED_5000) 6572ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_5000]; 6582ff8a1eeSSteen Hegelund break; 6592ff8a1eeSSteen Hegelund case SPX5_SD_MODE_2G5: 6602ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_SD_2G5]; 6612ff8a1eeSSteen Hegelund break; 6622ff8a1eeSSteen Hegelund case SPX5_SD_MODE_1000BASEX: 6632ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_1000BASEX]; 6642ff8a1eeSSteen Hegelund break; 6652ff8a1eeSSteen Hegelund case SPX5_SD_MODE_100FX: 6662ff8a1eeSSteen Hegelund /* Not supported */ 6672ff8a1eeSSteen Hegelund return -EINVAL; 6682ff8a1eeSSteen Hegelund default: 6692ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 6702ff8a1eeSSteen Hegelund break; 6712ff8a1eeSSteen Hegelund } 6722ff8a1eeSSteen Hegelund return 0; 6732ff8a1eeSSteen Hegelund } 6742ff8a1eeSSteen Hegelund 6752ff8a1eeSSteen Hegelund static int sparx5_sd10g28_get_mode_preset(struct sparx5_serdes_macro *macro, 6762ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset *mode, 6772ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args *args) 6782ff8a1eeSSteen Hegelund { 6792ff8a1eeSSteen Hegelund switch (macro->serdesmode) { 6802ff8a1eeSSteen Hegelund case SPX5_SD_MODE_SFI: 6812ff8a1eeSSteen Hegelund if (macro->speed == SPEED_10000) { 6822ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 6832ff8a1eeSSteen Hegelund } else if (macro->speed == SPEED_5000) { 6842ff8a1eeSSteen Hegelund if (args->is_6g) 6852ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_6G]; 6862ff8a1eeSSteen Hegelund else 6872ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_10G]; 6882ff8a1eeSSteen Hegelund } else { 6892ff8a1eeSSteen Hegelund dev_err(macro->priv->dev, "%s: Illegal speed: %02u, sidx: %02u, mode (%u)", 6902ff8a1eeSSteen Hegelund __func__, macro->speed, macro->sidx, 6912ff8a1eeSSteen Hegelund macro->serdesmode); 6922ff8a1eeSSteen Hegelund return -EINVAL; 6932ff8a1eeSSteen Hegelund } 6942ff8a1eeSSteen Hegelund break; 6952ff8a1eeSSteen Hegelund case SPX5_SD_MODE_QSGMII: 6962ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_QSGMII]; 6972ff8a1eeSSteen Hegelund break; 6982ff8a1eeSSteen Hegelund case SPX5_SD_MODE_2G5: 6992ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SD_2G5]; 7002ff8a1eeSSteen Hegelund break; 7012ff8a1eeSSteen Hegelund case SPX5_SD_MODE_100FX: 7022ff8a1eeSSteen Hegelund case SPX5_SD_MODE_1000BASEX: 7032ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_1000BASEX]; 7042ff8a1eeSSteen Hegelund break; 7052ff8a1eeSSteen Hegelund default: 7062ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 7072ff8a1eeSSteen Hegelund break; 7082ff8a1eeSSteen Hegelund } 7092ff8a1eeSSteen Hegelund return 0; 7102ff8a1eeSSteen Hegelund } 7112ff8a1eeSSteen Hegelund 7122ff8a1eeSSteen Hegelund static void sparx5_sd25g28_get_params(struct sparx5_serdes_macro *macro, 7132ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset *media, 7142ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset *mode, 7152ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args *args, 7162ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params *params) 7172ff8a1eeSSteen Hegelund { 7182ff8a1eeSSteen Hegelund u8 iw = sd25g28_get_iw_setting(macro->priv->dev, mode->bitwidth); 7192ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params init = { 7202ff8a1eeSSteen Hegelund .r_d_width_ctrl_2_0 = iw, 7212ff8a1eeSSteen Hegelund .r_txfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 7222ff8a1eeSSteen Hegelund .r_rxfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 7232ff8a1eeSSteen Hegelund .cfg_vco_div_mode_1_0 = mode->vco_div_mode, 7242ff8a1eeSSteen Hegelund .cfg_pre_divsel_1_0 = mode->pre_divsel, 7252ff8a1eeSSteen Hegelund .cfg_sel_div_3_0 = mode->sel_div, 7262ff8a1eeSSteen Hegelund .cfg_vco_start_code_3_0 = 0, 7272ff8a1eeSSteen Hegelund .cfg_pma_tx_ck_bitwidth_2_0 = mode->ck_bitwidth, 7282ff8a1eeSSteen Hegelund .cfg_tx_prediv_1_0 = mode->tx_pre_div, 7292ff8a1eeSSteen Hegelund .cfg_rxdiv_sel_2_0 = mode->ck_bitwidth, 7302ff8a1eeSSteen Hegelund .cfg_tx_subrate_2_0 = mode->subrate, 7312ff8a1eeSSteen Hegelund .cfg_rx_subrate_2_0 = mode->subrate, 7322ff8a1eeSSteen Hegelund .r_multi_lane_mode = 0, 7332ff8a1eeSSteen Hegelund .cfg_cdrck_en = 1, 7342ff8a1eeSSteen Hegelund .cfg_dfeck_en = mode->dfe_enable, 7352ff8a1eeSSteen Hegelund .cfg_dfe_pd = mode->dfe_enable == 1 ? 0 : 1, 7362ff8a1eeSSteen Hegelund .cfg_dfedmx_pd = 1, 7372ff8a1eeSSteen Hegelund .cfg_dfetap_en_5_1 = mode->dfe_tap, 7382ff8a1eeSSteen Hegelund .cfg_dmux_pd = 0, 7392ff8a1eeSSteen Hegelund .cfg_dmux_clk_pd = 1, 7402ff8a1eeSSteen Hegelund .cfg_erramp_pd = mode->dfe_enable == 1 ? 0 : 1, 7412ff8a1eeSSteen Hegelund .cfg_pi_DFE_en = mode->dfe_enable, 7422ff8a1eeSSteen Hegelund .cfg_pi_en = 1, 7432ff8a1eeSSteen Hegelund .cfg_pd_ctle = 0, 7442ff8a1eeSSteen Hegelund .cfg_summer_en = 1, 7452ff8a1eeSSteen Hegelund .cfg_pmad_ck_pd = 0, 7462ff8a1eeSSteen Hegelund .cfg_pd_clk = 0, 7472ff8a1eeSSteen Hegelund .cfg_pd_cml = 0, 7482ff8a1eeSSteen Hegelund .cfg_pd_driver = 0, 7492ff8a1eeSSteen Hegelund .cfg_rx_reg_pu = 1, 7502ff8a1eeSSteen Hegelund .cfg_pd_rms_det = 1, 7512ff8a1eeSSteen Hegelund .cfg_dcdr_pd = 0, 7522ff8a1eeSSteen Hegelund .cfg_ecdr_pd = 1, 7532ff8a1eeSSteen Hegelund .cfg_pd_sq = 1, 7542ff8a1eeSSteen Hegelund .cfg_itx_ipdriver_base_2_0 = mode->txmargin, 7552ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 7562ff8a1eeSSteen Hegelund .cfg_tap_main = media->cfg_tap_main, 7572ff8a1eeSSteen Hegelund .cfg_en_main = media->cfg_en_main, 7582ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 7592ff8a1eeSSteen Hegelund .cfg_en_adv = media->cfg_en_adv, 7602ff8a1eeSSteen Hegelund .cfg_en_dly = media->cfg_en_dly, 7612ff8a1eeSSteen Hegelund .cfg_iscan_en = 0, 7622ff8a1eeSSteen Hegelund .l1_pcs_en_fast_iscan = 0, 7632ff8a1eeSSteen Hegelund .l0_cfg_bw_1_0 = 0, 7642ff8a1eeSSteen Hegelund .cfg_en_dummy = 0, 7652ff8a1eeSSteen Hegelund .cfg_pll_reserve_3_0 = args->com_pll_reserve, 7662ff8a1eeSSteen Hegelund .l0_cfg_txcal_en = mode->com_txcal_en, 7672ff8a1eeSSteen Hegelund .l0_cfg_tx_reserve_15_8 = mode->com_tx_reserve_msb, 7682ff8a1eeSSteen Hegelund .l0_cfg_tx_reserve_7_0 = mode->com_tx_reserve_lsb, 7692ff8a1eeSSteen Hegelund .cfg_tx_reserve_15_8 = mode->tx_reserve_msb, 7702ff8a1eeSSteen Hegelund .cfg_tx_reserve_7_0 = mode->tx_reserve_lsb, 7712ff8a1eeSSteen Hegelund .cfg_bw_1_0 = mode->bw, 7722ff8a1eeSSteen Hegelund .cfg_txcal_man_en = 1, 7732ff8a1eeSSteen Hegelund .cfg_phase_man_4_0 = 0, 7742ff8a1eeSSteen Hegelund .cfg_quad_man_1_0 = 0, 7752ff8a1eeSSteen Hegelund .cfg_txcal_shift_code_5_0 = 2, 7762ff8a1eeSSteen Hegelund .cfg_txcal_valid_sel_3_0 = 4, 7772ff8a1eeSSteen Hegelund .cfg_txcal_en = 0, 7782ff8a1eeSSteen Hegelund .cfg_cdr_kf_2_0 = 1, 7792ff8a1eeSSteen Hegelund .cfg_cdr_m_7_0 = 6, 7802ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = mode->cfg_pi_bw_3_0, 7812ff8a1eeSSteen Hegelund .cfg_pi_steps_1_0 = 0, 7822ff8a1eeSSteen Hegelund .cfg_dis_2ndorder = 1, 7832ff8a1eeSSteen Hegelund .cfg_ctle_rstn = mode->cfg_ctle_rstn, 7842ff8a1eeSSteen Hegelund .r_dfe_rstn = mode->r_dfe_rstn, 7852ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = media->cfg_alos_thr_2_0, 7862ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base_1_0 = mode->cfg_itx_ipcml_base, 7872ff8a1eeSSteen Hegelund .cfg_rx_reserve_7_0 = 0xbf, 7882ff8a1eeSSteen Hegelund .cfg_rx_reserve_15_8 = 0x61, 7892ff8a1eeSSteen Hegelund .cfg_rxterm_2_0 = mode->rxterm, 7902ff8a1eeSSteen Hegelund .cfg_fom_selm = 0, 7912ff8a1eeSSteen Hegelund .cfg_rx_sp_ctle_1_0 = 0, 7922ff8a1eeSSteen Hegelund .cfg_isel_ctle_1_0 = 0, 7932ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = media->cfg_vga_ctrl_byp_4_0, 7942ff8a1eeSSteen Hegelund .cfg_vga_byp = 1, 7952ff8a1eeSSteen Hegelund .cfg_agc_adpt_byp = 1, 7962ff8a1eeSSteen Hegelund .cfg_eqr_byp = 1, 7972ff8a1eeSSteen Hegelund .cfg_eqr_force_3_0 = media->cfg_eq_r_force_3_0, 7982ff8a1eeSSteen Hegelund .cfg_eqc_force_3_0 = media->cfg_eq_c_force_3_0, 7992ff8a1eeSSteen Hegelund .cfg_sum_setcm_en = 1, 8002ff8a1eeSSteen Hegelund .cfg_pi_dfe_en = 1, 8012ff8a1eeSSteen Hegelund .cfg_init_pos_iscan_6_0 = 6, 8022ff8a1eeSSteen Hegelund .cfg_init_pos_ipi_6_0 = 9, 8032ff8a1eeSSteen Hegelund .cfg_dfedig_m_2_0 = 6, 8042ff8a1eeSSteen Hegelund .cfg_en_dfedig = mode->dfe_enable, 8052ff8a1eeSSteen Hegelund .r_d_width_ctrl_from_hwt = 0, 8062ff8a1eeSSteen Hegelund .r_reg_manual = 1, 8072ff8a1eeSSteen Hegelund .reg_rst = args->reg_rst, 8082ff8a1eeSSteen Hegelund .cfg_jc_byp = 1, 8092ff8a1eeSSteen Hegelund .cfg_common_reserve_7_0 = 1, 8102ff8a1eeSSteen Hegelund .cfg_pll_lol_set = 1, 8112ff8a1eeSSteen Hegelund .cfg_tx2rx_lp_en = 0, 8122ff8a1eeSSteen Hegelund .cfg_txlb_en = 0, 8132ff8a1eeSSteen Hegelund .cfg_rx2tx_lp_en = 0, 8142ff8a1eeSSteen Hegelund .cfg_rxlb_en = 0, 8152ff8a1eeSSteen Hegelund .r_tx_pol_inv = args->txinvert, 8162ff8a1eeSSteen Hegelund .r_rx_pol_inv = args->rxinvert, 8172ff8a1eeSSteen Hegelund }; 8182ff8a1eeSSteen Hegelund 8192ff8a1eeSSteen Hegelund *params = init; 8202ff8a1eeSSteen Hegelund } 8212ff8a1eeSSteen Hegelund 8222ff8a1eeSSteen Hegelund static void sparx5_sd10g28_get_params(struct sparx5_serdes_macro *macro, 8232ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset *media, 8242ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset *mode, 8252ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args *args, 8262ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params *params) 8272ff8a1eeSSteen Hegelund { 8282ff8a1eeSSteen Hegelund u8 iw = sd10g28_get_iw_setting(macro->priv->dev, mode->bwidth); 8292ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params init = { 8302ff8a1eeSSteen Hegelund .skip_cmu_cfg = args->skip_cmu_cfg, 8312ff8a1eeSSteen Hegelund .is_6g = args->is_6g, 8322ff8a1eeSSteen Hegelund .cmu_sel = mode->cmu_sel, 8332ff8a1eeSSteen Hegelund .cfg_lane_reserve_7_0 = (mode->cmu_sel % 2) << 6, 8342ff8a1eeSSteen Hegelund .cfg_ssc_rtl_clk_sel = (mode->cmu_sel / 2), 8352ff8a1eeSSteen Hegelund .cfg_lane_reserve_15_8 = mode->duty_cycle, 8362ff8a1eeSSteen Hegelund .cfg_txrate_1_0 = mode->rate, 8372ff8a1eeSSteen Hegelund .cfg_rxrate_1_0 = mode->rate, 8382ff8a1eeSSteen Hegelund .fx_100 = macro->serdesmode == SPX5_SD_MODE_100FX, 8392ff8a1eeSSteen Hegelund .r_d_width_ctrl_2_0 = iw, 8402ff8a1eeSSteen Hegelund .cfg_pma_tx_ck_bitwidth_2_0 = iw, 8412ff8a1eeSSteen Hegelund .cfg_rxdiv_sel_2_0 = iw, 8422ff8a1eeSSteen Hegelund .r_pcs2pma_phymode_4_0 = 0, 8432ff8a1eeSSteen Hegelund .cfg_lane_id_2_0 = 0, 8442ff8a1eeSSteen Hegelund .cfg_cdrck_en = 1, 8452ff8a1eeSSteen Hegelund .cfg_dfeck_en = mode->dfe_enable, 8462ff8a1eeSSteen Hegelund .cfg_dfe_pd = (mode->dfe_enable == 1) ? 0 : 1, 8472ff8a1eeSSteen Hegelund .cfg_dfetap_en_5_1 = mode->dfe_tap, 8482ff8a1eeSSteen Hegelund .cfg_erramp_pd = (mode->dfe_enable == 1) ? 0 : 1, 8492ff8a1eeSSteen Hegelund .cfg_pi_DFE_en = mode->dfe_enable, 8502ff8a1eeSSteen Hegelund .cfg_pi_en = 1, 8512ff8a1eeSSteen Hegelund .cfg_pd_ctle = 0, 8522ff8a1eeSSteen Hegelund .cfg_summer_en = 1, 8532ff8a1eeSSteen Hegelund .cfg_pd_rx_cktree = 0, 8542ff8a1eeSSteen Hegelund .cfg_pd_clk = 0, 8552ff8a1eeSSteen Hegelund .cfg_pd_cml = 0, 8562ff8a1eeSSteen Hegelund .cfg_pd_driver = 0, 8572ff8a1eeSSteen Hegelund .cfg_rx_reg_pu = 1, 8582ff8a1eeSSteen Hegelund .cfg_d_cdr_pd = 0, 8592ff8a1eeSSteen Hegelund .cfg_pd_sq = mode->dfe_enable, 8602ff8a1eeSSteen Hegelund .cfg_rxdet_en = 0, 8612ff8a1eeSSteen Hegelund .cfg_rxdet_str = 0, 8622ff8a1eeSSteen Hegelund .r_multi_lane_mode = 0, 8632ff8a1eeSSteen Hegelund .cfg_en_adv = media->cfg_en_adv, 8642ff8a1eeSSteen Hegelund .cfg_en_main = 1, 8652ff8a1eeSSteen Hegelund .cfg_en_dly = media->cfg_en_dly, 8662ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 8672ff8a1eeSSteen Hegelund .cfg_tap_main = media->cfg_tap_main, 8682ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 8692ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = media->cfg_vga_ctrl_3_0, 8702ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = media->cfg_vga_cp_2_0, 8712ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = media->cfg_eq_res_3_0, 8722ff8a1eeSSteen Hegelund .cfg_eq_r_byp = media->cfg_eq_r_byp, 8732ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = media->cfg_eq_c_force_3_0, 8742ff8a1eeSSteen Hegelund .cfg_en_dfedig = mode->dfe_enable, 8752ff8a1eeSSteen Hegelund .cfg_sum_setcm_en = 1, 8762ff8a1eeSSteen Hegelund .cfg_en_preemph = 0, 8772ff8a1eeSSteen Hegelund .cfg_itx_ippreemp_base_1_0 = 0, 8782ff8a1eeSSteen Hegelund .cfg_itx_ipdriver_base_2_0 = (args->txswing >> 6), 8792ff8a1eeSSteen Hegelund .cfg_ibias_tune_reserve_5_0 = (args->txswing & 63), 8802ff8a1eeSSteen Hegelund .cfg_txswing_half = (args->txmargin), 8812ff8a1eeSSteen Hegelund .cfg_dis_2nd_order = 0x1, 8822ff8a1eeSSteen Hegelund .cfg_rx_ssc_lh = 0x0, 8832ff8a1eeSSteen Hegelund .cfg_pi_floop_steps_1_0 = 0x0, 8842ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_23_16 = (1 << 5), 8852ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_15_8 = (0 << 6), 8862ff8a1eeSSteen Hegelund .cfg_iscan_ext_dac_7_0 = (1 << 7) + 9, 8872ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen1_2_0 = 1, 8882ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen2_2_0 = 1, 8892ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen3_2_0 = 1, 8902ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen4_2_0 = 1, 8912ff8a1eeSSteen Hegelund .r_cdr_m_gen1_7_0 = 4, 8922ff8a1eeSSteen Hegelund .cfg_pi_bw_gen1_3_0 = mode->pi_bw_gen1, 8932ff8a1eeSSteen Hegelund .cfg_pi_bw_gen2 = mode->pi_bw_gen1, 8942ff8a1eeSSteen Hegelund .cfg_pi_bw_gen3 = mode->pi_bw_gen1, 8952ff8a1eeSSteen Hegelund .cfg_pi_bw_gen4 = mode->pi_bw_gen1, 8962ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_7_0 = 3, 8972ff8a1eeSSteen Hegelund .cfg_pi_steps = 0, 8982ff8a1eeSSteen Hegelund .cfg_mp_max_3_0 = 1, 8992ff8a1eeSSteen Hegelund .cfg_rstn_dfedig = mode->dfe_enable, 9002ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = media->cfg_alos_thr_3_0, 9012ff8a1eeSSteen Hegelund .cfg_predrv_slewrate_1_0 = 3, 9022ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base_1_0 = 0, 9032ff8a1eeSSteen Hegelund .cfg_ip_pre_base_1_0 = 0, 9042ff8a1eeSSteen Hegelund .r_cdr_m_gen2_7_0 = 2, 9052ff8a1eeSSteen Hegelund .r_cdr_m_gen3_7_0 = 2, 9062ff8a1eeSSteen Hegelund .r_cdr_m_gen4_7_0 = 2, 9072ff8a1eeSSteen Hegelund .r_en_auto_cdr_rstn = 0, 9082ff8a1eeSSteen Hegelund .cfg_oscal_afe = 1, 9092ff8a1eeSSteen Hegelund .cfg_pd_osdac_afe = 0, 9102ff8a1eeSSteen Hegelund .cfg_resetb_oscal_afe[0] = 0, 9112ff8a1eeSSteen Hegelund .cfg_resetb_oscal_afe[1] = 1, 9122ff8a1eeSSteen Hegelund .cfg_center_spreading = 0, 9132ff8a1eeSSteen Hegelund .cfg_m_cnt_maxval_4_0 = 15, 9142ff8a1eeSSteen Hegelund .cfg_ncnt_maxval_7_0 = 32, 9152ff8a1eeSSteen Hegelund .cfg_ncnt_maxval_10_8 = 6, 9162ff8a1eeSSteen Hegelund .cfg_ssc_en = 1, 9172ff8a1eeSSteen Hegelund .cfg_tx2rx_lp_en = 0, 9182ff8a1eeSSteen Hegelund .cfg_txlb_en = 0, 9192ff8a1eeSSteen Hegelund .cfg_rx2tx_lp_en = 0, 9202ff8a1eeSSteen Hegelund .cfg_rxlb_en = 0, 9212ff8a1eeSSteen Hegelund .r_tx_pol_inv = args->txinvert, 9222ff8a1eeSSteen Hegelund .r_rx_pol_inv = args->rxinvert, 9232ff8a1eeSSteen Hegelund }; 9242ff8a1eeSSteen Hegelund 9252ff8a1eeSSteen Hegelund *params = init; 9262ff8a1eeSSteen Hegelund } 9272ff8a1eeSSteen Hegelund 928238a583fSDaniel Machon static int sparx5_cmu_apply_cfg(struct sparx5_serdes_private *priv, 929238a583fSDaniel Machon u32 cmu_idx, 930238a583fSDaniel Machon void __iomem *cmu_tgt, 931238a583fSDaniel Machon void __iomem *cmu_cfg_tgt, 932238a583fSDaniel Machon u32 spd10g) 933238a583fSDaniel Machon { 934238a583fSDaniel Machon void __iomem **regs = priv->regs; 935238a583fSDaniel Machon struct device *dev = priv->dev; 936238a583fSDaniel Machon int value; 937238a583fSDaniel Machon 938238a583fSDaniel Machon cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 939238a583fSDaniel Machon cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 940238a583fSDaniel Machon 941238a583fSDaniel Machon if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 942238a583fSDaniel Machon cmu_idx == 10 || cmu_idx == 13) { 943238a583fSDaniel Machon spd10g = 0; 944238a583fSDaniel Machon } 945238a583fSDaniel Machon 946238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(1), 947238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 948238a583fSDaniel Machon cmu_cfg_tgt, 949238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 950238a583fSDaniel Machon 951238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(0), 952238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 953238a583fSDaniel Machon cmu_cfg_tgt, 954238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 955238a583fSDaniel Machon 956238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(1), 957238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 958238a583fSDaniel Machon cmu_cfg_tgt, 959238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 960238a583fSDaniel Machon 961238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT_SET(0x1) | 962238a583fSDaniel Machon SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT_SET(0x1) | 963238a583fSDaniel Machon SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT_SET(0x1) | 964238a583fSDaniel Machon SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT_SET(0x1) | 965238a583fSDaniel Machon SD_CMU_CMU_45_R_EN_RATECHG_CTRL_SET(0x0), 966238a583fSDaniel Machon SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT | 967238a583fSDaniel Machon SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT | 968238a583fSDaniel Machon SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT | 969238a583fSDaniel Machon SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT | 970238a583fSDaniel Machon SD_CMU_CMU_45_R_EN_RATECHG_CTRL, 971238a583fSDaniel Machon cmu_tgt, 972238a583fSDaniel Machon SD_CMU_CMU_45(cmu_idx)); 973238a583fSDaniel Machon 974238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0_SET(0), 975238a583fSDaniel Machon SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0, 976238a583fSDaniel Machon cmu_tgt, 977238a583fSDaniel Machon SD_CMU_CMU_47(cmu_idx)); 978238a583fSDaniel Machon 979238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_1B_CFG_RESERVE_7_0_SET(0), 980238a583fSDaniel Machon SD_CMU_CMU_1B_CFG_RESERVE_7_0, 981238a583fSDaniel Machon cmu_tgt, 982238a583fSDaniel Machon SD_CMU_CMU_1B(cmu_idx)); 983238a583fSDaniel Machon 984238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_JC_BYP_SET(0x1), 985238a583fSDaniel Machon SD_CMU_CMU_0D_CFG_JC_BYP, 986238a583fSDaniel Machon cmu_tgt, 987238a583fSDaniel Machon SD_CMU_CMU_0D(cmu_idx)); 988238a583fSDaniel Machon 989238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_1F_CFG_VTUNE_SEL_SET(1), 990238a583fSDaniel Machon SD_CMU_CMU_1F_CFG_VTUNE_SEL, 991238a583fSDaniel Machon cmu_tgt, 992238a583fSDaniel Machon SD_CMU_CMU_1F(cmu_idx)); 993238a583fSDaniel Machon 994238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0_SET(3), 995238a583fSDaniel Machon SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0, 996238a583fSDaniel Machon cmu_tgt, 997238a583fSDaniel Machon SD_CMU_CMU_00(cmu_idx)); 998238a583fSDaniel Machon 999238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0_SET(3), 1000238a583fSDaniel Machon SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0, 1001238a583fSDaniel Machon cmu_tgt, 1002238a583fSDaniel Machon SD_CMU_CMU_05(cmu_idx)); 1003238a583fSDaniel Machon 1004238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_30_R_PLL_DLOL_EN_SET(1), 1005238a583fSDaniel Machon SD_CMU_CMU_30_R_PLL_DLOL_EN, 1006238a583fSDaniel Machon cmu_tgt, 1007238a583fSDaniel Machon SD_CMU_CMU_30(cmu_idx)); 1008238a583fSDaniel Machon 1009238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_09_CFG_SW_10G_SET(spd10g), 1010238a583fSDaniel Machon SD_CMU_CMU_09_CFG_SW_10G, 1011238a583fSDaniel Machon cmu_tgt, 1012238a583fSDaniel Machon SD_CMU_CMU_09(cmu_idx)); 1013238a583fSDaniel Machon 1014238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(0), 1015238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 1016238a583fSDaniel Machon cmu_cfg_tgt, 1017238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 1018238a583fSDaniel Machon 1019238a583fSDaniel Machon msleep(20); 1020238a583fSDaniel Machon 1021238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(0), 1022238a583fSDaniel Machon SD_CMU_CMU_44_R_PLL_RSTN, 1023238a583fSDaniel Machon cmu_tgt, 1024238a583fSDaniel Machon SD_CMU_CMU_44(cmu_idx)); 1025238a583fSDaniel Machon 1026238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(1), 1027238a583fSDaniel Machon SD_CMU_CMU_44_R_PLL_RSTN, 1028238a583fSDaniel Machon cmu_tgt, 1029238a583fSDaniel Machon SD_CMU_CMU_44(cmu_idx)); 1030238a583fSDaniel Machon 1031238a583fSDaniel Machon msleep(20); 1032238a583fSDaniel Machon 1033238a583fSDaniel Machon value = readl(sdx5_addr(regs, SD_CMU_CMU_E0(cmu_idx))); 1034238a583fSDaniel Machon value = SD_CMU_CMU_E0_PLL_LOL_UDL_GET(value); 1035238a583fSDaniel Machon 1036238a583fSDaniel Machon if (value) { 1037238a583fSDaniel Machon dev_err(dev, "CMU PLL Loss of Lock: 0x%x\n", value); 1038238a583fSDaniel Machon return -EINVAL; 1039238a583fSDaniel Machon } 1040238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD_SET(0), 1041238a583fSDaniel Machon SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD, 1042238a583fSDaniel Machon cmu_tgt, 1043238a583fSDaniel Machon SD_CMU_CMU_0D(cmu_idx)); 1044238a583fSDaniel Machon return 0; 1045238a583fSDaniel Machon } 1046238a583fSDaniel Machon 1047238a583fSDaniel Machon static int sparx5_cmu_cfg(struct sparx5_serdes_private *priv, u32 cmu_idx) 1048238a583fSDaniel Machon { 1049238a583fSDaniel Machon void __iomem *cmu_tgt, *cmu_cfg_tgt; 1050238a583fSDaniel Machon u32 spd10g = 1; 1051238a583fSDaniel Machon 1052238a583fSDaniel Machon if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 1053238a583fSDaniel Machon cmu_idx == 10 || cmu_idx == 13) { 1054238a583fSDaniel Machon spd10g = 0; 1055238a583fSDaniel Machon } 1056238a583fSDaniel Machon 1057238a583fSDaniel Machon cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 1058238a583fSDaniel Machon cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 1059238a583fSDaniel Machon 1060238a583fSDaniel Machon return sparx5_cmu_apply_cfg(priv, cmu_idx, cmu_tgt, cmu_cfg_tgt, spd10g); 1061238a583fSDaniel Machon } 1062238a583fSDaniel Machon 1063238a583fSDaniel Machon static int sparx5_serdes_cmu_enable(struct sparx5_serdes_private *priv) 1064238a583fSDaniel Machon { 1065238a583fSDaniel Machon int idx, err = 0; 1066238a583fSDaniel Machon 1067238a583fSDaniel Machon if (!priv->cmu_enabled) { 1068238a583fSDaniel Machon for (idx = 0; idx < SPX5_CMU_MAX; idx++) { 1069238a583fSDaniel Machon err = sparx5_cmu_cfg(priv, idx); 1070238a583fSDaniel Machon if (err) { 1071238a583fSDaniel Machon dev_err(priv->dev, "CMU %u, error: %d\n", idx, err); 1072238a583fSDaniel Machon goto leave; 1073238a583fSDaniel Machon } 1074238a583fSDaniel Machon } 1075238a583fSDaniel Machon priv->cmu_enabled = true; 1076238a583fSDaniel Machon } 1077238a583fSDaniel Machon leave: 1078238a583fSDaniel Machon return err; 1079238a583fSDaniel Machon } 1080238a583fSDaniel Machon 1081*044f3a1aSDaniel Machon static void sparx5_serdes_cmu_power_off(struct sparx5_serdes_private *priv) 1082*044f3a1aSDaniel Machon { 1083*044f3a1aSDaniel Machon void __iomem *cmu_inst, *cmu_cfg_inst; 1084*044f3a1aSDaniel Machon int i; 1085*044f3a1aSDaniel Machon 1086*044f3a1aSDaniel Machon /* Power down each CMU */ 1087*044f3a1aSDaniel Machon for (i = 0; i < SPX5_CMU_MAX; i++) { 1088*044f3a1aSDaniel Machon cmu_inst = sdx5_inst_get(priv, TARGET_SD_CMU, i); 1089*044f3a1aSDaniel Machon cmu_cfg_inst = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, i); 1090*044f3a1aSDaniel Machon 1091*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(0), 1092*044f3a1aSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, cmu_cfg_inst, 1093*044f3a1aSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(0)); 1094*044f3a1aSDaniel Machon 1095*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_05_CFG_REFCK_TERM_EN_SET(0), 1096*044f3a1aSDaniel Machon SD_CMU_CMU_05_CFG_REFCK_TERM_EN, cmu_inst, 1097*044f3a1aSDaniel Machon SD_CMU_CMU_05(0)); 1098*044f3a1aSDaniel Machon 1099*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_09_CFG_EN_TX_CK_DN_SET(0), 1100*044f3a1aSDaniel Machon SD_CMU_CMU_09_CFG_EN_TX_CK_DN, cmu_inst, 1101*044f3a1aSDaniel Machon SD_CMU_CMU_09(0)); 1102*044f3a1aSDaniel Machon 1103*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_06_CFG_VCO_PD_SET(1), 1104*044f3a1aSDaniel Machon SD_CMU_CMU_06_CFG_VCO_PD, cmu_inst, 1105*044f3a1aSDaniel Machon SD_CMU_CMU_06(0)); 1106*044f3a1aSDaniel Machon 1107*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_09_CFG_EN_TX_CK_UP_SET(0), 1108*044f3a1aSDaniel Machon SD_CMU_CMU_09_CFG_EN_TX_CK_UP, cmu_inst, 1109*044f3a1aSDaniel Machon SD_CMU_CMU_09(0)); 1110*044f3a1aSDaniel Machon 1111*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_08_CFG_CK_TREE_PD_SET(1), 1112*044f3a1aSDaniel Machon SD_CMU_CMU_08_CFG_CK_TREE_PD, cmu_inst, 1113*044f3a1aSDaniel Machon SD_CMU_CMU_08(0)); 1114*044f3a1aSDaniel Machon 1115*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_REFCK_PD_SET(1) | 1116*044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV64_SET(1) | 1117*044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV66_SET(1), 1118*044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_REFCK_PD | 1119*044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV64 | 1120*044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV66, cmu_inst, 1121*044f3a1aSDaniel Machon SD_CMU_CMU_0D(0)); 1122*044f3a1aSDaniel Machon 1123*044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_06_CFG_CTRL_LOGIC_PD_SET(1), 1124*044f3a1aSDaniel Machon SD_CMU_CMU_06_CFG_CTRL_LOGIC_PD, cmu_inst, 1125*044f3a1aSDaniel Machon SD_CMU_CMU_06(0)); 1126*044f3a1aSDaniel Machon } 1127*044f3a1aSDaniel Machon } 1128*044f3a1aSDaniel Machon 11292ff8a1eeSSteen Hegelund static void sparx5_sd25g28_reset(void __iomem *regs[], 11302ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params *params, 11312ff8a1eeSSteen Hegelund u32 sd_index) 11322ff8a1eeSSteen Hegelund { 11332ff8a1eeSSteen Hegelund if (params->reg_rst == 1) { 11342ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(1), 11352ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 11362ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 11372ff8a1eeSSteen Hegelund 11382ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 11392ff8a1eeSSteen Hegelund 11402ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(0), 11412ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 11422ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 11432ff8a1eeSSteen Hegelund } 11442ff8a1eeSSteen Hegelund } 11452ff8a1eeSSteen Hegelund 11468595ffb5SSteen Hegelund static int sparx5_sd25g28_apply_params(struct sparx5_serdes_macro *macro, 11478595ffb5SSteen Hegelund struct sparx5_sd25g28_params *params) 11482ff8a1eeSSteen Hegelund { 11498595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 11508595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 11518595ffb5SSteen Hegelund struct device *dev = priv->dev; 11528595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 11538595ffb5SSteen Hegelund u32 value; 11548595ffb5SSteen Hegelund 11558595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(1), 11562ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 11578595ffb5SSteen Hegelund priv, 11588595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 11598595ffb5SSteen Hegelund 11608595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xFF), 11612ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 11628595ffb5SSteen Hegelund priv, 11638595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 11648595ffb5SSteen Hegelund 11658595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT_SET 11662ff8a1eeSSteen Hegelund (params->r_d_width_ctrl_from_hwt) | 11672ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_REG_MANUAL_SET(params->r_reg_manual), 11682ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT | 11692ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_REG_MANUAL, 11708595ffb5SSteen Hegelund priv, 11718595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 11728595ffb5SSteen Hegelund 11738595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0_SET 11742ff8a1eeSSteen Hegelund (params->cfg_common_reserve_7_0), 11752ff8a1eeSSteen Hegelund SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0, 11768595ffb5SSteen Hegelund priv, 11778595ffb5SSteen Hegelund SD25G_LANE_CMU_31(sd_index)); 11788595ffb5SSteen Hegelund 11798595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_09_CFG_EN_DUMMY_SET(params->cfg_en_dummy), 11802ff8a1eeSSteen Hegelund SD25G_LANE_CMU_09_CFG_EN_DUMMY, 11818595ffb5SSteen Hegelund priv, 11828595ffb5SSteen Hegelund SD25G_LANE_CMU_09(sd_index)); 11838595ffb5SSteen Hegelund 11848595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0_SET 11858595ffb5SSteen Hegelund (params->cfg_pll_reserve_3_0), 11862ff8a1eeSSteen Hegelund SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0, 11878595ffb5SSteen Hegelund priv, 11888595ffb5SSteen Hegelund SD25G_LANE_CMU_13(sd_index)); 11898595ffb5SSteen Hegelund 11908595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN_SET(params->l0_cfg_txcal_en), 11912ff8a1eeSSteen Hegelund SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN, 11928595ffb5SSteen Hegelund priv, 11938595ffb5SSteen Hegelund SD25G_LANE_CMU_40(sd_index)); 11948595ffb5SSteen Hegelund 11958595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8_SET 11962ff8a1eeSSteen Hegelund (params->l0_cfg_tx_reserve_15_8), 11972ff8a1eeSSteen Hegelund SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8, 11988595ffb5SSteen Hegelund priv, 11998595ffb5SSteen Hegelund SD25G_LANE_CMU_46(sd_index)); 12008595ffb5SSteen Hegelund 12018595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0_SET 12028595ffb5SSteen Hegelund (params->l0_cfg_tx_reserve_7_0), 12032ff8a1eeSSteen Hegelund SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0, 12048595ffb5SSteen Hegelund priv, 12058595ffb5SSteen Hegelund SD25G_LANE_CMU_45(sd_index)); 12068595ffb5SSteen Hegelund 12078595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(0), 12082ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 12098595ffb5SSteen Hegelund priv, 12108595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 12118595ffb5SSteen Hegelund 12128595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(1), 12132ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 12148595ffb5SSteen Hegelund priv, 12158595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 12168595ffb5SSteen Hegelund 12178595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(0), 12182ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 12198595ffb5SSteen Hegelund priv, 12208595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 12218595ffb5SSteen Hegelund 12228595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(1), 12232ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 12248595ffb5SSteen Hegelund priv, 12258595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 12268595ffb5SSteen Hegelund 12278595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(0), 12282ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 12298595ffb5SSteen Hegelund priv, 12308595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 12318595ffb5SSteen Hegelund 12328595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(1), 12332ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 12348595ffb5SSteen Hegelund priv, 12358595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 12368595ffb5SSteen Hegelund 12378595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0_SET(params->r_d_width_ctrl_2_0), 12382ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0, 12398595ffb5SSteen Hegelund priv, 12408595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 12418595ffb5SSteen Hegelund 12428595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0_SET 12432ff8a1eeSSteen Hegelund (params->r_txfifo_ck_div_pmad_2_0) | 12442ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0_SET 12452ff8a1eeSSteen Hegelund (params->r_rxfifo_ck_div_pmad_2_0), 12462ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0 | 12472ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0, 12488595ffb5SSteen Hegelund priv, 12498595ffb5SSteen Hegelund SD25G_LANE_CMU_30(sd_index)); 12508595ffb5SSteen Hegelund 12518595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET_SET(params->cfg_pll_lol_set) | 12528595ffb5SSteen Hegelund SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0_SET 12538595ffb5SSteen Hegelund (params->cfg_vco_div_mode_1_0), 12542ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET | 12552ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0, 12568595ffb5SSteen Hegelund priv, 12578595ffb5SSteen Hegelund SD25G_LANE_CMU_0C(sd_index)); 12588595ffb5SSteen Hegelund 12598595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0_SET 12608595ffb5SSteen Hegelund (params->cfg_pre_divsel_1_0), 12612ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0, 12628595ffb5SSteen Hegelund priv, 12638595ffb5SSteen Hegelund SD25G_LANE_CMU_0D(sd_index)); 12648595ffb5SSteen Hegelund 12658595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0_SET(params->cfg_sel_div_3_0), 12662ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0, 12678595ffb5SSteen Hegelund priv, 12688595ffb5SSteen Hegelund SD25G_LANE_CMU_0E(sd_index)); 12698595ffb5SSteen Hegelund 12708595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0x00), 12712ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 12728595ffb5SSteen Hegelund priv, 12738595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 12748595ffb5SSteen Hegelund 12758595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 12762ff8a1eeSSteen Hegelund (params->cfg_pma_tx_ck_bitwidth_2_0), 12772ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0, 12788595ffb5SSteen Hegelund priv, 12798595ffb5SSteen Hegelund SD25G_LANE_LANE_0C(sd_index)); 12808595ffb5SSteen Hegelund 12818595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0_SET 12828595ffb5SSteen Hegelund (params->cfg_tx_prediv_1_0), 12832ff8a1eeSSteen Hegelund SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0, 12848595ffb5SSteen Hegelund priv, 12858595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 12868595ffb5SSteen Hegelund 12878595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0_SET 12888595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 12892ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0, 12908595ffb5SSteen Hegelund priv, 12918595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 12928595ffb5SSteen Hegelund 12938595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0_SET 12948595ffb5SSteen Hegelund (params->cfg_tx_subrate_2_0), 12952ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0, 12968595ffb5SSteen Hegelund priv, 12978595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 12988595ffb5SSteen Hegelund 12998595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0_SET 13008595ffb5SSteen Hegelund (params->cfg_rx_subrate_2_0), 13012ff8a1eeSSteen Hegelund SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0, 13028595ffb5SSteen Hegelund priv, 13038595ffb5SSteen Hegelund SD25G_LANE_LANE_28(sd_index)); 13048595ffb5SSteen Hegelund 13058595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 13062ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN, 13078595ffb5SSteen Hegelund priv, 13088595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 13098595ffb5SSteen Hegelund 13108595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1_SET 13118595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 13122ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1, 13138595ffb5SSteen Hegelund priv, 13148595ffb5SSteen Hegelund SD25G_LANE_LANE_0F(sd_index)); 13158595ffb5SSteen Hegelund 13168595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 13172ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 13188595ffb5SSteen Hegelund priv, 13198595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 13208595ffb5SSteen Hegelund 13218595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN_SET(params->cfg_pi_dfe_en), 13222ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN, 13238595ffb5SSteen Hegelund priv, 13248595ffb5SSteen Hegelund SD25G_LANE_LANE_1D(sd_index)); 13258595ffb5SSteen Hegelund 13268595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_ECDR_PD_SET(params->cfg_ecdr_pd), 13272ff8a1eeSSteen Hegelund SD25G_LANE_LANE_19_LN_CFG_ECDR_PD, 13288595ffb5SSteen Hegelund priv, 13298595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 13308595ffb5SSteen Hegelund 13318595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0_SET 13322ff8a1eeSSteen Hegelund (params->cfg_itx_ipdriver_base_2_0), 13332ff8a1eeSSteen Hegelund SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0, 13348595ffb5SSteen Hegelund priv, 13358595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 13368595ffb5SSteen Hegelund 13378595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0_SET(params->cfg_tap_dly_4_0), 13382ff8a1eeSSteen Hegelund SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0, 13398595ffb5SSteen Hegelund priv, 13408595ffb5SSteen Hegelund SD25G_LANE_LANE_03(sd_index)); 13418595ffb5SSteen Hegelund 13428595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0_SET(params->cfg_tap_adv_3_0), 13432ff8a1eeSSteen Hegelund SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0, 13448595ffb5SSteen Hegelund priv, 13458595ffb5SSteen Hegelund SD25G_LANE_LANE_06(sd_index)); 13468595ffb5SSteen Hegelund 13478595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_07_LN_CFG_EN_ADV_SET(params->cfg_en_adv) | 13482ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_DLY_SET(params->cfg_en_dly), 13492ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_ADV | 13502ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_DLY, 13518595ffb5SSteen Hegelund priv, 13528595ffb5SSteen Hegelund SD25G_LANE_LANE_07(sd_index)); 13538595ffb5SSteen Hegelund 13548595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8_SET 13558595ffb5SSteen Hegelund (params->cfg_tx_reserve_15_8), 13562ff8a1eeSSteen Hegelund SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8, 13578595ffb5SSteen Hegelund priv, 13588595ffb5SSteen Hegelund SD25G_LANE_LANE_43(sd_index)); 13598595ffb5SSteen Hegelund 13608595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0_SET 13618595ffb5SSteen Hegelund (params->cfg_tx_reserve_7_0), 13622ff8a1eeSSteen Hegelund SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0, 13638595ffb5SSteen Hegelund priv, 13648595ffb5SSteen Hegelund SD25G_LANE_LANE_42(sd_index)); 13658595ffb5SSteen Hegelund 13668595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_05_LN_CFG_BW_1_0_SET(params->cfg_bw_1_0), 13672ff8a1eeSSteen Hegelund SD25G_LANE_LANE_05_LN_CFG_BW_1_0, 13688595ffb5SSteen Hegelund priv, 13698595ffb5SSteen Hegelund SD25G_LANE_LANE_05(sd_index)); 13708595ffb5SSteen Hegelund 13718595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN_SET 13728595ffb5SSteen Hegelund (params->cfg_txcal_man_en), 13732ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN, 13748595ffb5SSteen Hegelund priv, 13758595ffb5SSteen Hegelund SD25G_LANE_LANE_0B(sd_index)); 13768595ffb5SSteen Hegelund 13778595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0_SET 13782ff8a1eeSSteen Hegelund (params->cfg_txcal_shift_code_5_0), 13792ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0, 13808595ffb5SSteen Hegelund priv, 13818595ffb5SSteen Hegelund SD25G_LANE_LANE_0A(sd_index)); 13828595ffb5SSteen Hegelund 13838595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0_SET 13842ff8a1eeSSteen Hegelund (params->cfg_txcal_valid_sel_3_0), 13852ff8a1eeSSteen Hegelund SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0, 13868595ffb5SSteen Hegelund priv, 13878595ffb5SSteen Hegelund SD25G_LANE_LANE_09(sd_index)); 13888595ffb5SSteen Hegelund 13898595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0_SET(params->cfg_cdr_kf_2_0), 13902ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0, 13918595ffb5SSteen Hegelund priv, 13928595ffb5SSteen Hegelund SD25G_LANE_LANE_1A(sd_index)); 13938595ffb5SSteen Hegelund 13948595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0_SET(params->cfg_cdr_m_7_0), 13952ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0, 13968595ffb5SSteen Hegelund priv, 13978595ffb5SSteen Hegelund SD25G_LANE_LANE_1B(sd_index)); 13988595ffb5SSteen Hegelund 13998595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0_SET(params->cfg_pi_bw_3_0), 14002ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0, 14018595ffb5SSteen Hegelund priv, 14028595ffb5SSteen Hegelund SD25G_LANE_LANE_2B(sd_index)); 14038595ffb5SSteen Hegelund 14048595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER_SET 14058595ffb5SSteen Hegelund (params->cfg_dis_2ndorder), 14062ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER, 14078595ffb5SSteen Hegelund priv, 14088595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 14098595ffb5SSteen Hegelund 14108595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN_SET(params->cfg_ctle_rstn), 14112ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN, 14128595ffb5SSteen Hegelund priv, 14138595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 14148595ffb5SSteen Hegelund 14158595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0_SET 14162ff8a1eeSSteen Hegelund (params->cfg_itx_ipcml_base_1_0), 14172ff8a1eeSSteen Hegelund SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0, 14188595ffb5SSteen Hegelund priv, 14198595ffb5SSteen Hegelund SD25G_LANE_LANE_00(sd_index)); 14208595ffb5SSteen Hegelund 14218595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0_SET 14228595ffb5SSteen Hegelund (params->cfg_rx_reserve_7_0), 14232ff8a1eeSSteen Hegelund SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0, 14248595ffb5SSteen Hegelund priv, 14258595ffb5SSteen Hegelund SD25G_LANE_LANE_44(sd_index)); 14268595ffb5SSteen Hegelund 14278595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8_SET 14288595ffb5SSteen Hegelund (params->cfg_rx_reserve_15_8), 14292ff8a1eeSSteen Hegelund SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8, 14308595ffb5SSteen Hegelund priv, 14318595ffb5SSteen Hegelund SD25G_LANE_LANE_45(sd_index)); 14328595ffb5SSteen Hegelund 14338595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN_SET(params->cfg_dfeck_en) | 14342ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0_SET(params->cfg_rxterm_2_0), 14352ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN | 14362ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0, 14378595ffb5SSteen Hegelund priv, 14388595ffb5SSteen Hegelund SD25G_LANE_LANE_0D(sd_index)); 14398595ffb5SSteen Hegelund 14408595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0_SET 14412ff8a1eeSSteen Hegelund (params->cfg_vga_ctrl_byp_4_0), 14422ff8a1eeSSteen Hegelund SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0, 14438595ffb5SSteen Hegelund priv, 14448595ffb5SSteen Hegelund SD25G_LANE_LANE_21(sd_index)); 14458595ffb5SSteen Hegelund 14468595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0_SET 14478595ffb5SSteen Hegelund (params->cfg_eqr_force_3_0), 14482ff8a1eeSSteen Hegelund SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0, 14498595ffb5SSteen Hegelund priv, 14508595ffb5SSteen Hegelund SD25G_LANE_LANE_22(sd_index)); 14518595ffb5SSteen Hegelund 14528595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0_SET 14538595ffb5SSteen Hegelund (params->cfg_eqc_force_3_0) | 14542ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_DFE_PD_SET(params->cfg_dfe_pd), 14552ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0 | 14562ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_DFE_PD, 14578595ffb5SSteen Hegelund priv, 14588595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 14598595ffb5SSteen Hegelund 14608595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN_SET 14618595ffb5SSteen Hegelund (params->cfg_sum_setcm_en), 14622ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN, 14638595ffb5SSteen Hegelund priv, 14648595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 14658595ffb5SSteen Hegelund 14668595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0_SET 14672ff8a1eeSSteen Hegelund (params->cfg_init_pos_iscan_6_0), 14682ff8a1eeSSteen Hegelund SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0, 14698595ffb5SSteen Hegelund priv, 14708595ffb5SSteen Hegelund SD25G_LANE_LANE_25(sd_index)); 14718595ffb5SSteen Hegelund 14728595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0_SET 14732ff8a1eeSSteen Hegelund (params->cfg_init_pos_ipi_6_0), 14742ff8a1eeSSteen Hegelund SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0, 14758595ffb5SSteen Hegelund priv, 14768595ffb5SSteen Hegelund SD25G_LANE_LANE_26(sd_index)); 14778595ffb5SSteen Hegelund 14788595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 14792ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 14808595ffb5SSteen Hegelund priv, 14818595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 14828595ffb5SSteen Hegelund 14838595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0_SET 14848595ffb5SSteen Hegelund (params->cfg_dfedig_m_2_0), 14852ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0, 14868595ffb5SSteen Hegelund priv, 14878595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 14888595ffb5SSteen Hegelund 14898595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG_SET(params->cfg_en_dfedig), 14902ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG, 14918595ffb5SSteen Hegelund priv, 14928595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 14938595ffb5SSteen Hegelund 14948595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_40_LN_R_TX_POL_INV_SET(params->r_tx_pol_inv) | 14952ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_RX_POL_INV_SET(params->r_rx_pol_inv), 14962ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_TX_POL_INV | 14972ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_RX_POL_INV, 14988595ffb5SSteen Hegelund priv, 14998595ffb5SSteen Hegelund SD25G_LANE_LANE_40(sd_index)); 15008595ffb5SSteen Hegelund 15018595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN_SET(params->cfg_rx2tx_lp_en) | 15022ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN_SET(params->cfg_tx2rx_lp_en), 15032ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN | 15042ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN, 15058595ffb5SSteen Hegelund priv, 15068595ffb5SSteen Hegelund SD25G_LANE_LANE_04(sd_index)); 15078595ffb5SSteen Hegelund 15088595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN_SET(params->cfg_rxlb_en), 15092ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN, 15108595ffb5SSteen Hegelund priv, 15118595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 15128595ffb5SSteen Hegelund 15138595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_TXLB_EN_SET(params->cfg_txlb_en), 15142ff8a1eeSSteen Hegelund SD25G_LANE_LANE_19_LN_CFG_TXLB_EN, 15158595ffb5SSteen Hegelund priv, 15168595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 15178595ffb5SSteen Hegelund 15188595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(0), 15192ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 15208595ffb5SSteen Hegelund priv, 15218595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 15228595ffb5SSteen Hegelund 15238595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(1), 15242ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 15258595ffb5SSteen Hegelund priv, 15268595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 15278595ffb5SSteen Hegelund 15288595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(0), 15292ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 15308595ffb5SSteen Hegelund priv, 15318595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 15328595ffb5SSteen Hegelund 15338595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(0), 15342ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 15358595ffb5SSteen Hegelund priv, 15368595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 15372ff8a1eeSSteen Hegelund 15382ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 15392ff8a1eeSSteen Hegelund 15408595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(1), 15412ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 15428595ffb5SSteen Hegelund priv, 15438595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 15442ff8a1eeSSteen Hegelund 15452ff8a1eeSSteen Hegelund usleep_range(10000, 20000); 15462ff8a1eeSSteen Hegelund 15478595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xff), 15482ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 15498595ffb5SSteen Hegelund priv, 15508595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 15512ff8a1eeSSteen Hegelund 15522ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD25G_LANE_CMU_C0(sd_index))); 15532ff8a1eeSSteen Hegelund value = SD25G_LANE_CMU_C0_PLL_LOL_UDL_GET(value); 15542ff8a1eeSSteen Hegelund 15552ff8a1eeSSteen Hegelund if (value) { 15562ff8a1eeSSteen Hegelund dev_err(dev, "25G PLL Loss of Lock: 0x%x\n", value); 15572ff8a1eeSSteen Hegelund return -EINVAL; 15582ff8a1eeSSteen Hegelund } 15592ff8a1eeSSteen Hegelund 15602ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD_LANE_25G_SD_LANE_STAT(sd_index))); 15612ff8a1eeSSteen Hegelund value = SD_LANE_25G_SD_LANE_STAT_PMA_RST_DONE_GET(value); 15622ff8a1eeSSteen Hegelund 15632ff8a1eeSSteen Hegelund if (value != 0x1) { 15642ff8a1eeSSteen Hegelund dev_err(dev, "25G PMA Reset failed: 0x%x\n", value); 15652ff8a1eeSSteen Hegelund return -EINVAL; 15662ff8a1eeSSteen Hegelund } 15678595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS_SET(0x1), 15688595ffb5SSteen Hegelund SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS, 15698595ffb5SSteen Hegelund priv, 15708595ffb5SSteen Hegelund SD25G_LANE_CMU_2A(sd_index)); 15718595ffb5SSteen Hegelund 15728595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_SER_RST_SER_RST_SET(0x0), 15738595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST_SER_RST, 15748595ffb5SSteen Hegelund priv, 15758595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST(sd_index)); 15768595ffb5SSteen Hegelund 15778595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_DES_RST_DES_RST_SET(0x0), 15788595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST_DES_RST, 15798595ffb5SSteen Hegelund priv, 15808595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST(sd_index)); 15818595ffb5SSteen Hegelund 15828595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0), 15838595ffb5SSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 15848595ffb5SSteen Hegelund priv, 15858595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 15868595ffb5SSteen Hegelund 15878595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0_SET 15888595ffb5SSteen Hegelund (params->cfg_alos_thr_2_0), 15898595ffb5SSteen Hegelund SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0, 15908595ffb5SSteen Hegelund priv, 15918595ffb5SSteen Hegelund SD25G_LANE_LANE_2D(sd_index)); 15928595ffb5SSteen Hegelund 15938595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ_SET(0), 15948595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ, 15958595ffb5SSteen Hegelund priv, 15968595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 15978595ffb5SSteen Hegelund 15988595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_PD_SQ_SET(0), 15998595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_PD_SQ, 16008595ffb5SSteen Hegelund priv, 16018595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 16028595ffb5SSteen Hegelund 16032ff8a1eeSSteen Hegelund return 0; 16042ff8a1eeSSteen Hegelund } 16052ff8a1eeSSteen Hegelund 16068595ffb5SSteen Hegelund static void sparx5_sd10g28_reset(void __iomem *regs[], u32 lane_index) 16072ff8a1eeSSteen Hegelund { 16082ff8a1eeSSteen Hegelund /* Note: SerDes SD10G_LANE_1 is configured in 10G_LAN mode */ 16092ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(1), 16102ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 16112ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 16122ff8a1eeSSteen Hegelund 16132ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 16148595ffb5SSteen Hegelund 16158595ffb5SSteen Hegelund sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 16168595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 16178595ffb5SSteen Hegelund sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 16182ff8a1eeSSteen Hegelund } 16192ff8a1eeSSteen Hegelund 16208595ffb5SSteen Hegelund static int sparx5_sd10g28_apply_params(struct sparx5_serdes_macro *macro, 16218595ffb5SSteen Hegelund struct sparx5_sd10g28_params *params) 16222ff8a1eeSSteen Hegelund { 16238595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 16248595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 16258595ffb5SSteen Hegelund struct device *dev = priv->dev; 16268595ffb5SSteen Hegelund u32 lane_index = macro->sidx; 16278595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 16288595ffb5SSteen Hegelund void __iomem *sd_inst; 16298595ffb5SSteen Hegelund u32 value; 16308595ffb5SSteen Hegelund 16318595ffb5SSteen Hegelund if (params->is_6g) 16328595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, sd_index); 16338595ffb5SSteen Hegelund else 16348595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, sd_index); 16358595ffb5SSteen Hegelund 16368595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(1), 16372ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 16388595ffb5SSteen Hegelund priv, 16398595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 16408595ffb5SSteen Hegelund 16418595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT_SET(0x0) | 16422ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_REG_MANUAL_SET(0x1) | 16432ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT_SET(0x1) | 16442ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT_SET(0x1) | 16452ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL_SET(0x0), 16462ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT | 16472ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_REG_MANUAL | 16482ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT | 16492ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT | 16502ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL, 16518595ffb5SSteen Hegelund sd_inst, 16528595ffb5SSteen Hegelund SD10G_LANE_LANE_93(sd_index)); 16538595ffb5SSteen Hegelund 16548595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_94_R_ISCAN_REG_SET(0x1) | 16552ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_TXEQ_REG_SET(0x1) | 16562ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_MISC_REG_SET(0x1) | 16572ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_SWING_REG_SET(0x1), 16582ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_ISCAN_REG | 16592ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_TXEQ_REG | 16602ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_MISC_REG | 16612ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_SWING_REG, 16628595ffb5SSteen Hegelund sd_inst, 16638595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 16648595ffb5SSteen Hegelund 16658595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_RXEQ_REG_SET(0x1), 16662ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_RXEQ_REG, 16678595ffb5SSteen Hegelund sd_inst, 16688595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 16698595ffb5SSteen Hegelund 16708595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_A1_R_SSC_FROM_HWT_SET(0x0) | 16712ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_CDR_FROM_HWT_SET(0x0) | 16722ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT_SET(0x1), 16732ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_SSC_FROM_HWT | 16742ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_CDR_FROM_HWT | 16752ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT, 16768595ffb5SSteen Hegelund sd_inst, 16778595ffb5SSteen Hegelund SD10G_LANE_LANE_A1(sd_index)); 16788595ffb5SSteen Hegelund 16798595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_RX_REF_SEL_SET(params->cmu_sel) | 16802ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_TX_REF_SEL_SET(params->cmu_sel), 16812ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_RX_REF_SEL | 16822ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_TX_REF_SEL, 16838595ffb5SSteen Hegelund priv, 16848595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 16858595ffb5SSteen Hegelund 16868595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0_SET 16878595ffb5SSteen Hegelund (params->cfg_lane_reserve_7_0), 16882ff8a1eeSSteen Hegelund SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0, 16898595ffb5SSteen Hegelund sd_inst, 16908595ffb5SSteen Hegelund SD10G_LANE_LANE_40(sd_index)); 16918595ffb5SSteen Hegelund 16928595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL_SET 16938595ffb5SSteen Hegelund (params->cfg_ssc_rtl_clk_sel), 16942ff8a1eeSSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL, 16958595ffb5SSteen Hegelund sd_inst, 16968595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 16978595ffb5SSteen Hegelund 16988595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_35_CFG_TXRATE_1_0_SET 16998595ffb5SSteen Hegelund (params->cfg_txrate_1_0) | 17008595ffb5SSteen Hegelund SD10G_LANE_LANE_35_CFG_RXRATE_1_0_SET 17018595ffb5SSteen Hegelund (params->cfg_rxrate_1_0), 17022ff8a1eeSSteen Hegelund SD10G_LANE_LANE_35_CFG_TXRATE_1_0 | 17032ff8a1eeSSteen Hegelund SD10G_LANE_LANE_35_CFG_RXRATE_1_0, 17048595ffb5SSteen Hegelund sd_inst, 17058595ffb5SSteen Hegelund SD10G_LANE_LANE_35(sd_index)); 17068595ffb5SSteen Hegelund 17078595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0_SET 17088595ffb5SSteen Hegelund (params->r_d_width_ctrl_2_0), 17092ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0, 17108595ffb5SSteen Hegelund sd_inst, 17118595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 17128595ffb5SSteen Hegelund 17138595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 17142ff8a1eeSSteen Hegelund (params->cfg_pma_tx_ck_bitwidth_2_0), 17152ff8a1eeSSteen Hegelund SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0, 17168595ffb5SSteen Hegelund sd_inst, 17178595ffb5SSteen Hegelund SD10G_LANE_LANE_01(sd_index)); 17188595ffb5SSteen Hegelund 17198595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0_SET 17208595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 17212ff8a1eeSSteen Hegelund SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0, 17228595ffb5SSteen Hegelund sd_inst, 17238595ffb5SSteen Hegelund SD10G_LANE_LANE_30(sd_index)); 17248595ffb5SSteen Hegelund 17258595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0_SET 17262ff8a1eeSSteen Hegelund (params->r_pcs2pma_phymode_4_0), 17272ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0, 17288595ffb5SSteen Hegelund sd_inst, 17298595ffb5SSteen Hegelund SD10G_LANE_LANE_A2(sd_index)); 17308595ffb5SSteen Hegelund 17318595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_13_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 17322ff8a1eeSSteen Hegelund SD10G_LANE_LANE_13_CFG_CDRCK_EN, 17338595ffb5SSteen Hegelund sd_inst, 17348595ffb5SSteen Hegelund SD10G_LANE_LANE_13(sd_index)); 17358595ffb5SSteen Hegelund 17368595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_DFECK_EN_SET 17378595ffb5SSteen Hegelund (params->cfg_dfeck_en) | 17382ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFE_PD_SET(params->cfg_dfe_pd) | 17398595ffb5SSteen Hegelund SD10G_LANE_LANE_23_CFG_ERRAMP_PD_SET 17408595ffb5SSteen Hegelund (params->cfg_erramp_pd), 17412ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFECK_EN | 17422ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFE_PD | 17432ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_ERRAMP_PD, 17448595ffb5SSteen Hegelund sd_inst, 17458595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 17468595ffb5SSteen Hegelund 17478595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1_SET 17488595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 17492ff8a1eeSSteen Hegelund SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1, 17508595ffb5SSteen Hegelund sd_inst, 17518595ffb5SSteen Hegelund SD10G_LANE_LANE_22(sd_index)); 17528595ffb5SSteen Hegelund 17538595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_DFE_EN_SET 17548595ffb5SSteen Hegelund (params->cfg_pi_DFE_en), 17552ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_DFE_EN, 17568595ffb5SSteen Hegelund sd_inst, 17578595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 17588595ffb5SSteen Hegelund 17598595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_02_CFG_EN_ADV_SET(params->cfg_en_adv) | 17602ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_MAIN_SET(params->cfg_en_main) | 17612ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_DLY_SET(params->cfg_en_dly) | 17628595ffb5SSteen Hegelund SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0_SET 17638595ffb5SSteen Hegelund (params->cfg_tap_adv_3_0), 17642ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_ADV | 17652ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_MAIN | 17662ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_DLY | 17672ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0, 17688595ffb5SSteen Hegelund sd_inst, 17698595ffb5SSteen Hegelund SD10G_LANE_LANE_02(sd_index)); 17708595ffb5SSteen Hegelund 17718595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_03_CFG_TAP_MAIN_SET(params->cfg_tap_main), 17722ff8a1eeSSteen Hegelund SD10G_LANE_LANE_03_CFG_TAP_MAIN, 17738595ffb5SSteen Hegelund sd_inst, 17748595ffb5SSteen Hegelund SD10G_LANE_LANE_03(sd_index)); 17758595ffb5SSteen Hegelund 17768595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0_SET 17778595ffb5SSteen Hegelund (params->cfg_tap_dly_4_0), 17782ff8a1eeSSteen Hegelund SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0, 17798595ffb5SSteen Hegelund sd_inst, 17808595ffb5SSteen Hegelund SD10G_LANE_LANE_04(sd_index)); 17818595ffb5SSteen Hegelund 17828595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0_SET 17838595ffb5SSteen Hegelund (params->cfg_vga_ctrl_3_0), 17842ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0, 17858595ffb5SSteen Hegelund sd_inst, 17868595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 17878595ffb5SSteen Hegelund 17888595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0_SET 17898595ffb5SSteen Hegelund (params->cfg_vga_cp_2_0), 17902ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0, 17918595ffb5SSteen Hegelund sd_inst, 17928595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 17938595ffb5SSteen Hegelund 17948595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0_SET 17958595ffb5SSteen Hegelund (params->cfg_eq_res_3_0), 17962ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0, 17978595ffb5SSteen Hegelund sd_inst, 17988595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 17998595ffb5SSteen Hegelund 18008595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0D_CFG_EQR_BYP_SET(params->cfg_eq_r_byp), 18012ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0D_CFG_EQR_BYP, 18028595ffb5SSteen Hegelund sd_inst, 18038595ffb5SSteen Hegelund SD10G_LANE_LANE_0D(sd_index)); 18048595ffb5SSteen Hegelund 18058595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0_SET 18068595ffb5SSteen Hegelund (params->cfg_eq_c_force_3_0) | 18078595ffb5SSteen Hegelund SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN_SET 18088595ffb5SSteen Hegelund (params->cfg_sum_setcm_en), 18092ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0 | 18102ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN, 18118595ffb5SSteen Hegelund sd_inst, 18128595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 18138595ffb5SSteen Hegelund 18148595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_EN_DFEDIG_SET 18158595ffb5SSteen Hegelund (params->cfg_en_dfedig), 18162ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_EN_DFEDIG, 18178595ffb5SSteen Hegelund sd_inst, 18188595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 18198595ffb5SSteen Hegelund 18208595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_EN_PREEMPH_SET 18218595ffb5SSteen Hegelund (params->cfg_en_preemph), 18222ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_EN_PREEMPH, 18238595ffb5SSteen Hegelund sd_inst, 18248595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 18258595ffb5SSteen Hegelund 18268595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0_SET 18272ff8a1eeSSteen Hegelund (params->cfg_itx_ippreemp_base_1_0) | 18282ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0_SET 18292ff8a1eeSSteen Hegelund (params->cfg_itx_ipdriver_base_2_0), 18302ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0 | 18312ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0, 18328595ffb5SSteen Hegelund sd_inst, 18338595ffb5SSteen Hegelund SD10G_LANE_LANE_33(sd_index)); 18348595ffb5SSteen Hegelund 18358595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0_SET 18362ff8a1eeSSteen Hegelund (params->cfg_ibias_tune_reserve_5_0), 18372ff8a1eeSSteen Hegelund SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0, 18388595ffb5SSteen Hegelund sd_inst, 18398595ffb5SSteen Hegelund SD10G_LANE_LANE_52(sd_index)); 18408595ffb5SSteen Hegelund 18418595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_TXSWING_HALF_SET 18428595ffb5SSteen Hegelund (params->cfg_txswing_half), 18432ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_TXSWING_HALF, 18448595ffb5SSteen Hegelund sd_inst, 18458595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 18468595ffb5SSteen Hegelund 18478595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER_SET 18488595ffb5SSteen Hegelund (params->cfg_dis_2nd_order), 18492ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER, 18508595ffb5SSteen Hegelund sd_inst, 18518595ffb5SSteen Hegelund SD10G_LANE_LANE_3C(sd_index)); 18528595ffb5SSteen Hegelund 18538595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_39_CFG_RX_SSC_LH_SET 18548595ffb5SSteen Hegelund (params->cfg_rx_ssc_lh), 18552ff8a1eeSSteen Hegelund SD10G_LANE_LANE_39_CFG_RX_SSC_LH, 18568595ffb5SSteen Hegelund sd_inst, 18578595ffb5SSteen Hegelund SD10G_LANE_LANE_39(sd_index)); 18588595ffb5SSteen Hegelund 18598595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0_SET 18602ff8a1eeSSteen Hegelund (params->cfg_pi_floop_steps_1_0), 18612ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0, 18628595ffb5SSteen Hegelund sd_inst, 18638595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 18648595ffb5SSteen Hegelund 18658595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16_SET 18668595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_23_16), 18672ff8a1eeSSteen Hegelund SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16, 18688595ffb5SSteen Hegelund sd_inst, 18698595ffb5SSteen Hegelund SD10G_LANE_LANE_16(sd_index)); 18708595ffb5SSteen Hegelund 18718595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8_SET 18728595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_15_8), 18732ff8a1eeSSteen Hegelund SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8, 18748595ffb5SSteen Hegelund sd_inst, 18758595ffb5SSteen Hegelund SD10G_LANE_LANE_15(sd_index)); 18768595ffb5SSteen Hegelund 18778595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0_SET 18782ff8a1eeSSteen Hegelund (params->cfg_iscan_ext_dac_7_0), 18792ff8a1eeSSteen Hegelund SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0, 18808595ffb5SSteen Hegelund sd_inst, 18818595ffb5SSteen Hegelund SD10G_LANE_LANE_26(sd_index)); 18828595ffb5SSteen Hegelund 18838595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0_SET 18848595ffb5SSteen Hegelund (params->cfg_cdr_kf_gen1_2_0), 18852ff8a1eeSSteen Hegelund SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0, 18868595ffb5SSteen Hegelund sd_inst, 18878595ffb5SSteen Hegelund SD10G_LANE_LANE_42(sd_index)); 18888595ffb5SSteen Hegelund 18898595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0_SET 18908595ffb5SSteen Hegelund (params->r_cdr_m_gen1_7_0), 18912ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0, 18928595ffb5SSteen Hegelund sd_inst, 18938595ffb5SSteen Hegelund SD10G_LANE_LANE_0F(sd_index)); 18948595ffb5SSteen Hegelund 18958595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0_SET 18968595ffb5SSteen Hegelund (params->cfg_pi_bw_gen1_3_0), 18972ff8a1eeSSteen Hegelund SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0, 18988595ffb5SSteen Hegelund sd_inst, 18998595ffb5SSteen Hegelund SD10G_LANE_LANE_24(sd_index)); 19008595ffb5SSteen Hegelund 19018595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0_SET 19028595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_7_0), 19032ff8a1eeSSteen Hegelund SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0, 19048595ffb5SSteen Hegelund sd_inst, 19058595ffb5SSteen Hegelund SD10G_LANE_LANE_14(sd_index)); 19068595ffb5SSteen Hegelund 19078595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_STEPS_SET(params->cfg_pi_steps), 19082ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_STEPS, 19098595ffb5SSteen Hegelund sd_inst, 19108595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 19118595ffb5SSteen Hegelund 19128595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0_SET 19138595ffb5SSteen Hegelund (params->cfg_mp_max_3_0), 19142ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0, 19158595ffb5SSteen Hegelund sd_inst, 19168595ffb5SSteen Hegelund SD10G_LANE_LANE_3A(sd_index)); 19178595ffb5SSteen Hegelund 19188595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG_SET 19198595ffb5SSteen Hegelund (params->cfg_rstn_dfedig), 19202ff8a1eeSSteen Hegelund SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG, 19218595ffb5SSteen Hegelund sd_inst, 19228595ffb5SSteen Hegelund SD10G_LANE_LANE_31(sd_index)); 19238595ffb5SSteen Hegelund 19248595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0_SET 19258595ffb5SSteen Hegelund (params->cfg_alos_thr_3_0), 19262ff8a1eeSSteen Hegelund SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0, 19278595ffb5SSteen Hegelund sd_inst, 19288595ffb5SSteen Hegelund SD10G_LANE_LANE_48(sd_index)); 19298595ffb5SSteen Hegelund 19308595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0_SET 19312ff8a1eeSSteen Hegelund (params->cfg_predrv_slewrate_1_0), 19322ff8a1eeSSteen Hegelund SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0, 19338595ffb5SSteen Hegelund sd_inst, 19348595ffb5SSteen Hegelund SD10G_LANE_LANE_36(sd_index)); 19358595ffb5SSteen Hegelund 19368595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0_SET 19372ff8a1eeSSteen Hegelund (params->cfg_itx_ipcml_base_1_0), 19382ff8a1eeSSteen Hegelund SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0, 19398595ffb5SSteen Hegelund sd_inst, 19408595ffb5SSteen Hegelund SD10G_LANE_LANE_32(sd_index)); 19418595ffb5SSteen Hegelund 19428595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0_SET 19438595ffb5SSteen Hegelund (params->cfg_ip_pre_base_1_0), 19442ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0, 19458595ffb5SSteen Hegelund sd_inst, 19468595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 19478595ffb5SSteen Hegelund 19488595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8_SET 19492ff8a1eeSSteen Hegelund (params->cfg_lane_reserve_15_8), 19502ff8a1eeSSteen Hegelund SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8, 19518595ffb5SSteen Hegelund sd_inst, 19528595ffb5SSteen Hegelund SD10G_LANE_LANE_41(sd_index)); 19538595ffb5SSteen Hegelund 19548595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN_SET 19558595ffb5SSteen Hegelund (params->r_en_auto_cdr_rstn), 19562ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN, 19578595ffb5SSteen Hegelund sd_inst, 19588595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 19598595ffb5SSteen Hegelund 19608595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0C_CFG_OSCAL_AFE_SET 19618595ffb5SSteen Hegelund (params->cfg_oscal_afe) | 19628595ffb5SSteen Hegelund SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE_SET 19638595ffb5SSteen Hegelund (params->cfg_pd_osdac_afe), 19642ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0C_CFG_OSCAL_AFE | 19652ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE, 19668595ffb5SSteen Hegelund sd_inst, 19678595ffb5SSteen Hegelund SD10G_LANE_LANE_0C(sd_index)); 19688595ffb5SSteen Hegelund 19698595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 19702ff8a1eeSSteen Hegelund (params->cfg_resetb_oscal_afe[0]), 19712ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 19728595ffb5SSteen Hegelund sd_inst, 19738595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 19748595ffb5SSteen Hegelund 19758595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 19762ff8a1eeSSteen Hegelund (params->cfg_resetb_oscal_afe[1]), 19772ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 19788595ffb5SSteen Hegelund sd_inst, 19798595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 19808595ffb5SSteen Hegelund 19818595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_83_R_TX_POL_INV_SET 19828595ffb5SSteen Hegelund (params->r_tx_pol_inv) | 19838595ffb5SSteen Hegelund SD10G_LANE_LANE_83_R_RX_POL_INV_SET 19848595ffb5SSteen Hegelund (params->r_rx_pol_inv), 19852ff8a1eeSSteen Hegelund SD10G_LANE_LANE_83_R_TX_POL_INV | 19862ff8a1eeSSteen Hegelund SD10G_LANE_LANE_83_R_RX_POL_INV, 19878595ffb5SSteen Hegelund sd_inst, 19888595ffb5SSteen Hegelund SD10G_LANE_LANE_83(sd_index)); 19898595ffb5SSteen Hegelund 19908595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN_SET 19918595ffb5SSteen Hegelund (params->cfg_rx2tx_lp_en) | 19928595ffb5SSteen Hegelund SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN_SET 19938595ffb5SSteen Hegelund (params->cfg_tx2rx_lp_en), 19942ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN | 19952ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN, 19968595ffb5SSteen Hegelund sd_inst, 19978595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 19988595ffb5SSteen Hegelund 19998595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_RXLB_EN_SET(params->cfg_rxlb_en) | 20002ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_TXLB_EN_SET(params->cfg_txlb_en), 20012ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_RXLB_EN | 20022ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_TXLB_EN, 20038595ffb5SSteen Hegelund sd_inst, 20048595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 20052ff8a1eeSSteen Hegelund 20068595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(0), 20078595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 20088595ffb5SSteen Hegelund priv, 20098595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 20108595ffb5SSteen Hegelund 20118595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 20128595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 20138595ffb5SSteen Hegelund sd_inst, 20148595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 20158595ffb5SSteen Hegelund 20168595ffb5SSteen Hegelund sdx5_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 20178595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 20188595ffb5SSteen Hegelund priv, 20198595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 20208595ffb5SSteen Hegelund 20218595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_SD_125_RST_DIS_SET(params->fx_100), 20228595ffb5SSteen Hegelund SD_LANE_MISC_SD_125_RST_DIS, 20238595ffb5SSteen Hegelund priv, 20248595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 20258595ffb5SSteen Hegelund 20268595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_RX_ENA_SET(params->fx_100), 20278595ffb5SSteen Hegelund SD_LANE_MISC_RX_ENA, 20288595ffb5SSteen Hegelund priv, 20298595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 20308595ffb5SSteen Hegelund 20318595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_MUX_ENA_SET(params->fx_100), 20328595ffb5SSteen Hegelund SD_LANE_MISC_MUX_ENA, 20338595ffb5SSteen Hegelund priv, 20348595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 20358595ffb5SSteen Hegelund 20362ff8a1eeSSteen Hegelund usleep_range(3000, 6000); 20372ff8a1eeSSteen Hegelund 20382ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD_LANE_SD_LANE_STAT(lane_index))); 20392ff8a1eeSSteen Hegelund value = SD_LANE_SD_LANE_STAT_PMA_RST_DONE_GET(value); 20402ff8a1eeSSteen Hegelund if (value != 1) { 20412ff8a1eeSSteen Hegelund dev_err(dev, "10G PMA Reset failed: 0x%x\n", value); 20422ff8a1eeSSteen Hegelund return -EINVAL; 20432ff8a1eeSSteen Hegelund } 20442ff8a1eeSSteen Hegelund 20458595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_SER_RST_SER_RST_SET(0x0), 20462ff8a1eeSSteen Hegelund SD_LANE_SD_SER_RST_SER_RST, 20478595ffb5SSteen Hegelund priv, 20488595ffb5SSteen Hegelund SD_LANE_SD_SER_RST(lane_index)); 20492ff8a1eeSSteen Hegelund 20508595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_DES_RST_DES_RST_SET(0x0), 20512ff8a1eeSSteen Hegelund SD_LANE_SD_DES_RST_DES_RST, 20528595ffb5SSteen Hegelund priv, 20538595ffb5SSteen Hegelund SD_LANE_SD_DES_RST(lane_index)); 20542ff8a1eeSSteen Hegelund 20552ff8a1eeSSteen Hegelund return 0; 20562ff8a1eeSSteen Hegelund } 20572ff8a1eeSSteen Hegelund 20582ff8a1eeSSteen Hegelund static int sparx5_sd25g28_config(struct sparx5_serdes_macro *macro, bool reset) 20592ff8a1eeSSteen Hegelund { 20602ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset media = media_presets_25g[macro->media]; 20618595ffb5SSteen Hegelund struct sparx5_sd25g28_mode_preset mode; 20622ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args args = { 20632ff8a1eeSSteen Hegelund .rxinvert = 1, 20642ff8a1eeSSteen Hegelund .txinvert = 0, 20652ff8a1eeSSteen Hegelund .txswing = 240, 20662ff8a1eeSSteen Hegelund .com_pll_reserve = 0xf, 20672ff8a1eeSSteen Hegelund .reg_rst = reset, 20682ff8a1eeSSteen Hegelund }; 20692ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params params; 20702ff8a1eeSSteen Hegelund int err; 20712ff8a1eeSSteen Hegelund 20722ff8a1eeSSteen Hegelund err = sparx5_sd10g25_get_mode_preset(macro, &mode); 20732ff8a1eeSSteen Hegelund if (err) 20742ff8a1eeSSteen Hegelund return err; 20752ff8a1eeSSteen Hegelund sparx5_sd25g28_get_params(macro, &media, &mode, &args, ¶ms); 20762ff8a1eeSSteen Hegelund sparx5_sd25g28_reset(macro->priv->regs, ¶ms, macro->stpidx); 20778595ffb5SSteen Hegelund return sparx5_sd25g28_apply_params(macro, ¶ms); 20782ff8a1eeSSteen Hegelund } 20792ff8a1eeSSteen Hegelund 20802ff8a1eeSSteen Hegelund static int sparx5_sd10g28_config(struct sparx5_serdes_macro *macro, bool reset) 20812ff8a1eeSSteen Hegelund { 20822ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset media = media_presets_10g[macro->media]; 20838595ffb5SSteen Hegelund struct sparx5_sd10g28_mode_preset mode; 20848595ffb5SSteen Hegelund struct sparx5_sd10g28_params params; 20852ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args args = { 20862ff8a1eeSSteen Hegelund .is_6g = (macro->serdestype == SPX5_SDT_6G), 20872ff8a1eeSSteen Hegelund .txinvert = 0, 20882ff8a1eeSSteen Hegelund .rxinvert = 1, 20892ff8a1eeSSteen Hegelund .txswing = 240, 20902ff8a1eeSSteen Hegelund .reg_rst = reset, 20912ff8a1eeSSteen Hegelund }; 20922ff8a1eeSSteen Hegelund int err; 20932ff8a1eeSSteen Hegelund 20942ff8a1eeSSteen Hegelund err = sparx5_sd10g28_get_mode_preset(macro, &mode, &args); 20952ff8a1eeSSteen Hegelund if (err) 20962ff8a1eeSSteen Hegelund return err; 20972ff8a1eeSSteen Hegelund sparx5_sd10g28_get_params(macro, &media, &mode, &args, ¶ms); 20988595ffb5SSteen Hegelund sparx5_sd10g28_reset(macro->priv->regs, macro->sidx); 20998595ffb5SSteen Hegelund return sparx5_sd10g28_apply_params(macro, ¶ms); 21002ff8a1eeSSteen Hegelund } 21012ff8a1eeSSteen Hegelund 21022ff8a1eeSSteen Hegelund /* Power down serdes TX driver */ 21032ff8a1eeSSteen Hegelund static int sparx5_serdes_power_save(struct sparx5_serdes_macro *macro, u32 pwdn) 21042ff8a1eeSSteen Hegelund { 21052ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 21063d61a1f8SDaniel Machon void __iomem *sd_inst, *sd_lane_inst; 21072ff8a1eeSSteen Hegelund 21082ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_6G) 21092ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, macro->stpidx); 21102ff8a1eeSSteen Hegelund else if (macro->serdestype == SPX5_SDT_10G) 21112ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, macro->stpidx); 21122ff8a1eeSSteen Hegelund else 21132ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD25G_LANE, macro->stpidx); 21142ff8a1eeSSteen Hegelund 21152ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) { 21163d61a1f8SDaniel Machon sd_lane_inst = sdx5_inst_get(priv, TARGET_SD_LANE_25G, 21173d61a1f8SDaniel Machon macro->stpidx); 21183d61a1f8SDaniel Machon /* Take serdes out of reset */ 21193d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(0), 21203d61a1f8SDaniel Machon SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, sd_lane_inst, 21213d61a1f8SDaniel Machon SD_LANE_25G_SD_LANE_CFG(0)); 21223d61a1f8SDaniel Machon 21233d61a1f8SDaniel Machon /* Configure optimal settings for quiet mode */ 21243d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_25G_QUIET_MODE_6G_QUIET_MODE_SET(SPX5_SERDES_QUIET_MODE_VAL), 21253d61a1f8SDaniel Machon SD_LANE_25G_QUIET_MODE_6G_QUIET_MODE, 21263d61a1f8SDaniel Machon sd_lane_inst, SD_LANE_25G_QUIET_MODE_6G(0)); 21273d61a1f8SDaniel Machon 21282ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER_SET(pwdn), 21292ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER, 21302ff8a1eeSSteen Hegelund sd_inst, 21312ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04(0)); 21322ff8a1eeSSteen Hegelund } else { 21332ff8a1eeSSteen Hegelund /* 6G and 10G */ 21343d61a1f8SDaniel Machon sd_lane_inst = sdx5_inst_get(priv, TARGET_SD_LANE, macro->sidx); 21353d61a1f8SDaniel Machon 21363d61a1f8SDaniel Machon /* Take serdes out of reset */ 21373d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 21383d61a1f8SDaniel Machon SD_LANE_SD_LANE_CFG_EXT_CFG_RST, sd_lane_inst, 21393d61a1f8SDaniel Machon SD_LANE_SD_LANE_CFG(0)); 21403d61a1f8SDaniel Machon 21413d61a1f8SDaniel Machon /* Configure optimal settings for quiet mode */ 21423d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_QUIET_MODE_6G_QUIET_MODE_SET(SPX5_SERDES_QUIET_MODE_VAL), 21433d61a1f8SDaniel Machon SD_LANE_QUIET_MODE_6G_QUIET_MODE, sd_lane_inst, 21443d61a1f8SDaniel Machon SD_LANE_QUIET_MODE_6G(0)); 21453d61a1f8SDaniel Machon 21462ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_PD_DRIVER_SET(pwdn), 21472ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_PD_DRIVER, 21482ff8a1eeSSteen Hegelund sd_inst, 21492ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06(0)); 21502ff8a1eeSSteen Hegelund } 21512ff8a1eeSSteen Hegelund return 0; 21522ff8a1eeSSteen Hegelund } 21532ff8a1eeSSteen Hegelund 21542ff8a1eeSSteen Hegelund static int sparx5_serdes_clock_config(struct sparx5_serdes_macro *macro) 21552ff8a1eeSSteen Hegelund { 21562ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 21572ff8a1eeSSteen Hegelund 21582ff8a1eeSSteen Hegelund if (macro->serdesmode == SPX5_SD_MODE_100FX) { 21592ff8a1eeSSteen Hegelund u32 freq = priv->coreclock == 250000000 ? 2 : 21602ff8a1eeSSteen Hegelund priv->coreclock == 500000000 ? 1 : 0; 21612ff8a1eeSSteen Hegelund 21622ff8a1eeSSteen Hegelund sdx5_rmw(SD_LANE_MISC_CORE_CLK_FREQ_SET(freq), 21632ff8a1eeSSteen Hegelund SD_LANE_MISC_CORE_CLK_FREQ, 21642ff8a1eeSSteen Hegelund priv, 21652ff8a1eeSSteen Hegelund SD_LANE_MISC(macro->sidx)); 21662ff8a1eeSSteen Hegelund } 21672ff8a1eeSSteen Hegelund return 0; 21682ff8a1eeSSteen Hegelund } 21692ff8a1eeSSteen Hegelund 21702ff8a1eeSSteen Hegelund static int sparx5_serdes_get_serdesmode(phy_interface_t portmode, int speed) 21712ff8a1eeSSteen Hegelund { 21722ff8a1eeSSteen Hegelund switch (portmode) { 21732ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 21742ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 21752ff8a1eeSSteen Hegelund if (speed == SPEED_2500) 21762ff8a1eeSSteen Hegelund return SPX5_SD_MODE_2G5; 21772ff8a1eeSSteen Hegelund if (speed == SPEED_100) 21782ff8a1eeSSteen Hegelund return SPX5_SD_MODE_100FX; 21792ff8a1eeSSteen Hegelund return SPX5_SD_MODE_1000BASEX; 21802ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 21812ff8a1eeSSteen Hegelund /* The same Serdes mode is used for both SGMII and 1000BaseX */ 21822ff8a1eeSSteen Hegelund return SPX5_SD_MODE_1000BASEX; 21832ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 21842ff8a1eeSSteen Hegelund return SPX5_SD_MODE_QSGMII; 21852ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 21862ff8a1eeSSteen Hegelund return SPX5_SD_MODE_SFI; 21872ff8a1eeSSteen Hegelund default: 21882ff8a1eeSSteen Hegelund return -EINVAL; 21892ff8a1eeSSteen Hegelund } 21902ff8a1eeSSteen Hegelund } 21912ff8a1eeSSteen Hegelund 21922ff8a1eeSSteen Hegelund static int sparx5_serdes_config(struct sparx5_serdes_macro *macro) 21932ff8a1eeSSteen Hegelund { 21942ff8a1eeSSteen Hegelund struct device *dev = macro->priv->dev; 21952ff8a1eeSSteen Hegelund int serdesmode; 21962ff8a1eeSSteen Hegelund int err; 21972ff8a1eeSSteen Hegelund 21982ff8a1eeSSteen Hegelund err = sparx5_serdes_cmu_enable(macro->priv); 21992ff8a1eeSSteen Hegelund if (err) 22002ff8a1eeSSteen Hegelund return err; 22012ff8a1eeSSteen Hegelund 22022ff8a1eeSSteen Hegelund serdesmode = sparx5_serdes_get_serdesmode(macro->portmode, macro->speed); 22032ff8a1eeSSteen Hegelund if (serdesmode < 0) { 22042ff8a1eeSSteen Hegelund dev_err(dev, "SerDes %u, interface not supported: %s\n", 22052ff8a1eeSSteen Hegelund macro->sidx, 22062ff8a1eeSSteen Hegelund phy_modes(macro->portmode)); 22072ff8a1eeSSteen Hegelund return serdesmode; 22082ff8a1eeSSteen Hegelund } 22092ff8a1eeSSteen Hegelund macro->serdesmode = serdesmode; 22102ff8a1eeSSteen Hegelund 22112ff8a1eeSSteen Hegelund sparx5_serdes_clock_config(macro); 22122ff8a1eeSSteen Hegelund 22132ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) 22142ff8a1eeSSteen Hegelund err = sparx5_sd25g28_config(macro, false); 22152ff8a1eeSSteen Hegelund else 22162ff8a1eeSSteen Hegelund err = sparx5_sd10g28_config(macro, false); 22172ff8a1eeSSteen Hegelund if (err) { 22182ff8a1eeSSteen Hegelund dev_err(dev, "SerDes %u, config error: %d\n", 22192ff8a1eeSSteen Hegelund macro->sidx, err); 22202ff8a1eeSSteen Hegelund } 22212ff8a1eeSSteen Hegelund return err; 22222ff8a1eeSSteen Hegelund } 22232ff8a1eeSSteen Hegelund 22242ff8a1eeSSteen Hegelund static int sparx5_serdes_power_on(struct phy *phy) 22252ff8a1eeSSteen Hegelund { 22262ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22272ff8a1eeSSteen Hegelund 22282ff8a1eeSSteen Hegelund return sparx5_serdes_power_save(macro, false); 22292ff8a1eeSSteen Hegelund } 22302ff8a1eeSSteen Hegelund 22312ff8a1eeSSteen Hegelund static int sparx5_serdes_power_off(struct phy *phy) 22322ff8a1eeSSteen Hegelund { 22332ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22342ff8a1eeSSteen Hegelund 22352ff8a1eeSSteen Hegelund return sparx5_serdes_power_save(macro, true); 22362ff8a1eeSSteen Hegelund } 22372ff8a1eeSSteen Hegelund 22382ff8a1eeSSteen Hegelund static int sparx5_serdes_set_mode(struct phy *phy, enum phy_mode mode, int submode) 22392ff8a1eeSSteen Hegelund { 22402ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro; 22412ff8a1eeSSteen Hegelund 22422ff8a1eeSSteen Hegelund if (mode != PHY_MODE_ETHERNET) 22432ff8a1eeSSteen Hegelund return -EINVAL; 22442ff8a1eeSSteen Hegelund 22452ff8a1eeSSteen Hegelund switch (submode) { 22462ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 22472ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 22482ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 22492ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 22502ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 22512ff8a1eeSSteen Hegelund macro = phy_get_drvdata(phy); 22522ff8a1eeSSteen Hegelund macro->portmode = submode; 22532ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 22542ff8a1eeSSteen Hegelund return 0; 22552ff8a1eeSSteen Hegelund default: 22562ff8a1eeSSteen Hegelund return -EINVAL; 22572ff8a1eeSSteen Hegelund } 22582ff8a1eeSSteen Hegelund } 22592ff8a1eeSSteen Hegelund 22602ff8a1eeSSteen Hegelund static int sparx5_serdes_set_media(struct phy *phy, enum phy_media media) 22612ff8a1eeSSteen Hegelund { 22622ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22632ff8a1eeSSteen Hegelund 22642ff8a1eeSSteen Hegelund if (media != macro->media) { 22652ff8a1eeSSteen Hegelund macro->media = media; 22662ff8a1eeSSteen Hegelund if (macro->serdesmode != SPX5_SD_MODE_NONE) 22672ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 22682ff8a1eeSSteen Hegelund } 22692ff8a1eeSSteen Hegelund return 0; 22702ff8a1eeSSteen Hegelund } 22712ff8a1eeSSteen Hegelund 22722ff8a1eeSSteen Hegelund static int sparx5_serdes_set_speed(struct phy *phy, int speed) 22732ff8a1eeSSteen Hegelund { 22742ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22752ff8a1eeSSteen Hegelund 22762ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_10G_START && speed > SPEED_5000) 22772ff8a1eeSSteen Hegelund return -EINVAL; 22782ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_25G_START && speed > SPEED_10000) 22792ff8a1eeSSteen Hegelund return -EINVAL; 22802ff8a1eeSSteen Hegelund if (speed != macro->speed) { 22812ff8a1eeSSteen Hegelund macro->speed = speed; 22822ff8a1eeSSteen Hegelund if (macro->serdesmode != SPX5_SD_MODE_NONE) 22832ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 22842ff8a1eeSSteen Hegelund } 22852ff8a1eeSSteen Hegelund return 0; 22862ff8a1eeSSteen Hegelund } 22872ff8a1eeSSteen Hegelund 22882ff8a1eeSSteen Hegelund static int sparx5_serdes_reset(struct phy *phy) 22892ff8a1eeSSteen Hegelund { 22902ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22912ff8a1eeSSteen Hegelund int err; 22922ff8a1eeSSteen Hegelund 22932ff8a1eeSSteen Hegelund err = sparx5_serdes_cmu_enable(macro->priv); 22942ff8a1eeSSteen Hegelund if (err) 22952ff8a1eeSSteen Hegelund return err; 22962ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) 22972ff8a1eeSSteen Hegelund err = sparx5_sd25g28_config(macro, true); 22982ff8a1eeSSteen Hegelund else 22992ff8a1eeSSteen Hegelund err = sparx5_sd10g28_config(macro, true); 23002ff8a1eeSSteen Hegelund if (err) { 23012ff8a1eeSSteen Hegelund dev_err(&phy->dev, "SerDes %u, reset error: %d\n", 23022ff8a1eeSSteen Hegelund macro->sidx, err); 23032ff8a1eeSSteen Hegelund } 23042ff8a1eeSSteen Hegelund return err; 23052ff8a1eeSSteen Hegelund } 23062ff8a1eeSSteen Hegelund 23072ff8a1eeSSteen Hegelund static int sparx5_serdes_validate(struct phy *phy, enum phy_mode mode, 23082ff8a1eeSSteen Hegelund int submode, 23092ff8a1eeSSteen Hegelund union phy_configure_opts *opts) 23102ff8a1eeSSteen Hegelund { 23112ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 23122ff8a1eeSSteen Hegelund 23132ff8a1eeSSteen Hegelund if (mode != PHY_MODE_ETHERNET) 23142ff8a1eeSSteen Hegelund return -EINVAL; 23152ff8a1eeSSteen Hegelund 23162ff8a1eeSSteen Hegelund if (macro->speed == 0) 23172ff8a1eeSSteen Hegelund return -EINVAL; 23182ff8a1eeSSteen Hegelund 23192ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_10G_START && macro->speed > SPEED_5000) 23202ff8a1eeSSteen Hegelund return -EINVAL; 23212ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_25G_START && macro->speed > SPEED_10000) 23222ff8a1eeSSteen Hegelund return -EINVAL; 23232ff8a1eeSSteen Hegelund 23242ff8a1eeSSteen Hegelund switch (submode) { 23252ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 23262ff8a1eeSSteen Hegelund if (macro->speed != SPEED_100 && /* This is for 100BASE-FX */ 23272ff8a1eeSSteen Hegelund macro->speed != SPEED_1000) 23282ff8a1eeSSteen Hegelund return -EINVAL; 23292ff8a1eeSSteen Hegelund break; 23302ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 23312ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 23322ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 23332ff8a1eeSSteen Hegelund if (macro->speed >= SPEED_5000) 23342ff8a1eeSSteen Hegelund return -EINVAL; 23352ff8a1eeSSteen Hegelund break; 23362ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 23372ff8a1eeSSteen Hegelund if (macro->speed < SPEED_5000) 23382ff8a1eeSSteen Hegelund return -EINVAL; 23392ff8a1eeSSteen Hegelund break; 23402ff8a1eeSSteen Hegelund default: 23412ff8a1eeSSteen Hegelund return -EINVAL; 23422ff8a1eeSSteen Hegelund } 23432ff8a1eeSSteen Hegelund return 0; 23442ff8a1eeSSteen Hegelund } 23452ff8a1eeSSteen Hegelund 23462ff8a1eeSSteen Hegelund static const struct phy_ops sparx5_serdes_ops = { 23472ff8a1eeSSteen Hegelund .power_on = sparx5_serdes_power_on, 23482ff8a1eeSSteen Hegelund .power_off = sparx5_serdes_power_off, 23492ff8a1eeSSteen Hegelund .set_mode = sparx5_serdes_set_mode, 23502ff8a1eeSSteen Hegelund .set_media = sparx5_serdes_set_media, 23512ff8a1eeSSteen Hegelund .set_speed = sparx5_serdes_set_speed, 23522ff8a1eeSSteen Hegelund .reset = sparx5_serdes_reset, 23532ff8a1eeSSteen Hegelund .validate = sparx5_serdes_validate, 23542ff8a1eeSSteen Hegelund .owner = THIS_MODULE, 23552ff8a1eeSSteen Hegelund }; 23562ff8a1eeSSteen Hegelund 23572ff8a1eeSSteen Hegelund static int sparx5_phy_create(struct sparx5_serdes_private *priv, 23582ff8a1eeSSteen Hegelund int idx, struct phy **phy) 23592ff8a1eeSSteen Hegelund { 23602ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro; 23612ff8a1eeSSteen Hegelund 23622ff8a1eeSSteen Hegelund *phy = devm_phy_create(priv->dev, NULL, &sparx5_serdes_ops); 23632ff8a1eeSSteen Hegelund if (IS_ERR(*phy)) 23642ff8a1eeSSteen Hegelund return PTR_ERR(*phy); 23652ff8a1eeSSteen Hegelund 23662ff8a1eeSSteen Hegelund macro = devm_kzalloc(priv->dev, sizeof(*macro), GFP_KERNEL); 23672ff8a1eeSSteen Hegelund if (!macro) 23682ff8a1eeSSteen Hegelund return -ENOMEM; 23692ff8a1eeSSteen Hegelund 23702ff8a1eeSSteen Hegelund macro->sidx = idx; 23712ff8a1eeSSteen Hegelund macro->priv = priv; 23722ff8a1eeSSteen Hegelund macro->speed = SPEED_UNKNOWN; 23732ff8a1eeSSteen Hegelund if (idx < SPX5_SERDES_10G_START) { 23742ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_6G; 23752ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx; 23762ff8a1eeSSteen Hegelund } else if (idx < SPX5_SERDES_25G_START) { 23772ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_10G; 23782ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx - SPX5_SERDES_10G_START; 23792ff8a1eeSSteen Hegelund } else { 23802ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_25G; 23812ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx - SPX5_SERDES_25G_START; 23822ff8a1eeSSteen Hegelund } 23832ff8a1eeSSteen Hegelund 23842ff8a1eeSSteen Hegelund phy_set_drvdata(*phy, macro); 23852ff8a1eeSSteen Hegelund 23863d61a1f8SDaniel Machon /* Power off serdes by default */ 23873d61a1f8SDaniel Machon sparx5_serdes_power_off(*phy); 23883d61a1f8SDaniel Machon 23892ff8a1eeSSteen Hegelund return 0; 23902ff8a1eeSSteen Hegelund } 23912ff8a1eeSSteen Hegelund 23922ff8a1eeSSteen Hegelund static struct sparx5_serdes_io_resource sparx5_serdes_iomap[] = { 23932ff8a1eeSSteen Hegelund { TARGET_SD_CMU, 0x0 }, /* 0x610808000: sd_cmu_0 */ 23942ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 1, 0x8000 }, /* 0x610810000: sd_cmu_1 */ 23952ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 2, 0x10000 }, /* 0x610818000: sd_cmu_2 */ 23962ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 3, 0x18000 }, /* 0x610820000: sd_cmu_3 */ 23972ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 4, 0x20000 }, /* 0x610828000: sd_cmu_4 */ 23982ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 5, 0x28000 }, /* 0x610830000: sd_cmu_5 */ 23992ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 6, 0x30000 }, /* 0x610838000: sd_cmu_6 */ 24002ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 7, 0x38000 }, /* 0x610840000: sd_cmu_7 */ 24012ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 8, 0x40000 }, /* 0x610848000: sd_cmu_8 */ 24022ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG, 0x48000 }, /* 0x610850000: sd_cmu_cfg_0 */ 24032ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 1, 0x50000 }, /* 0x610858000: sd_cmu_cfg_1 */ 24042ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 2, 0x58000 }, /* 0x610860000: sd_cmu_cfg_2 */ 24052ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 3, 0x60000 }, /* 0x610868000: sd_cmu_cfg_3 */ 24062ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 4, 0x68000 }, /* 0x610870000: sd_cmu_cfg_4 */ 24072ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 5, 0x70000 }, /* 0x610878000: sd_cmu_cfg_5 */ 24082ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 6, 0x78000 }, /* 0x610880000: sd_cmu_cfg_6 */ 24092ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 7, 0x80000 }, /* 0x610888000: sd_cmu_cfg_7 */ 24102ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 8, 0x88000 }, /* 0x610890000: sd_cmu_cfg_8 */ 24112ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE, 0x90000 }, /* 0x610898000: sd6g_lane_0 */ 24122ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 1, 0x98000 }, /* 0x6108a0000: sd6g_lane_1 */ 24132ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 2, 0xa0000 }, /* 0x6108a8000: sd6g_lane_2 */ 24142ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 3, 0xa8000 }, /* 0x6108b0000: sd6g_lane_3 */ 24152ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 4, 0xb0000 }, /* 0x6108b8000: sd6g_lane_4 */ 24162ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 5, 0xb8000 }, /* 0x6108c0000: sd6g_lane_5 */ 24172ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 6, 0xc0000 }, /* 0x6108c8000: sd6g_lane_6 */ 24182ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 7, 0xc8000 }, /* 0x6108d0000: sd6g_lane_7 */ 24192ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 8, 0xd0000 }, /* 0x6108d8000: sd6g_lane_8 */ 24202ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 9, 0xd8000 }, /* 0x6108e0000: sd6g_lane_9 */ 24212ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 10, 0xe0000 }, /* 0x6108e8000: sd6g_lane_10 */ 24222ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 11, 0xe8000 }, /* 0x6108f0000: sd6g_lane_11 */ 24232ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 12, 0xf0000 }, /* 0x6108f8000: sd6g_lane_12 */ 24242ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE, 0xf8000 }, /* 0x610900000: sd10g_lane_0 */ 24252ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 1, 0x100000 }, /* 0x610908000: sd10g_lane_1 */ 24262ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 2, 0x108000 }, /* 0x610910000: sd10g_lane_2 */ 24272ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 3, 0x110000 }, /* 0x610918000: sd10g_lane_3 */ 24282ff8a1eeSSteen Hegelund { TARGET_SD_LANE, 0x1a0000 }, /* 0x6109a8000: sd_lane_0 */ 24292ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 1, 0x1a8000 }, /* 0x6109b0000: sd_lane_1 */ 24302ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 2, 0x1b0000 }, /* 0x6109b8000: sd_lane_2 */ 24312ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 3, 0x1b8000 }, /* 0x6109c0000: sd_lane_3 */ 24322ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 4, 0x1c0000 }, /* 0x6109c8000: sd_lane_4 */ 24332ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 5, 0x1c8000 }, /* 0x6109d0000: sd_lane_5 */ 24342ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 6, 0x1d0000 }, /* 0x6109d8000: sd_lane_6 */ 24352ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 7, 0x1d8000 }, /* 0x6109e0000: sd_lane_7 */ 24362ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 8, 0x1e0000 }, /* 0x6109e8000: sd_lane_8 */ 24372ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 9, 0x1e8000 }, /* 0x6109f0000: sd_lane_9 */ 24382ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 10, 0x1f0000 }, /* 0x6109f8000: sd_lane_10 */ 24392ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 11, 0x1f8000 }, /* 0x610a00000: sd_lane_11 */ 24402ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 12, 0x200000 }, /* 0x610a08000: sd_lane_12 */ 24412ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 13, 0x208000 }, /* 0x610a10000: sd_lane_13 */ 24422ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 14, 0x210000 }, /* 0x610a18000: sd_lane_14 */ 24432ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 15, 0x218000 }, /* 0x610a20000: sd_lane_15 */ 24442ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 16, 0x220000 }, /* 0x610a28000: sd_lane_16 */ 24452ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 9, 0x400000 }, /* 0x610c08000: sd_cmu_9 */ 24462ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 10, 0x408000 }, /* 0x610c10000: sd_cmu_10 */ 24472ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 11, 0x410000 }, /* 0x610c18000: sd_cmu_11 */ 24482ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 12, 0x418000 }, /* 0x610c20000: sd_cmu_12 */ 24492ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 13, 0x420000 }, /* 0x610c28000: sd_cmu_13 */ 24502ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 9, 0x428000 }, /* 0x610c30000: sd_cmu_cfg_9 */ 24512ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 10, 0x430000 }, /* 0x610c38000: sd_cmu_cfg_10 */ 24522ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 11, 0x438000 }, /* 0x610c40000: sd_cmu_cfg_11 */ 24532ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 12, 0x440000 }, /* 0x610c48000: sd_cmu_cfg_12 */ 24542ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 13, 0x448000 }, /* 0x610c50000: sd_cmu_cfg_13 */ 24552ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 4, 0x450000 }, /* 0x610c58000: sd10g_lane_4 */ 24562ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 5, 0x458000 }, /* 0x610c60000: sd10g_lane_5 */ 24572ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 6, 0x460000 }, /* 0x610c68000: sd10g_lane_6 */ 24582ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 7, 0x468000 }, /* 0x610c70000: sd10g_lane_7 */ 24592ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 8, 0x470000 }, /* 0x610c78000: sd10g_lane_8 */ 24602ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 9, 0x478000 }, /* 0x610c80000: sd10g_lane_9 */ 24612ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 10, 0x480000 }, /* 0x610c88000: sd10g_lane_10 */ 24622ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 11, 0x488000 }, /* 0x610c90000: sd10g_lane_11 */ 24632ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE, 0x490000 }, /* 0x610c98000: sd25g_lane_0 */ 24642ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 1, 0x498000 }, /* 0x610ca0000: sd25g_lane_1 */ 24652ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 2, 0x4a0000 }, /* 0x610ca8000: sd25g_lane_2 */ 24662ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 3, 0x4a8000 }, /* 0x610cb0000: sd25g_lane_3 */ 24672ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 4, 0x4b0000 }, /* 0x610cb8000: sd25g_lane_4 */ 24682ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 5, 0x4b8000 }, /* 0x610cc0000: sd25g_lane_5 */ 24692ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 6, 0x4c0000 }, /* 0x610cc8000: sd25g_lane_6 */ 24702ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 7, 0x4c8000 }, /* 0x610cd0000: sd25g_lane_7 */ 24712ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 17, 0x550000 }, /* 0x610d58000: sd_lane_17 */ 24722ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 18, 0x558000 }, /* 0x610d60000: sd_lane_18 */ 24732ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 19, 0x560000 }, /* 0x610d68000: sd_lane_19 */ 24742ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 20, 0x568000 }, /* 0x610d70000: sd_lane_20 */ 24752ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 21, 0x570000 }, /* 0x610d78000: sd_lane_21 */ 24762ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 22, 0x578000 }, /* 0x610d80000: sd_lane_22 */ 24772ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 23, 0x580000 }, /* 0x610d88000: sd_lane_23 */ 24782ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 24, 0x588000 }, /* 0x610d90000: sd_lane_24 */ 24792ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G, 0x590000 }, /* 0x610d98000: sd_lane_25g_25 */ 24802ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 1, 0x598000 }, /* 0x610da0000: sd_lane_25g_26 */ 24812ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 2, 0x5a0000 }, /* 0x610da8000: sd_lane_25g_27 */ 24822ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 3, 0x5a8000 }, /* 0x610db0000: sd_lane_25g_28 */ 24832ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 4, 0x5b0000 }, /* 0x610db8000: sd_lane_25g_29 */ 24842ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 5, 0x5b8000 }, /* 0x610dc0000: sd_lane_25g_30 */ 24852ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 6, 0x5c0000 }, /* 0x610dc8000: sd_lane_25g_31 */ 24862ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 7, 0x5c8000 }, /* 0x610dd0000: sd_lane_25g_32 */ 24872ff8a1eeSSteen Hegelund }; 24882ff8a1eeSSteen Hegelund 24892ff8a1eeSSteen Hegelund /* Client lookup function, uses serdes index */ 24902ff8a1eeSSteen Hegelund static struct phy *sparx5_serdes_xlate(struct device *dev, 24912ff8a1eeSSteen Hegelund struct of_phandle_args *args) 24922ff8a1eeSSteen Hegelund { 24932ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = dev_get_drvdata(dev); 24942ff8a1eeSSteen Hegelund int idx; 24952ff8a1eeSSteen Hegelund unsigned int sidx; 24962ff8a1eeSSteen Hegelund 24972ff8a1eeSSteen Hegelund if (args->args_count != 1) 24982ff8a1eeSSteen Hegelund return ERR_PTR(-EINVAL); 24992ff8a1eeSSteen Hegelund 25002ff8a1eeSSteen Hegelund sidx = args->args[0]; 25012ff8a1eeSSteen Hegelund 25022ff8a1eeSSteen Hegelund /* Check validity: ERR_PTR(-ENODEV) if not valid */ 25032ff8a1eeSSteen Hegelund for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 25042ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = 25052ff8a1eeSSteen Hegelund phy_get_drvdata(priv->phys[idx]); 25062ff8a1eeSSteen Hegelund 25072ff8a1eeSSteen Hegelund if (sidx != macro->sidx) 25082ff8a1eeSSteen Hegelund continue; 25092ff8a1eeSSteen Hegelund 25102ff8a1eeSSteen Hegelund return priv->phys[idx]; 25112ff8a1eeSSteen Hegelund } 25122ff8a1eeSSteen Hegelund return ERR_PTR(-ENODEV); 25132ff8a1eeSSteen Hegelund } 25142ff8a1eeSSteen Hegelund 25152ff8a1eeSSteen Hegelund static int sparx5_serdes_probe(struct platform_device *pdev) 25162ff8a1eeSSteen Hegelund { 25172ff8a1eeSSteen Hegelund struct device_node *np = pdev->dev.of_node; 25182ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv; 25192ff8a1eeSSteen Hegelund struct phy_provider *provider; 25202ff8a1eeSSteen Hegelund struct resource *iores; 25212ff8a1eeSSteen Hegelund void __iomem *iomem; 25222ff8a1eeSSteen Hegelund unsigned long clock; 25232ff8a1eeSSteen Hegelund struct clk *clk; 25242ff8a1eeSSteen Hegelund int idx; 25252ff8a1eeSSteen Hegelund int err; 25262ff8a1eeSSteen Hegelund 25272ff8a1eeSSteen Hegelund if (!np && !pdev->dev.platform_data) 25282ff8a1eeSSteen Hegelund return -ENODEV; 25292ff8a1eeSSteen Hegelund 25302ff8a1eeSSteen Hegelund priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 25312ff8a1eeSSteen Hegelund if (!priv) 25322ff8a1eeSSteen Hegelund return -ENOMEM; 25332ff8a1eeSSteen Hegelund 25342ff8a1eeSSteen Hegelund platform_set_drvdata(pdev, priv); 25352ff8a1eeSSteen Hegelund priv->dev = &pdev->dev; 25362ff8a1eeSSteen Hegelund 25372ff8a1eeSSteen Hegelund /* Get coreclock */ 25382ff8a1eeSSteen Hegelund clk = devm_clk_get(priv->dev, NULL); 25392ff8a1eeSSteen Hegelund if (IS_ERR(clk)) { 25402ff8a1eeSSteen Hegelund dev_err(priv->dev, "Failed to get coreclock\n"); 25412ff8a1eeSSteen Hegelund return PTR_ERR(clk); 25422ff8a1eeSSteen Hegelund } 25432ff8a1eeSSteen Hegelund clock = clk_get_rate(clk); 25442ff8a1eeSSteen Hegelund if (clock == 0) { 25452ff8a1eeSSteen Hegelund dev_err(priv->dev, "Invalid coreclock %lu\n", clock); 25462ff8a1eeSSteen Hegelund return -EINVAL; 25472ff8a1eeSSteen Hegelund } 25482ff8a1eeSSteen Hegelund priv->coreclock = clock; 25492ff8a1eeSSteen Hegelund 25502ff8a1eeSSteen Hegelund iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2551d1ce245fSYang Yingliang if (!iores) { 2552d1ce245fSYang Yingliang dev_err(priv->dev, "Invalid resource\n"); 2553d1ce245fSYang Yingliang return -EINVAL; 2554d1ce245fSYang Yingliang } 2555cbc336c0Skernel test robot iomem = devm_ioremap(priv->dev, iores->start, resource_size(iores)); 2556b4dc97abSYang Yingliang if (!iomem) { 25572ff8a1eeSSteen Hegelund dev_err(priv->dev, "Unable to get serdes registers: %s\n", 25582ff8a1eeSSteen Hegelund iores->name); 2559b4dc97abSYang Yingliang return -ENOMEM; 25602ff8a1eeSSteen Hegelund } 25612ff8a1eeSSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(sparx5_serdes_iomap); idx++) { 25622ff8a1eeSSteen Hegelund struct sparx5_serdes_io_resource *iomap = &sparx5_serdes_iomap[idx]; 25632ff8a1eeSSteen Hegelund 25642ff8a1eeSSteen Hegelund priv->regs[iomap->id] = iomem + iomap->offset; 25652ff8a1eeSSteen Hegelund } 25662ff8a1eeSSteen Hegelund for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 25672ff8a1eeSSteen Hegelund err = sparx5_phy_create(priv, idx, &priv->phys[idx]); 25682ff8a1eeSSteen Hegelund if (err) 25692ff8a1eeSSteen Hegelund return err; 25702ff8a1eeSSteen Hegelund } 25712ff8a1eeSSteen Hegelund 2572*044f3a1aSDaniel Machon /* Power down all CMUs by default */ 2573*044f3a1aSDaniel Machon sparx5_serdes_cmu_power_off(priv); 2574*044f3a1aSDaniel Machon 25752ff8a1eeSSteen Hegelund provider = devm_of_phy_provider_register(priv->dev, sparx5_serdes_xlate); 25762ff8a1eeSSteen Hegelund 25772ff8a1eeSSteen Hegelund return PTR_ERR_OR_ZERO(provider); 25782ff8a1eeSSteen Hegelund } 25792ff8a1eeSSteen Hegelund 25802ff8a1eeSSteen Hegelund static const struct of_device_id sparx5_serdes_match[] = { 25812ff8a1eeSSteen Hegelund { .compatible = "microchip,sparx5-serdes" }, 25822ff8a1eeSSteen Hegelund { } 25832ff8a1eeSSteen Hegelund }; 25842ff8a1eeSSteen Hegelund MODULE_DEVICE_TABLE(of, sparx5_serdes_match); 25852ff8a1eeSSteen Hegelund 25862ff8a1eeSSteen Hegelund static struct platform_driver sparx5_serdes_driver = { 25872ff8a1eeSSteen Hegelund .probe = sparx5_serdes_probe, 25882ff8a1eeSSteen Hegelund .driver = { 25892ff8a1eeSSteen Hegelund .name = "sparx5-serdes", 25902ff8a1eeSSteen Hegelund .of_match_table = sparx5_serdes_match, 25912ff8a1eeSSteen Hegelund }, 25922ff8a1eeSSteen Hegelund }; 25932ff8a1eeSSteen Hegelund 25942ff8a1eeSSteen Hegelund module_platform_driver(sparx5_serdes_driver); 25952ff8a1eeSSteen Hegelund 25962ff8a1eeSSteen Hegelund MODULE_DESCRIPTION("Microchip Sparx5 switch serdes driver"); 25972ff8a1eeSSteen Hegelund MODULE_AUTHOR("Steen Hegelund <steen.hegelund@microchip.com>"); 25982ff8a1eeSSteen Hegelund MODULE_LICENSE("GPL v2"); 2599