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 2896bb1664SDaniel Machon #define SPX5_SERDES_6G10G_CNT SPX5_SERDES_25G_START 292ff8a1eeSSteen Hegelund 303d61a1f8SDaniel Machon /* Optimal power settings from GUC */ 313d61a1f8SDaniel Machon #define SPX5_SERDES_QUIET_MODE_VAL 0x01ef4e0c 323d61a1f8SDaniel Machon 332ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode { 342ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_MAIN = 0, 352ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_AUX1 = 1, 362ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_AUX2 = 3, 372ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_NONE = 4, 3896bb1664SDaniel Machon SPX5_SD10G28_CMU_MAX, 392ff8a1eeSSteen Hegelund }; 402ff8a1eeSSteen Hegelund 412ff8a1eeSSteen Hegelund enum sparx5_sd25g28_mode_preset_type { 422ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_25000, 432ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_10000, 442ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_5000, 452ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_SD_2G5, 462ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_1000BASEX, 472ff8a1eeSSteen Hegelund }; 482ff8a1eeSSteen Hegelund 492ff8a1eeSSteen Hegelund enum sparx5_sd10g28_mode_preset_type { 502ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_10000, 512ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SFI_5000_6G, 522ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SFI_5000_10G, 532ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_QSGMII, 542ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SD_2G5, 552ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_1000BASEX, 562ff8a1eeSSteen Hegelund }; 572ff8a1eeSSteen Hegelund 582ff8a1eeSSteen Hegelund struct sparx5_serdes_io_resource { 592ff8a1eeSSteen Hegelund enum sparx5_serdes_target id; 602ff8a1eeSSteen Hegelund phys_addr_t offset; 612ff8a1eeSSteen Hegelund }; 622ff8a1eeSSteen Hegelund 632ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset { 642ff8a1eeSSteen Hegelund u8 bitwidth; 652ff8a1eeSSteen Hegelund u8 tx_pre_div; 662ff8a1eeSSteen Hegelund u8 fifo_ck_div; 672ff8a1eeSSteen Hegelund u8 pre_divsel; 682ff8a1eeSSteen Hegelund u8 vco_div_mode; 692ff8a1eeSSteen Hegelund u8 sel_div; 702ff8a1eeSSteen Hegelund u8 ck_bitwidth; 712ff8a1eeSSteen Hegelund u8 subrate; 722ff8a1eeSSteen Hegelund u8 com_txcal_en; 732ff8a1eeSSteen Hegelund u8 com_tx_reserve_msb; 742ff8a1eeSSteen Hegelund u8 com_tx_reserve_lsb; 752ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base; 762ff8a1eeSSteen Hegelund u8 tx_reserve_lsb; 772ff8a1eeSSteen Hegelund u8 tx_reserve_msb; 782ff8a1eeSSteen Hegelund u8 bw; 792ff8a1eeSSteen Hegelund u8 rxterm; 802ff8a1eeSSteen Hegelund u8 dfe_tap; 812ff8a1eeSSteen Hegelund u8 dfe_enable; 822ff8a1eeSSteen Hegelund bool txmargin; 832ff8a1eeSSteen Hegelund u8 cfg_ctle_rstn; 842ff8a1eeSSteen Hegelund u8 r_dfe_rstn; 852ff8a1eeSSteen Hegelund u8 cfg_pi_bw_3_0; 862ff8a1eeSSteen Hegelund u8 tx_tap_dly; 872ff8a1eeSSteen Hegelund u8 tx_tap_adv; 882ff8a1eeSSteen Hegelund }; 892ff8a1eeSSteen Hegelund 902ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset { 912ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 922ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_byp_4_0; 932ff8a1eeSSteen Hegelund u8 cfg_eq_r_force_3_0; 942ff8a1eeSSteen Hegelund u8 cfg_en_adv; 952ff8a1eeSSteen Hegelund u8 cfg_en_main; 962ff8a1eeSSteen Hegelund u8 cfg_en_dly; 972ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 982ff8a1eeSSteen Hegelund u8 cfg_tap_main; 992ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 1002ff8a1eeSSteen Hegelund u8 cfg_alos_thr_2_0; 1012ff8a1eeSSteen Hegelund }; 1022ff8a1eeSSteen Hegelund 1032ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args { 1042ff8a1eeSSteen Hegelund u8 if_width; /* UDL if-width: 10/16/20/32/64 */ 1052ff8a1eeSSteen Hegelund bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 1062ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 1072ff8a1eeSSteen Hegelund bool no_pwrcycle:1; /* Omit initial power-cycle */ 1082ff8a1eeSSteen Hegelund bool txinvert:1; /* Enable inversion of output data */ 1092ff8a1eeSSteen Hegelund bool rxinvert:1; /* Enable inversion of input data */ 1102ff8a1eeSSteen Hegelund u16 txswing; /* Set output level */ 1112ff8a1eeSSteen Hegelund u8 rate; /* Rate of network interface */ 1122ff8a1eeSSteen Hegelund u8 pi_bw_gen1; 1132ff8a1eeSSteen Hegelund u8 duty_cycle; /* Set output level to half/full */ 1142ff8a1eeSSteen Hegelund bool mute:1; /* Mute Output Buffer */ 1152ff8a1eeSSteen Hegelund bool reg_rst:1; 1162ff8a1eeSSteen Hegelund u8 com_pll_reserve; 1172ff8a1eeSSteen Hegelund }; 1182ff8a1eeSSteen Hegelund 1192ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params { 1202ff8a1eeSSteen Hegelund u8 reg_rst; 1212ff8a1eeSSteen Hegelund u8 cfg_jc_byp; 1222ff8a1eeSSteen Hegelund u8 cfg_common_reserve_7_0; 1232ff8a1eeSSteen Hegelund u8 r_reg_manual; 1242ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_from_hwt; 1252ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_2_0; 1262ff8a1eeSSteen Hegelund u8 r_txfifo_ck_div_pmad_2_0; 1272ff8a1eeSSteen Hegelund u8 r_rxfifo_ck_div_pmad_2_0; 1282ff8a1eeSSteen Hegelund u8 cfg_pll_lol_set; 1292ff8a1eeSSteen Hegelund u8 cfg_vco_div_mode_1_0; 1302ff8a1eeSSteen Hegelund u8 cfg_pre_divsel_1_0; 1312ff8a1eeSSteen Hegelund u8 cfg_sel_div_3_0; 1322ff8a1eeSSteen Hegelund u8 cfg_vco_start_code_3_0; 1332ff8a1eeSSteen Hegelund u8 cfg_pma_tx_ck_bitwidth_2_0; 1342ff8a1eeSSteen Hegelund u8 cfg_tx_prediv_1_0; 1352ff8a1eeSSteen Hegelund u8 cfg_rxdiv_sel_2_0; 1362ff8a1eeSSteen Hegelund u8 cfg_tx_subrate_2_0; 1372ff8a1eeSSteen Hegelund u8 cfg_rx_subrate_2_0; 1382ff8a1eeSSteen Hegelund u8 r_multi_lane_mode; 1392ff8a1eeSSteen Hegelund u8 cfg_cdrck_en; 1402ff8a1eeSSteen Hegelund u8 cfg_dfeck_en; 1412ff8a1eeSSteen Hegelund u8 cfg_dfe_pd; 1422ff8a1eeSSteen Hegelund u8 cfg_dfedmx_pd; 1432ff8a1eeSSteen Hegelund u8 cfg_dfetap_en_5_1; 1442ff8a1eeSSteen Hegelund u8 cfg_dmux_pd; 1452ff8a1eeSSteen Hegelund u8 cfg_dmux_clk_pd; 1462ff8a1eeSSteen Hegelund u8 cfg_erramp_pd; 1472ff8a1eeSSteen Hegelund u8 cfg_pi_dfe_en; 1482ff8a1eeSSteen Hegelund u8 cfg_pi_en; 1492ff8a1eeSSteen Hegelund u8 cfg_pd_ctle; 1502ff8a1eeSSteen Hegelund u8 cfg_summer_en; 1512ff8a1eeSSteen Hegelund u8 cfg_pmad_ck_pd; 1522ff8a1eeSSteen Hegelund u8 cfg_pd_clk; 1532ff8a1eeSSteen Hegelund u8 cfg_pd_cml; 1542ff8a1eeSSteen Hegelund u8 cfg_pd_driver; 1552ff8a1eeSSteen Hegelund u8 cfg_rx_reg_pu; 1562ff8a1eeSSteen Hegelund u8 cfg_pd_rms_det; 1572ff8a1eeSSteen Hegelund u8 cfg_dcdr_pd; 1582ff8a1eeSSteen Hegelund u8 cfg_ecdr_pd; 1592ff8a1eeSSteen Hegelund u8 cfg_pd_sq; 1602ff8a1eeSSteen Hegelund u8 cfg_itx_ipdriver_base_2_0; 1612ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 1622ff8a1eeSSteen Hegelund u8 cfg_tap_main; 1632ff8a1eeSSteen Hegelund u8 cfg_en_main; 1642ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 1652ff8a1eeSSteen Hegelund u8 cfg_en_adv; 1662ff8a1eeSSteen Hegelund u8 cfg_en_dly; 1672ff8a1eeSSteen Hegelund u8 cfg_iscan_en; 1682ff8a1eeSSteen Hegelund u8 l1_pcs_en_fast_iscan; 1692ff8a1eeSSteen Hegelund u8 l0_cfg_bw_1_0; 1702ff8a1eeSSteen Hegelund u8 l0_cfg_txcal_en; 1712ff8a1eeSSteen Hegelund u8 cfg_en_dummy; 1722ff8a1eeSSteen Hegelund u8 cfg_pll_reserve_3_0; 1732ff8a1eeSSteen Hegelund u8 l0_cfg_tx_reserve_15_8; 1742ff8a1eeSSteen Hegelund u8 l0_cfg_tx_reserve_7_0; 1752ff8a1eeSSteen Hegelund u8 cfg_tx_reserve_15_8; 1762ff8a1eeSSteen Hegelund u8 cfg_tx_reserve_7_0; 1772ff8a1eeSSteen Hegelund u8 cfg_bw_1_0; 1782ff8a1eeSSteen Hegelund u8 cfg_txcal_man_en; 1792ff8a1eeSSteen Hegelund u8 cfg_phase_man_4_0; 1802ff8a1eeSSteen Hegelund u8 cfg_quad_man_1_0; 1812ff8a1eeSSteen Hegelund u8 cfg_txcal_shift_code_5_0; 1822ff8a1eeSSteen Hegelund u8 cfg_txcal_valid_sel_3_0; 1832ff8a1eeSSteen Hegelund u8 cfg_txcal_en; 1842ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_2_0; 1852ff8a1eeSSteen Hegelund u8 cfg_cdr_m_7_0; 1862ff8a1eeSSteen Hegelund u8 cfg_pi_bw_3_0; 1872ff8a1eeSSteen Hegelund u8 cfg_pi_steps_1_0; 1882ff8a1eeSSteen Hegelund u8 cfg_dis_2ndorder; 1892ff8a1eeSSteen Hegelund u8 cfg_ctle_rstn; 1902ff8a1eeSSteen Hegelund u8 r_dfe_rstn; 1912ff8a1eeSSteen Hegelund u8 cfg_alos_thr_2_0; 1922ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base_1_0; 1932ff8a1eeSSteen Hegelund u8 cfg_rx_reserve_7_0; 1942ff8a1eeSSteen Hegelund u8 cfg_rx_reserve_15_8; 1952ff8a1eeSSteen Hegelund u8 cfg_rxterm_2_0; 1962ff8a1eeSSteen Hegelund u8 cfg_fom_selm; 1972ff8a1eeSSteen Hegelund u8 cfg_rx_sp_ctle_1_0; 1982ff8a1eeSSteen Hegelund u8 cfg_isel_ctle_1_0; 1992ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_byp_4_0; 2002ff8a1eeSSteen Hegelund u8 cfg_vga_byp; 2012ff8a1eeSSteen Hegelund u8 cfg_agc_adpt_byp; 2022ff8a1eeSSteen Hegelund u8 cfg_eqr_byp; 2032ff8a1eeSSteen Hegelund u8 cfg_eqr_force_3_0; 2042ff8a1eeSSteen Hegelund u8 cfg_eqc_force_3_0; 2052ff8a1eeSSteen Hegelund u8 cfg_sum_setcm_en; 2062ff8a1eeSSteen Hegelund u8 cfg_init_pos_iscan_6_0; 2072ff8a1eeSSteen Hegelund u8 cfg_init_pos_ipi_6_0; 2082ff8a1eeSSteen Hegelund u8 cfg_dfedig_m_2_0; 2092ff8a1eeSSteen Hegelund u8 cfg_en_dfedig; 2102ff8a1eeSSteen Hegelund u8 cfg_pi_DFE_en; 2112ff8a1eeSSteen Hegelund u8 cfg_tx2rx_lp_en; 2122ff8a1eeSSteen Hegelund u8 cfg_txlb_en; 2132ff8a1eeSSteen Hegelund u8 cfg_rx2tx_lp_en; 2142ff8a1eeSSteen Hegelund u8 cfg_rxlb_en; 2152ff8a1eeSSteen Hegelund u8 r_tx_pol_inv; 2162ff8a1eeSSteen Hegelund u8 r_rx_pol_inv; 2172ff8a1eeSSteen Hegelund }; 2182ff8a1eeSSteen Hegelund 2192ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset { 2202ff8a1eeSSteen Hegelund u8 cfg_en_adv; 2212ff8a1eeSSteen Hegelund u8 cfg_en_main; 2222ff8a1eeSSteen Hegelund u8 cfg_en_dly; 2232ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 2242ff8a1eeSSteen Hegelund u8 cfg_tap_main; 2252ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 2262ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_3_0; 2272ff8a1eeSSteen Hegelund u8 cfg_vga_cp_2_0; 2282ff8a1eeSSteen Hegelund u8 cfg_eq_res_3_0; 2292ff8a1eeSSteen Hegelund u8 cfg_eq_r_byp; 2302ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 2312ff8a1eeSSteen Hegelund u8 cfg_alos_thr_3_0; 2322ff8a1eeSSteen Hegelund }; 2332ff8a1eeSSteen Hegelund 2342ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset { 2352ff8a1eeSSteen Hegelund u8 bwidth; /* interface width: 10/16/20/32/64 */ 2362ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 2372ff8a1eeSSteen Hegelund u8 rate; /* Rate of network interface */ 2382ff8a1eeSSteen Hegelund u8 dfe_tap; 2392ff8a1eeSSteen Hegelund u8 dfe_enable; 2402ff8a1eeSSteen Hegelund u8 pi_bw_gen1; 2412ff8a1eeSSteen Hegelund u8 duty_cycle; /* Set output level to half/full */ 2422ff8a1eeSSteen Hegelund }; 2432ff8a1eeSSteen Hegelund 2442ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args { 2452ff8a1eeSSteen Hegelund bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 2462ff8a1eeSSteen Hegelund bool no_pwrcycle:1; /* Omit initial power-cycle */ 2472ff8a1eeSSteen Hegelund bool txinvert:1; /* Enable inversion of output data */ 2482ff8a1eeSSteen Hegelund bool rxinvert:1; /* Enable inversion of input data */ 2492ff8a1eeSSteen Hegelund bool txmargin:1; /* Set output level to half/full */ 2502ff8a1eeSSteen Hegelund u16 txswing; /* Set output level */ 2512ff8a1eeSSteen Hegelund bool mute:1; /* Mute Output Buffer */ 2522ff8a1eeSSteen Hegelund bool is_6g:1; 2532ff8a1eeSSteen Hegelund bool reg_rst:1; 2542ff8a1eeSSteen Hegelund }; 2552ff8a1eeSSteen Hegelund 2562ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params { 2572ff8a1eeSSteen Hegelund u8 cmu_sel; 2582ff8a1eeSSteen Hegelund u8 is_6g; 2592ff8a1eeSSteen Hegelund u8 skip_cmu_cfg; 2602ff8a1eeSSteen Hegelund u8 cfg_lane_reserve_7_0; 2612ff8a1eeSSteen Hegelund u8 cfg_ssc_rtl_clk_sel; 2622ff8a1eeSSteen Hegelund u8 cfg_lane_reserve_15_8; 2632ff8a1eeSSteen Hegelund u8 cfg_txrate_1_0; 2642ff8a1eeSSteen Hegelund u8 cfg_rxrate_1_0; 2652ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_2_0; 2662ff8a1eeSSteen Hegelund u8 cfg_pma_tx_ck_bitwidth_2_0; 2672ff8a1eeSSteen Hegelund u8 cfg_rxdiv_sel_2_0; 2682ff8a1eeSSteen Hegelund u8 r_pcs2pma_phymode_4_0; 2692ff8a1eeSSteen Hegelund u8 cfg_lane_id_2_0; 2702ff8a1eeSSteen Hegelund u8 cfg_cdrck_en; 2712ff8a1eeSSteen Hegelund u8 cfg_dfeck_en; 2722ff8a1eeSSteen Hegelund u8 cfg_dfe_pd; 2732ff8a1eeSSteen Hegelund u8 cfg_dfetap_en_5_1; 2742ff8a1eeSSteen Hegelund u8 cfg_erramp_pd; 2752ff8a1eeSSteen Hegelund u8 cfg_pi_DFE_en; 2762ff8a1eeSSteen Hegelund u8 cfg_pi_en; 2772ff8a1eeSSteen Hegelund u8 cfg_pd_ctle; 2782ff8a1eeSSteen Hegelund u8 cfg_summer_en; 2792ff8a1eeSSteen Hegelund u8 cfg_pd_rx_cktree; 2802ff8a1eeSSteen Hegelund u8 cfg_pd_clk; 2812ff8a1eeSSteen Hegelund u8 cfg_pd_cml; 2822ff8a1eeSSteen Hegelund u8 cfg_pd_driver; 2832ff8a1eeSSteen Hegelund u8 cfg_rx_reg_pu; 2842ff8a1eeSSteen Hegelund u8 cfg_d_cdr_pd; 2852ff8a1eeSSteen Hegelund u8 cfg_pd_sq; 2862ff8a1eeSSteen Hegelund u8 cfg_rxdet_en; 2872ff8a1eeSSteen Hegelund u8 cfg_rxdet_str; 2882ff8a1eeSSteen Hegelund u8 r_multi_lane_mode; 2892ff8a1eeSSteen Hegelund u8 cfg_en_adv; 2902ff8a1eeSSteen Hegelund u8 cfg_en_main; 2912ff8a1eeSSteen Hegelund u8 cfg_en_dly; 2922ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 2932ff8a1eeSSteen Hegelund u8 cfg_tap_main; 2942ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 2952ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_3_0; 2962ff8a1eeSSteen Hegelund u8 cfg_vga_cp_2_0; 2972ff8a1eeSSteen Hegelund u8 cfg_eq_res_3_0; 2982ff8a1eeSSteen Hegelund u8 cfg_eq_r_byp; 2992ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 3002ff8a1eeSSteen Hegelund u8 cfg_en_dfedig; 3012ff8a1eeSSteen Hegelund u8 cfg_sum_setcm_en; 3022ff8a1eeSSteen Hegelund u8 cfg_en_preemph; 3032ff8a1eeSSteen Hegelund u8 cfg_itx_ippreemp_base_1_0; 3042ff8a1eeSSteen Hegelund u8 cfg_itx_ipdriver_base_2_0; 3052ff8a1eeSSteen Hegelund u8 cfg_ibias_tune_reserve_5_0; 3062ff8a1eeSSteen Hegelund u8 cfg_txswing_half; 3072ff8a1eeSSteen Hegelund u8 cfg_dis_2nd_order; 3082ff8a1eeSSteen Hegelund u8 cfg_rx_ssc_lh; 3092ff8a1eeSSteen Hegelund u8 cfg_pi_floop_steps_1_0; 3102ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_23_16; 3112ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_15_8; 3122ff8a1eeSSteen Hegelund u8 cfg_iscan_ext_dac_7_0; 3132ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen1_2_0; 3142ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen2_2_0; 3152ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen3_2_0; 3162ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen4_2_0; 3172ff8a1eeSSteen Hegelund u8 r_cdr_m_gen1_7_0; 3182ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen1_3_0; 3192ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen2; 3202ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen3; 3212ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen4; 3222ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_7_0; 3232ff8a1eeSSteen Hegelund u8 cfg_pi_steps; 3242ff8a1eeSSteen Hegelund u8 cfg_mp_max_3_0; 3252ff8a1eeSSteen Hegelund u8 cfg_rstn_dfedig; 3262ff8a1eeSSteen Hegelund u8 cfg_alos_thr_3_0; 3272ff8a1eeSSteen Hegelund u8 cfg_predrv_slewrate_1_0; 3282ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base_1_0; 3292ff8a1eeSSteen Hegelund u8 cfg_ip_pre_base_1_0; 3302ff8a1eeSSteen Hegelund u8 r_cdr_m_gen2_7_0; 3312ff8a1eeSSteen Hegelund u8 r_cdr_m_gen3_7_0; 3322ff8a1eeSSteen Hegelund u8 r_cdr_m_gen4_7_0; 3332ff8a1eeSSteen Hegelund u8 r_en_auto_cdr_rstn; 3342ff8a1eeSSteen Hegelund u8 cfg_oscal_afe; 3352ff8a1eeSSteen Hegelund u8 cfg_pd_osdac_afe; 3362ff8a1eeSSteen Hegelund u8 cfg_resetb_oscal_afe[2]; 3372ff8a1eeSSteen Hegelund u8 cfg_center_spreading; 3382ff8a1eeSSteen Hegelund u8 cfg_m_cnt_maxval_4_0; 3392ff8a1eeSSteen Hegelund u8 cfg_ncnt_maxval_7_0; 3402ff8a1eeSSteen Hegelund u8 cfg_ncnt_maxval_10_8; 3412ff8a1eeSSteen Hegelund u8 cfg_ssc_en; 3422ff8a1eeSSteen Hegelund u8 cfg_tx2rx_lp_en; 3432ff8a1eeSSteen Hegelund u8 cfg_txlb_en; 3442ff8a1eeSSteen Hegelund u8 cfg_rx2tx_lp_en; 3452ff8a1eeSSteen Hegelund u8 cfg_rxlb_en; 3462ff8a1eeSSteen Hegelund u8 r_tx_pol_inv; 3472ff8a1eeSSteen Hegelund u8 r_rx_pol_inv; 3482ff8a1eeSSteen Hegelund u8 fx_100; 3492ff8a1eeSSteen Hegelund }; 3502ff8a1eeSSteen Hegelund 3512ff8a1eeSSteen Hegelund static struct sparx5_sd25g28_media_preset media_presets_25g[] = { 3522ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DEFAULT */ 3532ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 3542ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3552ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 3562ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3572ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3582ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 3592ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3602ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 4, 3612ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 12, 3622ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 7, 3632ff8a1eeSSteen Hegelund }, 3642ff8a1eeSSteen Hegelund { /* ETH_MEDIA_SR */ 3652ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 3662ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3672ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 3682ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3692ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3702ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0x10, 3712ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3722ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 8, 3732ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 4, 3742ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 0, 3752ff8a1eeSSteen Hegelund }, 3762ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DAC */ 3772ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 3782ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3792ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 3802ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3812ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3822ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 3832ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3842ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 8, 3852ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 0xc, 3862ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 0, 3872ff8a1eeSSteen Hegelund }, 3882ff8a1eeSSteen Hegelund }; 3892ff8a1eeSSteen Hegelund 3902ff8a1eeSSteen Hegelund static struct sparx5_sd25g28_mode_preset mode_presets_25g[] = { 3912ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_25000 */ 3922ff8a1eeSSteen Hegelund .bitwidth = 40, 3932ff8a1eeSSteen Hegelund .tx_pre_div = 0, 3942ff8a1eeSSteen Hegelund .fifo_ck_div = 0, 3952ff8a1eeSSteen Hegelund .pre_divsel = 1, 3962ff8a1eeSSteen Hegelund .vco_div_mode = 0, 3972ff8a1eeSSteen Hegelund .sel_div = 15, 3982ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 3992ff8a1eeSSteen Hegelund .subrate = 0, 4002ff8a1eeSSteen Hegelund .com_txcal_en = 0, 4012ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 4022ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0xf0, 4032ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4042ff8a1eeSSteen Hegelund .tx_reserve_msb = 0xcc, 4052ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0xfe, 4062ff8a1eeSSteen Hegelund .bw = 3, 4072ff8a1eeSSteen Hegelund .rxterm = 0, 4082ff8a1eeSSteen Hegelund .dfe_enable = 1, 4092ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 4102ff8a1eeSSteen Hegelund .txmargin = 1, 4112ff8a1eeSSteen Hegelund .cfg_ctle_rstn = 1, 4122ff8a1eeSSteen Hegelund .r_dfe_rstn = 1, 4132ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4142ff8a1eeSSteen Hegelund .tx_tap_dly = 8, 4152ff8a1eeSSteen Hegelund .tx_tap_adv = 0xc, 4162ff8a1eeSSteen Hegelund }, 4172ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_10000 */ 4182ff8a1eeSSteen Hegelund .bitwidth = 64, 4192ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4202ff8a1eeSSteen Hegelund .fifo_ck_div = 2, 4212ff8a1eeSSteen Hegelund .pre_divsel = 0, 4222ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4232ff8a1eeSSteen Hegelund .sel_div = 9, 4242ff8a1eeSSteen Hegelund .ck_bitwidth = 0, 4252ff8a1eeSSteen Hegelund .subrate = 0, 4262ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4272ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x20 << 1), 4282ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0x40, 4292ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4302ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x4c, 4312ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x44, 4322ff8a1eeSSteen Hegelund .bw = 3, 4332ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4342ff8a1eeSSteen Hegelund .rxterm = 3, 4352ff8a1eeSSteen Hegelund .dfe_enable = 1, 4362ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 4372ff8a1eeSSteen Hegelund .txmargin = 0, 4382ff8a1eeSSteen Hegelund .cfg_ctle_rstn = 1, 4392ff8a1eeSSteen Hegelund .r_dfe_rstn = 1, 4402ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4412ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4422ff8a1eeSSteen Hegelund }, 4432ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_5000 */ 4442ff8a1eeSSteen Hegelund .bitwidth = 64, 4452ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4462ff8a1eeSSteen Hegelund .fifo_ck_div = 2, 4472ff8a1eeSSteen Hegelund .pre_divsel = 0, 4482ff8a1eeSSteen Hegelund .vco_div_mode = 2, 4492ff8a1eeSSteen Hegelund .sel_div = 9, 4502ff8a1eeSSteen Hegelund .ck_bitwidth = 0, 4512ff8a1eeSSteen Hegelund .subrate = 0, 4522ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4532ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x20 << 1), 4542ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0, 4552ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4562ff8a1eeSSteen Hegelund .tx_reserve_msb = 0xe, 4572ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x80, 4582ff8a1eeSSteen Hegelund .bw = 0, 4592ff8a1eeSSteen Hegelund .rxterm = 0, 4602ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 6, 4612ff8a1eeSSteen Hegelund .dfe_enable = 0, 4622ff8a1eeSSteen Hegelund .dfe_tap = 0, 4632ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4642ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4652ff8a1eeSSteen Hegelund }, 4662ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_SD_2G5 */ 4672ff8a1eeSSteen Hegelund .bitwidth = 10, 4682ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4692ff8a1eeSSteen Hegelund .fifo_ck_div = 0, 4702ff8a1eeSSteen Hegelund .pre_divsel = 0, 4712ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4722ff8a1eeSSteen Hegelund .sel_div = 6, 4732ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 4742ff8a1eeSSteen Hegelund .subrate = 2, 4752ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4762ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 4772ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = (0xf << 4), 4782ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 2, 4792ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x8, 4802ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x8a, 4812ff8a1eeSSteen Hegelund .bw = 0, 4822ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4832ff8a1eeSSteen Hegelund .rxterm = (1 << 2), 4842ff8a1eeSSteen Hegelund .dfe_enable = 0, 4852ff8a1eeSSteen Hegelund .dfe_tap = 0, 4862ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4872ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4882ff8a1eeSSteen Hegelund }, 4892ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_1000BASEX */ 4902ff8a1eeSSteen Hegelund .bitwidth = 10, 4912ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4922ff8a1eeSSteen Hegelund .fifo_ck_div = 1, 4932ff8a1eeSSteen Hegelund .pre_divsel = 0, 4942ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4952ff8a1eeSSteen Hegelund .sel_div = 8, 4962ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 4972ff8a1eeSSteen Hegelund .subrate = 3, 4982ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4992ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 5002ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0xf0, 5012ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 5022ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x8, 5032ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0xce, 5042ff8a1eeSSteen Hegelund .bw = 0, 5052ff8a1eeSSteen Hegelund .rxterm = 0, 5062ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 5072ff8a1eeSSteen Hegelund .dfe_enable = 0, 5082ff8a1eeSSteen Hegelund .dfe_tap = 0, 5092ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 5102ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 5112ff8a1eeSSteen Hegelund }, 5122ff8a1eeSSteen Hegelund }; 5132ff8a1eeSSteen Hegelund 5142ff8a1eeSSteen Hegelund static struct sparx5_sd10g28_media_preset media_presets_10g[] = { 5152ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DEFAULT */ 5162ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 5172ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5182ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 5192ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 5202ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5212ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 5222ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 5, 5232ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 0, 5242ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5252ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5262ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0x8, 5272ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x3, 5282ff8a1eeSSteen Hegelund }, 5292ff8a1eeSSteen Hegelund { /* ETH_MEDIA_SR */ 5302ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 5312ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5322ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 5332ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 5342ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5352ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0xc, 5362ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 0xa, 5372ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 0x4, 5382ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5392ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5402ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xF, 5412ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x3, 5422ff8a1eeSSteen Hegelund }, 5432ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DAC */ 5442ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 5452ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5462ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 5472ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 12, 5482ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5492ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 8, 5502ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 0xa, 5512ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 4, 5522ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5532ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5542ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 5552ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x0, 5562ff8a1eeSSteen Hegelund } 5572ff8a1eeSSteen Hegelund }; 5582ff8a1eeSSteen Hegelund 5592ff8a1eeSSteen Hegelund static struct sparx5_sd10g28_mode_preset mode_presets_10g[] = { 5602ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_10000 */ 5612ff8a1eeSSteen Hegelund .bwidth = 64, 5622ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5632ff8a1eeSSteen Hegelund .rate = 0x0, 5642ff8a1eeSSteen Hegelund .dfe_enable = 1, 5652ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 5662ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x0, 5672ff8a1eeSSteen Hegelund .duty_cycle = 0x2, 5682ff8a1eeSSteen Hegelund }, 5692ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_6G */ 5702ff8a1eeSSteen Hegelund .bwidth = 16, 5712ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5722ff8a1eeSSteen Hegelund .rate = 0x1, 5732ff8a1eeSSteen Hegelund .dfe_enable = 0, 5742ff8a1eeSSteen Hegelund .dfe_tap = 0, 5752ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5762ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5772ff8a1eeSSteen Hegelund }, 5782ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_10G */ 5792ff8a1eeSSteen Hegelund .bwidth = 64, 5802ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5812ff8a1eeSSteen Hegelund .rate = 0x1, 5822ff8a1eeSSteen Hegelund .dfe_enable = 0, 5832ff8a1eeSSteen Hegelund .dfe_tap = 0, 5842ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5852ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5862ff8a1eeSSteen Hegelund }, 5872ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_QSGMII */ 5882ff8a1eeSSteen Hegelund .bwidth = 20, 5892ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX1, 5902ff8a1eeSSteen Hegelund .rate = 0x1, 5912ff8a1eeSSteen Hegelund .dfe_enable = 0, 5922ff8a1eeSSteen Hegelund .dfe_tap = 0, 5932ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5942ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5952ff8a1eeSSteen Hegelund }, 5962ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SD_2G5 */ 5972ff8a1eeSSteen Hegelund .bwidth = 10, 5982ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX2, 5992ff8a1eeSSteen Hegelund .rate = 0x2, 6002ff8a1eeSSteen Hegelund .dfe_enable = 0, 6012ff8a1eeSSteen Hegelund .dfe_tap = 0, 6022ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x7, 6032ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 6042ff8a1eeSSteen Hegelund }, 6052ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_1000BASEX */ 6062ff8a1eeSSteen Hegelund .bwidth = 10, 6072ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX1, 6082ff8a1eeSSteen Hegelund .rate = 0x3, 6092ff8a1eeSSteen Hegelund .dfe_enable = 0, 6102ff8a1eeSSteen Hegelund .dfe_tap = 0, 6112ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x7, 6122ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 6132ff8a1eeSSteen Hegelund }, 6142ff8a1eeSSteen Hegelund }; 6152ff8a1eeSSteen Hegelund 6162ff8a1eeSSteen Hegelund /* map from SD25G28 interface width to configuration value */ 6172ff8a1eeSSteen Hegelund static u8 sd25g28_get_iw_setting(struct device *dev, const u8 interface_width) 6182ff8a1eeSSteen Hegelund { 6192ff8a1eeSSteen Hegelund switch (interface_width) { 6202ff8a1eeSSteen Hegelund case 10: return 0; 6212ff8a1eeSSteen Hegelund case 16: return 1; 6222ff8a1eeSSteen Hegelund case 32: return 3; 6232ff8a1eeSSteen Hegelund case 40: return 4; 6242ff8a1eeSSteen Hegelund case 64: return 5; 6252ff8a1eeSSteen Hegelund default: 6262ff8a1eeSSteen Hegelund dev_err(dev, "%s: Illegal value %d for interface width\n", 6272ff8a1eeSSteen Hegelund __func__, interface_width); 6282ff8a1eeSSteen Hegelund } 6292ff8a1eeSSteen Hegelund return 0; 6302ff8a1eeSSteen Hegelund } 6312ff8a1eeSSteen Hegelund 6322ff8a1eeSSteen Hegelund /* map from SD10G28 interface width to configuration value */ 6332ff8a1eeSSteen Hegelund static u8 sd10g28_get_iw_setting(struct device *dev, const u8 interface_width) 6342ff8a1eeSSteen Hegelund { 6352ff8a1eeSSteen Hegelund switch (interface_width) { 6362ff8a1eeSSteen Hegelund case 10: return 0; 6372ff8a1eeSSteen Hegelund case 16: return 1; 6382ff8a1eeSSteen Hegelund case 20: return 2; 6392ff8a1eeSSteen Hegelund case 32: return 3; 6402ff8a1eeSSteen Hegelund case 40: return 4; 6412ff8a1eeSSteen Hegelund case 64: return 7; 6422ff8a1eeSSteen Hegelund default: 6432ff8a1eeSSteen Hegelund dev_err(dev, "%s: Illegal value %d for interface width\n", __func__, 6442ff8a1eeSSteen Hegelund interface_width); 6452ff8a1eeSSteen Hegelund return 0; 6462ff8a1eeSSteen Hegelund } 6472ff8a1eeSSteen Hegelund } 6482ff8a1eeSSteen Hegelund 6492ff8a1eeSSteen Hegelund static int sparx5_sd10g25_get_mode_preset(struct sparx5_serdes_macro *macro, 6502ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset *mode) 6512ff8a1eeSSteen Hegelund { 6522ff8a1eeSSteen Hegelund switch (macro->serdesmode) { 6532ff8a1eeSSteen Hegelund case SPX5_SD_MODE_SFI: 6542ff8a1eeSSteen Hegelund if (macro->speed == SPEED_25000) 6552ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 6562ff8a1eeSSteen Hegelund else if (macro->speed == SPEED_10000) 6572ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_10000]; 6582ff8a1eeSSteen Hegelund else if (macro->speed == SPEED_5000) 6592ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_5000]; 6602ff8a1eeSSteen Hegelund break; 6612ff8a1eeSSteen Hegelund case SPX5_SD_MODE_2G5: 6622ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_SD_2G5]; 6632ff8a1eeSSteen Hegelund break; 6642ff8a1eeSSteen Hegelund case SPX5_SD_MODE_1000BASEX: 6652ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_1000BASEX]; 6662ff8a1eeSSteen Hegelund break; 6672ff8a1eeSSteen Hegelund case SPX5_SD_MODE_100FX: 6682ff8a1eeSSteen Hegelund /* Not supported */ 6692ff8a1eeSSteen Hegelund return -EINVAL; 6702ff8a1eeSSteen Hegelund default: 6712ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 6722ff8a1eeSSteen Hegelund break; 6732ff8a1eeSSteen Hegelund } 6742ff8a1eeSSteen Hegelund return 0; 6752ff8a1eeSSteen Hegelund } 6762ff8a1eeSSteen Hegelund 6772ff8a1eeSSteen Hegelund static int sparx5_sd10g28_get_mode_preset(struct sparx5_serdes_macro *macro, 6782ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset *mode, 6792ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args *args) 6802ff8a1eeSSteen Hegelund { 6812ff8a1eeSSteen Hegelund switch (macro->serdesmode) { 6822ff8a1eeSSteen Hegelund case SPX5_SD_MODE_SFI: 6832ff8a1eeSSteen Hegelund if (macro->speed == SPEED_10000) { 6842ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 6852ff8a1eeSSteen Hegelund } else if (macro->speed == SPEED_5000) { 6862ff8a1eeSSteen Hegelund if (args->is_6g) 6872ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_6G]; 6882ff8a1eeSSteen Hegelund else 6892ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_10G]; 6902ff8a1eeSSteen Hegelund } else { 6912ff8a1eeSSteen Hegelund dev_err(macro->priv->dev, "%s: Illegal speed: %02u, sidx: %02u, mode (%u)", 6922ff8a1eeSSteen Hegelund __func__, macro->speed, macro->sidx, 6932ff8a1eeSSteen Hegelund macro->serdesmode); 6942ff8a1eeSSteen Hegelund return -EINVAL; 6952ff8a1eeSSteen Hegelund } 6962ff8a1eeSSteen Hegelund break; 6972ff8a1eeSSteen Hegelund case SPX5_SD_MODE_QSGMII: 6982ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_QSGMII]; 6992ff8a1eeSSteen Hegelund break; 7002ff8a1eeSSteen Hegelund case SPX5_SD_MODE_2G5: 7012ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SD_2G5]; 7022ff8a1eeSSteen Hegelund break; 7032ff8a1eeSSteen Hegelund case SPX5_SD_MODE_100FX: 7042ff8a1eeSSteen Hegelund case SPX5_SD_MODE_1000BASEX: 7052ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_1000BASEX]; 7062ff8a1eeSSteen Hegelund break; 7072ff8a1eeSSteen Hegelund default: 7082ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 7092ff8a1eeSSteen Hegelund break; 7102ff8a1eeSSteen Hegelund } 7112ff8a1eeSSteen Hegelund return 0; 7122ff8a1eeSSteen Hegelund } 7132ff8a1eeSSteen Hegelund 7142ff8a1eeSSteen Hegelund static void sparx5_sd25g28_get_params(struct sparx5_serdes_macro *macro, 7152ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset *media, 7162ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset *mode, 7172ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args *args, 7182ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params *params) 7192ff8a1eeSSteen Hegelund { 7202ff8a1eeSSteen Hegelund u8 iw = sd25g28_get_iw_setting(macro->priv->dev, mode->bitwidth); 7212ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params init = { 7222ff8a1eeSSteen Hegelund .r_d_width_ctrl_2_0 = iw, 7232ff8a1eeSSteen Hegelund .r_txfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 7242ff8a1eeSSteen Hegelund .r_rxfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 7252ff8a1eeSSteen Hegelund .cfg_vco_div_mode_1_0 = mode->vco_div_mode, 7262ff8a1eeSSteen Hegelund .cfg_pre_divsel_1_0 = mode->pre_divsel, 7272ff8a1eeSSteen Hegelund .cfg_sel_div_3_0 = mode->sel_div, 7282ff8a1eeSSteen Hegelund .cfg_vco_start_code_3_0 = 0, 7292ff8a1eeSSteen Hegelund .cfg_pma_tx_ck_bitwidth_2_0 = mode->ck_bitwidth, 7302ff8a1eeSSteen Hegelund .cfg_tx_prediv_1_0 = mode->tx_pre_div, 7312ff8a1eeSSteen Hegelund .cfg_rxdiv_sel_2_0 = mode->ck_bitwidth, 7322ff8a1eeSSteen Hegelund .cfg_tx_subrate_2_0 = mode->subrate, 7332ff8a1eeSSteen Hegelund .cfg_rx_subrate_2_0 = mode->subrate, 7342ff8a1eeSSteen Hegelund .r_multi_lane_mode = 0, 7352ff8a1eeSSteen Hegelund .cfg_cdrck_en = 1, 7362ff8a1eeSSteen Hegelund .cfg_dfeck_en = mode->dfe_enable, 7372ff8a1eeSSteen Hegelund .cfg_dfe_pd = mode->dfe_enable == 1 ? 0 : 1, 7382ff8a1eeSSteen Hegelund .cfg_dfedmx_pd = 1, 7392ff8a1eeSSteen Hegelund .cfg_dfetap_en_5_1 = mode->dfe_tap, 7402ff8a1eeSSteen Hegelund .cfg_dmux_pd = 0, 7412ff8a1eeSSteen Hegelund .cfg_dmux_clk_pd = 1, 7422ff8a1eeSSteen Hegelund .cfg_erramp_pd = mode->dfe_enable == 1 ? 0 : 1, 7432ff8a1eeSSteen Hegelund .cfg_pi_DFE_en = mode->dfe_enable, 7442ff8a1eeSSteen Hegelund .cfg_pi_en = 1, 7452ff8a1eeSSteen Hegelund .cfg_pd_ctle = 0, 7462ff8a1eeSSteen Hegelund .cfg_summer_en = 1, 7472ff8a1eeSSteen Hegelund .cfg_pmad_ck_pd = 0, 7482ff8a1eeSSteen Hegelund .cfg_pd_clk = 0, 7492ff8a1eeSSteen Hegelund .cfg_pd_cml = 0, 7502ff8a1eeSSteen Hegelund .cfg_pd_driver = 0, 7512ff8a1eeSSteen Hegelund .cfg_rx_reg_pu = 1, 7522ff8a1eeSSteen Hegelund .cfg_pd_rms_det = 1, 7532ff8a1eeSSteen Hegelund .cfg_dcdr_pd = 0, 7542ff8a1eeSSteen Hegelund .cfg_ecdr_pd = 1, 7552ff8a1eeSSteen Hegelund .cfg_pd_sq = 1, 7562ff8a1eeSSteen Hegelund .cfg_itx_ipdriver_base_2_0 = mode->txmargin, 7572ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 7582ff8a1eeSSteen Hegelund .cfg_tap_main = media->cfg_tap_main, 7592ff8a1eeSSteen Hegelund .cfg_en_main = media->cfg_en_main, 7602ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 7612ff8a1eeSSteen Hegelund .cfg_en_adv = media->cfg_en_adv, 7622ff8a1eeSSteen Hegelund .cfg_en_dly = media->cfg_en_dly, 7632ff8a1eeSSteen Hegelund .cfg_iscan_en = 0, 7642ff8a1eeSSteen Hegelund .l1_pcs_en_fast_iscan = 0, 7652ff8a1eeSSteen Hegelund .l0_cfg_bw_1_0 = 0, 7662ff8a1eeSSteen Hegelund .cfg_en_dummy = 0, 7672ff8a1eeSSteen Hegelund .cfg_pll_reserve_3_0 = args->com_pll_reserve, 7682ff8a1eeSSteen Hegelund .l0_cfg_txcal_en = mode->com_txcal_en, 7692ff8a1eeSSteen Hegelund .l0_cfg_tx_reserve_15_8 = mode->com_tx_reserve_msb, 7702ff8a1eeSSteen Hegelund .l0_cfg_tx_reserve_7_0 = mode->com_tx_reserve_lsb, 7712ff8a1eeSSteen Hegelund .cfg_tx_reserve_15_8 = mode->tx_reserve_msb, 7722ff8a1eeSSteen Hegelund .cfg_tx_reserve_7_0 = mode->tx_reserve_lsb, 7732ff8a1eeSSteen Hegelund .cfg_bw_1_0 = mode->bw, 7742ff8a1eeSSteen Hegelund .cfg_txcal_man_en = 1, 7752ff8a1eeSSteen Hegelund .cfg_phase_man_4_0 = 0, 7762ff8a1eeSSteen Hegelund .cfg_quad_man_1_0 = 0, 7772ff8a1eeSSteen Hegelund .cfg_txcal_shift_code_5_0 = 2, 7782ff8a1eeSSteen Hegelund .cfg_txcal_valid_sel_3_0 = 4, 7792ff8a1eeSSteen Hegelund .cfg_txcal_en = 0, 7802ff8a1eeSSteen Hegelund .cfg_cdr_kf_2_0 = 1, 7812ff8a1eeSSteen Hegelund .cfg_cdr_m_7_0 = 6, 7822ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = mode->cfg_pi_bw_3_0, 7832ff8a1eeSSteen Hegelund .cfg_pi_steps_1_0 = 0, 7842ff8a1eeSSteen Hegelund .cfg_dis_2ndorder = 1, 7852ff8a1eeSSteen Hegelund .cfg_ctle_rstn = mode->cfg_ctle_rstn, 7862ff8a1eeSSteen Hegelund .r_dfe_rstn = mode->r_dfe_rstn, 7872ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = media->cfg_alos_thr_2_0, 7882ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base_1_0 = mode->cfg_itx_ipcml_base, 7892ff8a1eeSSteen Hegelund .cfg_rx_reserve_7_0 = 0xbf, 7902ff8a1eeSSteen Hegelund .cfg_rx_reserve_15_8 = 0x61, 7912ff8a1eeSSteen Hegelund .cfg_rxterm_2_0 = mode->rxterm, 7922ff8a1eeSSteen Hegelund .cfg_fom_selm = 0, 7932ff8a1eeSSteen Hegelund .cfg_rx_sp_ctle_1_0 = 0, 7942ff8a1eeSSteen Hegelund .cfg_isel_ctle_1_0 = 0, 7952ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = media->cfg_vga_ctrl_byp_4_0, 7962ff8a1eeSSteen Hegelund .cfg_vga_byp = 1, 7972ff8a1eeSSteen Hegelund .cfg_agc_adpt_byp = 1, 7982ff8a1eeSSteen Hegelund .cfg_eqr_byp = 1, 7992ff8a1eeSSteen Hegelund .cfg_eqr_force_3_0 = media->cfg_eq_r_force_3_0, 8002ff8a1eeSSteen Hegelund .cfg_eqc_force_3_0 = media->cfg_eq_c_force_3_0, 8012ff8a1eeSSteen Hegelund .cfg_sum_setcm_en = 1, 8022ff8a1eeSSteen Hegelund .cfg_pi_dfe_en = 1, 8032ff8a1eeSSteen Hegelund .cfg_init_pos_iscan_6_0 = 6, 8042ff8a1eeSSteen Hegelund .cfg_init_pos_ipi_6_0 = 9, 8052ff8a1eeSSteen Hegelund .cfg_dfedig_m_2_0 = 6, 8062ff8a1eeSSteen Hegelund .cfg_en_dfedig = mode->dfe_enable, 8072ff8a1eeSSteen Hegelund .r_d_width_ctrl_from_hwt = 0, 8082ff8a1eeSSteen Hegelund .r_reg_manual = 1, 8092ff8a1eeSSteen Hegelund .reg_rst = args->reg_rst, 8102ff8a1eeSSteen Hegelund .cfg_jc_byp = 1, 8112ff8a1eeSSteen Hegelund .cfg_common_reserve_7_0 = 1, 8122ff8a1eeSSteen Hegelund .cfg_pll_lol_set = 1, 8132ff8a1eeSSteen Hegelund .cfg_tx2rx_lp_en = 0, 8142ff8a1eeSSteen Hegelund .cfg_txlb_en = 0, 8152ff8a1eeSSteen Hegelund .cfg_rx2tx_lp_en = 0, 8162ff8a1eeSSteen Hegelund .cfg_rxlb_en = 0, 8172ff8a1eeSSteen Hegelund .r_tx_pol_inv = args->txinvert, 8182ff8a1eeSSteen Hegelund .r_rx_pol_inv = args->rxinvert, 8192ff8a1eeSSteen Hegelund }; 8202ff8a1eeSSteen Hegelund 8212ff8a1eeSSteen Hegelund *params = init; 8222ff8a1eeSSteen Hegelund } 8232ff8a1eeSSteen Hegelund 8242ff8a1eeSSteen Hegelund static void sparx5_sd10g28_get_params(struct sparx5_serdes_macro *macro, 8252ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset *media, 8262ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset *mode, 8272ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args *args, 8282ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params *params) 8292ff8a1eeSSteen Hegelund { 8302ff8a1eeSSteen Hegelund u8 iw = sd10g28_get_iw_setting(macro->priv->dev, mode->bwidth); 8312ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params init = { 8322ff8a1eeSSteen Hegelund .skip_cmu_cfg = args->skip_cmu_cfg, 8332ff8a1eeSSteen Hegelund .is_6g = args->is_6g, 8342ff8a1eeSSteen Hegelund .cmu_sel = mode->cmu_sel, 8352ff8a1eeSSteen Hegelund .cfg_lane_reserve_7_0 = (mode->cmu_sel % 2) << 6, 8362ff8a1eeSSteen Hegelund .cfg_ssc_rtl_clk_sel = (mode->cmu_sel / 2), 8372ff8a1eeSSteen Hegelund .cfg_lane_reserve_15_8 = mode->duty_cycle, 8382ff8a1eeSSteen Hegelund .cfg_txrate_1_0 = mode->rate, 8392ff8a1eeSSteen Hegelund .cfg_rxrate_1_0 = mode->rate, 8402ff8a1eeSSteen Hegelund .fx_100 = macro->serdesmode == SPX5_SD_MODE_100FX, 8412ff8a1eeSSteen Hegelund .r_d_width_ctrl_2_0 = iw, 8422ff8a1eeSSteen Hegelund .cfg_pma_tx_ck_bitwidth_2_0 = iw, 8432ff8a1eeSSteen Hegelund .cfg_rxdiv_sel_2_0 = iw, 8442ff8a1eeSSteen Hegelund .r_pcs2pma_phymode_4_0 = 0, 8452ff8a1eeSSteen Hegelund .cfg_lane_id_2_0 = 0, 8462ff8a1eeSSteen Hegelund .cfg_cdrck_en = 1, 8472ff8a1eeSSteen Hegelund .cfg_dfeck_en = mode->dfe_enable, 8482ff8a1eeSSteen Hegelund .cfg_dfe_pd = (mode->dfe_enable == 1) ? 0 : 1, 8492ff8a1eeSSteen Hegelund .cfg_dfetap_en_5_1 = mode->dfe_tap, 8502ff8a1eeSSteen Hegelund .cfg_erramp_pd = (mode->dfe_enable == 1) ? 0 : 1, 8512ff8a1eeSSteen Hegelund .cfg_pi_DFE_en = mode->dfe_enable, 8522ff8a1eeSSteen Hegelund .cfg_pi_en = 1, 8532ff8a1eeSSteen Hegelund .cfg_pd_ctle = 0, 8542ff8a1eeSSteen Hegelund .cfg_summer_en = 1, 8552ff8a1eeSSteen Hegelund .cfg_pd_rx_cktree = 0, 8562ff8a1eeSSteen Hegelund .cfg_pd_clk = 0, 8572ff8a1eeSSteen Hegelund .cfg_pd_cml = 0, 8582ff8a1eeSSteen Hegelund .cfg_pd_driver = 0, 8592ff8a1eeSSteen Hegelund .cfg_rx_reg_pu = 1, 8602ff8a1eeSSteen Hegelund .cfg_d_cdr_pd = 0, 8612ff8a1eeSSteen Hegelund .cfg_pd_sq = mode->dfe_enable, 8622ff8a1eeSSteen Hegelund .cfg_rxdet_en = 0, 8632ff8a1eeSSteen Hegelund .cfg_rxdet_str = 0, 8642ff8a1eeSSteen Hegelund .r_multi_lane_mode = 0, 8652ff8a1eeSSteen Hegelund .cfg_en_adv = media->cfg_en_adv, 8662ff8a1eeSSteen Hegelund .cfg_en_main = 1, 8672ff8a1eeSSteen Hegelund .cfg_en_dly = media->cfg_en_dly, 8682ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 8692ff8a1eeSSteen Hegelund .cfg_tap_main = media->cfg_tap_main, 8702ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 8712ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = media->cfg_vga_ctrl_3_0, 8722ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = media->cfg_vga_cp_2_0, 8732ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = media->cfg_eq_res_3_0, 8742ff8a1eeSSteen Hegelund .cfg_eq_r_byp = media->cfg_eq_r_byp, 8752ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = media->cfg_eq_c_force_3_0, 8762ff8a1eeSSteen Hegelund .cfg_en_dfedig = mode->dfe_enable, 8772ff8a1eeSSteen Hegelund .cfg_sum_setcm_en = 1, 8782ff8a1eeSSteen Hegelund .cfg_en_preemph = 0, 8792ff8a1eeSSteen Hegelund .cfg_itx_ippreemp_base_1_0 = 0, 8802ff8a1eeSSteen Hegelund .cfg_itx_ipdriver_base_2_0 = (args->txswing >> 6), 8812ff8a1eeSSteen Hegelund .cfg_ibias_tune_reserve_5_0 = (args->txswing & 63), 8822ff8a1eeSSteen Hegelund .cfg_txswing_half = (args->txmargin), 8832ff8a1eeSSteen Hegelund .cfg_dis_2nd_order = 0x1, 8842ff8a1eeSSteen Hegelund .cfg_rx_ssc_lh = 0x0, 8852ff8a1eeSSteen Hegelund .cfg_pi_floop_steps_1_0 = 0x0, 8862ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_23_16 = (1 << 5), 8872ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_15_8 = (0 << 6), 8882ff8a1eeSSteen Hegelund .cfg_iscan_ext_dac_7_0 = (1 << 7) + 9, 8892ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen1_2_0 = 1, 8902ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen2_2_0 = 1, 8912ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen3_2_0 = 1, 8922ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen4_2_0 = 1, 8932ff8a1eeSSteen Hegelund .r_cdr_m_gen1_7_0 = 4, 8942ff8a1eeSSteen Hegelund .cfg_pi_bw_gen1_3_0 = mode->pi_bw_gen1, 8952ff8a1eeSSteen Hegelund .cfg_pi_bw_gen2 = mode->pi_bw_gen1, 8962ff8a1eeSSteen Hegelund .cfg_pi_bw_gen3 = mode->pi_bw_gen1, 8972ff8a1eeSSteen Hegelund .cfg_pi_bw_gen4 = mode->pi_bw_gen1, 8982ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_7_0 = 3, 8992ff8a1eeSSteen Hegelund .cfg_pi_steps = 0, 9002ff8a1eeSSteen Hegelund .cfg_mp_max_3_0 = 1, 9012ff8a1eeSSteen Hegelund .cfg_rstn_dfedig = mode->dfe_enable, 9022ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = media->cfg_alos_thr_3_0, 9032ff8a1eeSSteen Hegelund .cfg_predrv_slewrate_1_0 = 3, 9042ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base_1_0 = 0, 9052ff8a1eeSSteen Hegelund .cfg_ip_pre_base_1_0 = 0, 9062ff8a1eeSSteen Hegelund .r_cdr_m_gen2_7_0 = 2, 9072ff8a1eeSSteen Hegelund .r_cdr_m_gen3_7_0 = 2, 9082ff8a1eeSSteen Hegelund .r_cdr_m_gen4_7_0 = 2, 9092ff8a1eeSSteen Hegelund .r_en_auto_cdr_rstn = 0, 9102ff8a1eeSSteen Hegelund .cfg_oscal_afe = 1, 9112ff8a1eeSSteen Hegelund .cfg_pd_osdac_afe = 0, 9122ff8a1eeSSteen Hegelund .cfg_resetb_oscal_afe[0] = 0, 9132ff8a1eeSSteen Hegelund .cfg_resetb_oscal_afe[1] = 1, 9142ff8a1eeSSteen Hegelund .cfg_center_spreading = 0, 9152ff8a1eeSSteen Hegelund .cfg_m_cnt_maxval_4_0 = 15, 9162ff8a1eeSSteen Hegelund .cfg_ncnt_maxval_7_0 = 32, 9172ff8a1eeSSteen Hegelund .cfg_ncnt_maxval_10_8 = 6, 9182ff8a1eeSSteen Hegelund .cfg_ssc_en = 1, 9192ff8a1eeSSteen Hegelund .cfg_tx2rx_lp_en = 0, 9202ff8a1eeSSteen Hegelund .cfg_txlb_en = 0, 9212ff8a1eeSSteen Hegelund .cfg_rx2tx_lp_en = 0, 9222ff8a1eeSSteen Hegelund .cfg_rxlb_en = 0, 9232ff8a1eeSSteen Hegelund .r_tx_pol_inv = args->txinvert, 9242ff8a1eeSSteen Hegelund .r_rx_pol_inv = args->rxinvert, 9252ff8a1eeSSteen Hegelund }; 9262ff8a1eeSSteen Hegelund 9272ff8a1eeSSteen Hegelund *params = init; 9282ff8a1eeSSteen Hegelund } 9292ff8a1eeSSteen Hegelund 930238a583fSDaniel Machon static int sparx5_cmu_apply_cfg(struct sparx5_serdes_private *priv, 931238a583fSDaniel Machon u32 cmu_idx, 932238a583fSDaniel Machon void __iomem *cmu_tgt, 933238a583fSDaniel Machon void __iomem *cmu_cfg_tgt, 934238a583fSDaniel Machon u32 spd10g) 935238a583fSDaniel Machon { 936238a583fSDaniel Machon void __iomem **regs = priv->regs; 937238a583fSDaniel Machon struct device *dev = priv->dev; 938238a583fSDaniel Machon int value; 939238a583fSDaniel Machon 940238a583fSDaniel Machon cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 941238a583fSDaniel Machon cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 942238a583fSDaniel Machon 943238a583fSDaniel Machon if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 944238a583fSDaniel Machon cmu_idx == 10 || cmu_idx == 13) { 945238a583fSDaniel Machon spd10g = 0; 946238a583fSDaniel Machon } 947238a583fSDaniel Machon 948238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(1), 949238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 950238a583fSDaniel Machon cmu_cfg_tgt, 951238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 952238a583fSDaniel Machon 953238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(0), 954238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 955238a583fSDaniel Machon cmu_cfg_tgt, 956238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 957238a583fSDaniel Machon 958238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(1), 959238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 960238a583fSDaniel Machon cmu_cfg_tgt, 961238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 962238a583fSDaniel Machon 963238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT_SET(0x1) | 964238a583fSDaniel Machon SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT_SET(0x1) | 965238a583fSDaniel Machon SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT_SET(0x1) | 966238a583fSDaniel Machon SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT_SET(0x1) | 967238a583fSDaniel Machon SD_CMU_CMU_45_R_EN_RATECHG_CTRL_SET(0x0), 968238a583fSDaniel Machon SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT | 969238a583fSDaniel Machon SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT | 970238a583fSDaniel Machon SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT | 971238a583fSDaniel Machon SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT | 972238a583fSDaniel Machon SD_CMU_CMU_45_R_EN_RATECHG_CTRL, 973238a583fSDaniel Machon cmu_tgt, 974238a583fSDaniel Machon SD_CMU_CMU_45(cmu_idx)); 975238a583fSDaniel Machon 976238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0_SET(0), 977238a583fSDaniel Machon SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0, 978238a583fSDaniel Machon cmu_tgt, 979238a583fSDaniel Machon SD_CMU_CMU_47(cmu_idx)); 980238a583fSDaniel Machon 981238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_1B_CFG_RESERVE_7_0_SET(0), 982238a583fSDaniel Machon SD_CMU_CMU_1B_CFG_RESERVE_7_0, 983238a583fSDaniel Machon cmu_tgt, 984238a583fSDaniel Machon SD_CMU_CMU_1B(cmu_idx)); 985238a583fSDaniel Machon 986238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_JC_BYP_SET(0x1), 987238a583fSDaniel Machon SD_CMU_CMU_0D_CFG_JC_BYP, 988238a583fSDaniel Machon cmu_tgt, 989238a583fSDaniel Machon SD_CMU_CMU_0D(cmu_idx)); 990238a583fSDaniel Machon 991238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_1F_CFG_VTUNE_SEL_SET(1), 992238a583fSDaniel Machon SD_CMU_CMU_1F_CFG_VTUNE_SEL, 993238a583fSDaniel Machon cmu_tgt, 994238a583fSDaniel Machon SD_CMU_CMU_1F(cmu_idx)); 995238a583fSDaniel Machon 996238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0_SET(3), 997238a583fSDaniel Machon SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0, 998238a583fSDaniel Machon cmu_tgt, 999238a583fSDaniel Machon SD_CMU_CMU_00(cmu_idx)); 1000238a583fSDaniel Machon 1001238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0_SET(3), 1002238a583fSDaniel Machon SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0, 1003238a583fSDaniel Machon cmu_tgt, 1004238a583fSDaniel Machon SD_CMU_CMU_05(cmu_idx)); 1005238a583fSDaniel Machon 1006238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_30_R_PLL_DLOL_EN_SET(1), 1007238a583fSDaniel Machon SD_CMU_CMU_30_R_PLL_DLOL_EN, 1008238a583fSDaniel Machon cmu_tgt, 1009238a583fSDaniel Machon SD_CMU_CMU_30(cmu_idx)); 1010238a583fSDaniel Machon 1011238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_09_CFG_SW_10G_SET(spd10g), 1012238a583fSDaniel Machon SD_CMU_CMU_09_CFG_SW_10G, 1013238a583fSDaniel Machon cmu_tgt, 1014238a583fSDaniel Machon SD_CMU_CMU_09(cmu_idx)); 1015238a583fSDaniel Machon 1016238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(0), 1017238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 1018238a583fSDaniel Machon cmu_cfg_tgt, 1019238a583fSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 1020238a583fSDaniel Machon 1021238a583fSDaniel Machon msleep(20); 1022238a583fSDaniel Machon 1023238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(0), 1024238a583fSDaniel Machon SD_CMU_CMU_44_R_PLL_RSTN, 1025238a583fSDaniel Machon cmu_tgt, 1026238a583fSDaniel Machon SD_CMU_CMU_44(cmu_idx)); 1027238a583fSDaniel Machon 1028238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(1), 1029238a583fSDaniel Machon SD_CMU_CMU_44_R_PLL_RSTN, 1030238a583fSDaniel Machon cmu_tgt, 1031238a583fSDaniel Machon SD_CMU_CMU_44(cmu_idx)); 1032238a583fSDaniel Machon 1033238a583fSDaniel Machon msleep(20); 1034238a583fSDaniel Machon 1035238a583fSDaniel Machon value = readl(sdx5_addr(regs, SD_CMU_CMU_E0(cmu_idx))); 1036238a583fSDaniel Machon value = SD_CMU_CMU_E0_PLL_LOL_UDL_GET(value); 1037238a583fSDaniel Machon 1038238a583fSDaniel Machon if (value) { 1039238a583fSDaniel Machon dev_err(dev, "CMU PLL Loss of Lock: 0x%x\n", value); 1040238a583fSDaniel Machon return -EINVAL; 1041238a583fSDaniel Machon } 1042238a583fSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD_SET(0), 1043238a583fSDaniel Machon SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD, 1044238a583fSDaniel Machon cmu_tgt, 1045238a583fSDaniel Machon SD_CMU_CMU_0D(cmu_idx)); 1046238a583fSDaniel Machon return 0; 1047238a583fSDaniel Machon } 1048238a583fSDaniel Machon 1049238a583fSDaniel Machon static int sparx5_cmu_cfg(struct sparx5_serdes_private *priv, u32 cmu_idx) 1050238a583fSDaniel Machon { 1051238a583fSDaniel Machon void __iomem *cmu_tgt, *cmu_cfg_tgt; 1052238a583fSDaniel Machon u32 spd10g = 1; 1053238a583fSDaniel Machon 1054238a583fSDaniel Machon if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 1055238a583fSDaniel Machon cmu_idx == 10 || cmu_idx == 13) { 1056238a583fSDaniel Machon spd10g = 0; 1057238a583fSDaniel Machon } 1058238a583fSDaniel Machon 1059238a583fSDaniel Machon cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 1060238a583fSDaniel Machon cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 1061238a583fSDaniel Machon 1062238a583fSDaniel Machon return sparx5_cmu_apply_cfg(priv, cmu_idx, cmu_tgt, cmu_cfg_tgt, spd10g); 1063238a583fSDaniel Machon } 1064238a583fSDaniel Machon 106596bb1664SDaniel Machon /* Map of 6G/10G serdes mode and index to CMU index. */ 106696bb1664SDaniel Machon static const int 106796bb1664SDaniel Machon sparx5_serdes_cmu_map[SPX5_SD10G28_CMU_MAX][SPX5_SERDES_6G10G_CNT] = { 106896bb1664SDaniel Machon [SPX5_SD10G28_CMU_MAIN] = { 2, 2, 2, 2, 2, 106996bb1664SDaniel Machon 2, 2, 2, 5, 5, 107096bb1664SDaniel Machon 5, 5, 5, 5, 5, 107196bb1664SDaniel Machon 5, 8, 11, 11, 11, 107296bb1664SDaniel Machon 11, 11, 11, 11, 11 }, 107396bb1664SDaniel Machon [SPX5_SD10G28_CMU_AUX1] = { 0, 0, 3, 3, 3, 107496bb1664SDaniel Machon 3, 3, 3, 3, 3, 107596bb1664SDaniel Machon 6, 6, 6, 6, 6, 107696bb1664SDaniel Machon 6, 6, 9, 9, 12, 107796bb1664SDaniel Machon 12, 12, 12, 12, 12 }, 107896bb1664SDaniel Machon [SPX5_SD10G28_CMU_AUX2] = { 1, 1, 1, 1, 4, 107996bb1664SDaniel Machon 4, 4, 4, 4, 4, 108096bb1664SDaniel Machon 4, 4, 7, 7, 7, 108196bb1664SDaniel Machon 7, 7, 10, 10, 10, 108296bb1664SDaniel Machon 10, 13, 13, 13, 13 }, 108396bb1664SDaniel Machon [SPX5_SD10G28_CMU_NONE] = { 1, 1, 1, 1, 4, 108496bb1664SDaniel Machon 4, 4, 4, 4, 4, 108596bb1664SDaniel Machon 4, 4, 7, 7, 7, 108696bb1664SDaniel Machon 7, 7, 10, 10, 10, 108796bb1664SDaniel Machon 10, 13, 13, 13, 13 }, 108896bb1664SDaniel Machon }; 108996bb1664SDaniel Machon 109096bb1664SDaniel Machon /* Get the index of the CMU which provides the clock for the specified serdes 109196bb1664SDaniel Machon * mode and index. 109296bb1664SDaniel Machon */ 109396bb1664SDaniel Machon static int sparx5_serdes_cmu_get(enum sparx5_10g28cmu_mode mode, int sd_index) 109496bb1664SDaniel Machon { 109596bb1664SDaniel Machon return sparx5_serdes_cmu_map[mode][sd_index]; 109696bb1664SDaniel Machon } 109796bb1664SDaniel Machon 1098044f3a1aSDaniel Machon static void sparx5_serdes_cmu_power_off(struct sparx5_serdes_private *priv) 1099044f3a1aSDaniel Machon { 1100044f3a1aSDaniel Machon void __iomem *cmu_inst, *cmu_cfg_inst; 1101044f3a1aSDaniel Machon int i; 1102044f3a1aSDaniel Machon 1103044f3a1aSDaniel Machon /* Power down each CMU */ 1104044f3a1aSDaniel Machon for (i = 0; i < SPX5_CMU_MAX; i++) { 1105044f3a1aSDaniel Machon cmu_inst = sdx5_inst_get(priv, TARGET_SD_CMU, i); 1106044f3a1aSDaniel Machon cmu_cfg_inst = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, i); 1107044f3a1aSDaniel Machon 1108044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(0), 1109044f3a1aSDaniel Machon SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, cmu_cfg_inst, 1110044f3a1aSDaniel Machon SD_CMU_CFG_SD_CMU_CFG(0)); 1111044f3a1aSDaniel Machon 1112044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_05_CFG_REFCK_TERM_EN_SET(0), 1113044f3a1aSDaniel Machon SD_CMU_CMU_05_CFG_REFCK_TERM_EN, cmu_inst, 1114044f3a1aSDaniel Machon SD_CMU_CMU_05(0)); 1115044f3a1aSDaniel Machon 1116044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_09_CFG_EN_TX_CK_DN_SET(0), 1117044f3a1aSDaniel Machon SD_CMU_CMU_09_CFG_EN_TX_CK_DN, cmu_inst, 1118044f3a1aSDaniel Machon SD_CMU_CMU_09(0)); 1119044f3a1aSDaniel Machon 1120044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_06_CFG_VCO_PD_SET(1), 1121044f3a1aSDaniel Machon SD_CMU_CMU_06_CFG_VCO_PD, cmu_inst, 1122044f3a1aSDaniel Machon SD_CMU_CMU_06(0)); 1123044f3a1aSDaniel Machon 1124044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_09_CFG_EN_TX_CK_UP_SET(0), 1125044f3a1aSDaniel Machon SD_CMU_CMU_09_CFG_EN_TX_CK_UP, cmu_inst, 1126044f3a1aSDaniel Machon SD_CMU_CMU_09(0)); 1127044f3a1aSDaniel Machon 1128044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_08_CFG_CK_TREE_PD_SET(1), 1129044f3a1aSDaniel Machon SD_CMU_CMU_08_CFG_CK_TREE_PD, cmu_inst, 1130044f3a1aSDaniel Machon SD_CMU_CMU_08(0)); 1131044f3a1aSDaniel Machon 1132044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_REFCK_PD_SET(1) | 1133044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV64_SET(1) | 1134044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV66_SET(1), 1135044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_REFCK_PD | 1136044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV64 | 1137044f3a1aSDaniel Machon SD_CMU_CMU_0D_CFG_PD_DIV66, cmu_inst, 1138044f3a1aSDaniel Machon SD_CMU_CMU_0D(0)); 1139044f3a1aSDaniel Machon 1140044f3a1aSDaniel Machon sdx5_inst_rmw(SD_CMU_CMU_06_CFG_CTRL_LOGIC_PD_SET(1), 1141044f3a1aSDaniel Machon SD_CMU_CMU_06_CFG_CTRL_LOGIC_PD, cmu_inst, 1142044f3a1aSDaniel Machon SD_CMU_CMU_06(0)); 1143044f3a1aSDaniel Machon } 1144044f3a1aSDaniel Machon } 1145044f3a1aSDaniel Machon 11462ff8a1eeSSteen Hegelund static void sparx5_sd25g28_reset(void __iomem *regs[], 11472ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params *params, 11482ff8a1eeSSteen Hegelund u32 sd_index) 11492ff8a1eeSSteen Hegelund { 11502ff8a1eeSSteen Hegelund if (params->reg_rst == 1) { 11512ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(1), 11522ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 11532ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 11542ff8a1eeSSteen Hegelund 11552ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 11562ff8a1eeSSteen Hegelund 11572ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(0), 11582ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 11592ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 11602ff8a1eeSSteen Hegelund } 11612ff8a1eeSSteen Hegelund } 11622ff8a1eeSSteen Hegelund 11638595ffb5SSteen Hegelund static int sparx5_sd25g28_apply_params(struct sparx5_serdes_macro *macro, 11648595ffb5SSteen Hegelund struct sparx5_sd25g28_params *params) 11652ff8a1eeSSteen Hegelund { 11668595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 11678595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 11688595ffb5SSteen Hegelund struct device *dev = priv->dev; 11698595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 11708595ffb5SSteen Hegelund u32 value; 11718595ffb5SSteen Hegelund 11728595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(1), 11732ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 11748595ffb5SSteen Hegelund priv, 11758595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 11768595ffb5SSteen Hegelund 11778595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xFF), 11782ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 11798595ffb5SSteen Hegelund priv, 11808595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 11818595ffb5SSteen Hegelund 11828595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT_SET 11832ff8a1eeSSteen Hegelund (params->r_d_width_ctrl_from_hwt) | 11842ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_REG_MANUAL_SET(params->r_reg_manual), 11852ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT | 11862ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_REG_MANUAL, 11878595ffb5SSteen Hegelund priv, 11888595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 11898595ffb5SSteen Hegelund 11908595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0_SET 11912ff8a1eeSSteen Hegelund (params->cfg_common_reserve_7_0), 11922ff8a1eeSSteen Hegelund SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0, 11938595ffb5SSteen Hegelund priv, 11948595ffb5SSteen Hegelund SD25G_LANE_CMU_31(sd_index)); 11958595ffb5SSteen Hegelund 11968595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_09_CFG_EN_DUMMY_SET(params->cfg_en_dummy), 11972ff8a1eeSSteen Hegelund SD25G_LANE_CMU_09_CFG_EN_DUMMY, 11988595ffb5SSteen Hegelund priv, 11998595ffb5SSteen Hegelund SD25G_LANE_CMU_09(sd_index)); 12008595ffb5SSteen Hegelund 12018595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0_SET 12028595ffb5SSteen Hegelund (params->cfg_pll_reserve_3_0), 12032ff8a1eeSSteen Hegelund SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0, 12048595ffb5SSteen Hegelund priv, 12058595ffb5SSteen Hegelund SD25G_LANE_CMU_13(sd_index)); 12068595ffb5SSteen Hegelund 12078595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN_SET(params->l0_cfg_txcal_en), 12082ff8a1eeSSteen Hegelund SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN, 12098595ffb5SSteen Hegelund priv, 12108595ffb5SSteen Hegelund SD25G_LANE_CMU_40(sd_index)); 12118595ffb5SSteen Hegelund 12128595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8_SET 12132ff8a1eeSSteen Hegelund (params->l0_cfg_tx_reserve_15_8), 12142ff8a1eeSSteen Hegelund SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8, 12158595ffb5SSteen Hegelund priv, 12168595ffb5SSteen Hegelund SD25G_LANE_CMU_46(sd_index)); 12178595ffb5SSteen Hegelund 12188595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0_SET 12198595ffb5SSteen Hegelund (params->l0_cfg_tx_reserve_7_0), 12202ff8a1eeSSteen Hegelund SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0, 12218595ffb5SSteen Hegelund priv, 12228595ffb5SSteen Hegelund SD25G_LANE_CMU_45(sd_index)); 12238595ffb5SSteen Hegelund 12248595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(0), 12252ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 12268595ffb5SSteen Hegelund priv, 12278595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 12288595ffb5SSteen Hegelund 12298595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(1), 12302ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 12318595ffb5SSteen Hegelund priv, 12328595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 12338595ffb5SSteen Hegelund 12348595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(0), 12352ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 12368595ffb5SSteen Hegelund priv, 12378595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 12388595ffb5SSteen Hegelund 12398595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(1), 12402ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 12418595ffb5SSteen Hegelund priv, 12428595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 12438595ffb5SSteen Hegelund 12448595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(0), 12452ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 12468595ffb5SSteen Hegelund priv, 12478595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 12488595ffb5SSteen Hegelund 12498595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(1), 12502ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 12518595ffb5SSteen Hegelund priv, 12528595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 12538595ffb5SSteen Hegelund 12548595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0_SET(params->r_d_width_ctrl_2_0), 12552ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0, 12568595ffb5SSteen Hegelund priv, 12578595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 12588595ffb5SSteen Hegelund 12598595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0_SET 12602ff8a1eeSSteen Hegelund (params->r_txfifo_ck_div_pmad_2_0) | 12612ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0_SET 12622ff8a1eeSSteen Hegelund (params->r_rxfifo_ck_div_pmad_2_0), 12632ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0 | 12642ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0, 12658595ffb5SSteen Hegelund priv, 12668595ffb5SSteen Hegelund SD25G_LANE_CMU_30(sd_index)); 12678595ffb5SSteen Hegelund 12688595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET_SET(params->cfg_pll_lol_set) | 12698595ffb5SSteen Hegelund SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0_SET 12708595ffb5SSteen Hegelund (params->cfg_vco_div_mode_1_0), 12712ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET | 12722ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0, 12738595ffb5SSteen Hegelund priv, 12748595ffb5SSteen Hegelund SD25G_LANE_CMU_0C(sd_index)); 12758595ffb5SSteen Hegelund 12768595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0_SET 12778595ffb5SSteen Hegelund (params->cfg_pre_divsel_1_0), 12782ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0, 12798595ffb5SSteen Hegelund priv, 12808595ffb5SSteen Hegelund SD25G_LANE_CMU_0D(sd_index)); 12818595ffb5SSteen Hegelund 12828595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0_SET(params->cfg_sel_div_3_0), 12832ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0, 12848595ffb5SSteen Hegelund priv, 12858595ffb5SSteen Hegelund SD25G_LANE_CMU_0E(sd_index)); 12868595ffb5SSteen Hegelund 12878595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0x00), 12882ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 12898595ffb5SSteen Hegelund priv, 12908595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 12918595ffb5SSteen Hegelund 12928595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 12932ff8a1eeSSteen Hegelund (params->cfg_pma_tx_ck_bitwidth_2_0), 12942ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0, 12958595ffb5SSteen Hegelund priv, 12968595ffb5SSteen Hegelund SD25G_LANE_LANE_0C(sd_index)); 12978595ffb5SSteen Hegelund 12988595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0_SET 12998595ffb5SSteen Hegelund (params->cfg_tx_prediv_1_0), 13002ff8a1eeSSteen Hegelund SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0, 13018595ffb5SSteen Hegelund priv, 13028595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 13038595ffb5SSteen Hegelund 13048595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0_SET 13058595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 13062ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0, 13078595ffb5SSteen Hegelund priv, 13088595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 13098595ffb5SSteen Hegelund 13108595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0_SET 13118595ffb5SSteen Hegelund (params->cfg_tx_subrate_2_0), 13122ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0, 13138595ffb5SSteen Hegelund priv, 13148595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 13158595ffb5SSteen Hegelund 13168595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0_SET 13178595ffb5SSteen Hegelund (params->cfg_rx_subrate_2_0), 13182ff8a1eeSSteen Hegelund SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0, 13198595ffb5SSteen Hegelund priv, 13208595ffb5SSteen Hegelund SD25G_LANE_LANE_28(sd_index)); 13218595ffb5SSteen Hegelund 13228595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 13232ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN, 13248595ffb5SSteen Hegelund priv, 13258595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 13268595ffb5SSteen Hegelund 13278595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1_SET 13288595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 13292ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1, 13308595ffb5SSteen Hegelund priv, 13318595ffb5SSteen Hegelund SD25G_LANE_LANE_0F(sd_index)); 13328595ffb5SSteen Hegelund 13338595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 13342ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 13358595ffb5SSteen Hegelund priv, 13368595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 13378595ffb5SSteen Hegelund 13388595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN_SET(params->cfg_pi_dfe_en), 13392ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN, 13408595ffb5SSteen Hegelund priv, 13418595ffb5SSteen Hegelund SD25G_LANE_LANE_1D(sd_index)); 13428595ffb5SSteen Hegelund 13438595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_ECDR_PD_SET(params->cfg_ecdr_pd), 13442ff8a1eeSSteen Hegelund SD25G_LANE_LANE_19_LN_CFG_ECDR_PD, 13458595ffb5SSteen Hegelund priv, 13468595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 13478595ffb5SSteen Hegelund 13488595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0_SET 13492ff8a1eeSSteen Hegelund (params->cfg_itx_ipdriver_base_2_0), 13502ff8a1eeSSteen Hegelund SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0, 13518595ffb5SSteen Hegelund priv, 13528595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 13538595ffb5SSteen Hegelund 13548595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0_SET(params->cfg_tap_dly_4_0), 13552ff8a1eeSSteen Hegelund SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0, 13568595ffb5SSteen Hegelund priv, 13578595ffb5SSteen Hegelund SD25G_LANE_LANE_03(sd_index)); 13588595ffb5SSteen Hegelund 13598595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0_SET(params->cfg_tap_adv_3_0), 13602ff8a1eeSSteen Hegelund SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0, 13618595ffb5SSteen Hegelund priv, 13628595ffb5SSteen Hegelund SD25G_LANE_LANE_06(sd_index)); 13638595ffb5SSteen Hegelund 13648595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_07_LN_CFG_EN_ADV_SET(params->cfg_en_adv) | 13652ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_DLY_SET(params->cfg_en_dly), 13662ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_ADV | 13672ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_DLY, 13688595ffb5SSteen Hegelund priv, 13698595ffb5SSteen Hegelund SD25G_LANE_LANE_07(sd_index)); 13708595ffb5SSteen Hegelund 13718595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8_SET 13728595ffb5SSteen Hegelund (params->cfg_tx_reserve_15_8), 13732ff8a1eeSSteen Hegelund SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8, 13748595ffb5SSteen Hegelund priv, 13758595ffb5SSteen Hegelund SD25G_LANE_LANE_43(sd_index)); 13768595ffb5SSteen Hegelund 13778595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0_SET 13788595ffb5SSteen Hegelund (params->cfg_tx_reserve_7_0), 13792ff8a1eeSSteen Hegelund SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0, 13808595ffb5SSteen Hegelund priv, 13818595ffb5SSteen Hegelund SD25G_LANE_LANE_42(sd_index)); 13828595ffb5SSteen Hegelund 13838595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_05_LN_CFG_BW_1_0_SET(params->cfg_bw_1_0), 13842ff8a1eeSSteen Hegelund SD25G_LANE_LANE_05_LN_CFG_BW_1_0, 13858595ffb5SSteen Hegelund priv, 13868595ffb5SSteen Hegelund SD25G_LANE_LANE_05(sd_index)); 13878595ffb5SSteen Hegelund 13888595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN_SET 13898595ffb5SSteen Hegelund (params->cfg_txcal_man_en), 13902ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN, 13918595ffb5SSteen Hegelund priv, 13928595ffb5SSteen Hegelund SD25G_LANE_LANE_0B(sd_index)); 13938595ffb5SSteen Hegelund 13948595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0_SET 13952ff8a1eeSSteen Hegelund (params->cfg_txcal_shift_code_5_0), 13962ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0, 13978595ffb5SSteen Hegelund priv, 13988595ffb5SSteen Hegelund SD25G_LANE_LANE_0A(sd_index)); 13998595ffb5SSteen Hegelund 14008595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0_SET 14012ff8a1eeSSteen Hegelund (params->cfg_txcal_valid_sel_3_0), 14022ff8a1eeSSteen Hegelund SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0, 14038595ffb5SSteen Hegelund priv, 14048595ffb5SSteen Hegelund SD25G_LANE_LANE_09(sd_index)); 14058595ffb5SSteen Hegelund 14068595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0_SET(params->cfg_cdr_kf_2_0), 14072ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0, 14088595ffb5SSteen Hegelund priv, 14098595ffb5SSteen Hegelund SD25G_LANE_LANE_1A(sd_index)); 14108595ffb5SSteen Hegelund 14118595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0_SET(params->cfg_cdr_m_7_0), 14122ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0, 14138595ffb5SSteen Hegelund priv, 14148595ffb5SSteen Hegelund SD25G_LANE_LANE_1B(sd_index)); 14158595ffb5SSteen Hegelund 14168595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0_SET(params->cfg_pi_bw_3_0), 14172ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0, 14188595ffb5SSteen Hegelund priv, 14198595ffb5SSteen Hegelund SD25G_LANE_LANE_2B(sd_index)); 14208595ffb5SSteen Hegelund 14218595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER_SET 14228595ffb5SSteen Hegelund (params->cfg_dis_2ndorder), 14232ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER, 14248595ffb5SSteen Hegelund priv, 14258595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 14268595ffb5SSteen Hegelund 14278595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN_SET(params->cfg_ctle_rstn), 14282ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN, 14298595ffb5SSteen Hegelund priv, 14308595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 14318595ffb5SSteen Hegelund 14328595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0_SET 14332ff8a1eeSSteen Hegelund (params->cfg_itx_ipcml_base_1_0), 14342ff8a1eeSSteen Hegelund SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0, 14358595ffb5SSteen Hegelund priv, 14368595ffb5SSteen Hegelund SD25G_LANE_LANE_00(sd_index)); 14378595ffb5SSteen Hegelund 14388595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0_SET 14398595ffb5SSteen Hegelund (params->cfg_rx_reserve_7_0), 14402ff8a1eeSSteen Hegelund SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0, 14418595ffb5SSteen Hegelund priv, 14428595ffb5SSteen Hegelund SD25G_LANE_LANE_44(sd_index)); 14438595ffb5SSteen Hegelund 14448595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8_SET 14458595ffb5SSteen Hegelund (params->cfg_rx_reserve_15_8), 14462ff8a1eeSSteen Hegelund SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8, 14478595ffb5SSteen Hegelund priv, 14488595ffb5SSteen Hegelund SD25G_LANE_LANE_45(sd_index)); 14498595ffb5SSteen Hegelund 14508595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN_SET(params->cfg_dfeck_en) | 14512ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0_SET(params->cfg_rxterm_2_0), 14522ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN | 14532ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0, 14548595ffb5SSteen Hegelund priv, 14558595ffb5SSteen Hegelund SD25G_LANE_LANE_0D(sd_index)); 14568595ffb5SSteen Hegelund 14578595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0_SET 14582ff8a1eeSSteen Hegelund (params->cfg_vga_ctrl_byp_4_0), 14592ff8a1eeSSteen Hegelund SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0, 14608595ffb5SSteen Hegelund priv, 14618595ffb5SSteen Hegelund SD25G_LANE_LANE_21(sd_index)); 14628595ffb5SSteen Hegelund 14638595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0_SET 14648595ffb5SSteen Hegelund (params->cfg_eqr_force_3_0), 14652ff8a1eeSSteen Hegelund SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0, 14668595ffb5SSteen Hegelund priv, 14678595ffb5SSteen Hegelund SD25G_LANE_LANE_22(sd_index)); 14688595ffb5SSteen Hegelund 14698595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0_SET 14708595ffb5SSteen Hegelund (params->cfg_eqc_force_3_0) | 14712ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_DFE_PD_SET(params->cfg_dfe_pd), 14722ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0 | 14732ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_DFE_PD, 14748595ffb5SSteen Hegelund priv, 14758595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 14768595ffb5SSteen Hegelund 14778595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN_SET 14788595ffb5SSteen Hegelund (params->cfg_sum_setcm_en), 14792ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN, 14808595ffb5SSteen Hegelund priv, 14818595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 14828595ffb5SSteen Hegelund 14838595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0_SET 14842ff8a1eeSSteen Hegelund (params->cfg_init_pos_iscan_6_0), 14852ff8a1eeSSteen Hegelund SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0, 14868595ffb5SSteen Hegelund priv, 14878595ffb5SSteen Hegelund SD25G_LANE_LANE_25(sd_index)); 14888595ffb5SSteen Hegelund 14898595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0_SET 14902ff8a1eeSSteen Hegelund (params->cfg_init_pos_ipi_6_0), 14912ff8a1eeSSteen Hegelund SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0, 14928595ffb5SSteen Hegelund priv, 14938595ffb5SSteen Hegelund SD25G_LANE_LANE_26(sd_index)); 14948595ffb5SSteen Hegelund 14958595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 14962ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 14978595ffb5SSteen Hegelund priv, 14988595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 14998595ffb5SSteen Hegelund 15008595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0_SET 15018595ffb5SSteen Hegelund (params->cfg_dfedig_m_2_0), 15022ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0, 15038595ffb5SSteen Hegelund priv, 15048595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 15058595ffb5SSteen Hegelund 15068595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG_SET(params->cfg_en_dfedig), 15072ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG, 15088595ffb5SSteen Hegelund priv, 15098595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 15108595ffb5SSteen Hegelund 15118595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_40_LN_R_TX_POL_INV_SET(params->r_tx_pol_inv) | 15122ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_RX_POL_INV_SET(params->r_rx_pol_inv), 15132ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_TX_POL_INV | 15142ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_RX_POL_INV, 15158595ffb5SSteen Hegelund priv, 15168595ffb5SSteen Hegelund SD25G_LANE_LANE_40(sd_index)); 15178595ffb5SSteen Hegelund 15188595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN_SET(params->cfg_rx2tx_lp_en) | 15192ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN_SET(params->cfg_tx2rx_lp_en), 15202ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN | 15212ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN, 15228595ffb5SSteen Hegelund priv, 15238595ffb5SSteen Hegelund SD25G_LANE_LANE_04(sd_index)); 15248595ffb5SSteen Hegelund 15258595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN_SET(params->cfg_rxlb_en), 15262ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN, 15278595ffb5SSteen Hegelund priv, 15288595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 15298595ffb5SSteen Hegelund 15308595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_TXLB_EN_SET(params->cfg_txlb_en), 15312ff8a1eeSSteen Hegelund SD25G_LANE_LANE_19_LN_CFG_TXLB_EN, 15328595ffb5SSteen Hegelund priv, 15338595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 15348595ffb5SSteen Hegelund 15358595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(0), 15362ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 15378595ffb5SSteen Hegelund priv, 15388595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 15398595ffb5SSteen Hegelund 15408595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(1), 15412ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 15428595ffb5SSteen Hegelund priv, 15438595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 15448595ffb5SSteen Hegelund 15458595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(0), 15462ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 15478595ffb5SSteen Hegelund priv, 15488595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 15498595ffb5SSteen Hegelund 15508595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(0), 15512ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 15528595ffb5SSteen Hegelund priv, 15538595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 15542ff8a1eeSSteen Hegelund 15552ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 15562ff8a1eeSSteen Hegelund 15578595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(1), 15582ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 15598595ffb5SSteen Hegelund priv, 15608595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 15612ff8a1eeSSteen Hegelund 15622ff8a1eeSSteen Hegelund usleep_range(10000, 20000); 15632ff8a1eeSSteen Hegelund 15648595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xff), 15652ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 15668595ffb5SSteen Hegelund priv, 15678595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 15682ff8a1eeSSteen Hegelund 15692ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD25G_LANE_CMU_C0(sd_index))); 15702ff8a1eeSSteen Hegelund value = SD25G_LANE_CMU_C0_PLL_LOL_UDL_GET(value); 15712ff8a1eeSSteen Hegelund 15722ff8a1eeSSteen Hegelund if (value) { 15732ff8a1eeSSteen Hegelund dev_err(dev, "25G PLL Loss of Lock: 0x%x\n", value); 15742ff8a1eeSSteen Hegelund return -EINVAL; 15752ff8a1eeSSteen Hegelund } 15762ff8a1eeSSteen Hegelund 15772ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD_LANE_25G_SD_LANE_STAT(sd_index))); 15782ff8a1eeSSteen Hegelund value = SD_LANE_25G_SD_LANE_STAT_PMA_RST_DONE_GET(value); 15792ff8a1eeSSteen Hegelund 15802ff8a1eeSSteen Hegelund if (value != 0x1) { 15812ff8a1eeSSteen Hegelund dev_err(dev, "25G PMA Reset failed: 0x%x\n", value); 15822ff8a1eeSSteen Hegelund return -EINVAL; 15832ff8a1eeSSteen Hegelund } 15848595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS_SET(0x1), 15858595ffb5SSteen Hegelund SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS, 15868595ffb5SSteen Hegelund priv, 15878595ffb5SSteen Hegelund SD25G_LANE_CMU_2A(sd_index)); 15888595ffb5SSteen Hegelund 15898595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_SER_RST_SER_RST_SET(0x0), 15908595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST_SER_RST, 15918595ffb5SSteen Hegelund priv, 15928595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST(sd_index)); 15938595ffb5SSteen Hegelund 15948595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_DES_RST_DES_RST_SET(0x0), 15958595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST_DES_RST, 15968595ffb5SSteen Hegelund priv, 15978595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST(sd_index)); 15988595ffb5SSteen Hegelund 15998595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0), 16008595ffb5SSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 16018595ffb5SSteen Hegelund priv, 16028595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 16038595ffb5SSteen Hegelund 16048595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0_SET 16058595ffb5SSteen Hegelund (params->cfg_alos_thr_2_0), 16068595ffb5SSteen Hegelund SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0, 16078595ffb5SSteen Hegelund priv, 16088595ffb5SSteen Hegelund SD25G_LANE_LANE_2D(sd_index)); 16098595ffb5SSteen Hegelund 16108595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ_SET(0), 16118595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ, 16128595ffb5SSteen Hegelund priv, 16138595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 16148595ffb5SSteen Hegelund 16158595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_PD_SQ_SET(0), 16168595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_PD_SQ, 16178595ffb5SSteen Hegelund priv, 16188595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 16198595ffb5SSteen Hegelund 16202ff8a1eeSSteen Hegelund return 0; 16212ff8a1eeSSteen Hegelund } 16222ff8a1eeSSteen Hegelund 16238595ffb5SSteen Hegelund static void sparx5_sd10g28_reset(void __iomem *regs[], u32 lane_index) 16242ff8a1eeSSteen Hegelund { 16252ff8a1eeSSteen Hegelund /* Note: SerDes SD10G_LANE_1 is configured in 10G_LAN mode */ 16262ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(1), 16272ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 16282ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 16292ff8a1eeSSteen Hegelund 16302ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 16318595ffb5SSteen Hegelund 16328595ffb5SSteen Hegelund sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 16338595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 16348595ffb5SSteen Hegelund sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 16352ff8a1eeSSteen Hegelund } 16362ff8a1eeSSteen Hegelund 16378595ffb5SSteen Hegelund static int sparx5_sd10g28_apply_params(struct sparx5_serdes_macro *macro, 16388595ffb5SSteen Hegelund struct sparx5_sd10g28_params *params) 16392ff8a1eeSSteen Hegelund { 16408595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 16418595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 16428595ffb5SSteen Hegelund struct device *dev = priv->dev; 16438595ffb5SSteen Hegelund u32 lane_index = macro->sidx; 16448595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 16458595ffb5SSteen Hegelund void __iomem *sd_inst; 164696bb1664SDaniel Machon u32 value, cmu_idx; 164796bb1664SDaniel Machon int err; 164896bb1664SDaniel Machon 1649*7a503071SDaniel Machon /* Do not configure serdes if CMU is not to be configured too */ 1650*7a503071SDaniel Machon if (params->skip_cmu_cfg) 1651*7a503071SDaniel Machon return 0; 1652*7a503071SDaniel Machon 165396bb1664SDaniel Machon cmu_idx = sparx5_serdes_cmu_get(params->cmu_sel, lane_index); 165496bb1664SDaniel Machon err = sparx5_cmu_cfg(priv, cmu_idx); 165596bb1664SDaniel Machon if (err) 165696bb1664SDaniel Machon return err; 16578595ffb5SSteen Hegelund 16588595ffb5SSteen Hegelund if (params->is_6g) 16598595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, sd_index); 16608595ffb5SSteen Hegelund else 16618595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, sd_index); 16628595ffb5SSteen Hegelund 16638595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(1), 16642ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 16658595ffb5SSteen Hegelund priv, 16668595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 16678595ffb5SSteen Hegelund 16688595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT_SET(0x0) | 16692ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_REG_MANUAL_SET(0x1) | 16702ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT_SET(0x1) | 16712ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT_SET(0x1) | 16722ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL_SET(0x0), 16732ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT | 16742ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_REG_MANUAL | 16752ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT | 16762ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT | 16772ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL, 16788595ffb5SSteen Hegelund sd_inst, 16798595ffb5SSteen Hegelund SD10G_LANE_LANE_93(sd_index)); 16808595ffb5SSteen Hegelund 16818595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_94_R_ISCAN_REG_SET(0x1) | 16822ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_TXEQ_REG_SET(0x1) | 16832ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_MISC_REG_SET(0x1) | 16842ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_SWING_REG_SET(0x1), 16852ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_ISCAN_REG | 16862ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_TXEQ_REG | 16872ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_MISC_REG | 16882ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_SWING_REG, 16898595ffb5SSteen Hegelund sd_inst, 16908595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 16918595ffb5SSteen Hegelund 16928595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_RXEQ_REG_SET(0x1), 16932ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_RXEQ_REG, 16948595ffb5SSteen Hegelund sd_inst, 16958595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 16968595ffb5SSteen Hegelund 16978595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_A1_R_SSC_FROM_HWT_SET(0x0) | 16982ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_CDR_FROM_HWT_SET(0x0) | 16992ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT_SET(0x1), 17002ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_SSC_FROM_HWT | 17012ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_CDR_FROM_HWT | 17022ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT, 17038595ffb5SSteen Hegelund sd_inst, 17048595ffb5SSteen Hegelund SD10G_LANE_LANE_A1(sd_index)); 17058595ffb5SSteen Hegelund 17068595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_RX_REF_SEL_SET(params->cmu_sel) | 17072ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_TX_REF_SEL_SET(params->cmu_sel), 17082ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_RX_REF_SEL | 17092ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_TX_REF_SEL, 17108595ffb5SSteen Hegelund priv, 17118595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 17128595ffb5SSteen Hegelund 17138595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0_SET 17148595ffb5SSteen Hegelund (params->cfg_lane_reserve_7_0), 17152ff8a1eeSSteen Hegelund SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0, 17168595ffb5SSteen Hegelund sd_inst, 17178595ffb5SSteen Hegelund SD10G_LANE_LANE_40(sd_index)); 17188595ffb5SSteen Hegelund 17198595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL_SET 17208595ffb5SSteen Hegelund (params->cfg_ssc_rtl_clk_sel), 17212ff8a1eeSSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL, 17228595ffb5SSteen Hegelund sd_inst, 17238595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 17248595ffb5SSteen Hegelund 17258595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_35_CFG_TXRATE_1_0_SET 17268595ffb5SSteen Hegelund (params->cfg_txrate_1_0) | 17278595ffb5SSteen Hegelund SD10G_LANE_LANE_35_CFG_RXRATE_1_0_SET 17288595ffb5SSteen Hegelund (params->cfg_rxrate_1_0), 17292ff8a1eeSSteen Hegelund SD10G_LANE_LANE_35_CFG_TXRATE_1_0 | 17302ff8a1eeSSteen Hegelund SD10G_LANE_LANE_35_CFG_RXRATE_1_0, 17318595ffb5SSteen Hegelund sd_inst, 17328595ffb5SSteen Hegelund SD10G_LANE_LANE_35(sd_index)); 17338595ffb5SSteen Hegelund 17348595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0_SET 17358595ffb5SSteen Hegelund (params->r_d_width_ctrl_2_0), 17362ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0, 17378595ffb5SSteen Hegelund sd_inst, 17388595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 17398595ffb5SSteen Hegelund 17408595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 17412ff8a1eeSSteen Hegelund (params->cfg_pma_tx_ck_bitwidth_2_0), 17422ff8a1eeSSteen Hegelund SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0, 17438595ffb5SSteen Hegelund sd_inst, 17448595ffb5SSteen Hegelund SD10G_LANE_LANE_01(sd_index)); 17458595ffb5SSteen Hegelund 17468595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0_SET 17478595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 17482ff8a1eeSSteen Hegelund SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0, 17498595ffb5SSteen Hegelund sd_inst, 17508595ffb5SSteen Hegelund SD10G_LANE_LANE_30(sd_index)); 17518595ffb5SSteen Hegelund 17528595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0_SET 17532ff8a1eeSSteen Hegelund (params->r_pcs2pma_phymode_4_0), 17542ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0, 17558595ffb5SSteen Hegelund sd_inst, 17568595ffb5SSteen Hegelund SD10G_LANE_LANE_A2(sd_index)); 17578595ffb5SSteen Hegelund 17588595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_13_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 17592ff8a1eeSSteen Hegelund SD10G_LANE_LANE_13_CFG_CDRCK_EN, 17608595ffb5SSteen Hegelund sd_inst, 17618595ffb5SSteen Hegelund SD10G_LANE_LANE_13(sd_index)); 17628595ffb5SSteen Hegelund 17638595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_DFECK_EN_SET 17648595ffb5SSteen Hegelund (params->cfg_dfeck_en) | 17652ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFE_PD_SET(params->cfg_dfe_pd) | 17668595ffb5SSteen Hegelund SD10G_LANE_LANE_23_CFG_ERRAMP_PD_SET 17678595ffb5SSteen Hegelund (params->cfg_erramp_pd), 17682ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFECK_EN | 17692ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFE_PD | 17702ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_ERRAMP_PD, 17718595ffb5SSteen Hegelund sd_inst, 17728595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 17738595ffb5SSteen Hegelund 17748595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1_SET 17758595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 17762ff8a1eeSSteen Hegelund SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1, 17778595ffb5SSteen Hegelund sd_inst, 17788595ffb5SSteen Hegelund SD10G_LANE_LANE_22(sd_index)); 17798595ffb5SSteen Hegelund 17808595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_DFE_EN_SET 17818595ffb5SSteen Hegelund (params->cfg_pi_DFE_en), 17822ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_DFE_EN, 17838595ffb5SSteen Hegelund sd_inst, 17848595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 17858595ffb5SSteen Hegelund 17868595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_02_CFG_EN_ADV_SET(params->cfg_en_adv) | 17872ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_MAIN_SET(params->cfg_en_main) | 17882ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_DLY_SET(params->cfg_en_dly) | 17898595ffb5SSteen Hegelund SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0_SET 17908595ffb5SSteen Hegelund (params->cfg_tap_adv_3_0), 17912ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_ADV | 17922ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_MAIN | 17932ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_DLY | 17942ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0, 17958595ffb5SSteen Hegelund sd_inst, 17968595ffb5SSteen Hegelund SD10G_LANE_LANE_02(sd_index)); 17978595ffb5SSteen Hegelund 17988595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_03_CFG_TAP_MAIN_SET(params->cfg_tap_main), 17992ff8a1eeSSteen Hegelund SD10G_LANE_LANE_03_CFG_TAP_MAIN, 18008595ffb5SSteen Hegelund sd_inst, 18018595ffb5SSteen Hegelund SD10G_LANE_LANE_03(sd_index)); 18028595ffb5SSteen Hegelund 18038595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0_SET 18048595ffb5SSteen Hegelund (params->cfg_tap_dly_4_0), 18052ff8a1eeSSteen Hegelund SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0, 18068595ffb5SSteen Hegelund sd_inst, 18078595ffb5SSteen Hegelund SD10G_LANE_LANE_04(sd_index)); 18088595ffb5SSteen Hegelund 18098595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0_SET 18108595ffb5SSteen Hegelund (params->cfg_vga_ctrl_3_0), 18112ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0, 18128595ffb5SSteen Hegelund sd_inst, 18138595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 18148595ffb5SSteen Hegelund 18158595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0_SET 18168595ffb5SSteen Hegelund (params->cfg_vga_cp_2_0), 18172ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0, 18188595ffb5SSteen Hegelund sd_inst, 18198595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 18208595ffb5SSteen Hegelund 18218595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0_SET 18228595ffb5SSteen Hegelund (params->cfg_eq_res_3_0), 18232ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0, 18248595ffb5SSteen Hegelund sd_inst, 18258595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 18268595ffb5SSteen Hegelund 18278595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0D_CFG_EQR_BYP_SET(params->cfg_eq_r_byp), 18282ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0D_CFG_EQR_BYP, 18298595ffb5SSteen Hegelund sd_inst, 18308595ffb5SSteen Hegelund SD10G_LANE_LANE_0D(sd_index)); 18318595ffb5SSteen Hegelund 18328595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0_SET 18338595ffb5SSteen Hegelund (params->cfg_eq_c_force_3_0) | 18348595ffb5SSteen Hegelund SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN_SET 18358595ffb5SSteen Hegelund (params->cfg_sum_setcm_en), 18362ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0 | 18372ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN, 18388595ffb5SSteen Hegelund sd_inst, 18398595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 18408595ffb5SSteen Hegelund 18418595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_EN_DFEDIG_SET 18428595ffb5SSteen Hegelund (params->cfg_en_dfedig), 18432ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_EN_DFEDIG, 18448595ffb5SSteen Hegelund sd_inst, 18458595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 18468595ffb5SSteen Hegelund 18478595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_EN_PREEMPH_SET 18488595ffb5SSteen Hegelund (params->cfg_en_preemph), 18492ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_EN_PREEMPH, 18508595ffb5SSteen Hegelund sd_inst, 18518595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 18528595ffb5SSteen Hegelund 18538595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0_SET 18542ff8a1eeSSteen Hegelund (params->cfg_itx_ippreemp_base_1_0) | 18552ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0_SET 18562ff8a1eeSSteen Hegelund (params->cfg_itx_ipdriver_base_2_0), 18572ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0 | 18582ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0, 18598595ffb5SSteen Hegelund sd_inst, 18608595ffb5SSteen Hegelund SD10G_LANE_LANE_33(sd_index)); 18618595ffb5SSteen Hegelund 18628595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0_SET 18632ff8a1eeSSteen Hegelund (params->cfg_ibias_tune_reserve_5_0), 18642ff8a1eeSSteen Hegelund SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0, 18658595ffb5SSteen Hegelund sd_inst, 18668595ffb5SSteen Hegelund SD10G_LANE_LANE_52(sd_index)); 18678595ffb5SSteen Hegelund 18688595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_TXSWING_HALF_SET 18698595ffb5SSteen Hegelund (params->cfg_txswing_half), 18702ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_TXSWING_HALF, 18718595ffb5SSteen Hegelund sd_inst, 18728595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 18738595ffb5SSteen Hegelund 18748595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER_SET 18758595ffb5SSteen Hegelund (params->cfg_dis_2nd_order), 18762ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER, 18778595ffb5SSteen Hegelund sd_inst, 18788595ffb5SSteen Hegelund SD10G_LANE_LANE_3C(sd_index)); 18798595ffb5SSteen Hegelund 18808595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_39_CFG_RX_SSC_LH_SET 18818595ffb5SSteen Hegelund (params->cfg_rx_ssc_lh), 18822ff8a1eeSSteen Hegelund SD10G_LANE_LANE_39_CFG_RX_SSC_LH, 18838595ffb5SSteen Hegelund sd_inst, 18848595ffb5SSteen Hegelund SD10G_LANE_LANE_39(sd_index)); 18858595ffb5SSteen Hegelund 18868595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0_SET 18872ff8a1eeSSteen Hegelund (params->cfg_pi_floop_steps_1_0), 18882ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0, 18898595ffb5SSteen Hegelund sd_inst, 18908595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 18918595ffb5SSteen Hegelund 18928595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16_SET 18938595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_23_16), 18942ff8a1eeSSteen Hegelund SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16, 18958595ffb5SSteen Hegelund sd_inst, 18968595ffb5SSteen Hegelund SD10G_LANE_LANE_16(sd_index)); 18978595ffb5SSteen Hegelund 18988595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8_SET 18998595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_15_8), 19002ff8a1eeSSteen Hegelund SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8, 19018595ffb5SSteen Hegelund sd_inst, 19028595ffb5SSteen Hegelund SD10G_LANE_LANE_15(sd_index)); 19038595ffb5SSteen Hegelund 19048595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0_SET 19052ff8a1eeSSteen Hegelund (params->cfg_iscan_ext_dac_7_0), 19062ff8a1eeSSteen Hegelund SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0, 19078595ffb5SSteen Hegelund sd_inst, 19088595ffb5SSteen Hegelund SD10G_LANE_LANE_26(sd_index)); 19098595ffb5SSteen Hegelund 19108595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0_SET 19118595ffb5SSteen Hegelund (params->cfg_cdr_kf_gen1_2_0), 19122ff8a1eeSSteen Hegelund SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0, 19138595ffb5SSteen Hegelund sd_inst, 19148595ffb5SSteen Hegelund SD10G_LANE_LANE_42(sd_index)); 19158595ffb5SSteen Hegelund 19168595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0_SET 19178595ffb5SSteen Hegelund (params->r_cdr_m_gen1_7_0), 19182ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0, 19198595ffb5SSteen Hegelund sd_inst, 19208595ffb5SSteen Hegelund SD10G_LANE_LANE_0F(sd_index)); 19218595ffb5SSteen Hegelund 19228595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0_SET 19238595ffb5SSteen Hegelund (params->cfg_pi_bw_gen1_3_0), 19242ff8a1eeSSteen Hegelund SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0, 19258595ffb5SSteen Hegelund sd_inst, 19268595ffb5SSteen Hegelund SD10G_LANE_LANE_24(sd_index)); 19278595ffb5SSteen Hegelund 19288595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0_SET 19298595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_7_0), 19302ff8a1eeSSteen Hegelund SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0, 19318595ffb5SSteen Hegelund sd_inst, 19328595ffb5SSteen Hegelund SD10G_LANE_LANE_14(sd_index)); 19338595ffb5SSteen Hegelund 19348595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_STEPS_SET(params->cfg_pi_steps), 19352ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_STEPS, 19368595ffb5SSteen Hegelund sd_inst, 19378595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 19388595ffb5SSteen Hegelund 19398595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0_SET 19408595ffb5SSteen Hegelund (params->cfg_mp_max_3_0), 19412ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0, 19428595ffb5SSteen Hegelund sd_inst, 19438595ffb5SSteen Hegelund SD10G_LANE_LANE_3A(sd_index)); 19448595ffb5SSteen Hegelund 19458595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG_SET 19468595ffb5SSteen Hegelund (params->cfg_rstn_dfedig), 19472ff8a1eeSSteen Hegelund SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG, 19488595ffb5SSteen Hegelund sd_inst, 19498595ffb5SSteen Hegelund SD10G_LANE_LANE_31(sd_index)); 19508595ffb5SSteen Hegelund 19518595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0_SET 19528595ffb5SSteen Hegelund (params->cfg_alos_thr_3_0), 19532ff8a1eeSSteen Hegelund SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0, 19548595ffb5SSteen Hegelund sd_inst, 19558595ffb5SSteen Hegelund SD10G_LANE_LANE_48(sd_index)); 19568595ffb5SSteen Hegelund 19578595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0_SET 19582ff8a1eeSSteen Hegelund (params->cfg_predrv_slewrate_1_0), 19592ff8a1eeSSteen Hegelund SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0, 19608595ffb5SSteen Hegelund sd_inst, 19618595ffb5SSteen Hegelund SD10G_LANE_LANE_36(sd_index)); 19628595ffb5SSteen Hegelund 19638595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0_SET 19642ff8a1eeSSteen Hegelund (params->cfg_itx_ipcml_base_1_0), 19652ff8a1eeSSteen Hegelund SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0, 19668595ffb5SSteen Hegelund sd_inst, 19678595ffb5SSteen Hegelund SD10G_LANE_LANE_32(sd_index)); 19688595ffb5SSteen Hegelund 19698595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0_SET 19708595ffb5SSteen Hegelund (params->cfg_ip_pre_base_1_0), 19712ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0, 19728595ffb5SSteen Hegelund sd_inst, 19738595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 19748595ffb5SSteen Hegelund 19758595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8_SET 19762ff8a1eeSSteen Hegelund (params->cfg_lane_reserve_15_8), 19772ff8a1eeSSteen Hegelund SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8, 19788595ffb5SSteen Hegelund sd_inst, 19798595ffb5SSteen Hegelund SD10G_LANE_LANE_41(sd_index)); 19808595ffb5SSteen Hegelund 19818595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN_SET 19828595ffb5SSteen Hegelund (params->r_en_auto_cdr_rstn), 19832ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN, 19848595ffb5SSteen Hegelund sd_inst, 19858595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 19868595ffb5SSteen Hegelund 19878595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0C_CFG_OSCAL_AFE_SET 19888595ffb5SSteen Hegelund (params->cfg_oscal_afe) | 19898595ffb5SSteen Hegelund SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE_SET 19908595ffb5SSteen Hegelund (params->cfg_pd_osdac_afe), 19912ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0C_CFG_OSCAL_AFE | 19922ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE, 19938595ffb5SSteen Hegelund sd_inst, 19948595ffb5SSteen Hegelund SD10G_LANE_LANE_0C(sd_index)); 19958595ffb5SSteen Hegelund 19968595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 19972ff8a1eeSSteen Hegelund (params->cfg_resetb_oscal_afe[0]), 19982ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 19998595ffb5SSteen Hegelund sd_inst, 20008595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 20018595ffb5SSteen Hegelund 20028595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 20032ff8a1eeSSteen Hegelund (params->cfg_resetb_oscal_afe[1]), 20042ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 20058595ffb5SSteen Hegelund sd_inst, 20068595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 20078595ffb5SSteen Hegelund 20088595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_83_R_TX_POL_INV_SET 20098595ffb5SSteen Hegelund (params->r_tx_pol_inv) | 20108595ffb5SSteen Hegelund SD10G_LANE_LANE_83_R_RX_POL_INV_SET 20118595ffb5SSteen Hegelund (params->r_rx_pol_inv), 20122ff8a1eeSSteen Hegelund SD10G_LANE_LANE_83_R_TX_POL_INV | 20132ff8a1eeSSteen Hegelund SD10G_LANE_LANE_83_R_RX_POL_INV, 20148595ffb5SSteen Hegelund sd_inst, 20158595ffb5SSteen Hegelund SD10G_LANE_LANE_83(sd_index)); 20168595ffb5SSteen Hegelund 20178595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN_SET 20188595ffb5SSteen Hegelund (params->cfg_rx2tx_lp_en) | 20198595ffb5SSteen Hegelund SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN_SET 20208595ffb5SSteen Hegelund (params->cfg_tx2rx_lp_en), 20212ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN | 20222ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN, 20238595ffb5SSteen Hegelund sd_inst, 20248595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 20258595ffb5SSteen Hegelund 20268595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_RXLB_EN_SET(params->cfg_rxlb_en) | 20272ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_TXLB_EN_SET(params->cfg_txlb_en), 20282ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_RXLB_EN | 20292ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_TXLB_EN, 20308595ffb5SSteen Hegelund sd_inst, 20318595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 20322ff8a1eeSSteen Hegelund 20338595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(0), 20348595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 20358595ffb5SSteen Hegelund priv, 20368595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 20378595ffb5SSteen Hegelund 20388595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 20398595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 20408595ffb5SSteen Hegelund sd_inst, 20418595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 20428595ffb5SSteen Hegelund 20438595ffb5SSteen Hegelund sdx5_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 20448595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 20458595ffb5SSteen Hegelund priv, 20468595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 20478595ffb5SSteen Hegelund 20488595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_SD_125_RST_DIS_SET(params->fx_100), 20498595ffb5SSteen Hegelund SD_LANE_MISC_SD_125_RST_DIS, 20508595ffb5SSteen Hegelund priv, 20518595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 20528595ffb5SSteen Hegelund 20538595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_RX_ENA_SET(params->fx_100), 20548595ffb5SSteen Hegelund SD_LANE_MISC_RX_ENA, 20558595ffb5SSteen Hegelund priv, 20568595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 20578595ffb5SSteen Hegelund 20588595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_MUX_ENA_SET(params->fx_100), 20598595ffb5SSteen Hegelund SD_LANE_MISC_MUX_ENA, 20608595ffb5SSteen Hegelund priv, 20618595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 20628595ffb5SSteen Hegelund 20632ff8a1eeSSteen Hegelund usleep_range(3000, 6000); 20642ff8a1eeSSteen Hegelund 20652ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD_LANE_SD_LANE_STAT(lane_index))); 20662ff8a1eeSSteen Hegelund value = SD_LANE_SD_LANE_STAT_PMA_RST_DONE_GET(value); 20672ff8a1eeSSteen Hegelund if (value != 1) { 20682ff8a1eeSSteen Hegelund dev_err(dev, "10G PMA Reset failed: 0x%x\n", value); 20692ff8a1eeSSteen Hegelund return -EINVAL; 20702ff8a1eeSSteen Hegelund } 20712ff8a1eeSSteen Hegelund 20728595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_SER_RST_SER_RST_SET(0x0), 20732ff8a1eeSSteen Hegelund SD_LANE_SD_SER_RST_SER_RST, 20748595ffb5SSteen Hegelund priv, 20758595ffb5SSteen Hegelund SD_LANE_SD_SER_RST(lane_index)); 20762ff8a1eeSSteen Hegelund 20778595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_DES_RST_DES_RST_SET(0x0), 20782ff8a1eeSSteen Hegelund SD_LANE_SD_DES_RST_DES_RST, 20798595ffb5SSteen Hegelund priv, 20808595ffb5SSteen Hegelund SD_LANE_SD_DES_RST(lane_index)); 20812ff8a1eeSSteen Hegelund 20822ff8a1eeSSteen Hegelund return 0; 20832ff8a1eeSSteen Hegelund } 20842ff8a1eeSSteen Hegelund 20852ff8a1eeSSteen Hegelund static int sparx5_sd25g28_config(struct sparx5_serdes_macro *macro, bool reset) 20862ff8a1eeSSteen Hegelund { 20872ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset media = media_presets_25g[macro->media]; 20888595ffb5SSteen Hegelund struct sparx5_sd25g28_mode_preset mode; 20892ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args args = { 20902ff8a1eeSSteen Hegelund .rxinvert = 1, 20912ff8a1eeSSteen Hegelund .txinvert = 0, 20922ff8a1eeSSteen Hegelund .txswing = 240, 20932ff8a1eeSSteen Hegelund .com_pll_reserve = 0xf, 20942ff8a1eeSSteen Hegelund .reg_rst = reset, 20952ff8a1eeSSteen Hegelund }; 20962ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params params; 20972ff8a1eeSSteen Hegelund int err; 20982ff8a1eeSSteen Hegelund 20992ff8a1eeSSteen Hegelund err = sparx5_sd10g25_get_mode_preset(macro, &mode); 21002ff8a1eeSSteen Hegelund if (err) 21012ff8a1eeSSteen Hegelund return err; 21022ff8a1eeSSteen Hegelund sparx5_sd25g28_get_params(macro, &media, &mode, &args, ¶ms); 21032ff8a1eeSSteen Hegelund sparx5_sd25g28_reset(macro->priv->regs, ¶ms, macro->stpidx); 21048595ffb5SSteen Hegelund return sparx5_sd25g28_apply_params(macro, ¶ms); 21052ff8a1eeSSteen Hegelund } 21062ff8a1eeSSteen Hegelund 21072ff8a1eeSSteen Hegelund static int sparx5_sd10g28_config(struct sparx5_serdes_macro *macro, bool reset) 21082ff8a1eeSSteen Hegelund { 21092ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset media = media_presets_10g[macro->media]; 21108595ffb5SSteen Hegelund struct sparx5_sd10g28_mode_preset mode; 21118595ffb5SSteen Hegelund struct sparx5_sd10g28_params params; 21122ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args args = { 21132ff8a1eeSSteen Hegelund .is_6g = (macro->serdestype == SPX5_SDT_6G), 21142ff8a1eeSSteen Hegelund .txinvert = 0, 21152ff8a1eeSSteen Hegelund .rxinvert = 1, 21162ff8a1eeSSteen Hegelund .txswing = 240, 21172ff8a1eeSSteen Hegelund .reg_rst = reset, 2118*7a503071SDaniel Machon .skip_cmu_cfg = reset, 21192ff8a1eeSSteen Hegelund }; 21202ff8a1eeSSteen Hegelund int err; 21212ff8a1eeSSteen Hegelund 21222ff8a1eeSSteen Hegelund err = sparx5_sd10g28_get_mode_preset(macro, &mode, &args); 21232ff8a1eeSSteen Hegelund if (err) 21242ff8a1eeSSteen Hegelund return err; 21252ff8a1eeSSteen Hegelund sparx5_sd10g28_get_params(macro, &media, &mode, &args, ¶ms); 21268595ffb5SSteen Hegelund sparx5_sd10g28_reset(macro->priv->regs, macro->sidx); 21278595ffb5SSteen Hegelund return sparx5_sd10g28_apply_params(macro, ¶ms); 21282ff8a1eeSSteen Hegelund } 21292ff8a1eeSSteen Hegelund 21302ff8a1eeSSteen Hegelund /* Power down serdes TX driver */ 21312ff8a1eeSSteen Hegelund static int sparx5_serdes_power_save(struct sparx5_serdes_macro *macro, u32 pwdn) 21322ff8a1eeSSteen Hegelund { 21332ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 21343d61a1f8SDaniel Machon void __iomem *sd_inst, *sd_lane_inst; 21352ff8a1eeSSteen Hegelund 21362ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_6G) 21372ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, macro->stpidx); 21382ff8a1eeSSteen Hegelund else if (macro->serdestype == SPX5_SDT_10G) 21392ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, macro->stpidx); 21402ff8a1eeSSteen Hegelund else 21412ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD25G_LANE, macro->stpidx); 21422ff8a1eeSSteen Hegelund 21432ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) { 21443d61a1f8SDaniel Machon sd_lane_inst = sdx5_inst_get(priv, TARGET_SD_LANE_25G, 21453d61a1f8SDaniel Machon macro->stpidx); 21463d61a1f8SDaniel Machon /* Take serdes out of reset */ 21473d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(0), 21483d61a1f8SDaniel Machon SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, sd_lane_inst, 21493d61a1f8SDaniel Machon SD_LANE_25G_SD_LANE_CFG(0)); 21503d61a1f8SDaniel Machon 21513d61a1f8SDaniel Machon /* Configure optimal settings for quiet mode */ 21523d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_25G_QUIET_MODE_6G_QUIET_MODE_SET(SPX5_SERDES_QUIET_MODE_VAL), 21533d61a1f8SDaniel Machon SD_LANE_25G_QUIET_MODE_6G_QUIET_MODE, 21543d61a1f8SDaniel Machon sd_lane_inst, SD_LANE_25G_QUIET_MODE_6G(0)); 21553d61a1f8SDaniel Machon 21562ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER_SET(pwdn), 21572ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER, 21582ff8a1eeSSteen Hegelund sd_inst, 21592ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04(0)); 21602ff8a1eeSSteen Hegelund } else { 21612ff8a1eeSSteen Hegelund /* 6G and 10G */ 21623d61a1f8SDaniel Machon sd_lane_inst = sdx5_inst_get(priv, TARGET_SD_LANE, macro->sidx); 21633d61a1f8SDaniel Machon 21643d61a1f8SDaniel Machon /* Take serdes out of reset */ 21653d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 21663d61a1f8SDaniel Machon SD_LANE_SD_LANE_CFG_EXT_CFG_RST, sd_lane_inst, 21673d61a1f8SDaniel Machon SD_LANE_SD_LANE_CFG(0)); 21683d61a1f8SDaniel Machon 21693d61a1f8SDaniel Machon /* Configure optimal settings for quiet mode */ 21703d61a1f8SDaniel Machon sdx5_inst_rmw(SD_LANE_QUIET_MODE_6G_QUIET_MODE_SET(SPX5_SERDES_QUIET_MODE_VAL), 21713d61a1f8SDaniel Machon SD_LANE_QUIET_MODE_6G_QUIET_MODE, sd_lane_inst, 21723d61a1f8SDaniel Machon SD_LANE_QUIET_MODE_6G(0)); 21733d61a1f8SDaniel Machon 21742ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_PD_DRIVER_SET(pwdn), 21752ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_PD_DRIVER, 21762ff8a1eeSSteen Hegelund sd_inst, 21772ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06(0)); 21782ff8a1eeSSteen Hegelund } 21792ff8a1eeSSteen Hegelund return 0; 21802ff8a1eeSSteen Hegelund } 21812ff8a1eeSSteen Hegelund 21822ff8a1eeSSteen Hegelund static int sparx5_serdes_clock_config(struct sparx5_serdes_macro *macro) 21832ff8a1eeSSteen Hegelund { 21842ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 21852ff8a1eeSSteen Hegelund 21862ff8a1eeSSteen Hegelund if (macro->serdesmode == SPX5_SD_MODE_100FX) { 21872ff8a1eeSSteen Hegelund u32 freq = priv->coreclock == 250000000 ? 2 : 21882ff8a1eeSSteen Hegelund priv->coreclock == 500000000 ? 1 : 0; 21892ff8a1eeSSteen Hegelund 21902ff8a1eeSSteen Hegelund sdx5_rmw(SD_LANE_MISC_CORE_CLK_FREQ_SET(freq), 21912ff8a1eeSSteen Hegelund SD_LANE_MISC_CORE_CLK_FREQ, 21922ff8a1eeSSteen Hegelund priv, 21932ff8a1eeSSteen Hegelund SD_LANE_MISC(macro->sidx)); 21942ff8a1eeSSteen Hegelund } 21952ff8a1eeSSteen Hegelund return 0; 21962ff8a1eeSSteen Hegelund } 21972ff8a1eeSSteen Hegelund 21982ff8a1eeSSteen Hegelund static int sparx5_serdes_get_serdesmode(phy_interface_t portmode, int speed) 21992ff8a1eeSSteen Hegelund { 22002ff8a1eeSSteen Hegelund switch (portmode) { 22012ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 22022ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 22032ff8a1eeSSteen Hegelund if (speed == SPEED_2500) 22042ff8a1eeSSteen Hegelund return SPX5_SD_MODE_2G5; 22052ff8a1eeSSteen Hegelund if (speed == SPEED_100) 22062ff8a1eeSSteen Hegelund return SPX5_SD_MODE_100FX; 22072ff8a1eeSSteen Hegelund return SPX5_SD_MODE_1000BASEX; 22082ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 22092ff8a1eeSSteen Hegelund /* The same Serdes mode is used for both SGMII and 1000BaseX */ 22102ff8a1eeSSteen Hegelund return SPX5_SD_MODE_1000BASEX; 22112ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 22122ff8a1eeSSteen Hegelund return SPX5_SD_MODE_QSGMII; 22132ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 22142ff8a1eeSSteen Hegelund return SPX5_SD_MODE_SFI; 22152ff8a1eeSSteen Hegelund default: 22162ff8a1eeSSteen Hegelund return -EINVAL; 22172ff8a1eeSSteen Hegelund } 22182ff8a1eeSSteen Hegelund } 22192ff8a1eeSSteen Hegelund 22202ff8a1eeSSteen Hegelund static int sparx5_serdes_config(struct sparx5_serdes_macro *macro) 22212ff8a1eeSSteen Hegelund { 22222ff8a1eeSSteen Hegelund struct device *dev = macro->priv->dev; 22232ff8a1eeSSteen Hegelund int serdesmode; 22242ff8a1eeSSteen Hegelund int err; 22252ff8a1eeSSteen Hegelund 22262ff8a1eeSSteen Hegelund serdesmode = sparx5_serdes_get_serdesmode(macro->portmode, macro->speed); 22272ff8a1eeSSteen Hegelund if (serdesmode < 0) { 22282ff8a1eeSSteen Hegelund dev_err(dev, "SerDes %u, interface not supported: %s\n", 22292ff8a1eeSSteen Hegelund macro->sidx, 22302ff8a1eeSSteen Hegelund phy_modes(macro->portmode)); 22312ff8a1eeSSteen Hegelund return serdesmode; 22322ff8a1eeSSteen Hegelund } 22332ff8a1eeSSteen Hegelund macro->serdesmode = serdesmode; 22342ff8a1eeSSteen Hegelund 22352ff8a1eeSSteen Hegelund sparx5_serdes_clock_config(macro); 22362ff8a1eeSSteen Hegelund 22372ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) 22382ff8a1eeSSteen Hegelund err = sparx5_sd25g28_config(macro, false); 22392ff8a1eeSSteen Hegelund else 22402ff8a1eeSSteen Hegelund err = sparx5_sd10g28_config(macro, false); 22412ff8a1eeSSteen Hegelund if (err) { 22422ff8a1eeSSteen Hegelund dev_err(dev, "SerDes %u, config error: %d\n", 22432ff8a1eeSSteen Hegelund macro->sidx, err); 22442ff8a1eeSSteen Hegelund } 22452ff8a1eeSSteen Hegelund return err; 22462ff8a1eeSSteen Hegelund } 22472ff8a1eeSSteen Hegelund 22482ff8a1eeSSteen Hegelund static int sparx5_serdes_power_on(struct phy *phy) 22492ff8a1eeSSteen Hegelund { 22502ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22512ff8a1eeSSteen Hegelund 22522ff8a1eeSSteen Hegelund return sparx5_serdes_power_save(macro, false); 22532ff8a1eeSSteen Hegelund } 22542ff8a1eeSSteen Hegelund 22552ff8a1eeSSteen Hegelund static int sparx5_serdes_power_off(struct phy *phy) 22562ff8a1eeSSteen Hegelund { 22572ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22582ff8a1eeSSteen Hegelund 22592ff8a1eeSSteen Hegelund return sparx5_serdes_power_save(macro, true); 22602ff8a1eeSSteen Hegelund } 22612ff8a1eeSSteen Hegelund 22622ff8a1eeSSteen Hegelund static int sparx5_serdes_set_mode(struct phy *phy, enum phy_mode mode, int submode) 22632ff8a1eeSSteen Hegelund { 22642ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro; 22652ff8a1eeSSteen Hegelund 22662ff8a1eeSSteen Hegelund if (mode != PHY_MODE_ETHERNET) 22672ff8a1eeSSteen Hegelund return -EINVAL; 22682ff8a1eeSSteen Hegelund 22692ff8a1eeSSteen Hegelund switch (submode) { 22702ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 22712ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 22722ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 22732ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 22742ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 22752ff8a1eeSSteen Hegelund macro = phy_get_drvdata(phy); 22762ff8a1eeSSteen Hegelund macro->portmode = submode; 22772ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 22782ff8a1eeSSteen Hegelund return 0; 22792ff8a1eeSSteen Hegelund default: 22802ff8a1eeSSteen Hegelund return -EINVAL; 22812ff8a1eeSSteen Hegelund } 22822ff8a1eeSSteen Hegelund } 22832ff8a1eeSSteen Hegelund 22842ff8a1eeSSteen Hegelund static int sparx5_serdes_set_media(struct phy *phy, enum phy_media media) 22852ff8a1eeSSteen Hegelund { 22862ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22872ff8a1eeSSteen Hegelund 22882ff8a1eeSSteen Hegelund if (media != macro->media) { 22892ff8a1eeSSteen Hegelund macro->media = media; 22902ff8a1eeSSteen Hegelund if (macro->serdesmode != SPX5_SD_MODE_NONE) 22912ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 22922ff8a1eeSSteen Hegelund } 22932ff8a1eeSSteen Hegelund return 0; 22942ff8a1eeSSteen Hegelund } 22952ff8a1eeSSteen Hegelund 22962ff8a1eeSSteen Hegelund static int sparx5_serdes_set_speed(struct phy *phy, int speed) 22972ff8a1eeSSteen Hegelund { 22982ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22992ff8a1eeSSteen Hegelund 23002ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_10G_START && speed > SPEED_5000) 23012ff8a1eeSSteen Hegelund return -EINVAL; 23022ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_25G_START && speed > SPEED_10000) 23032ff8a1eeSSteen Hegelund return -EINVAL; 23042ff8a1eeSSteen Hegelund if (speed != macro->speed) { 23052ff8a1eeSSteen Hegelund macro->speed = speed; 23062ff8a1eeSSteen Hegelund if (macro->serdesmode != SPX5_SD_MODE_NONE) 23072ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 23082ff8a1eeSSteen Hegelund } 23092ff8a1eeSSteen Hegelund return 0; 23102ff8a1eeSSteen Hegelund } 23112ff8a1eeSSteen Hegelund 23122ff8a1eeSSteen Hegelund static int sparx5_serdes_reset(struct phy *phy) 23132ff8a1eeSSteen Hegelund { 23142ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 23152ff8a1eeSSteen Hegelund int err; 23162ff8a1eeSSteen Hegelund 23172ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) 23182ff8a1eeSSteen Hegelund err = sparx5_sd25g28_config(macro, true); 23192ff8a1eeSSteen Hegelund else 23202ff8a1eeSSteen Hegelund err = sparx5_sd10g28_config(macro, true); 23212ff8a1eeSSteen Hegelund if (err) { 23222ff8a1eeSSteen Hegelund dev_err(&phy->dev, "SerDes %u, reset error: %d\n", 23232ff8a1eeSSteen Hegelund macro->sidx, err); 23242ff8a1eeSSteen Hegelund } 23252ff8a1eeSSteen Hegelund return err; 23262ff8a1eeSSteen Hegelund } 23272ff8a1eeSSteen Hegelund 23282ff8a1eeSSteen Hegelund static int sparx5_serdes_validate(struct phy *phy, enum phy_mode mode, 23292ff8a1eeSSteen Hegelund int submode, 23302ff8a1eeSSteen Hegelund union phy_configure_opts *opts) 23312ff8a1eeSSteen Hegelund { 23322ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 23332ff8a1eeSSteen Hegelund 23342ff8a1eeSSteen Hegelund if (mode != PHY_MODE_ETHERNET) 23352ff8a1eeSSteen Hegelund return -EINVAL; 23362ff8a1eeSSteen Hegelund 23372ff8a1eeSSteen Hegelund if (macro->speed == 0) 23382ff8a1eeSSteen Hegelund return -EINVAL; 23392ff8a1eeSSteen Hegelund 23402ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_10G_START && macro->speed > SPEED_5000) 23412ff8a1eeSSteen Hegelund return -EINVAL; 23422ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_25G_START && macro->speed > SPEED_10000) 23432ff8a1eeSSteen Hegelund return -EINVAL; 23442ff8a1eeSSteen Hegelund 23452ff8a1eeSSteen Hegelund switch (submode) { 23462ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 23472ff8a1eeSSteen Hegelund if (macro->speed != SPEED_100 && /* This is for 100BASE-FX */ 23482ff8a1eeSSteen Hegelund macro->speed != SPEED_1000) 23492ff8a1eeSSteen Hegelund return -EINVAL; 23502ff8a1eeSSteen Hegelund break; 23512ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 23522ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 23532ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 23542ff8a1eeSSteen Hegelund if (macro->speed >= SPEED_5000) 23552ff8a1eeSSteen Hegelund return -EINVAL; 23562ff8a1eeSSteen Hegelund break; 23572ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 23582ff8a1eeSSteen Hegelund if (macro->speed < SPEED_5000) 23592ff8a1eeSSteen Hegelund return -EINVAL; 23602ff8a1eeSSteen Hegelund break; 23612ff8a1eeSSteen Hegelund default: 23622ff8a1eeSSteen Hegelund return -EINVAL; 23632ff8a1eeSSteen Hegelund } 23642ff8a1eeSSteen Hegelund return 0; 23652ff8a1eeSSteen Hegelund } 23662ff8a1eeSSteen Hegelund 23672ff8a1eeSSteen Hegelund static const struct phy_ops sparx5_serdes_ops = { 23682ff8a1eeSSteen Hegelund .power_on = sparx5_serdes_power_on, 23692ff8a1eeSSteen Hegelund .power_off = sparx5_serdes_power_off, 23702ff8a1eeSSteen Hegelund .set_mode = sparx5_serdes_set_mode, 23712ff8a1eeSSteen Hegelund .set_media = sparx5_serdes_set_media, 23722ff8a1eeSSteen Hegelund .set_speed = sparx5_serdes_set_speed, 23732ff8a1eeSSteen Hegelund .reset = sparx5_serdes_reset, 23742ff8a1eeSSteen Hegelund .validate = sparx5_serdes_validate, 23752ff8a1eeSSteen Hegelund .owner = THIS_MODULE, 23762ff8a1eeSSteen Hegelund }; 23772ff8a1eeSSteen Hegelund 23782ff8a1eeSSteen Hegelund static int sparx5_phy_create(struct sparx5_serdes_private *priv, 23792ff8a1eeSSteen Hegelund int idx, struct phy **phy) 23802ff8a1eeSSteen Hegelund { 23812ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro; 23822ff8a1eeSSteen Hegelund 23832ff8a1eeSSteen Hegelund *phy = devm_phy_create(priv->dev, NULL, &sparx5_serdes_ops); 23842ff8a1eeSSteen Hegelund if (IS_ERR(*phy)) 23852ff8a1eeSSteen Hegelund return PTR_ERR(*phy); 23862ff8a1eeSSteen Hegelund 23872ff8a1eeSSteen Hegelund macro = devm_kzalloc(priv->dev, sizeof(*macro), GFP_KERNEL); 23882ff8a1eeSSteen Hegelund if (!macro) 23892ff8a1eeSSteen Hegelund return -ENOMEM; 23902ff8a1eeSSteen Hegelund 23912ff8a1eeSSteen Hegelund macro->sidx = idx; 23922ff8a1eeSSteen Hegelund macro->priv = priv; 23932ff8a1eeSSteen Hegelund macro->speed = SPEED_UNKNOWN; 23942ff8a1eeSSteen Hegelund if (idx < SPX5_SERDES_10G_START) { 23952ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_6G; 23962ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx; 23972ff8a1eeSSteen Hegelund } else if (idx < SPX5_SERDES_25G_START) { 23982ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_10G; 23992ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx - SPX5_SERDES_10G_START; 24002ff8a1eeSSteen Hegelund } else { 24012ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_25G; 24022ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx - SPX5_SERDES_25G_START; 24032ff8a1eeSSteen Hegelund } 24042ff8a1eeSSteen Hegelund 24052ff8a1eeSSteen Hegelund phy_set_drvdata(*phy, macro); 24062ff8a1eeSSteen Hegelund 24073d61a1f8SDaniel Machon /* Power off serdes by default */ 24083d61a1f8SDaniel Machon sparx5_serdes_power_off(*phy); 24093d61a1f8SDaniel Machon 24102ff8a1eeSSteen Hegelund return 0; 24112ff8a1eeSSteen Hegelund } 24122ff8a1eeSSteen Hegelund 24132ff8a1eeSSteen Hegelund static struct sparx5_serdes_io_resource sparx5_serdes_iomap[] = { 24142ff8a1eeSSteen Hegelund { TARGET_SD_CMU, 0x0 }, /* 0x610808000: sd_cmu_0 */ 24152ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 1, 0x8000 }, /* 0x610810000: sd_cmu_1 */ 24162ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 2, 0x10000 }, /* 0x610818000: sd_cmu_2 */ 24172ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 3, 0x18000 }, /* 0x610820000: sd_cmu_3 */ 24182ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 4, 0x20000 }, /* 0x610828000: sd_cmu_4 */ 24192ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 5, 0x28000 }, /* 0x610830000: sd_cmu_5 */ 24202ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 6, 0x30000 }, /* 0x610838000: sd_cmu_6 */ 24212ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 7, 0x38000 }, /* 0x610840000: sd_cmu_7 */ 24222ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 8, 0x40000 }, /* 0x610848000: sd_cmu_8 */ 24232ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG, 0x48000 }, /* 0x610850000: sd_cmu_cfg_0 */ 24242ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 1, 0x50000 }, /* 0x610858000: sd_cmu_cfg_1 */ 24252ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 2, 0x58000 }, /* 0x610860000: sd_cmu_cfg_2 */ 24262ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 3, 0x60000 }, /* 0x610868000: sd_cmu_cfg_3 */ 24272ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 4, 0x68000 }, /* 0x610870000: sd_cmu_cfg_4 */ 24282ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 5, 0x70000 }, /* 0x610878000: sd_cmu_cfg_5 */ 24292ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 6, 0x78000 }, /* 0x610880000: sd_cmu_cfg_6 */ 24302ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 7, 0x80000 }, /* 0x610888000: sd_cmu_cfg_7 */ 24312ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 8, 0x88000 }, /* 0x610890000: sd_cmu_cfg_8 */ 24322ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE, 0x90000 }, /* 0x610898000: sd6g_lane_0 */ 24332ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 1, 0x98000 }, /* 0x6108a0000: sd6g_lane_1 */ 24342ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 2, 0xa0000 }, /* 0x6108a8000: sd6g_lane_2 */ 24352ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 3, 0xa8000 }, /* 0x6108b0000: sd6g_lane_3 */ 24362ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 4, 0xb0000 }, /* 0x6108b8000: sd6g_lane_4 */ 24372ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 5, 0xb8000 }, /* 0x6108c0000: sd6g_lane_5 */ 24382ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 6, 0xc0000 }, /* 0x6108c8000: sd6g_lane_6 */ 24392ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 7, 0xc8000 }, /* 0x6108d0000: sd6g_lane_7 */ 24402ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 8, 0xd0000 }, /* 0x6108d8000: sd6g_lane_8 */ 24412ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 9, 0xd8000 }, /* 0x6108e0000: sd6g_lane_9 */ 24422ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 10, 0xe0000 }, /* 0x6108e8000: sd6g_lane_10 */ 24432ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 11, 0xe8000 }, /* 0x6108f0000: sd6g_lane_11 */ 24442ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 12, 0xf0000 }, /* 0x6108f8000: sd6g_lane_12 */ 24452ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE, 0xf8000 }, /* 0x610900000: sd10g_lane_0 */ 24462ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 1, 0x100000 }, /* 0x610908000: sd10g_lane_1 */ 24472ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 2, 0x108000 }, /* 0x610910000: sd10g_lane_2 */ 24482ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 3, 0x110000 }, /* 0x610918000: sd10g_lane_3 */ 24492ff8a1eeSSteen Hegelund { TARGET_SD_LANE, 0x1a0000 }, /* 0x6109a8000: sd_lane_0 */ 24502ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 1, 0x1a8000 }, /* 0x6109b0000: sd_lane_1 */ 24512ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 2, 0x1b0000 }, /* 0x6109b8000: sd_lane_2 */ 24522ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 3, 0x1b8000 }, /* 0x6109c0000: sd_lane_3 */ 24532ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 4, 0x1c0000 }, /* 0x6109c8000: sd_lane_4 */ 24542ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 5, 0x1c8000 }, /* 0x6109d0000: sd_lane_5 */ 24552ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 6, 0x1d0000 }, /* 0x6109d8000: sd_lane_6 */ 24562ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 7, 0x1d8000 }, /* 0x6109e0000: sd_lane_7 */ 24572ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 8, 0x1e0000 }, /* 0x6109e8000: sd_lane_8 */ 24582ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 9, 0x1e8000 }, /* 0x6109f0000: sd_lane_9 */ 24592ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 10, 0x1f0000 }, /* 0x6109f8000: sd_lane_10 */ 24602ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 11, 0x1f8000 }, /* 0x610a00000: sd_lane_11 */ 24612ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 12, 0x200000 }, /* 0x610a08000: sd_lane_12 */ 24622ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 13, 0x208000 }, /* 0x610a10000: sd_lane_13 */ 24632ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 14, 0x210000 }, /* 0x610a18000: sd_lane_14 */ 24642ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 15, 0x218000 }, /* 0x610a20000: sd_lane_15 */ 24652ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 16, 0x220000 }, /* 0x610a28000: sd_lane_16 */ 24662ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 9, 0x400000 }, /* 0x610c08000: sd_cmu_9 */ 24672ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 10, 0x408000 }, /* 0x610c10000: sd_cmu_10 */ 24682ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 11, 0x410000 }, /* 0x610c18000: sd_cmu_11 */ 24692ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 12, 0x418000 }, /* 0x610c20000: sd_cmu_12 */ 24702ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 13, 0x420000 }, /* 0x610c28000: sd_cmu_13 */ 24712ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 9, 0x428000 }, /* 0x610c30000: sd_cmu_cfg_9 */ 24722ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 10, 0x430000 }, /* 0x610c38000: sd_cmu_cfg_10 */ 24732ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 11, 0x438000 }, /* 0x610c40000: sd_cmu_cfg_11 */ 24742ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 12, 0x440000 }, /* 0x610c48000: sd_cmu_cfg_12 */ 24752ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 13, 0x448000 }, /* 0x610c50000: sd_cmu_cfg_13 */ 24762ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 4, 0x450000 }, /* 0x610c58000: sd10g_lane_4 */ 24772ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 5, 0x458000 }, /* 0x610c60000: sd10g_lane_5 */ 24782ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 6, 0x460000 }, /* 0x610c68000: sd10g_lane_6 */ 24792ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 7, 0x468000 }, /* 0x610c70000: sd10g_lane_7 */ 24802ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 8, 0x470000 }, /* 0x610c78000: sd10g_lane_8 */ 24812ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 9, 0x478000 }, /* 0x610c80000: sd10g_lane_9 */ 24822ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 10, 0x480000 }, /* 0x610c88000: sd10g_lane_10 */ 24832ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 11, 0x488000 }, /* 0x610c90000: sd10g_lane_11 */ 24842ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE, 0x490000 }, /* 0x610c98000: sd25g_lane_0 */ 24852ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 1, 0x498000 }, /* 0x610ca0000: sd25g_lane_1 */ 24862ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 2, 0x4a0000 }, /* 0x610ca8000: sd25g_lane_2 */ 24872ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 3, 0x4a8000 }, /* 0x610cb0000: sd25g_lane_3 */ 24882ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 4, 0x4b0000 }, /* 0x610cb8000: sd25g_lane_4 */ 24892ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 5, 0x4b8000 }, /* 0x610cc0000: sd25g_lane_5 */ 24902ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 6, 0x4c0000 }, /* 0x610cc8000: sd25g_lane_6 */ 24912ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 7, 0x4c8000 }, /* 0x610cd0000: sd25g_lane_7 */ 24922ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 17, 0x550000 }, /* 0x610d58000: sd_lane_17 */ 24932ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 18, 0x558000 }, /* 0x610d60000: sd_lane_18 */ 24942ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 19, 0x560000 }, /* 0x610d68000: sd_lane_19 */ 24952ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 20, 0x568000 }, /* 0x610d70000: sd_lane_20 */ 24962ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 21, 0x570000 }, /* 0x610d78000: sd_lane_21 */ 24972ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 22, 0x578000 }, /* 0x610d80000: sd_lane_22 */ 24982ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 23, 0x580000 }, /* 0x610d88000: sd_lane_23 */ 24992ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 24, 0x588000 }, /* 0x610d90000: sd_lane_24 */ 25002ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G, 0x590000 }, /* 0x610d98000: sd_lane_25g_25 */ 25012ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 1, 0x598000 }, /* 0x610da0000: sd_lane_25g_26 */ 25022ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 2, 0x5a0000 }, /* 0x610da8000: sd_lane_25g_27 */ 25032ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 3, 0x5a8000 }, /* 0x610db0000: sd_lane_25g_28 */ 25042ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 4, 0x5b0000 }, /* 0x610db8000: sd_lane_25g_29 */ 25052ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 5, 0x5b8000 }, /* 0x610dc0000: sd_lane_25g_30 */ 25062ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 6, 0x5c0000 }, /* 0x610dc8000: sd_lane_25g_31 */ 25072ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 7, 0x5c8000 }, /* 0x610dd0000: sd_lane_25g_32 */ 25082ff8a1eeSSteen Hegelund }; 25092ff8a1eeSSteen Hegelund 25102ff8a1eeSSteen Hegelund /* Client lookup function, uses serdes index */ 25112ff8a1eeSSteen Hegelund static struct phy *sparx5_serdes_xlate(struct device *dev, 25122ff8a1eeSSteen Hegelund struct of_phandle_args *args) 25132ff8a1eeSSteen Hegelund { 25142ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = dev_get_drvdata(dev); 25152ff8a1eeSSteen Hegelund int idx; 25162ff8a1eeSSteen Hegelund unsigned int sidx; 25172ff8a1eeSSteen Hegelund 25182ff8a1eeSSteen Hegelund if (args->args_count != 1) 25192ff8a1eeSSteen Hegelund return ERR_PTR(-EINVAL); 25202ff8a1eeSSteen Hegelund 25212ff8a1eeSSteen Hegelund sidx = args->args[0]; 25222ff8a1eeSSteen Hegelund 25232ff8a1eeSSteen Hegelund /* Check validity: ERR_PTR(-ENODEV) if not valid */ 25242ff8a1eeSSteen Hegelund for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 25252ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = 25262ff8a1eeSSteen Hegelund phy_get_drvdata(priv->phys[idx]); 25272ff8a1eeSSteen Hegelund 25282ff8a1eeSSteen Hegelund if (sidx != macro->sidx) 25292ff8a1eeSSteen Hegelund continue; 25302ff8a1eeSSteen Hegelund 25312ff8a1eeSSteen Hegelund return priv->phys[idx]; 25322ff8a1eeSSteen Hegelund } 25332ff8a1eeSSteen Hegelund return ERR_PTR(-ENODEV); 25342ff8a1eeSSteen Hegelund } 25352ff8a1eeSSteen Hegelund 25362ff8a1eeSSteen Hegelund static int sparx5_serdes_probe(struct platform_device *pdev) 25372ff8a1eeSSteen Hegelund { 25382ff8a1eeSSteen Hegelund struct device_node *np = pdev->dev.of_node; 25392ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv; 25402ff8a1eeSSteen Hegelund struct phy_provider *provider; 25412ff8a1eeSSteen Hegelund struct resource *iores; 25422ff8a1eeSSteen Hegelund void __iomem *iomem; 25432ff8a1eeSSteen Hegelund unsigned long clock; 25442ff8a1eeSSteen Hegelund struct clk *clk; 25452ff8a1eeSSteen Hegelund int idx; 25462ff8a1eeSSteen Hegelund int err; 25472ff8a1eeSSteen Hegelund 25482ff8a1eeSSteen Hegelund if (!np && !pdev->dev.platform_data) 25492ff8a1eeSSteen Hegelund return -ENODEV; 25502ff8a1eeSSteen Hegelund 25512ff8a1eeSSteen Hegelund priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 25522ff8a1eeSSteen Hegelund if (!priv) 25532ff8a1eeSSteen Hegelund return -ENOMEM; 25542ff8a1eeSSteen Hegelund 25552ff8a1eeSSteen Hegelund platform_set_drvdata(pdev, priv); 25562ff8a1eeSSteen Hegelund priv->dev = &pdev->dev; 25572ff8a1eeSSteen Hegelund 25582ff8a1eeSSteen Hegelund /* Get coreclock */ 25592ff8a1eeSSteen Hegelund clk = devm_clk_get(priv->dev, NULL); 25602ff8a1eeSSteen Hegelund if (IS_ERR(clk)) { 25612ff8a1eeSSteen Hegelund dev_err(priv->dev, "Failed to get coreclock\n"); 25622ff8a1eeSSteen Hegelund return PTR_ERR(clk); 25632ff8a1eeSSteen Hegelund } 25642ff8a1eeSSteen Hegelund clock = clk_get_rate(clk); 25652ff8a1eeSSteen Hegelund if (clock == 0) { 25662ff8a1eeSSteen Hegelund dev_err(priv->dev, "Invalid coreclock %lu\n", clock); 25672ff8a1eeSSteen Hegelund return -EINVAL; 25682ff8a1eeSSteen Hegelund } 25692ff8a1eeSSteen Hegelund priv->coreclock = clock; 25702ff8a1eeSSteen Hegelund 25712ff8a1eeSSteen Hegelund iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2572d1ce245fSYang Yingliang if (!iores) { 2573d1ce245fSYang Yingliang dev_err(priv->dev, "Invalid resource\n"); 2574d1ce245fSYang Yingliang return -EINVAL; 2575d1ce245fSYang Yingliang } 2576cbc336c0Skernel test robot iomem = devm_ioremap(priv->dev, iores->start, resource_size(iores)); 2577b4dc97abSYang Yingliang if (!iomem) { 25782ff8a1eeSSteen Hegelund dev_err(priv->dev, "Unable to get serdes registers: %s\n", 25792ff8a1eeSSteen Hegelund iores->name); 2580b4dc97abSYang Yingliang return -ENOMEM; 25812ff8a1eeSSteen Hegelund } 25822ff8a1eeSSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(sparx5_serdes_iomap); idx++) { 25832ff8a1eeSSteen Hegelund struct sparx5_serdes_io_resource *iomap = &sparx5_serdes_iomap[idx]; 25842ff8a1eeSSteen Hegelund 25852ff8a1eeSSteen Hegelund priv->regs[iomap->id] = iomem + iomap->offset; 25862ff8a1eeSSteen Hegelund } 25872ff8a1eeSSteen Hegelund for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 25882ff8a1eeSSteen Hegelund err = sparx5_phy_create(priv, idx, &priv->phys[idx]); 25892ff8a1eeSSteen Hegelund if (err) 25902ff8a1eeSSteen Hegelund return err; 25912ff8a1eeSSteen Hegelund } 25922ff8a1eeSSteen Hegelund 2593044f3a1aSDaniel Machon /* Power down all CMUs by default */ 2594044f3a1aSDaniel Machon sparx5_serdes_cmu_power_off(priv); 2595044f3a1aSDaniel Machon 25962ff8a1eeSSteen Hegelund provider = devm_of_phy_provider_register(priv->dev, sparx5_serdes_xlate); 25972ff8a1eeSSteen Hegelund 25982ff8a1eeSSteen Hegelund return PTR_ERR_OR_ZERO(provider); 25992ff8a1eeSSteen Hegelund } 26002ff8a1eeSSteen Hegelund 26012ff8a1eeSSteen Hegelund static const struct of_device_id sparx5_serdes_match[] = { 26022ff8a1eeSSteen Hegelund { .compatible = "microchip,sparx5-serdes" }, 26032ff8a1eeSSteen Hegelund { } 26042ff8a1eeSSteen Hegelund }; 26052ff8a1eeSSteen Hegelund MODULE_DEVICE_TABLE(of, sparx5_serdes_match); 26062ff8a1eeSSteen Hegelund 26072ff8a1eeSSteen Hegelund static struct platform_driver sparx5_serdes_driver = { 26082ff8a1eeSSteen Hegelund .probe = sparx5_serdes_probe, 26092ff8a1eeSSteen Hegelund .driver = { 26102ff8a1eeSSteen Hegelund .name = "sparx5-serdes", 26112ff8a1eeSSteen Hegelund .of_match_table = sparx5_serdes_match, 26122ff8a1eeSSteen Hegelund }, 26132ff8a1eeSSteen Hegelund }; 26142ff8a1eeSSteen Hegelund 26152ff8a1eeSSteen Hegelund module_platform_driver(sparx5_serdes_driver); 26162ff8a1eeSSteen Hegelund 26172ff8a1eeSSteen Hegelund MODULE_DESCRIPTION("Microchip Sparx5 switch serdes driver"); 26182ff8a1eeSSteen Hegelund MODULE_AUTHOR("Steen Hegelund <steen.hegelund@microchip.com>"); 26192ff8a1eeSSteen Hegelund MODULE_LICENSE("GPL v2"); 2620