12ff8a1eeSSteen Hegelund // SPDX-License-Identifier: GPL-2.0-or-later 22ff8a1eeSSteen Hegelund /* Microchip Sparx5 Switch SerDes driver 32ff8a1eeSSteen Hegelund * 42ff8a1eeSSteen Hegelund * Copyright (c) 2020 Microchip Technology Inc. and its subsidiaries. 52ff8a1eeSSteen Hegelund * 62ff8a1eeSSteen Hegelund * The Sparx5 Chip Register Model can be browsed at this location: 72ff8a1eeSSteen Hegelund * https://github.com/microchip-ung/sparx-5_reginfo 82ff8a1eeSSteen Hegelund * and the datasheet is available here: 92ff8a1eeSSteen Hegelund * https://ww1.microchip.com/downloads/en/DeviceDoc/SparX-5_Family_L2L3_Enterprise_10G_Ethernet_Switches_Datasheet_00003822B.pdf 102ff8a1eeSSteen Hegelund */ 112ff8a1eeSSteen Hegelund #include <linux/printk.h> 122ff8a1eeSSteen Hegelund #include <linux/module.h> 132ff8a1eeSSteen Hegelund #include <linux/device.h> 142ff8a1eeSSteen Hegelund #include <linux/netdevice.h> 152ff8a1eeSSteen Hegelund #include <linux/platform_device.h> 162ff8a1eeSSteen Hegelund #include <linux/of.h> 172ff8a1eeSSteen Hegelund #include <linux/io.h> 182ff8a1eeSSteen Hegelund #include <linux/clk.h> 192ff8a1eeSSteen Hegelund #include <linux/phy.h> 202ff8a1eeSSteen Hegelund #include <linux/phy/phy.h> 212ff8a1eeSSteen Hegelund 222ff8a1eeSSteen Hegelund #include "sparx5_serdes.h" 232ff8a1eeSSteen Hegelund 242ff8a1eeSSteen Hegelund #define SPX5_CMU_MAX 14 252ff8a1eeSSteen Hegelund 262ff8a1eeSSteen Hegelund #define SPX5_SERDES_10G_START 13 272ff8a1eeSSteen Hegelund #define SPX5_SERDES_25G_START 25 282ff8a1eeSSteen Hegelund 292ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode { 302ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_MAIN = 0, 312ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_AUX1 = 1, 322ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_AUX2 = 3, 332ff8a1eeSSteen Hegelund SPX5_SD10G28_CMU_NONE = 4, 342ff8a1eeSSteen Hegelund }; 352ff8a1eeSSteen Hegelund 362ff8a1eeSSteen Hegelund enum sparx5_sd25g28_mode_preset_type { 372ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_25000, 382ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_10000, 392ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_5000, 402ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_SD_2G5, 412ff8a1eeSSteen Hegelund SPX5_SD25G28_MODE_PRESET_1000BASEX, 422ff8a1eeSSteen Hegelund }; 432ff8a1eeSSteen Hegelund 442ff8a1eeSSteen Hegelund enum sparx5_sd10g28_mode_preset_type { 452ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_10000, 462ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SFI_5000_6G, 472ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SFI_5000_10G, 482ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_QSGMII, 492ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_SD_2G5, 502ff8a1eeSSteen Hegelund SPX5_SD10G28_MODE_PRESET_1000BASEX, 512ff8a1eeSSteen Hegelund }; 522ff8a1eeSSteen Hegelund 532ff8a1eeSSteen Hegelund struct sparx5_serdes_io_resource { 542ff8a1eeSSteen Hegelund enum sparx5_serdes_target id; 552ff8a1eeSSteen Hegelund phys_addr_t offset; 562ff8a1eeSSteen Hegelund }; 572ff8a1eeSSteen Hegelund 582ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset { 592ff8a1eeSSteen Hegelund u8 bitwidth; 602ff8a1eeSSteen Hegelund u8 tx_pre_div; 612ff8a1eeSSteen Hegelund u8 fifo_ck_div; 622ff8a1eeSSteen Hegelund u8 pre_divsel; 632ff8a1eeSSteen Hegelund u8 vco_div_mode; 642ff8a1eeSSteen Hegelund u8 sel_div; 652ff8a1eeSSteen Hegelund u8 ck_bitwidth; 662ff8a1eeSSteen Hegelund u8 subrate; 672ff8a1eeSSteen Hegelund u8 com_txcal_en; 682ff8a1eeSSteen Hegelund u8 com_tx_reserve_msb; 692ff8a1eeSSteen Hegelund u8 com_tx_reserve_lsb; 702ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base; 712ff8a1eeSSteen Hegelund u8 tx_reserve_lsb; 722ff8a1eeSSteen Hegelund u8 tx_reserve_msb; 732ff8a1eeSSteen Hegelund u8 bw; 742ff8a1eeSSteen Hegelund u8 rxterm; 752ff8a1eeSSteen Hegelund u8 dfe_tap; 762ff8a1eeSSteen Hegelund u8 dfe_enable; 772ff8a1eeSSteen Hegelund bool txmargin; 782ff8a1eeSSteen Hegelund u8 cfg_ctle_rstn; 792ff8a1eeSSteen Hegelund u8 r_dfe_rstn; 802ff8a1eeSSteen Hegelund u8 cfg_pi_bw_3_0; 812ff8a1eeSSteen Hegelund u8 tx_tap_dly; 822ff8a1eeSSteen Hegelund u8 tx_tap_adv; 832ff8a1eeSSteen Hegelund }; 842ff8a1eeSSteen Hegelund 852ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset { 862ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 872ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_byp_4_0; 882ff8a1eeSSteen Hegelund u8 cfg_eq_r_force_3_0; 892ff8a1eeSSteen Hegelund u8 cfg_en_adv; 902ff8a1eeSSteen Hegelund u8 cfg_en_main; 912ff8a1eeSSteen Hegelund u8 cfg_en_dly; 922ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 932ff8a1eeSSteen Hegelund u8 cfg_tap_main; 942ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 952ff8a1eeSSteen Hegelund u8 cfg_alos_thr_2_0; 962ff8a1eeSSteen Hegelund }; 972ff8a1eeSSteen Hegelund 982ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args { 992ff8a1eeSSteen Hegelund u8 if_width; /* UDL if-width: 10/16/20/32/64 */ 1002ff8a1eeSSteen Hegelund bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 1012ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 1022ff8a1eeSSteen Hegelund bool no_pwrcycle:1; /* Omit initial power-cycle */ 1032ff8a1eeSSteen Hegelund bool txinvert:1; /* Enable inversion of output data */ 1042ff8a1eeSSteen Hegelund bool rxinvert:1; /* Enable inversion of input data */ 1052ff8a1eeSSteen Hegelund u16 txswing; /* Set output level */ 1062ff8a1eeSSteen Hegelund u8 rate; /* Rate of network interface */ 1072ff8a1eeSSteen Hegelund u8 pi_bw_gen1; 1082ff8a1eeSSteen Hegelund u8 duty_cycle; /* Set output level to half/full */ 1092ff8a1eeSSteen Hegelund bool mute:1; /* Mute Output Buffer */ 1102ff8a1eeSSteen Hegelund bool reg_rst:1; 1112ff8a1eeSSteen Hegelund u8 com_pll_reserve; 1122ff8a1eeSSteen Hegelund }; 1132ff8a1eeSSteen Hegelund 1142ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params { 1152ff8a1eeSSteen Hegelund u8 reg_rst; 1162ff8a1eeSSteen Hegelund u8 cfg_jc_byp; 1172ff8a1eeSSteen Hegelund u8 cfg_common_reserve_7_0; 1182ff8a1eeSSteen Hegelund u8 r_reg_manual; 1192ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_from_hwt; 1202ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_2_0; 1212ff8a1eeSSteen Hegelund u8 r_txfifo_ck_div_pmad_2_0; 1222ff8a1eeSSteen Hegelund u8 r_rxfifo_ck_div_pmad_2_0; 1232ff8a1eeSSteen Hegelund u8 cfg_pll_lol_set; 1242ff8a1eeSSteen Hegelund u8 cfg_vco_div_mode_1_0; 1252ff8a1eeSSteen Hegelund u8 cfg_pre_divsel_1_0; 1262ff8a1eeSSteen Hegelund u8 cfg_sel_div_3_0; 1272ff8a1eeSSteen Hegelund u8 cfg_vco_start_code_3_0; 1282ff8a1eeSSteen Hegelund u8 cfg_pma_tx_ck_bitwidth_2_0; 1292ff8a1eeSSteen Hegelund u8 cfg_tx_prediv_1_0; 1302ff8a1eeSSteen Hegelund u8 cfg_rxdiv_sel_2_0; 1312ff8a1eeSSteen Hegelund u8 cfg_tx_subrate_2_0; 1322ff8a1eeSSteen Hegelund u8 cfg_rx_subrate_2_0; 1332ff8a1eeSSteen Hegelund u8 r_multi_lane_mode; 1342ff8a1eeSSteen Hegelund u8 cfg_cdrck_en; 1352ff8a1eeSSteen Hegelund u8 cfg_dfeck_en; 1362ff8a1eeSSteen Hegelund u8 cfg_dfe_pd; 1372ff8a1eeSSteen Hegelund u8 cfg_dfedmx_pd; 1382ff8a1eeSSteen Hegelund u8 cfg_dfetap_en_5_1; 1392ff8a1eeSSteen Hegelund u8 cfg_dmux_pd; 1402ff8a1eeSSteen Hegelund u8 cfg_dmux_clk_pd; 1412ff8a1eeSSteen Hegelund u8 cfg_erramp_pd; 1422ff8a1eeSSteen Hegelund u8 cfg_pi_dfe_en; 1432ff8a1eeSSteen Hegelund u8 cfg_pi_en; 1442ff8a1eeSSteen Hegelund u8 cfg_pd_ctle; 1452ff8a1eeSSteen Hegelund u8 cfg_summer_en; 1462ff8a1eeSSteen Hegelund u8 cfg_pmad_ck_pd; 1472ff8a1eeSSteen Hegelund u8 cfg_pd_clk; 1482ff8a1eeSSteen Hegelund u8 cfg_pd_cml; 1492ff8a1eeSSteen Hegelund u8 cfg_pd_driver; 1502ff8a1eeSSteen Hegelund u8 cfg_rx_reg_pu; 1512ff8a1eeSSteen Hegelund u8 cfg_pd_rms_det; 1522ff8a1eeSSteen Hegelund u8 cfg_dcdr_pd; 1532ff8a1eeSSteen Hegelund u8 cfg_ecdr_pd; 1542ff8a1eeSSteen Hegelund u8 cfg_pd_sq; 1552ff8a1eeSSteen Hegelund u8 cfg_itx_ipdriver_base_2_0; 1562ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 1572ff8a1eeSSteen Hegelund u8 cfg_tap_main; 1582ff8a1eeSSteen Hegelund u8 cfg_en_main; 1592ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 1602ff8a1eeSSteen Hegelund u8 cfg_en_adv; 1612ff8a1eeSSteen Hegelund u8 cfg_en_dly; 1622ff8a1eeSSteen Hegelund u8 cfg_iscan_en; 1632ff8a1eeSSteen Hegelund u8 l1_pcs_en_fast_iscan; 1642ff8a1eeSSteen Hegelund u8 l0_cfg_bw_1_0; 1652ff8a1eeSSteen Hegelund u8 l0_cfg_txcal_en; 1662ff8a1eeSSteen Hegelund u8 cfg_en_dummy; 1672ff8a1eeSSteen Hegelund u8 cfg_pll_reserve_3_0; 1682ff8a1eeSSteen Hegelund u8 l0_cfg_tx_reserve_15_8; 1692ff8a1eeSSteen Hegelund u8 l0_cfg_tx_reserve_7_0; 1702ff8a1eeSSteen Hegelund u8 cfg_tx_reserve_15_8; 1712ff8a1eeSSteen Hegelund u8 cfg_tx_reserve_7_0; 1722ff8a1eeSSteen Hegelund u8 cfg_bw_1_0; 1732ff8a1eeSSteen Hegelund u8 cfg_txcal_man_en; 1742ff8a1eeSSteen Hegelund u8 cfg_phase_man_4_0; 1752ff8a1eeSSteen Hegelund u8 cfg_quad_man_1_0; 1762ff8a1eeSSteen Hegelund u8 cfg_txcal_shift_code_5_0; 1772ff8a1eeSSteen Hegelund u8 cfg_txcal_valid_sel_3_0; 1782ff8a1eeSSteen Hegelund u8 cfg_txcal_en; 1792ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_2_0; 1802ff8a1eeSSteen Hegelund u8 cfg_cdr_m_7_0; 1812ff8a1eeSSteen Hegelund u8 cfg_pi_bw_3_0; 1822ff8a1eeSSteen Hegelund u8 cfg_pi_steps_1_0; 1832ff8a1eeSSteen Hegelund u8 cfg_dis_2ndorder; 1842ff8a1eeSSteen Hegelund u8 cfg_ctle_rstn; 1852ff8a1eeSSteen Hegelund u8 r_dfe_rstn; 1862ff8a1eeSSteen Hegelund u8 cfg_alos_thr_2_0; 1872ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base_1_0; 1882ff8a1eeSSteen Hegelund u8 cfg_rx_reserve_7_0; 1892ff8a1eeSSteen Hegelund u8 cfg_rx_reserve_15_8; 1902ff8a1eeSSteen Hegelund u8 cfg_rxterm_2_0; 1912ff8a1eeSSteen Hegelund u8 cfg_fom_selm; 1922ff8a1eeSSteen Hegelund u8 cfg_rx_sp_ctle_1_0; 1932ff8a1eeSSteen Hegelund u8 cfg_isel_ctle_1_0; 1942ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_byp_4_0; 1952ff8a1eeSSteen Hegelund u8 cfg_vga_byp; 1962ff8a1eeSSteen Hegelund u8 cfg_agc_adpt_byp; 1972ff8a1eeSSteen Hegelund u8 cfg_eqr_byp; 1982ff8a1eeSSteen Hegelund u8 cfg_eqr_force_3_0; 1992ff8a1eeSSteen Hegelund u8 cfg_eqc_force_3_0; 2002ff8a1eeSSteen Hegelund u8 cfg_sum_setcm_en; 2012ff8a1eeSSteen Hegelund u8 cfg_init_pos_iscan_6_0; 2022ff8a1eeSSteen Hegelund u8 cfg_init_pos_ipi_6_0; 2032ff8a1eeSSteen Hegelund u8 cfg_dfedig_m_2_0; 2042ff8a1eeSSteen Hegelund u8 cfg_en_dfedig; 2052ff8a1eeSSteen Hegelund u8 cfg_pi_DFE_en; 2062ff8a1eeSSteen Hegelund u8 cfg_tx2rx_lp_en; 2072ff8a1eeSSteen Hegelund u8 cfg_txlb_en; 2082ff8a1eeSSteen Hegelund u8 cfg_rx2tx_lp_en; 2092ff8a1eeSSteen Hegelund u8 cfg_rxlb_en; 2102ff8a1eeSSteen Hegelund u8 r_tx_pol_inv; 2112ff8a1eeSSteen Hegelund u8 r_rx_pol_inv; 2122ff8a1eeSSteen Hegelund }; 2132ff8a1eeSSteen Hegelund 2142ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset { 2152ff8a1eeSSteen Hegelund u8 cfg_en_adv; 2162ff8a1eeSSteen Hegelund u8 cfg_en_main; 2172ff8a1eeSSteen Hegelund u8 cfg_en_dly; 2182ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 2192ff8a1eeSSteen Hegelund u8 cfg_tap_main; 2202ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 2212ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_3_0; 2222ff8a1eeSSteen Hegelund u8 cfg_vga_cp_2_0; 2232ff8a1eeSSteen Hegelund u8 cfg_eq_res_3_0; 2242ff8a1eeSSteen Hegelund u8 cfg_eq_r_byp; 2252ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 2262ff8a1eeSSteen Hegelund u8 cfg_alos_thr_3_0; 2272ff8a1eeSSteen Hegelund }; 2282ff8a1eeSSteen Hegelund 2292ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset { 2302ff8a1eeSSteen Hegelund u8 bwidth; /* interface width: 10/16/20/32/64 */ 2312ff8a1eeSSteen Hegelund enum sparx5_10g28cmu_mode cmu_sel; /* Device/Mode serdes uses */ 2322ff8a1eeSSteen Hegelund u8 rate; /* Rate of network interface */ 2332ff8a1eeSSteen Hegelund u8 dfe_tap; 2342ff8a1eeSSteen Hegelund u8 dfe_enable; 2352ff8a1eeSSteen Hegelund u8 pi_bw_gen1; 2362ff8a1eeSSteen Hegelund u8 duty_cycle; /* Set output level to half/full */ 2372ff8a1eeSSteen Hegelund }; 2382ff8a1eeSSteen Hegelund 2392ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args { 2402ff8a1eeSSteen Hegelund bool skip_cmu_cfg:1; /* Enable/disable CMU cfg */ 2412ff8a1eeSSteen Hegelund bool no_pwrcycle:1; /* Omit initial power-cycle */ 2422ff8a1eeSSteen Hegelund bool txinvert:1; /* Enable inversion of output data */ 2432ff8a1eeSSteen Hegelund bool rxinvert:1; /* Enable inversion of input data */ 2442ff8a1eeSSteen Hegelund bool txmargin:1; /* Set output level to half/full */ 2452ff8a1eeSSteen Hegelund u16 txswing; /* Set output level */ 2462ff8a1eeSSteen Hegelund bool mute:1; /* Mute Output Buffer */ 2472ff8a1eeSSteen Hegelund bool is_6g:1; 2482ff8a1eeSSteen Hegelund bool reg_rst:1; 2492ff8a1eeSSteen Hegelund }; 2502ff8a1eeSSteen Hegelund 2512ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params { 2522ff8a1eeSSteen Hegelund u8 cmu_sel; 2532ff8a1eeSSteen Hegelund u8 is_6g; 2542ff8a1eeSSteen Hegelund u8 skip_cmu_cfg; 2552ff8a1eeSSteen Hegelund u8 cfg_lane_reserve_7_0; 2562ff8a1eeSSteen Hegelund u8 cfg_ssc_rtl_clk_sel; 2572ff8a1eeSSteen Hegelund u8 cfg_lane_reserve_15_8; 2582ff8a1eeSSteen Hegelund u8 cfg_txrate_1_0; 2592ff8a1eeSSteen Hegelund u8 cfg_rxrate_1_0; 2602ff8a1eeSSteen Hegelund u8 r_d_width_ctrl_2_0; 2612ff8a1eeSSteen Hegelund u8 cfg_pma_tx_ck_bitwidth_2_0; 2622ff8a1eeSSteen Hegelund u8 cfg_rxdiv_sel_2_0; 2632ff8a1eeSSteen Hegelund u8 r_pcs2pma_phymode_4_0; 2642ff8a1eeSSteen Hegelund u8 cfg_lane_id_2_0; 2652ff8a1eeSSteen Hegelund u8 cfg_cdrck_en; 2662ff8a1eeSSteen Hegelund u8 cfg_dfeck_en; 2672ff8a1eeSSteen Hegelund u8 cfg_dfe_pd; 2682ff8a1eeSSteen Hegelund u8 cfg_dfetap_en_5_1; 2692ff8a1eeSSteen Hegelund u8 cfg_erramp_pd; 2702ff8a1eeSSteen Hegelund u8 cfg_pi_DFE_en; 2712ff8a1eeSSteen Hegelund u8 cfg_pi_en; 2722ff8a1eeSSteen Hegelund u8 cfg_pd_ctle; 2732ff8a1eeSSteen Hegelund u8 cfg_summer_en; 2742ff8a1eeSSteen Hegelund u8 cfg_pd_rx_cktree; 2752ff8a1eeSSteen Hegelund u8 cfg_pd_clk; 2762ff8a1eeSSteen Hegelund u8 cfg_pd_cml; 2772ff8a1eeSSteen Hegelund u8 cfg_pd_driver; 2782ff8a1eeSSteen Hegelund u8 cfg_rx_reg_pu; 2792ff8a1eeSSteen Hegelund u8 cfg_d_cdr_pd; 2802ff8a1eeSSteen Hegelund u8 cfg_pd_sq; 2812ff8a1eeSSteen Hegelund u8 cfg_rxdet_en; 2822ff8a1eeSSteen Hegelund u8 cfg_rxdet_str; 2832ff8a1eeSSteen Hegelund u8 r_multi_lane_mode; 2842ff8a1eeSSteen Hegelund u8 cfg_en_adv; 2852ff8a1eeSSteen Hegelund u8 cfg_en_main; 2862ff8a1eeSSteen Hegelund u8 cfg_en_dly; 2872ff8a1eeSSteen Hegelund u8 cfg_tap_adv_3_0; 2882ff8a1eeSSteen Hegelund u8 cfg_tap_main; 2892ff8a1eeSSteen Hegelund u8 cfg_tap_dly_4_0; 2902ff8a1eeSSteen Hegelund u8 cfg_vga_ctrl_3_0; 2912ff8a1eeSSteen Hegelund u8 cfg_vga_cp_2_0; 2922ff8a1eeSSteen Hegelund u8 cfg_eq_res_3_0; 2932ff8a1eeSSteen Hegelund u8 cfg_eq_r_byp; 2942ff8a1eeSSteen Hegelund u8 cfg_eq_c_force_3_0; 2952ff8a1eeSSteen Hegelund u8 cfg_en_dfedig; 2962ff8a1eeSSteen Hegelund u8 cfg_sum_setcm_en; 2972ff8a1eeSSteen Hegelund u8 cfg_en_preemph; 2982ff8a1eeSSteen Hegelund u8 cfg_itx_ippreemp_base_1_0; 2992ff8a1eeSSteen Hegelund u8 cfg_itx_ipdriver_base_2_0; 3002ff8a1eeSSteen Hegelund u8 cfg_ibias_tune_reserve_5_0; 3012ff8a1eeSSteen Hegelund u8 cfg_txswing_half; 3022ff8a1eeSSteen Hegelund u8 cfg_dis_2nd_order; 3032ff8a1eeSSteen Hegelund u8 cfg_rx_ssc_lh; 3042ff8a1eeSSteen Hegelund u8 cfg_pi_floop_steps_1_0; 3052ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_23_16; 3062ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_15_8; 3072ff8a1eeSSteen Hegelund u8 cfg_iscan_ext_dac_7_0; 3082ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen1_2_0; 3092ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen2_2_0; 3102ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen3_2_0; 3112ff8a1eeSSteen Hegelund u8 cfg_cdr_kf_gen4_2_0; 3122ff8a1eeSSteen Hegelund u8 r_cdr_m_gen1_7_0; 3132ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen1_3_0; 3142ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen2; 3152ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen3; 3162ff8a1eeSSteen Hegelund u8 cfg_pi_bw_gen4; 3172ff8a1eeSSteen Hegelund u8 cfg_pi_ext_dac_7_0; 3182ff8a1eeSSteen Hegelund u8 cfg_pi_steps; 3192ff8a1eeSSteen Hegelund u8 cfg_mp_max_3_0; 3202ff8a1eeSSteen Hegelund u8 cfg_rstn_dfedig; 3212ff8a1eeSSteen Hegelund u8 cfg_alos_thr_3_0; 3222ff8a1eeSSteen Hegelund u8 cfg_predrv_slewrate_1_0; 3232ff8a1eeSSteen Hegelund u8 cfg_itx_ipcml_base_1_0; 3242ff8a1eeSSteen Hegelund u8 cfg_ip_pre_base_1_0; 3252ff8a1eeSSteen Hegelund u8 r_cdr_m_gen2_7_0; 3262ff8a1eeSSteen Hegelund u8 r_cdr_m_gen3_7_0; 3272ff8a1eeSSteen Hegelund u8 r_cdr_m_gen4_7_0; 3282ff8a1eeSSteen Hegelund u8 r_en_auto_cdr_rstn; 3292ff8a1eeSSteen Hegelund u8 cfg_oscal_afe; 3302ff8a1eeSSteen Hegelund u8 cfg_pd_osdac_afe; 3312ff8a1eeSSteen Hegelund u8 cfg_resetb_oscal_afe[2]; 3322ff8a1eeSSteen Hegelund u8 cfg_center_spreading; 3332ff8a1eeSSteen Hegelund u8 cfg_m_cnt_maxval_4_0; 3342ff8a1eeSSteen Hegelund u8 cfg_ncnt_maxval_7_0; 3352ff8a1eeSSteen Hegelund u8 cfg_ncnt_maxval_10_8; 3362ff8a1eeSSteen Hegelund u8 cfg_ssc_en; 3372ff8a1eeSSteen Hegelund u8 cfg_tx2rx_lp_en; 3382ff8a1eeSSteen Hegelund u8 cfg_txlb_en; 3392ff8a1eeSSteen Hegelund u8 cfg_rx2tx_lp_en; 3402ff8a1eeSSteen Hegelund u8 cfg_rxlb_en; 3412ff8a1eeSSteen Hegelund u8 r_tx_pol_inv; 3422ff8a1eeSSteen Hegelund u8 r_rx_pol_inv; 3432ff8a1eeSSteen Hegelund u8 fx_100; 3442ff8a1eeSSteen Hegelund }; 3452ff8a1eeSSteen Hegelund 3462ff8a1eeSSteen Hegelund static struct sparx5_sd25g28_media_preset media_presets_25g[] = { 3472ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DEFAULT */ 3482ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 3492ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3502ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 3512ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3522ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3532ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 3542ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3552ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 4, 3562ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 12, 3572ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 7, 3582ff8a1eeSSteen Hegelund }, 3592ff8a1eeSSteen Hegelund { /* ETH_MEDIA_SR */ 3602ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 3612ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3622ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 3632ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3642ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3652ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0x10, 3662ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3672ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 8, 3682ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 4, 3692ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 0, 3702ff8a1eeSSteen Hegelund }, 3712ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DAC */ 3722ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 3732ff8a1eeSSteen Hegelund .cfg_en_main = 1, 3742ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 3752ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 3762ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 3772ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 3782ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 3792ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = 8, 3802ff8a1eeSSteen Hegelund .cfg_eq_r_force_3_0 = 0xc, 3812ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = 0, 3822ff8a1eeSSteen Hegelund }, 3832ff8a1eeSSteen Hegelund }; 3842ff8a1eeSSteen Hegelund 3852ff8a1eeSSteen Hegelund static struct sparx5_sd25g28_mode_preset mode_presets_25g[] = { 3862ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_25000 */ 3872ff8a1eeSSteen Hegelund .bitwidth = 40, 3882ff8a1eeSSteen Hegelund .tx_pre_div = 0, 3892ff8a1eeSSteen Hegelund .fifo_ck_div = 0, 3902ff8a1eeSSteen Hegelund .pre_divsel = 1, 3912ff8a1eeSSteen Hegelund .vco_div_mode = 0, 3922ff8a1eeSSteen Hegelund .sel_div = 15, 3932ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 3942ff8a1eeSSteen Hegelund .subrate = 0, 3952ff8a1eeSSteen Hegelund .com_txcal_en = 0, 3962ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 3972ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0xf0, 3982ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 3992ff8a1eeSSteen Hegelund .tx_reserve_msb = 0xcc, 4002ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0xfe, 4012ff8a1eeSSteen Hegelund .bw = 3, 4022ff8a1eeSSteen Hegelund .rxterm = 0, 4032ff8a1eeSSteen Hegelund .dfe_enable = 1, 4042ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 4052ff8a1eeSSteen Hegelund .txmargin = 1, 4062ff8a1eeSSteen Hegelund .cfg_ctle_rstn = 1, 4072ff8a1eeSSteen Hegelund .r_dfe_rstn = 1, 4082ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4092ff8a1eeSSteen Hegelund .tx_tap_dly = 8, 4102ff8a1eeSSteen Hegelund .tx_tap_adv = 0xc, 4112ff8a1eeSSteen Hegelund }, 4122ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_10000 */ 4132ff8a1eeSSteen Hegelund .bitwidth = 64, 4142ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4152ff8a1eeSSteen Hegelund .fifo_ck_div = 2, 4162ff8a1eeSSteen Hegelund .pre_divsel = 0, 4172ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4182ff8a1eeSSteen Hegelund .sel_div = 9, 4192ff8a1eeSSteen Hegelund .ck_bitwidth = 0, 4202ff8a1eeSSteen Hegelund .subrate = 0, 4212ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4222ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x20 << 1), 4232ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0x40, 4242ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4252ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x4c, 4262ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x44, 4272ff8a1eeSSteen Hegelund .bw = 3, 4282ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4292ff8a1eeSSteen Hegelund .rxterm = 3, 4302ff8a1eeSSteen Hegelund .dfe_enable = 1, 4312ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 4322ff8a1eeSSteen Hegelund .txmargin = 0, 4332ff8a1eeSSteen Hegelund .cfg_ctle_rstn = 1, 4342ff8a1eeSSteen Hegelund .r_dfe_rstn = 1, 4352ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4362ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4372ff8a1eeSSteen Hegelund }, 4382ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_5000 */ 4392ff8a1eeSSteen Hegelund .bitwidth = 64, 4402ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4412ff8a1eeSSteen Hegelund .fifo_ck_div = 2, 4422ff8a1eeSSteen Hegelund .pre_divsel = 0, 4432ff8a1eeSSteen Hegelund .vco_div_mode = 2, 4442ff8a1eeSSteen Hegelund .sel_div = 9, 4452ff8a1eeSSteen Hegelund .ck_bitwidth = 0, 4462ff8a1eeSSteen Hegelund .subrate = 0, 4472ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4482ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x20 << 1), 4492ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0, 4502ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4512ff8a1eeSSteen Hegelund .tx_reserve_msb = 0xe, 4522ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x80, 4532ff8a1eeSSteen Hegelund .bw = 0, 4542ff8a1eeSSteen Hegelund .rxterm = 0, 4552ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 6, 4562ff8a1eeSSteen Hegelund .dfe_enable = 0, 4572ff8a1eeSSteen Hegelund .dfe_tap = 0, 4582ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4592ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4602ff8a1eeSSteen Hegelund }, 4612ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_SD_2G5 */ 4622ff8a1eeSSteen Hegelund .bitwidth = 10, 4632ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4642ff8a1eeSSteen Hegelund .fifo_ck_div = 0, 4652ff8a1eeSSteen Hegelund .pre_divsel = 0, 4662ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4672ff8a1eeSSteen Hegelund .sel_div = 6, 4682ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 4692ff8a1eeSSteen Hegelund .subrate = 2, 4702ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4712ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 4722ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = (0xf << 4), 4732ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 2, 4742ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x8, 4752ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0x8a, 4762ff8a1eeSSteen Hegelund .bw = 0, 4772ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 4782ff8a1eeSSteen Hegelund .rxterm = (1 << 2), 4792ff8a1eeSSteen Hegelund .dfe_enable = 0, 4802ff8a1eeSSteen Hegelund .dfe_tap = 0, 4812ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 4822ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 4832ff8a1eeSSteen Hegelund }, 4842ff8a1eeSSteen Hegelund { /* SPX5_SD25G28_MODE_PRESET_1000BASEX */ 4852ff8a1eeSSteen Hegelund .bitwidth = 10, 4862ff8a1eeSSteen Hegelund .tx_pre_div = 0, 4872ff8a1eeSSteen Hegelund .fifo_ck_div = 1, 4882ff8a1eeSSteen Hegelund .pre_divsel = 0, 4892ff8a1eeSSteen Hegelund .vco_div_mode = 1, 4902ff8a1eeSSteen Hegelund .sel_div = 8, 4912ff8a1eeSSteen Hegelund .ck_bitwidth = 3, 4922ff8a1eeSSteen Hegelund .subrate = 3, 4932ff8a1eeSSteen Hegelund .com_txcal_en = 1, 4942ff8a1eeSSteen Hegelund .com_tx_reserve_msb = (0x26 << 1), 4952ff8a1eeSSteen Hegelund .com_tx_reserve_lsb = 0xf0, 4962ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base = 0, 4972ff8a1eeSSteen Hegelund .tx_reserve_msb = 0x8, 4982ff8a1eeSSteen Hegelund .tx_reserve_lsb = 0xce, 4992ff8a1eeSSteen Hegelund .bw = 0, 5002ff8a1eeSSteen Hegelund .rxterm = 0, 5012ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = 0, 5022ff8a1eeSSteen Hegelund .dfe_enable = 0, 5032ff8a1eeSSteen Hegelund .dfe_tap = 0, 5042ff8a1eeSSteen Hegelund .tx_tap_dly = 0, 5052ff8a1eeSSteen Hegelund .tx_tap_adv = 0, 5062ff8a1eeSSteen Hegelund }, 5072ff8a1eeSSteen Hegelund }; 5082ff8a1eeSSteen Hegelund 5092ff8a1eeSSteen Hegelund static struct sparx5_sd10g28_media_preset media_presets_10g[] = { 5102ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DEFAULT */ 5112ff8a1eeSSteen Hegelund .cfg_en_adv = 0, 5122ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5132ff8a1eeSSteen Hegelund .cfg_en_dly = 0, 5142ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 5152ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5162ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0, 5172ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 5, 5182ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 0, 5192ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5202ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5212ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0x8, 5222ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x3, 5232ff8a1eeSSteen Hegelund }, 5242ff8a1eeSSteen Hegelund { /* ETH_MEDIA_SR */ 5252ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 5262ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5272ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 5282ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 0, 5292ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5302ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 0xc, 5312ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 0xa, 5322ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 0x4, 5332ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5342ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5352ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xF, 5362ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x3, 5372ff8a1eeSSteen Hegelund }, 5382ff8a1eeSSteen Hegelund { /* ETH_MEDIA_DAC */ 5392ff8a1eeSSteen Hegelund .cfg_en_adv = 1, 5402ff8a1eeSSteen Hegelund .cfg_en_main = 1, 5412ff8a1eeSSteen Hegelund .cfg_en_dly = 1, 5422ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = 12, 5432ff8a1eeSSteen Hegelund .cfg_tap_main = 1, 5442ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = 8, 5452ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = 0xa, 5462ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = 4, 5472ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = 0xa, 5482ff8a1eeSSteen Hegelund .cfg_eq_r_byp = 1, 5492ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = 0xf, 5502ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = 0x0, 5512ff8a1eeSSteen Hegelund } 5522ff8a1eeSSteen Hegelund }; 5532ff8a1eeSSteen Hegelund 5542ff8a1eeSSteen Hegelund static struct sparx5_sd10g28_mode_preset mode_presets_10g[] = { 5552ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_10000 */ 5562ff8a1eeSSteen Hegelund .bwidth = 64, 5572ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5582ff8a1eeSSteen Hegelund .rate = 0x0, 5592ff8a1eeSSteen Hegelund .dfe_enable = 1, 5602ff8a1eeSSteen Hegelund .dfe_tap = 0x1f, 5612ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x0, 5622ff8a1eeSSteen Hegelund .duty_cycle = 0x2, 5632ff8a1eeSSteen Hegelund }, 5642ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_6G */ 5652ff8a1eeSSteen Hegelund .bwidth = 16, 5662ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5672ff8a1eeSSteen Hegelund .rate = 0x1, 5682ff8a1eeSSteen Hegelund .dfe_enable = 0, 5692ff8a1eeSSteen Hegelund .dfe_tap = 0, 5702ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5712ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5722ff8a1eeSSteen Hegelund }, 5732ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SFI_5000_10G */ 5742ff8a1eeSSteen Hegelund .bwidth = 64, 5752ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_MAIN, 5762ff8a1eeSSteen Hegelund .rate = 0x1, 5772ff8a1eeSSteen Hegelund .dfe_enable = 0, 5782ff8a1eeSSteen Hegelund .dfe_tap = 0, 5792ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5802ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5812ff8a1eeSSteen Hegelund }, 5822ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_QSGMII */ 5832ff8a1eeSSteen Hegelund .bwidth = 20, 5842ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX1, 5852ff8a1eeSSteen Hegelund .rate = 0x1, 5862ff8a1eeSSteen Hegelund .dfe_enable = 0, 5872ff8a1eeSSteen Hegelund .dfe_tap = 0, 5882ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x5, 5892ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5902ff8a1eeSSteen Hegelund }, 5912ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_SD_2G5 */ 5922ff8a1eeSSteen Hegelund .bwidth = 10, 5932ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX2, 5942ff8a1eeSSteen Hegelund .rate = 0x2, 5952ff8a1eeSSteen Hegelund .dfe_enable = 0, 5962ff8a1eeSSteen Hegelund .dfe_tap = 0, 5972ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x7, 5982ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 5992ff8a1eeSSteen Hegelund }, 6002ff8a1eeSSteen Hegelund { /* SPX5_SD10G28_MODE_PRESET_1000BASEX */ 6012ff8a1eeSSteen Hegelund .bwidth = 10, 6022ff8a1eeSSteen Hegelund .cmu_sel = SPX5_SD10G28_CMU_AUX1, 6032ff8a1eeSSteen Hegelund .rate = 0x3, 6042ff8a1eeSSteen Hegelund .dfe_enable = 0, 6052ff8a1eeSSteen Hegelund .dfe_tap = 0, 6062ff8a1eeSSteen Hegelund .pi_bw_gen1 = 0x7, 6072ff8a1eeSSteen Hegelund .duty_cycle = 0x0, 6082ff8a1eeSSteen Hegelund }, 6092ff8a1eeSSteen Hegelund }; 6102ff8a1eeSSteen Hegelund 6112ff8a1eeSSteen Hegelund /* map from SD25G28 interface width to configuration value */ 6122ff8a1eeSSteen Hegelund static u8 sd25g28_get_iw_setting(struct device *dev, const u8 interface_width) 6132ff8a1eeSSteen Hegelund { 6142ff8a1eeSSteen Hegelund switch (interface_width) { 6152ff8a1eeSSteen Hegelund case 10: return 0; 6162ff8a1eeSSteen Hegelund case 16: return 1; 6172ff8a1eeSSteen Hegelund case 32: return 3; 6182ff8a1eeSSteen Hegelund case 40: return 4; 6192ff8a1eeSSteen Hegelund case 64: return 5; 6202ff8a1eeSSteen Hegelund default: 6212ff8a1eeSSteen Hegelund dev_err(dev, "%s: Illegal value %d for interface width\n", 6222ff8a1eeSSteen Hegelund __func__, interface_width); 6232ff8a1eeSSteen Hegelund } 6242ff8a1eeSSteen Hegelund return 0; 6252ff8a1eeSSteen Hegelund } 6262ff8a1eeSSteen Hegelund 6272ff8a1eeSSteen Hegelund /* map from SD10G28 interface width to configuration value */ 6282ff8a1eeSSteen Hegelund static u8 sd10g28_get_iw_setting(struct device *dev, const u8 interface_width) 6292ff8a1eeSSteen Hegelund { 6302ff8a1eeSSteen Hegelund switch (interface_width) { 6312ff8a1eeSSteen Hegelund case 10: return 0; 6322ff8a1eeSSteen Hegelund case 16: return 1; 6332ff8a1eeSSteen Hegelund case 20: return 2; 6342ff8a1eeSSteen Hegelund case 32: return 3; 6352ff8a1eeSSteen Hegelund case 40: return 4; 6362ff8a1eeSSteen Hegelund case 64: return 7; 6372ff8a1eeSSteen Hegelund default: 6382ff8a1eeSSteen Hegelund dev_err(dev, "%s: Illegal value %d for interface width\n", __func__, 6392ff8a1eeSSteen Hegelund interface_width); 6402ff8a1eeSSteen Hegelund return 0; 6412ff8a1eeSSteen Hegelund } 6422ff8a1eeSSteen Hegelund } 6432ff8a1eeSSteen Hegelund 6442ff8a1eeSSteen Hegelund static int sparx5_sd10g25_get_mode_preset(struct sparx5_serdes_macro *macro, 6452ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset *mode) 6462ff8a1eeSSteen Hegelund { 6472ff8a1eeSSteen Hegelund switch (macro->serdesmode) { 6482ff8a1eeSSteen Hegelund case SPX5_SD_MODE_SFI: 6492ff8a1eeSSteen Hegelund if (macro->speed == SPEED_25000) 6502ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 6512ff8a1eeSSteen Hegelund else if (macro->speed == SPEED_10000) 6522ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_10000]; 6532ff8a1eeSSteen Hegelund else if (macro->speed == SPEED_5000) 6542ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_5000]; 6552ff8a1eeSSteen Hegelund break; 6562ff8a1eeSSteen Hegelund case SPX5_SD_MODE_2G5: 6572ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_SD_2G5]; 6582ff8a1eeSSteen Hegelund break; 6592ff8a1eeSSteen Hegelund case SPX5_SD_MODE_1000BASEX: 6602ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_1000BASEX]; 6612ff8a1eeSSteen Hegelund break; 6622ff8a1eeSSteen Hegelund case SPX5_SD_MODE_100FX: 6632ff8a1eeSSteen Hegelund /* Not supported */ 6642ff8a1eeSSteen Hegelund return -EINVAL; 6652ff8a1eeSSteen Hegelund default: 6662ff8a1eeSSteen Hegelund *mode = mode_presets_25g[SPX5_SD25G28_MODE_PRESET_25000]; 6672ff8a1eeSSteen Hegelund break; 6682ff8a1eeSSteen Hegelund } 6692ff8a1eeSSteen Hegelund return 0; 6702ff8a1eeSSteen Hegelund } 6712ff8a1eeSSteen Hegelund 6722ff8a1eeSSteen Hegelund static int sparx5_sd10g28_get_mode_preset(struct sparx5_serdes_macro *macro, 6732ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset *mode, 6742ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args *args) 6752ff8a1eeSSteen Hegelund { 6762ff8a1eeSSteen Hegelund switch (macro->serdesmode) { 6772ff8a1eeSSteen Hegelund case SPX5_SD_MODE_SFI: 6782ff8a1eeSSteen Hegelund if (macro->speed == SPEED_10000) { 6792ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 6802ff8a1eeSSteen Hegelund } else if (macro->speed == SPEED_5000) { 6812ff8a1eeSSteen Hegelund if (args->is_6g) 6822ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_6G]; 6832ff8a1eeSSteen Hegelund else 6842ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SFI_5000_10G]; 6852ff8a1eeSSteen Hegelund } else { 6862ff8a1eeSSteen Hegelund dev_err(macro->priv->dev, "%s: Illegal speed: %02u, sidx: %02u, mode (%u)", 6872ff8a1eeSSteen Hegelund __func__, macro->speed, macro->sidx, 6882ff8a1eeSSteen Hegelund macro->serdesmode); 6892ff8a1eeSSteen Hegelund return -EINVAL; 6902ff8a1eeSSteen Hegelund } 6912ff8a1eeSSteen Hegelund break; 6922ff8a1eeSSteen Hegelund case SPX5_SD_MODE_QSGMII: 6932ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_QSGMII]; 6942ff8a1eeSSteen Hegelund break; 6952ff8a1eeSSteen Hegelund case SPX5_SD_MODE_2G5: 6962ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_SD_2G5]; 6972ff8a1eeSSteen Hegelund break; 6982ff8a1eeSSteen Hegelund case SPX5_SD_MODE_100FX: 6992ff8a1eeSSteen Hegelund case SPX5_SD_MODE_1000BASEX: 7002ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_1000BASEX]; 7012ff8a1eeSSteen Hegelund break; 7022ff8a1eeSSteen Hegelund default: 7032ff8a1eeSSteen Hegelund *mode = mode_presets_10g[SPX5_SD10G28_MODE_PRESET_10000]; 7042ff8a1eeSSteen Hegelund break; 7052ff8a1eeSSteen Hegelund } 7062ff8a1eeSSteen Hegelund return 0; 7072ff8a1eeSSteen Hegelund } 7082ff8a1eeSSteen Hegelund 7092ff8a1eeSSteen Hegelund static void sparx5_sd25g28_get_params(struct sparx5_serdes_macro *macro, 7102ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset *media, 7112ff8a1eeSSteen Hegelund struct sparx5_sd25g28_mode_preset *mode, 7122ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args *args, 7132ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params *params) 7142ff8a1eeSSteen Hegelund { 7152ff8a1eeSSteen Hegelund u8 iw = sd25g28_get_iw_setting(macro->priv->dev, mode->bitwidth); 7162ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params init = { 7172ff8a1eeSSteen Hegelund .r_d_width_ctrl_2_0 = iw, 7182ff8a1eeSSteen Hegelund .r_txfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 7192ff8a1eeSSteen Hegelund .r_rxfifo_ck_div_pmad_2_0 = mode->fifo_ck_div, 7202ff8a1eeSSteen Hegelund .cfg_vco_div_mode_1_0 = mode->vco_div_mode, 7212ff8a1eeSSteen Hegelund .cfg_pre_divsel_1_0 = mode->pre_divsel, 7222ff8a1eeSSteen Hegelund .cfg_sel_div_3_0 = mode->sel_div, 7232ff8a1eeSSteen Hegelund .cfg_vco_start_code_3_0 = 0, 7242ff8a1eeSSteen Hegelund .cfg_pma_tx_ck_bitwidth_2_0 = mode->ck_bitwidth, 7252ff8a1eeSSteen Hegelund .cfg_tx_prediv_1_0 = mode->tx_pre_div, 7262ff8a1eeSSteen Hegelund .cfg_rxdiv_sel_2_0 = mode->ck_bitwidth, 7272ff8a1eeSSteen Hegelund .cfg_tx_subrate_2_0 = mode->subrate, 7282ff8a1eeSSteen Hegelund .cfg_rx_subrate_2_0 = mode->subrate, 7292ff8a1eeSSteen Hegelund .r_multi_lane_mode = 0, 7302ff8a1eeSSteen Hegelund .cfg_cdrck_en = 1, 7312ff8a1eeSSteen Hegelund .cfg_dfeck_en = mode->dfe_enable, 7322ff8a1eeSSteen Hegelund .cfg_dfe_pd = mode->dfe_enable == 1 ? 0 : 1, 7332ff8a1eeSSteen Hegelund .cfg_dfedmx_pd = 1, 7342ff8a1eeSSteen Hegelund .cfg_dfetap_en_5_1 = mode->dfe_tap, 7352ff8a1eeSSteen Hegelund .cfg_dmux_pd = 0, 7362ff8a1eeSSteen Hegelund .cfg_dmux_clk_pd = 1, 7372ff8a1eeSSteen Hegelund .cfg_erramp_pd = mode->dfe_enable == 1 ? 0 : 1, 7382ff8a1eeSSteen Hegelund .cfg_pi_DFE_en = mode->dfe_enable, 7392ff8a1eeSSteen Hegelund .cfg_pi_en = 1, 7402ff8a1eeSSteen Hegelund .cfg_pd_ctle = 0, 7412ff8a1eeSSteen Hegelund .cfg_summer_en = 1, 7422ff8a1eeSSteen Hegelund .cfg_pmad_ck_pd = 0, 7432ff8a1eeSSteen Hegelund .cfg_pd_clk = 0, 7442ff8a1eeSSteen Hegelund .cfg_pd_cml = 0, 7452ff8a1eeSSteen Hegelund .cfg_pd_driver = 0, 7462ff8a1eeSSteen Hegelund .cfg_rx_reg_pu = 1, 7472ff8a1eeSSteen Hegelund .cfg_pd_rms_det = 1, 7482ff8a1eeSSteen Hegelund .cfg_dcdr_pd = 0, 7492ff8a1eeSSteen Hegelund .cfg_ecdr_pd = 1, 7502ff8a1eeSSteen Hegelund .cfg_pd_sq = 1, 7512ff8a1eeSSteen Hegelund .cfg_itx_ipdriver_base_2_0 = mode->txmargin, 7522ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 7532ff8a1eeSSteen Hegelund .cfg_tap_main = media->cfg_tap_main, 7542ff8a1eeSSteen Hegelund .cfg_en_main = media->cfg_en_main, 7552ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 7562ff8a1eeSSteen Hegelund .cfg_en_adv = media->cfg_en_adv, 7572ff8a1eeSSteen Hegelund .cfg_en_dly = media->cfg_en_dly, 7582ff8a1eeSSteen Hegelund .cfg_iscan_en = 0, 7592ff8a1eeSSteen Hegelund .l1_pcs_en_fast_iscan = 0, 7602ff8a1eeSSteen Hegelund .l0_cfg_bw_1_0 = 0, 7612ff8a1eeSSteen Hegelund .cfg_en_dummy = 0, 7622ff8a1eeSSteen Hegelund .cfg_pll_reserve_3_0 = args->com_pll_reserve, 7632ff8a1eeSSteen Hegelund .l0_cfg_txcal_en = mode->com_txcal_en, 7642ff8a1eeSSteen Hegelund .l0_cfg_tx_reserve_15_8 = mode->com_tx_reserve_msb, 7652ff8a1eeSSteen Hegelund .l0_cfg_tx_reserve_7_0 = mode->com_tx_reserve_lsb, 7662ff8a1eeSSteen Hegelund .cfg_tx_reserve_15_8 = mode->tx_reserve_msb, 7672ff8a1eeSSteen Hegelund .cfg_tx_reserve_7_0 = mode->tx_reserve_lsb, 7682ff8a1eeSSteen Hegelund .cfg_bw_1_0 = mode->bw, 7692ff8a1eeSSteen Hegelund .cfg_txcal_man_en = 1, 7702ff8a1eeSSteen Hegelund .cfg_phase_man_4_0 = 0, 7712ff8a1eeSSteen Hegelund .cfg_quad_man_1_0 = 0, 7722ff8a1eeSSteen Hegelund .cfg_txcal_shift_code_5_0 = 2, 7732ff8a1eeSSteen Hegelund .cfg_txcal_valid_sel_3_0 = 4, 7742ff8a1eeSSteen Hegelund .cfg_txcal_en = 0, 7752ff8a1eeSSteen Hegelund .cfg_cdr_kf_2_0 = 1, 7762ff8a1eeSSteen Hegelund .cfg_cdr_m_7_0 = 6, 7772ff8a1eeSSteen Hegelund .cfg_pi_bw_3_0 = mode->cfg_pi_bw_3_0, 7782ff8a1eeSSteen Hegelund .cfg_pi_steps_1_0 = 0, 7792ff8a1eeSSteen Hegelund .cfg_dis_2ndorder = 1, 7802ff8a1eeSSteen Hegelund .cfg_ctle_rstn = mode->cfg_ctle_rstn, 7812ff8a1eeSSteen Hegelund .r_dfe_rstn = mode->r_dfe_rstn, 7822ff8a1eeSSteen Hegelund .cfg_alos_thr_2_0 = media->cfg_alos_thr_2_0, 7832ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base_1_0 = mode->cfg_itx_ipcml_base, 7842ff8a1eeSSteen Hegelund .cfg_rx_reserve_7_0 = 0xbf, 7852ff8a1eeSSteen Hegelund .cfg_rx_reserve_15_8 = 0x61, 7862ff8a1eeSSteen Hegelund .cfg_rxterm_2_0 = mode->rxterm, 7872ff8a1eeSSteen Hegelund .cfg_fom_selm = 0, 7882ff8a1eeSSteen Hegelund .cfg_rx_sp_ctle_1_0 = 0, 7892ff8a1eeSSteen Hegelund .cfg_isel_ctle_1_0 = 0, 7902ff8a1eeSSteen Hegelund .cfg_vga_ctrl_byp_4_0 = media->cfg_vga_ctrl_byp_4_0, 7912ff8a1eeSSteen Hegelund .cfg_vga_byp = 1, 7922ff8a1eeSSteen Hegelund .cfg_agc_adpt_byp = 1, 7932ff8a1eeSSteen Hegelund .cfg_eqr_byp = 1, 7942ff8a1eeSSteen Hegelund .cfg_eqr_force_3_0 = media->cfg_eq_r_force_3_0, 7952ff8a1eeSSteen Hegelund .cfg_eqc_force_3_0 = media->cfg_eq_c_force_3_0, 7962ff8a1eeSSteen Hegelund .cfg_sum_setcm_en = 1, 7972ff8a1eeSSteen Hegelund .cfg_pi_dfe_en = 1, 7982ff8a1eeSSteen Hegelund .cfg_init_pos_iscan_6_0 = 6, 7992ff8a1eeSSteen Hegelund .cfg_init_pos_ipi_6_0 = 9, 8002ff8a1eeSSteen Hegelund .cfg_dfedig_m_2_0 = 6, 8012ff8a1eeSSteen Hegelund .cfg_en_dfedig = mode->dfe_enable, 8022ff8a1eeSSteen Hegelund .r_d_width_ctrl_from_hwt = 0, 8032ff8a1eeSSteen Hegelund .r_reg_manual = 1, 8042ff8a1eeSSteen Hegelund .reg_rst = args->reg_rst, 8052ff8a1eeSSteen Hegelund .cfg_jc_byp = 1, 8062ff8a1eeSSteen Hegelund .cfg_common_reserve_7_0 = 1, 8072ff8a1eeSSteen Hegelund .cfg_pll_lol_set = 1, 8082ff8a1eeSSteen Hegelund .cfg_tx2rx_lp_en = 0, 8092ff8a1eeSSteen Hegelund .cfg_txlb_en = 0, 8102ff8a1eeSSteen Hegelund .cfg_rx2tx_lp_en = 0, 8112ff8a1eeSSteen Hegelund .cfg_rxlb_en = 0, 8122ff8a1eeSSteen Hegelund .r_tx_pol_inv = args->txinvert, 8132ff8a1eeSSteen Hegelund .r_rx_pol_inv = args->rxinvert, 8142ff8a1eeSSteen Hegelund }; 8152ff8a1eeSSteen Hegelund 8162ff8a1eeSSteen Hegelund *params = init; 8172ff8a1eeSSteen Hegelund } 8182ff8a1eeSSteen Hegelund 8192ff8a1eeSSteen Hegelund static void sparx5_sd10g28_get_params(struct sparx5_serdes_macro *macro, 8202ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset *media, 8212ff8a1eeSSteen Hegelund struct sparx5_sd10g28_mode_preset *mode, 8222ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args *args, 8232ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params *params) 8242ff8a1eeSSteen Hegelund { 8252ff8a1eeSSteen Hegelund u8 iw = sd10g28_get_iw_setting(macro->priv->dev, mode->bwidth); 8262ff8a1eeSSteen Hegelund struct sparx5_sd10g28_params init = { 8272ff8a1eeSSteen Hegelund .skip_cmu_cfg = args->skip_cmu_cfg, 8282ff8a1eeSSteen Hegelund .is_6g = args->is_6g, 8292ff8a1eeSSteen Hegelund .cmu_sel = mode->cmu_sel, 8302ff8a1eeSSteen Hegelund .cfg_lane_reserve_7_0 = (mode->cmu_sel % 2) << 6, 8312ff8a1eeSSteen Hegelund .cfg_ssc_rtl_clk_sel = (mode->cmu_sel / 2), 8322ff8a1eeSSteen Hegelund .cfg_lane_reserve_15_8 = mode->duty_cycle, 8332ff8a1eeSSteen Hegelund .cfg_txrate_1_0 = mode->rate, 8342ff8a1eeSSteen Hegelund .cfg_rxrate_1_0 = mode->rate, 8352ff8a1eeSSteen Hegelund .fx_100 = macro->serdesmode == SPX5_SD_MODE_100FX, 8362ff8a1eeSSteen Hegelund .r_d_width_ctrl_2_0 = iw, 8372ff8a1eeSSteen Hegelund .cfg_pma_tx_ck_bitwidth_2_0 = iw, 8382ff8a1eeSSteen Hegelund .cfg_rxdiv_sel_2_0 = iw, 8392ff8a1eeSSteen Hegelund .r_pcs2pma_phymode_4_0 = 0, 8402ff8a1eeSSteen Hegelund .cfg_lane_id_2_0 = 0, 8412ff8a1eeSSteen Hegelund .cfg_cdrck_en = 1, 8422ff8a1eeSSteen Hegelund .cfg_dfeck_en = mode->dfe_enable, 8432ff8a1eeSSteen Hegelund .cfg_dfe_pd = (mode->dfe_enable == 1) ? 0 : 1, 8442ff8a1eeSSteen Hegelund .cfg_dfetap_en_5_1 = mode->dfe_tap, 8452ff8a1eeSSteen Hegelund .cfg_erramp_pd = (mode->dfe_enable == 1) ? 0 : 1, 8462ff8a1eeSSteen Hegelund .cfg_pi_DFE_en = mode->dfe_enable, 8472ff8a1eeSSteen Hegelund .cfg_pi_en = 1, 8482ff8a1eeSSteen Hegelund .cfg_pd_ctle = 0, 8492ff8a1eeSSteen Hegelund .cfg_summer_en = 1, 8502ff8a1eeSSteen Hegelund .cfg_pd_rx_cktree = 0, 8512ff8a1eeSSteen Hegelund .cfg_pd_clk = 0, 8522ff8a1eeSSteen Hegelund .cfg_pd_cml = 0, 8532ff8a1eeSSteen Hegelund .cfg_pd_driver = 0, 8542ff8a1eeSSteen Hegelund .cfg_rx_reg_pu = 1, 8552ff8a1eeSSteen Hegelund .cfg_d_cdr_pd = 0, 8562ff8a1eeSSteen Hegelund .cfg_pd_sq = mode->dfe_enable, 8572ff8a1eeSSteen Hegelund .cfg_rxdet_en = 0, 8582ff8a1eeSSteen Hegelund .cfg_rxdet_str = 0, 8592ff8a1eeSSteen Hegelund .r_multi_lane_mode = 0, 8602ff8a1eeSSteen Hegelund .cfg_en_adv = media->cfg_en_adv, 8612ff8a1eeSSteen Hegelund .cfg_en_main = 1, 8622ff8a1eeSSteen Hegelund .cfg_en_dly = media->cfg_en_dly, 8632ff8a1eeSSteen Hegelund .cfg_tap_adv_3_0 = media->cfg_tap_adv_3_0, 8642ff8a1eeSSteen Hegelund .cfg_tap_main = media->cfg_tap_main, 8652ff8a1eeSSteen Hegelund .cfg_tap_dly_4_0 = media->cfg_tap_dly_4_0, 8662ff8a1eeSSteen Hegelund .cfg_vga_ctrl_3_0 = media->cfg_vga_ctrl_3_0, 8672ff8a1eeSSteen Hegelund .cfg_vga_cp_2_0 = media->cfg_vga_cp_2_0, 8682ff8a1eeSSteen Hegelund .cfg_eq_res_3_0 = media->cfg_eq_res_3_0, 8692ff8a1eeSSteen Hegelund .cfg_eq_r_byp = media->cfg_eq_r_byp, 8702ff8a1eeSSteen Hegelund .cfg_eq_c_force_3_0 = media->cfg_eq_c_force_3_0, 8712ff8a1eeSSteen Hegelund .cfg_en_dfedig = mode->dfe_enable, 8722ff8a1eeSSteen Hegelund .cfg_sum_setcm_en = 1, 8732ff8a1eeSSteen Hegelund .cfg_en_preemph = 0, 8742ff8a1eeSSteen Hegelund .cfg_itx_ippreemp_base_1_0 = 0, 8752ff8a1eeSSteen Hegelund .cfg_itx_ipdriver_base_2_0 = (args->txswing >> 6), 8762ff8a1eeSSteen Hegelund .cfg_ibias_tune_reserve_5_0 = (args->txswing & 63), 8772ff8a1eeSSteen Hegelund .cfg_txswing_half = (args->txmargin), 8782ff8a1eeSSteen Hegelund .cfg_dis_2nd_order = 0x1, 8792ff8a1eeSSteen Hegelund .cfg_rx_ssc_lh = 0x0, 8802ff8a1eeSSteen Hegelund .cfg_pi_floop_steps_1_0 = 0x0, 8812ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_23_16 = (1 << 5), 8822ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_15_8 = (0 << 6), 8832ff8a1eeSSteen Hegelund .cfg_iscan_ext_dac_7_0 = (1 << 7) + 9, 8842ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen1_2_0 = 1, 8852ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen2_2_0 = 1, 8862ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen3_2_0 = 1, 8872ff8a1eeSSteen Hegelund .cfg_cdr_kf_gen4_2_0 = 1, 8882ff8a1eeSSteen Hegelund .r_cdr_m_gen1_7_0 = 4, 8892ff8a1eeSSteen Hegelund .cfg_pi_bw_gen1_3_0 = mode->pi_bw_gen1, 8902ff8a1eeSSteen Hegelund .cfg_pi_bw_gen2 = mode->pi_bw_gen1, 8912ff8a1eeSSteen Hegelund .cfg_pi_bw_gen3 = mode->pi_bw_gen1, 8922ff8a1eeSSteen Hegelund .cfg_pi_bw_gen4 = mode->pi_bw_gen1, 8932ff8a1eeSSteen Hegelund .cfg_pi_ext_dac_7_0 = 3, 8942ff8a1eeSSteen Hegelund .cfg_pi_steps = 0, 8952ff8a1eeSSteen Hegelund .cfg_mp_max_3_0 = 1, 8962ff8a1eeSSteen Hegelund .cfg_rstn_dfedig = mode->dfe_enable, 8972ff8a1eeSSteen Hegelund .cfg_alos_thr_3_0 = media->cfg_alos_thr_3_0, 8982ff8a1eeSSteen Hegelund .cfg_predrv_slewrate_1_0 = 3, 8992ff8a1eeSSteen Hegelund .cfg_itx_ipcml_base_1_0 = 0, 9002ff8a1eeSSteen Hegelund .cfg_ip_pre_base_1_0 = 0, 9012ff8a1eeSSteen Hegelund .r_cdr_m_gen2_7_0 = 2, 9022ff8a1eeSSteen Hegelund .r_cdr_m_gen3_7_0 = 2, 9032ff8a1eeSSteen Hegelund .r_cdr_m_gen4_7_0 = 2, 9042ff8a1eeSSteen Hegelund .r_en_auto_cdr_rstn = 0, 9052ff8a1eeSSteen Hegelund .cfg_oscal_afe = 1, 9062ff8a1eeSSteen Hegelund .cfg_pd_osdac_afe = 0, 9072ff8a1eeSSteen Hegelund .cfg_resetb_oscal_afe[0] = 0, 9082ff8a1eeSSteen Hegelund .cfg_resetb_oscal_afe[1] = 1, 9092ff8a1eeSSteen Hegelund .cfg_center_spreading = 0, 9102ff8a1eeSSteen Hegelund .cfg_m_cnt_maxval_4_0 = 15, 9112ff8a1eeSSteen Hegelund .cfg_ncnt_maxval_7_0 = 32, 9122ff8a1eeSSteen Hegelund .cfg_ncnt_maxval_10_8 = 6, 9132ff8a1eeSSteen Hegelund .cfg_ssc_en = 1, 9142ff8a1eeSSteen Hegelund .cfg_tx2rx_lp_en = 0, 9152ff8a1eeSSteen Hegelund .cfg_txlb_en = 0, 9162ff8a1eeSSteen Hegelund .cfg_rx2tx_lp_en = 0, 9172ff8a1eeSSteen Hegelund .cfg_rxlb_en = 0, 9182ff8a1eeSSteen Hegelund .r_tx_pol_inv = args->txinvert, 9192ff8a1eeSSteen Hegelund .r_rx_pol_inv = args->rxinvert, 9202ff8a1eeSSteen Hegelund }; 9212ff8a1eeSSteen Hegelund 9222ff8a1eeSSteen Hegelund *params = init; 9232ff8a1eeSSteen Hegelund } 9242ff8a1eeSSteen Hegelund 9252ff8a1eeSSteen Hegelund static void sparx5_sd25g28_reset(void __iomem *regs[], 9262ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params *params, 9272ff8a1eeSSteen Hegelund u32 sd_index) 9282ff8a1eeSSteen Hegelund { 9292ff8a1eeSSteen Hegelund if (params->reg_rst == 1) { 9302ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(1), 9312ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 9322ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 9332ff8a1eeSSteen Hegelund 9342ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 9352ff8a1eeSSteen Hegelund 9362ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST_SET(0), 9372ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_EXT_CFG_RST, 9382ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_25G_SD_LANE_CFG(sd_index))); 9392ff8a1eeSSteen Hegelund } 9402ff8a1eeSSteen Hegelund } 9412ff8a1eeSSteen Hegelund 942*8595ffb5SSteen Hegelund static int sparx5_sd25g28_apply_params(struct sparx5_serdes_macro *macro, 943*8595ffb5SSteen Hegelund struct sparx5_sd25g28_params *params) 9442ff8a1eeSSteen Hegelund { 945*8595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 946*8595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 947*8595ffb5SSteen Hegelund struct device *dev = priv->dev; 948*8595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 949*8595ffb5SSteen Hegelund u32 value; 950*8595ffb5SSteen Hegelund 951*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(1), 9522ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 953*8595ffb5SSteen Hegelund priv, 954*8595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 955*8595ffb5SSteen Hegelund 956*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xFF), 9572ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 958*8595ffb5SSteen Hegelund priv, 959*8595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 960*8595ffb5SSteen Hegelund 961*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT_SET 9622ff8a1eeSSteen Hegelund (params->r_d_width_ctrl_from_hwt) | 9632ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_REG_MANUAL_SET(params->r_reg_manual), 9642ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_DWIDTHCTRL_FROM_HWT | 9652ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_REG_MANUAL, 966*8595ffb5SSteen Hegelund priv, 967*8595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 968*8595ffb5SSteen Hegelund 969*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0_SET 9702ff8a1eeSSteen Hegelund (params->cfg_common_reserve_7_0), 9712ff8a1eeSSteen Hegelund SD25G_LANE_CMU_31_CFG_COMMON_RESERVE_7_0, 972*8595ffb5SSteen Hegelund priv, 973*8595ffb5SSteen Hegelund SD25G_LANE_CMU_31(sd_index)); 974*8595ffb5SSteen Hegelund 975*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_09_CFG_EN_DUMMY_SET(params->cfg_en_dummy), 9762ff8a1eeSSteen Hegelund SD25G_LANE_CMU_09_CFG_EN_DUMMY, 977*8595ffb5SSteen Hegelund priv, 978*8595ffb5SSteen Hegelund SD25G_LANE_CMU_09(sd_index)); 979*8595ffb5SSteen Hegelund 980*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0_SET 981*8595ffb5SSteen Hegelund (params->cfg_pll_reserve_3_0), 9822ff8a1eeSSteen Hegelund SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0, 983*8595ffb5SSteen Hegelund priv, 984*8595ffb5SSteen Hegelund SD25G_LANE_CMU_13(sd_index)); 985*8595ffb5SSteen Hegelund 986*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN_SET(params->l0_cfg_txcal_en), 9872ff8a1eeSSteen Hegelund SD25G_LANE_CMU_40_L0_CFG_TXCAL_EN, 988*8595ffb5SSteen Hegelund priv, 989*8595ffb5SSteen Hegelund SD25G_LANE_CMU_40(sd_index)); 990*8595ffb5SSteen Hegelund 991*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8_SET 9922ff8a1eeSSteen Hegelund (params->l0_cfg_tx_reserve_15_8), 9932ff8a1eeSSteen Hegelund SD25G_LANE_CMU_46_L0_CFG_TX_RESERVE_15_8, 994*8595ffb5SSteen Hegelund priv, 995*8595ffb5SSteen Hegelund SD25G_LANE_CMU_46(sd_index)); 996*8595ffb5SSteen Hegelund 997*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0_SET 998*8595ffb5SSteen Hegelund (params->l0_cfg_tx_reserve_7_0), 9992ff8a1eeSSteen Hegelund SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0, 1000*8595ffb5SSteen Hegelund priv, 1001*8595ffb5SSteen Hegelund SD25G_LANE_CMU_45(sd_index)); 1002*8595ffb5SSteen Hegelund 1003*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(0), 10042ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 1005*8595ffb5SSteen Hegelund priv, 1006*8595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 1007*8595ffb5SSteen Hegelund 1008*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(1), 10092ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 1010*8595ffb5SSteen Hegelund priv, 1011*8595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 1012*8595ffb5SSteen Hegelund 1013*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(0), 10142ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 1015*8595ffb5SSteen Hegelund priv, 1016*8595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 1017*8595ffb5SSteen Hegelund 1018*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(1), 10192ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 1020*8595ffb5SSteen Hegelund priv, 1021*8595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 1022*8595ffb5SSteen Hegelund 1023*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(0), 10242ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 1025*8595ffb5SSteen Hegelund priv, 1026*8595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 1027*8595ffb5SSteen Hegelund 1028*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(1), 10292ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 1030*8595ffb5SSteen Hegelund priv, 1031*8595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 1032*8595ffb5SSteen Hegelund 1033*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0_SET(params->r_d_width_ctrl_2_0), 10342ff8a1eeSSteen Hegelund SD25G_LANE_CMU_1A_R_DWIDTHCTRL_2_0, 1035*8595ffb5SSteen Hegelund priv, 1036*8595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 1037*8595ffb5SSteen Hegelund 1038*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0_SET 10392ff8a1eeSSteen Hegelund (params->r_txfifo_ck_div_pmad_2_0) | 10402ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0_SET 10412ff8a1eeSSteen Hegelund (params->r_rxfifo_ck_div_pmad_2_0), 10422ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_TXFIFO_CK_DIV_PMAD_2_0 | 10432ff8a1eeSSteen Hegelund SD25G_LANE_CMU_30_R_RXFIFO_CK_DIV_PMAD_2_0, 1044*8595ffb5SSteen Hegelund priv, 1045*8595ffb5SSteen Hegelund SD25G_LANE_CMU_30(sd_index)); 1046*8595ffb5SSteen Hegelund 1047*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET_SET(params->cfg_pll_lol_set) | 1048*8595ffb5SSteen Hegelund SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0_SET 1049*8595ffb5SSteen Hegelund (params->cfg_vco_div_mode_1_0), 10502ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET | 10512ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0, 1052*8595ffb5SSteen Hegelund priv, 1053*8595ffb5SSteen Hegelund SD25G_LANE_CMU_0C(sd_index)); 1054*8595ffb5SSteen Hegelund 1055*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0_SET 1056*8595ffb5SSteen Hegelund (params->cfg_pre_divsel_1_0), 10572ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0, 1058*8595ffb5SSteen Hegelund priv, 1059*8595ffb5SSteen Hegelund SD25G_LANE_CMU_0D(sd_index)); 1060*8595ffb5SSteen Hegelund 1061*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0_SET(params->cfg_sel_div_3_0), 10622ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0E_CFG_SEL_DIV_3_0, 1063*8595ffb5SSteen Hegelund priv, 1064*8595ffb5SSteen Hegelund SD25G_LANE_CMU_0E(sd_index)); 1065*8595ffb5SSteen Hegelund 1066*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0x00), 10672ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 1068*8595ffb5SSteen Hegelund priv, 1069*8595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 1070*8595ffb5SSteen Hegelund 1071*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 10722ff8a1eeSSteen Hegelund (params->cfg_pma_tx_ck_bitwidth_2_0), 10732ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0C_LN_CFG_PMA_TX_CK_BITWIDTH_2_0, 1074*8595ffb5SSteen Hegelund priv, 1075*8595ffb5SSteen Hegelund SD25G_LANE_LANE_0C(sd_index)); 1076*8595ffb5SSteen Hegelund 1077*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0_SET 1078*8595ffb5SSteen Hegelund (params->cfg_tx_prediv_1_0), 10792ff8a1eeSSteen Hegelund SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0, 1080*8595ffb5SSteen Hegelund priv, 1081*8595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 1082*8595ffb5SSteen Hegelund 1083*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0_SET 1084*8595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 10852ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0, 1086*8595ffb5SSteen Hegelund priv, 1087*8595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 1088*8595ffb5SSteen Hegelund 1089*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0_SET 1090*8595ffb5SSteen Hegelund (params->cfg_tx_subrate_2_0), 10912ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0, 1092*8595ffb5SSteen Hegelund priv, 1093*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 1094*8595ffb5SSteen Hegelund 1095*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0_SET 1096*8595ffb5SSteen Hegelund (params->cfg_rx_subrate_2_0), 10972ff8a1eeSSteen Hegelund SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0, 1098*8595ffb5SSteen Hegelund priv, 1099*8595ffb5SSteen Hegelund SD25G_LANE_LANE_28(sd_index)); 1100*8595ffb5SSteen Hegelund 1101*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 11022ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_CDRCK_EN, 1103*8595ffb5SSteen Hegelund priv, 1104*8595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 1105*8595ffb5SSteen Hegelund 1106*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1_SET 1107*8595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 11082ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1, 1109*8595ffb5SSteen Hegelund priv, 1110*8595ffb5SSteen Hegelund SD25G_LANE_LANE_0F(sd_index)); 1111*8595ffb5SSteen Hegelund 1112*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 11132ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 1114*8595ffb5SSteen Hegelund priv, 1115*8595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 1116*8595ffb5SSteen Hegelund 1117*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN_SET(params->cfg_pi_dfe_en), 11182ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1D_LN_CFG_PI_DFE_EN, 1119*8595ffb5SSteen Hegelund priv, 1120*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1D(sd_index)); 1121*8595ffb5SSteen Hegelund 1122*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_ECDR_PD_SET(params->cfg_ecdr_pd), 11232ff8a1eeSSteen Hegelund SD25G_LANE_LANE_19_LN_CFG_ECDR_PD, 1124*8595ffb5SSteen Hegelund priv, 1125*8595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 1126*8595ffb5SSteen Hegelund 1127*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0_SET 11282ff8a1eeSSteen Hegelund (params->cfg_itx_ipdriver_base_2_0), 11292ff8a1eeSSteen Hegelund SD25G_LANE_LANE_01_LN_CFG_ITX_IPDRIVER_BASE_2_0, 1130*8595ffb5SSteen Hegelund priv, 1131*8595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 1132*8595ffb5SSteen Hegelund 1133*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0_SET(params->cfg_tap_dly_4_0), 11342ff8a1eeSSteen Hegelund SD25G_LANE_LANE_03_LN_CFG_TAP_DLY_4_0, 1135*8595ffb5SSteen Hegelund priv, 1136*8595ffb5SSteen Hegelund SD25G_LANE_LANE_03(sd_index)); 1137*8595ffb5SSteen Hegelund 1138*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0_SET(params->cfg_tap_adv_3_0), 11392ff8a1eeSSteen Hegelund SD25G_LANE_LANE_06_LN_CFG_TAP_ADV_3_0, 1140*8595ffb5SSteen Hegelund priv, 1141*8595ffb5SSteen Hegelund SD25G_LANE_LANE_06(sd_index)); 1142*8595ffb5SSteen Hegelund 1143*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_07_LN_CFG_EN_ADV_SET(params->cfg_en_adv) | 11442ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_DLY_SET(params->cfg_en_dly), 11452ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_ADV | 11462ff8a1eeSSteen Hegelund SD25G_LANE_LANE_07_LN_CFG_EN_DLY, 1147*8595ffb5SSteen Hegelund priv, 1148*8595ffb5SSteen Hegelund SD25G_LANE_LANE_07(sd_index)); 1149*8595ffb5SSteen Hegelund 1150*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8_SET 1151*8595ffb5SSteen Hegelund (params->cfg_tx_reserve_15_8), 11522ff8a1eeSSteen Hegelund SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8, 1153*8595ffb5SSteen Hegelund priv, 1154*8595ffb5SSteen Hegelund SD25G_LANE_LANE_43(sd_index)); 1155*8595ffb5SSteen Hegelund 1156*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0_SET 1157*8595ffb5SSteen Hegelund (params->cfg_tx_reserve_7_0), 11582ff8a1eeSSteen Hegelund SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0, 1159*8595ffb5SSteen Hegelund priv, 1160*8595ffb5SSteen Hegelund SD25G_LANE_LANE_42(sd_index)); 1161*8595ffb5SSteen Hegelund 1162*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_05_LN_CFG_BW_1_0_SET(params->cfg_bw_1_0), 11632ff8a1eeSSteen Hegelund SD25G_LANE_LANE_05_LN_CFG_BW_1_0, 1164*8595ffb5SSteen Hegelund priv, 1165*8595ffb5SSteen Hegelund SD25G_LANE_LANE_05(sd_index)); 1166*8595ffb5SSteen Hegelund 1167*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN_SET 1168*8595ffb5SSteen Hegelund (params->cfg_txcal_man_en), 11692ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN, 1170*8595ffb5SSteen Hegelund priv, 1171*8595ffb5SSteen Hegelund SD25G_LANE_LANE_0B(sd_index)); 1172*8595ffb5SSteen Hegelund 1173*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0_SET 11742ff8a1eeSSteen Hegelund (params->cfg_txcal_shift_code_5_0), 11752ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0A_LN_CFG_TXCAL_SHIFT_CODE_5_0, 1176*8595ffb5SSteen Hegelund priv, 1177*8595ffb5SSteen Hegelund SD25G_LANE_LANE_0A(sd_index)); 1178*8595ffb5SSteen Hegelund 1179*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0_SET 11802ff8a1eeSSteen Hegelund (params->cfg_txcal_valid_sel_3_0), 11812ff8a1eeSSteen Hegelund SD25G_LANE_LANE_09_LN_CFG_TXCAL_VALID_SEL_3_0, 1182*8595ffb5SSteen Hegelund priv, 1183*8595ffb5SSteen Hegelund SD25G_LANE_LANE_09(sd_index)); 1184*8595ffb5SSteen Hegelund 1185*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0_SET(params->cfg_cdr_kf_2_0), 11862ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1A_LN_CFG_CDR_KF_2_0, 1187*8595ffb5SSteen Hegelund priv, 1188*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1A(sd_index)); 1189*8595ffb5SSteen Hegelund 1190*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0_SET(params->cfg_cdr_m_7_0), 11912ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1B_LN_CFG_CDR_M_7_0, 1192*8595ffb5SSteen Hegelund priv, 1193*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1B(sd_index)); 1194*8595ffb5SSteen Hegelund 1195*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0_SET(params->cfg_pi_bw_3_0), 11962ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2B_LN_CFG_PI_BW_3_0, 1197*8595ffb5SSteen Hegelund priv, 1198*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2B(sd_index)); 1199*8595ffb5SSteen Hegelund 1200*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER_SET 1201*8595ffb5SSteen Hegelund (params->cfg_dis_2ndorder), 12022ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER, 1203*8595ffb5SSteen Hegelund priv, 1204*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 1205*8595ffb5SSteen Hegelund 1206*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN_SET(params->cfg_ctle_rstn), 12072ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_CTLE_RSTN, 1208*8595ffb5SSteen Hegelund priv, 1209*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 1210*8595ffb5SSteen Hegelund 1211*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0_SET 12122ff8a1eeSSteen Hegelund (params->cfg_itx_ipcml_base_1_0), 12132ff8a1eeSSteen Hegelund SD25G_LANE_LANE_00_LN_CFG_ITX_IPCML_BASE_1_0, 1214*8595ffb5SSteen Hegelund priv, 1215*8595ffb5SSteen Hegelund SD25G_LANE_LANE_00(sd_index)); 1216*8595ffb5SSteen Hegelund 1217*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0_SET 1218*8595ffb5SSteen Hegelund (params->cfg_rx_reserve_7_0), 12192ff8a1eeSSteen Hegelund SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0, 1220*8595ffb5SSteen Hegelund priv, 1221*8595ffb5SSteen Hegelund SD25G_LANE_LANE_44(sd_index)); 1222*8595ffb5SSteen Hegelund 1223*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8_SET 1224*8595ffb5SSteen Hegelund (params->cfg_rx_reserve_15_8), 12252ff8a1eeSSteen Hegelund SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8, 1226*8595ffb5SSteen Hegelund priv, 1227*8595ffb5SSteen Hegelund SD25G_LANE_LANE_45(sd_index)); 1228*8595ffb5SSteen Hegelund 1229*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN_SET(params->cfg_dfeck_en) | 12302ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0_SET(params->cfg_rxterm_2_0), 12312ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_DFECK_EN | 12322ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0D_LN_CFG_RXTERM_2_0, 1233*8595ffb5SSteen Hegelund priv, 1234*8595ffb5SSteen Hegelund SD25G_LANE_LANE_0D(sd_index)); 1235*8595ffb5SSteen Hegelund 1236*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0_SET 12372ff8a1eeSSteen Hegelund (params->cfg_vga_ctrl_byp_4_0), 12382ff8a1eeSSteen Hegelund SD25G_LANE_LANE_21_LN_CFG_VGA_CTRL_BYP_4_0, 1239*8595ffb5SSteen Hegelund priv, 1240*8595ffb5SSteen Hegelund SD25G_LANE_LANE_21(sd_index)); 1241*8595ffb5SSteen Hegelund 1242*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0_SET 1243*8595ffb5SSteen Hegelund (params->cfg_eqr_force_3_0), 12442ff8a1eeSSteen Hegelund SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0, 1245*8595ffb5SSteen Hegelund priv, 1246*8595ffb5SSteen Hegelund SD25G_LANE_LANE_22(sd_index)); 1247*8595ffb5SSteen Hegelund 1248*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0_SET 1249*8595ffb5SSteen Hegelund (params->cfg_eqc_force_3_0) | 12502ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_DFE_PD_SET(params->cfg_dfe_pd), 12512ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0 | 12522ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_DFE_PD, 1253*8595ffb5SSteen Hegelund priv, 1254*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 1255*8595ffb5SSteen Hegelund 1256*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN_SET 1257*8595ffb5SSteen Hegelund (params->cfg_sum_setcm_en), 12582ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN, 1259*8595ffb5SSteen Hegelund priv, 1260*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 1261*8595ffb5SSteen Hegelund 1262*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0_SET 12632ff8a1eeSSteen Hegelund (params->cfg_init_pos_iscan_6_0), 12642ff8a1eeSSteen Hegelund SD25G_LANE_LANE_25_LN_CFG_INIT_POS_ISCAN_6_0, 1265*8595ffb5SSteen Hegelund priv, 1266*8595ffb5SSteen Hegelund SD25G_LANE_LANE_25(sd_index)); 1267*8595ffb5SSteen Hegelund 1268*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0_SET 12692ff8a1eeSSteen Hegelund (params->cfg_init_pos_ipi_6_0), 12702ff8a1eeSSteen Hegelund SD25G_LANE_LANE_26_LN_CFG_INIT_POS_IPI_6_0, 1271*8595ffb5SSteen Hegelund priv, 1272*8595ffb5SSteen Hegelund SD25G_LANE_LANE_26(sd_index)); 1273*8595ffb5SSteen Hegelund 1274*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD_SET(params->cfg_erramp_pd), 12752ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_ERRAMP_PD, 1276*8595ffb5SSteen Hegelund priv, 1277*8595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 1278*8595ffb5SSteen Hegelund 1279*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0_SET 1280*8595ffb5SSteen Hegelund (params->cfg_dfedig_m_2_0), 12812ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0, 1282*8595ffb5SSteen Hegelund priv, 1283*8595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 1284*8595ffb5SSteen Hegelund 1285*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG_SET(params->cfg_en_dfedig), 12862ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0E_LN_CFG_EN_DFEDIG, 1287*8595ffb5SSteen Hegelund priv, 1288*8595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 1289*8595ffb5SSteen Hegelund 1290*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_40_LN_R_TX_POL_INV_SET(params->r_tx_pol_inv) | 12912ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_RX_POL_INV_SET(params->r_rx_pol_inv), 12922ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_TX_POL_INV | 12932ff8a1eeSSteen Hegelund SD25G_LANE_LANE_40_LN_R_RX_POL_INV, 1294*8595ffb5SSteen Hegelund priv, 1295*8595ffb5SSteen Hegelund SD25G_LANE_LANE_40(sd_index)); 1296*8595ffb5SSteen Hegelund 1297*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN_SET(params->cfg_rx2tx_lp_en) | 12982ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN_SET(params->cfg_tx2rx_lp_en), 12992ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_RX2TX_LP_EN | 13002ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_TX2RX_LP_EN, 1301*8595ffb5SSteen Hegelund priv, 1302*8595ffb5SSteen Hegelund SD25G_LANE_LANE_04(sd_index)); 1303*8595ffb5SSteen Hegelund 1304*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN_SET(params->cfg_rxlb_en), 13052ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1E_LN_CFG_RXLB_EN, 1306*8595ffb5SSteen Hegelund priv, 1307*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 1308*8595ffb5SSteen Hegelund 1309*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_19_LN_CFG_TXLB_EN_SET(params->cfg_txlb_en), 13102ff8a1eeSSteen Hegelund SD25G_LANE_LANE_19_LN_CFG_TXLB_EN, 1311*8595ffb5SSteen Hegelund priv, 1312*8595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 1313*8595ffb5SSteen Hegelund 1314*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(0), 13152ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 1316*8595ffb5SSteen Hegelund priv, 1317*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 1318*8595ffb5SSteen Hegelund 1319*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(1), 13202ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 1321*8595ffb5SSteen Hegelund priv, 1322*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 1323*8595ffb5SSteen Hegelund 1324*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(0), 13252ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 1326*8595ffb5SSteen Hegelund priv, 1327*8595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 1328*8595ffb5SSteen Hegelund 1329*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(0), 13302ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 1331*8595ffb5SSteen Hegelund priv, 1332*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 13332ff8a1eeSSteen Hegelund 13342ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 13352ff8a1eeSSteen Hegelund 1336*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(1), 13372ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 1338*8595ffb5SSteen Hegelund priv, 1339*8595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 13402ff8a1eeSSteen Hegelund 13412ff8a1eeSSteen Hegelund usleep_range(10000, 20000); 13422ff8a1eeSSteen Hegelund 1343*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xff), 13442ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 1345*8595ffb5SSteen Hegelund priv, 1346*8595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 13472ff8a1eeSSteen Hegelund 13482ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD25G_LANE_CMU_C0(sd_index))); 13492ff8a1eeSSteen Hegelund value = SD25G_LANE_CMU_C0_PLL_LOL_UDL_GET(value); 13502ff8a1eeSSteen Hegelund 13512ff8a1eeSSteen Hegelund if (value) { 13522ff8a1eeSSteen Hegelund dev_err(dev, "25G PLL Loss of Lock: 0x%x\n", value); 13532ff8a1eeSSteen Hegelund return -EINVAL; 13542ff8a1eeSSteen Hegelund } 13552ff8a1eeSSteen Hegelund 13562ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD_LANE_25G_SD_LANE_STAT(sd_index))); 13572ff8a1eeSSteen Hegelund value = SD_LANE_25G_SD_LANE_STAT_PMA_RST_DONE_GET(value); 13582ff8a1eeSSteen Hegelund 13592ff8a1eeSSteen Hegelund if (value != 0x1) { 13602ff8a1eeSSteen Hegelund dev_err(dev, "25G PMA Reset failed: 0x%x\n", value); 13612ff8a1eeSSteen Hegelund return -EINVAL; 13622ff8a1eeSSteen Hegelund } 1363*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS_SET(0x1), 1364*8595ffb5SSteen Hegelund SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS, 1365*8595ffb5SSteen Hegelund priv, 1366*8595ffb5SSteen Hegelund SD25G_LANE_CMU_2A(sd_index)); 1367*8595ffb5SSteen Hegelund 1368*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_SER_RST_SER_RST_SET(0x0), 1369*8595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST_SER_RST, 1370*8595ffb5SSteen Hegelund priv, 1371*8595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST(sd_index)); 1372*8595ffb5SSteen Hegelund 1373*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_DES_RST_DES_RST_SET(0x0), 1374*8595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST_DES_RST, 1375*8595ffb5SSteen Hegelund priv, 1376*8595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST(sd_index)); 1377*8595ffb5SSteen Hegelund 1378*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0), 1379*8595ffb5SSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 1380*8595ffb5SSteen Hegelund priv, 1381*8595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 1382*8595ffb5SSteen Hegelund 1383*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0_SET 1384*8595ffb5SSteen Hegelund (params->cfg_alos_thr_2_0), 1385*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0, 1386*8595ffb5SSteen Hegelund priv, 1387*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2D(sd_index)); 1388*8595ffb5SSteen Hegelund 1389*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ_SET(0), 1390*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ, 1391*8595ffb5SSteen Hegelund priv, 1392*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 1393*8595ffb5SSteen Hegelund 1394*8595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_PD_SQ_SET(0), 1395*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_PD_SQ, 1396*8595ffb5SSteen Hegelund priv, 1397*8595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 1398*8595ffb5SSteen Hegelund 13992ff8a1eeSSteen Hegelund return 0; 14002ff8a1eeSSteen Hegelund } 14012ff8a1eeSSteen Hegelund 1402*8595ffb5SSteen Hegelund static void sparx5_sd10g28_reset(void __iomem *regs[], u32 lane_index) 14032ff8a1eeSSteen Hegelund { 14042ff8a1eeSSteen Hegelund /* Note: SerDes SD10G_LANE_1 is configured in 10G_LAN mode */ 14052ff8a1eeSSteen Hegelund sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(1), 14062ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 14072ff8a1eeSSteen Hegelund sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 14082ff8a1eeSSteen Hegelund 14092ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 1410*8595ffb5SSteen Hegelund 1411*8595ffb5SSteen Hegelund sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 1412*8595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 1413*8595ffb5SSteen Hegelund sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 14142ff8a1eeSSteen Hegelund } 14152ff8a1eeSSteen Hegelund 1416*8595ffb5SSteen Hegelund static int sparx5_sd10g28_apply_params(struct sparx5_serdes_macro *macro, 1417*8595ffb5SSteen Hegelund struct sparx5_sd10g28_params *params) 14182ff8a1eeSSteen Hegelund { 1419*8595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 1420*8595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 1421*8595ffb5SSteen Hegelund struct device *dev = priv->dev; 1422*8595ffb5SSteen Hegelund u32 lane_index = macro->sidx; 1423*8595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 1424*8595ffb5SSteen Hegelund void __iomem *sd_inst; 1425*8595ffb5SSteen Hegelund u32 value; 1426*8595ffb5SSteen Hegelund 1427*8595ffb5SSteen Hegelund if (params->is_6g) 1428*8595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, sd_index); 1429*8595ffb5SSteen Hegelund else 1430*8595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, sd_index); 1431*8595ffb5SSteen Hegelund 1432*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(1), 14332ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 1434*8595ffb5SSteen Hegelund priv, 1435*8595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 1436*8595ffb5SSteen Hegelund 1437*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT_SET(0x0) | 14382ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_REG_MANUAL_SET(0x1) | 14392ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT_SET(0x1) | 14402ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT_SET(0x1) | 14412ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL_SET(0x0), 14422ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_DWIDTHCTRL_FROM_HWT | 14432ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_REG_MANUAL | 14442ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_AUXCKSEL_FROM_HWT | 14452ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_LANE_ID_FROM_HWT | 14462ff8a1eeSSteen Hegelund SD10G_LANE_LANE_93_R_EN_RATECHG_CTRL, 1447*8595ffb5SSteen Hegelund sd_inst, 1448*8595ffb5SSteen Hegelund SD10G_LANE_LANE_93(sd_index)); 1449*8595ffb5SSteen Hegelund 1450*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_94_R_ISCAN_REG_SET(0x1) | 14512ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_TXEQ_REG_SET(0x1) | 14522ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_MISC_REG_SET(0x1) | 14532ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_SWING_REG_SET(0x1), 14542ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_ISCAN_REG | 14552ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_TXEQ_REG | 14562ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_MISC_REG | 14572ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_SWING_REG, 1458*8595ffb5SSteen Hegelund sd_inst, 1459*8595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 1460*8595ffb5SSteen Hegelund 1461*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_RXEQ_REG_SET(0x1), 14622ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_RXEQ_REG, 1463*8595ffb5SSteen Hegelund sd_inst, 1464*8595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 1465*8595ffb5SSteen Hegelund 1466*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_A1_R_SSC_FROM_HWT_SET(0x0) | 14672ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_CDR_FROM_HWT_SET(0x0) | 14682ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT_SET(0x1), 14692ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_SSC_FROM_HWT | 14702ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_CDR_FROM_HWT | 14712ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A1_R_PCLK_GATING_FROM_HWT, 1472*8595ffb5SSteen Hegelund sd_inst, 1473*8595ffb5SSteen Hegelund SD10G_LANE_LANE_A1(sd_index)); 1474*8595ffb5SSteen Hegelund 1475*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_RX_REF_SEL_SET(params->cmu_sel) | 14762ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_TX_REF_SEL_SET(params->cmu_sel), 14772ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_RX_REF_SEL | 14782ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_TX_REF_SEL, 1479*8595ffb5SSteen Hegelund priv, 1480*8595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 1481*8595ffb5SSteen Hegelund 1482*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0_SET 1483*8595ffb5SSteen Hegelund (params->cfg_lane_reserve_7_0), 14842ff8a1eeSSteen Hegelund SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0, 1485*8595ffb5SSteen Hegelund sd_inst, 1486*8595ffb5SSteen Hegelund SD10G_LANE_LANE_40(sd_index)); 1487*8595ffb5SSteen Hegelund 1488*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL_SET 1489*8595ffb5SSteen Hegelund (params->cfg_ssc_rtl_clk_sel), 14902ff8a1eeSSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL, 1491*8595ffb5SSteen Hegelund sd_inst, 1492*8595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 1493*8595ffb5SSteen Hegelund 1494*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_35_CFG_TXRATE_1_0_SET 1495*8595ffb5SSteen Hegelund (params->cfg_txrate_1_0) | 1496*8595ffb5SSteen Hegelund SD10G_LANE_LANE_35_CFG_RXRATE_1_0_SET 1497*8595ffb5SSteen Hegelund (params->cfg_rxrate_1_0), 14982ff8a1eeSSteen Hegelund SD10G_LANE_LANE_35_CFG_TXRATE_1_0 | 14992ff8a1eeSSteen Hegelund SD10G_LANE_LANE_35_CFG_RXRATE_1_0, 1500*8595ffb5SSteen Hegelund sd_inst, 1501*8595ffb5SSteen Hegelund SD10G_LANE_LANE_35(sd_index)); 1502*8595ffb5SSteen Hegelund 1503*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0_SET 1504*8595ffb5SSteen Hegelund (params->r_d_width_ctrl_2_0), 15052ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0, 1506*8595ffb5SSteen Hegelund sd_inst, 1507*8595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 1508*8595ffb5SSteen Hegelund 1509*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0_SET 15102ff8a1eeSSteen Hegelund (params->cfg_pma_tx_ck_bitwidth_2_0), 15112ff8a1eeSSteen Hegelund SD10G_LANE_LANE_01_CFG_PMA_TX_CK_BITWIDTH_2_0, 1512*8595ffb5SSteen Hegelund sd_inst, 1513*8595ffb5SSteen Hegelund SD10G_LANE_LANE_01(sd_index)); 1514*8595ffb5SSteen Hegelund 1515*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0_SET 1516*8595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 15172ff8a1eeSSteen Hegelund SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0, 1518*8595ffb5SSteen Hegelund sd_inst, 1519*8595ffb5SSteen Hegelund SD10G_LANE_LANE_30(sd_index)); 1520*8595ffb5SSteen Hegelund 1521*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0_SET 15222ff8a1eeSSteen Hegelund (params->r_pcs2pma_phymode_4_0), 15232ff8a1eeSSteen Hegelund SD10G_LANE_LANE_A2_R_PCS2PMA_PHYMODE_4_0, 1524*8595ffb5SSteen Hegelund sd_inst, 1525*8595ffb5SSteen Hegelund SD10G_LANE_LANE_A2(sd_index)); 1526*8595ffb5SSteen Hegelund 1527*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_13_CFG_CDRCK_EN_SET(params->cfg_cdrck_en), 15282ff8a1eeSSteen Hegelund SD10G_LANE_LANE_13_CFG_CDRCK_EN, 1529*8595ffb5SSteen Hegelund sd_inst, 1530*8595ffb5SSteen Hegelund SD10G_LANE_LANE_13(sd_index)); 1531*8595ffb5SSteen Hegelund 1532*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_DFECK_EN_SET 1533*8595ffb5SSteen Hegelund (params->cfg_dfeck_en) | 15342ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFE_PD_SET(params->cfg_dfe_pd) | 1535*8595ffb5SSteen Hegelund SD10G_LANE_LANE_23_CFG_ERRAMP_PD_SET 1536*8595ffb5SSteen Hegelund (params->cfg_erramp_pd), 15372ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFECK_EN | 15382ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFE_PD | 15392ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_ERRAMP_PD, 1540*8595ffb5SSteen Hegelund sd_inst, 1541*8595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 1542*8595ffb5SSteen Hegelund 1543*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1_SET 1544*8595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 15452ff8a1eeSSteen Hegelund SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1, 1546*8595ffb5SSteen Hegelund sd_inst, 1547*8595ffb5SSteen Hegelund SD10G_LANE_LANE_22(sd_index)); 1548*8595ffb5SSteen Hegelund 1549*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_DFE_EN_SET 1550*8595ffb5SSteen Hegelund (params->cfg_pi_DFE_en), 15512ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_DFE_EN, 1552*8595ffb5SSteen Hegelund sd_inst, 1553*8595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 1554*8595ffb5SSteen Hegelund 1555*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_02_CFG_EN_ADV_SET(params->cfg_en_adv) | 15562ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_MAIN_SET(params->cfg_en_main) | 15572ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_DLY_SET(params->cfg_en_dly) | 1558*8595ffb5SSteen Hegelund SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0_SET 1559*8595ffb5SSteen Hegelund (params->cfg_tap_adv_3_0), 15602ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_ADV | 15612ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_MAIN | 15622ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_EN_DLY | 15632ff8a1eeSSteen Hegelund SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0, 1564*8595ffb5SSteen Hegelund sd_inst, 1565*8595ffb5SSteen Hegelund SD10G_LANE_LANE_02(sd_index)); 1566*8595ffb5SSteen Hegelund 1567*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_03_CFG_TAP_MAIN_SET(params->cfg_tap_main), 15682ff8a1eeSSteen Hegelund SD10G_LANE_LANE_03_CFG_TAP_MAIN, 1569*8595ffb5SSteen Hegelund sd_inst, 1570*8595ffb5SSteen Hegelund SD10G_LANE_LANE_03(sd_index)); 1571*8595ffb5SSteen Hegelund 1572*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0_SET 1573*8595ffb5SSteen Hegelund (params->cfg_tap_dly_4_0), 15742ff8a1eeSSteen Hegelund SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0, 1575*8595ffb5SSteen Hegelund sd_inst, 1576*8595ffb5SSteen Hegelund SD10G_LANE_LANE_04(sd_index)); 1577*8595ffb5SSteen Hegelund 1578*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0_SET 1579*8595ffb5SSteen Hegelund (params->cfg_vga_ctrl_3_0), 15802ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0, 1581*8595ffb5SSteen Hegelund sd_inst, 1582*8595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 1583*8595ffb5SSteen Hegelund 1584*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0_SET 1585*8595ffb5SSteen Hegelund (params->cfg_vga_cp_2_0), 15862ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0, 1587*8595ffb5SSteen Hegelund sd_inst, 1588*8595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 1589*8595ffb5SSteen Hegelund 1590*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0_SET 1591*8595ffb5SSteen Hegelund (params->cfg_eq_res_3_0), 15922ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0, 1593*8595ffb5SSteen Hegelund sd_inst, 1594*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 1595*8595ffb5SSteen Hegelund 1596*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0D_CFG_EQR_BYP_SET(params->cfg_eq_r_byp), 15972ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0D_CFG_EQR_BYP, 1598*8595ffb5SSteen Hegelund sd_inst, 1599*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0D(sd_index)); 1600*8595ffb5SSteen Hegelund 1601*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0_SET 1602*8595ffb5SSteen Hegelund (params->cfg_eq_c_force_3_0) | 1603*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN_SET 1604*8595ffb5SSteen Hegelund (params->cfg_sum_setcm_en), 16052ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0 | 16062ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN, 1607*8595ffb5SSteen Hegelund sd_inst, 1608*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 1609*8595ffb5SSteen Hegelund 1610*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_EN_DFEDIG_SET 1611*8595ffb5SSteen Hegelund (params->cfg_en_dfedig), 16122ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_EN_DFEDIG, 1613*8595ffb5SSteen Hegelund sd_inst, 1614*8595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 1615*8595ffb5SSteen Hegelund 1616*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_EN_PREEMPH_SET 1617*8595ffb5SSteen Hegelund (params->cfg_en_preemph), 16182ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_EN_PREEMPH, 1619*8595ffb5SSteen Hegelund sd_inst, 1620*8595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 1621*8595ffb5SSteen Hegelund 1622*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0_SET 16232ff8a1eeSSteen Hegelund (params->cfg_itx_ippreemp_base_1_0) | 16242ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0_SET 16252ff8a1eeSSteen Hegelund (params->cfg_itx_ipdriver_base_2_0), 16262ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPPREEMP_BASE_1_0 | 16272ff8a1eeSSteen Hegelund SD10G_LANE_LANE_33_CFG_ITX_IPDRIVER_BASE_2_0, 1628*8595ffb5SSteen Hegelund sd_inst, 1629*8595ffb5SSteen Hegelund SD10G_LANE_LANE_33(sd_index)); 1630*8595ffb5SSteen Hegelund 1631*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0_SET 16322ff8a1eeSSteen Hegelund (params->cfg_ibias_tune_reserve_5_0), 16332ff8a1eeSSteen Hegelund SD10G_LANE_LANE_52_CFG_IBIAS_TUNE_RESERVE_5_0, 1634*8595ffb5SSteen Hegelund sd_inst, 1635*8595ffb5SSteen Hegelund SD10G_LANE_LANE_52(sd_index)); 1636*8595ffb5SSteen Hegelund 1637*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_TXSWING_HALF_SET 1638*8595ffb5SSteen Hegelund (params->cfg_txswing_half), 16392ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_TXSWING_HALF, 1640*8595ffb5SSteen Hegelund sd_inst, 1641*8595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 1642*8595ffb5SSteen Hegelund 1643*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER_SET 1644*8595ffb5SSteen Hegelund (params->cfg_dis_2nd_order), 16452ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER, 1646*8595ffb5SSteen Hegelund sd_inst, 1647*8595ffb5SSteen Hegelund SD10G_LANE_LANE_3C(sd_index)); 1648*8595ffb5SSteen Hegelund 1649*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_39_CFG_RX_SSC_LH_SET 1650*8595ffb5SSteen Hegelund (params->cfg_rx_ssc_lh), 16512ff8a1eeSSteen Hegelund SD10G_LANE_LANE_39_CFG_RX_SSC_LH, 1652*8595ffb5SSteen Hegelund sd_inst, 1653*8595ffb5SSteen Hegelund SD10G_LANE_LANE_39(sd_index)); 1654*8595ffb5SSteen Hegelund 1655*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0_SET 16562ff8a1eeSSteen Hegelund (params->cfg_pi_floop_steps_1_0), 16572ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_FLOOP_STEPS_1_0, 1658*8595ffb5SSteen Hegelund sd_inst, 1659*8595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 1660*8595ffb5SSteen Hegelund 1661*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16_SET 1662*8595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_23_16), 16632ff8a1eeSSteen Hegelund SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16, 1664*8595ffb5SSteen Hegelund sd_inst, 1665*8595ffb5SSteen Hegelund SD10G_LANE_LANE_16(sd_index)); 1666*8595ffb5SSteen Hegelund 1667*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8_SET 1668*8595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_15_8), 16692ff8a1eeSSteen Hegelund SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8, 1670*8595ffb5SSteen Hegelund sd_inst, 1671*8595ffb5SSteen Hegelund SD10G_LANE_LANE_15(sd_index)); 1672*8595ffb5SSteen Hegelund 1673*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0_SET 16742ff8a1eeSSteen Hegelund (params->cfg_iscan_ext_dac_7_0), 16752ff8a1eeSSteen Hegelund SD10G_LANE_LANE_26_CFG_ISCAN_EXT_DAC_7_0, 1676*8595ffb5SSteen Hegelund sd_inst, 1677*8595ffb5SSteen Hegelund SD10G_LANE_LANE_26(sd_index)); 1678*8595ffb5SSteen Hegelund 1679*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0_SET 1680*8595ffb5SSteen Hegelund (params->cfg_cdr_kf_gen1_2_0), 16812ff8a1eeSSteen Hegelund SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0, 1682*8595ffb5SSteen Hegelund sd_inst, 1683*8595ffb5SSteen Hegelund SD10G_LANE_LANE_42(sd_index)); 1684*8595ffb5SSteen Hegelund 1685*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0_SET 1686*8595ffb5SSteen Hegelund (params->r_cdr_m_gen1_7_0), 16872ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0, 1688*8595ffb5SSteen Hegelund sd_inst, 1689*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0F(sd_index)); 1690*8595ffb5SSteen Hegelund 1691*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0_SET 1692*8595ffb5SSteen Hegelund (params->cfg_pi_bw_gen1_3_0), 16932ff8a1eeSSteen Hegelund SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0, 1694*8595ffb5SSteen Hegelund sd_inst, 1695*8595ffb5SSteen Hegelund SD10G_LANE_LANE_24(sd_index)); 1696*8595ffb5SSteen Hegelund 1697*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0_SET 1698*8595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_7_0), 16992ff8a1eeSSteen Hegelund SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0, 1700*8595ffb5SSteen Hegelund sd_inst, 1701*8595ffb5SSteen Hegelund SD10G_LANE_LANE_14(sd_index)); 1702*8595ffb5SSteen Hegelund 1703*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_STEPS_SET(params->cfg_pi_steps), 17042ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_STEPS, 1705*8595ffb5SSteen Hegelund sd_inst, 1706*8595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 1707*8595ffb5SSteen Hegelund 1708*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0_SET 1709*8595ffb5SSteen Hegelund (params->cfg_mp_max_3_0), 17102ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0, 1711*8595ffb5SSteen Hegelund sd_inst, 1712*8595ffb5SSteen Hegelund SD10G_LANE_LANE_3A(sd_index)); 1713*8595ffb5SSteen Hegelund 1714*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG_SET 1715*8595ffb5SSteen Hegelund (params->cfg_rstn_dfedig), 17162ff8a1eeSSteen Hegelund SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG, 1717*8595ffb5SSteen Hegelund sd_inst, 1718*8595ffb5SSteen Hegelund SD10G_LANE_LANE_31(sd_index)); 1719*8595ffb5SSteen Hegelund 1720*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0_SET 1721*8595ffb5SSteen Hegelund (params->cfg_alos_thr_3_0), 17222ff8a1eeSSteen Hegelund SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0, 1723*8595ffb5SSteen Hegelund sd_inst, 1724*8595ffb5SSteen Hegelund SD10G_LANE_LANE_48(sd_index)); 1725*8595ffb5SSteen Hegelund 1726*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0_SET 17272ff8a1eeSSteen Hegelund (params->cfg_predrv_slewrate_1_0), 17282ff8a1eeSSteen Hegelund SD10G_LANE_LANE_36_CFG_PREDRV_SLEWRATE_1_0, 1729*8595ffb5SSteen Hegelund sd_inst, 1730*8595ffb5SSteen Hegelund SD10G_LANE_LANE_36(sd_index)); 1731*8595ffb5SSteen Hegelund 1732*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0_SET 17332ff8a1eeSSteen Hegelund (params->cfg_itx_ipcml_base_1_0), 17342ff8a1eeSSteen Hegelund SD10G_LANE_LANE_32_CFG_ITX_IPCML_BASE_1_0, 1735*8595ffb5SSteen Hegelund sd_inst, 1736*8595ffb5SSteen Hegelund SD10G_LANE_LANE_32(sd_index)); 1737*8595ffb5SSteen Hegelund 1738*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0_SET 1739*8595ffb5SSteen Hegelund (params->cfg_ip_pre_base_1_0), 17402ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0, 1741*8595ffb5SSteen Hegelund sd_inst, 1742*8595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 1743*8595ffb5SSteen Hegelund 1744*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8_SET 17452ff8a1eeSSteen Hegelund (params->cfg_lane_reserve_15_8), 17462ff8a1eeSSteen Hegelund SD10G_LANE_LANE_41_CFG_LANE_RESERVE_15_8, 1747*8595ffb5SSteen Hegelund sd_inst, 1748*8595ffb5SSteen Hegelund SD10G_LANE_LANE_41(sd_index)); 1749*8595ffb5SSteen Hegelund 1750*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN_SET 1751*8595ffb5SSteen Hegelund (params->r_en_auto_cdr_rstn), 17522ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN, 1753*8595ffb5SSteen Hegelund sd_inst, 1754*8595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 1755*8595ffb5SSteen Hegelund 1756*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0C_CFG_OSCAL_AFE_SET 1757*8595ffb5SSteen Hegelund (params->cfg_oscal_afe) | 1758*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE_SET 1759*8595ffb5SSteen Hegelund (params->cfg_pd_osdac_afe), 17602ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0C_CFG_OSCAL_AFE | 17612ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE, 1762*8595ffb5SSteen Hegelund sd_inst, 1763*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0C(sd_index)); 1764*8595ffb5SSteen Hegelund 1765*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 17662ff8a1eeSSteen Hegelund (params->cfg_resetb_oscal_afe[0]), 17672ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 1768*8595ffb5SSteen Hegelund sd_inst, 1769*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 1770*8595ffb5SSteen Hegelund 1771*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE_SET 17722ff8a1eeSSteen Hegelund (params->cfg_resetb_oscal_afe[1]), 17732ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_RESETB_OSCAL_AFE, 1774*8595ffb5SSteen Hegelund sd_inst, 1775*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 1776*8595ffb5SSteen Hegelund 1777*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_83_R_TX_POL_INV_SET 1778*8595ffb5SSteen Hegelund (params->r_tx_pol_inv) | 1779*8595ffb5SSteen Hegelund SD10G_LANE_LANE_83_R_RX_POL_INV_SET 1780*8595ffb5SSteen Hegelund (params->r_rx_pol_inv), 17812ff8a1eeSSteen Hegelund SD10G_LANE_LANE_83_R_TX_POL_INV | 17822ff8a1eeSSteen Hegelund SD10G_LANE_LANE_83_R_RX_POL_INV, 1783*8595ffb5SSteen Hegelund sd_inst, 1784*8595ffb5SSteen Hegelund SD10G_LANE_LANE_83(sd_index)); 1785*8595ffb5SSteen Hegelund 1786*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN_SET 1787*8595ffb5SSteen Hegelund (params->cfg_rx2tx_lp_en) | 1788*8595ffb5SSteen Hegelund SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN_SET 1789*8595ffb5SSteen Hegelund (params->cfg_tx2rx_lp_en), 17902ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN | 17912ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN, 1792*8595ffb5SSteen Hegelund sd_inst, 1793*8595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 1794*8595ffb5SSteen Hegelund 1795*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_RXLB_EN_SET(params->cfg_rxlb_en) | 17962ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_TXLB_EN_SET(params->cfg_txlb_en), 17972ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_RXLB_EN | 17982ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0E_CFG_TXLB_EN, 1799*8595ffb5SSteen Hegelund sd_inst, 1800*8595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 18012ff8a1eeSSteen Hegelund 1802*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(0), 1803*8595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 1804*8595ffb5SSteen Hegelund priv, 1805*8595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 1806*8595ffb5SSteen Hegelund 1807*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 1808*8595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 1809*8595ffb5SSteen Hegelund sd_inst, 1810*8595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 1811*8595ffb5SSteen Hegelund 1812*8595ffb5SSteen Hegelund sdx5_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 1813*8595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 1814*8595ffb5SSteen Hegelund priv, 1815*8595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 1816*8595ffb5SSteen Hegelund 1817*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_SD_125_RST_DIS_SET(params->fx_100), 1818*8595ffb5SSteen Hegelund SD_LANE_MISC_SD_125_RST_DIS, 1819*8595ffb5SSteen Hegelund priv, 1820*8595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 1821*8595ffb5SSteen Hegelund 1822*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_RX_ENA_SET(params->fx_100), 1823*8595ffb5SSteen Hegelund SD_LANE_MISC_RX_ENA, 1824*8595ffb5SSteen Hegelund priv, 1825*8595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 1826*8595ffb5SSteen Hegelund 1827*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_MUX_ENA_SET(params->fx_100), 1828*8595ffb5SSteen Hegelund SD_LANE_MISC_MUX_ENA, 1829*8595ffb5SSteen Hegelund priv, 1830*8595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 1831*8595ffb5SSteen Hegelund 18322ff8a1eeSSteen Hegelund usleep_range(3000, 6000); 18332ff8a1eeSSteen Hegelund 18342ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD_LANE_SD_LANE_STAT(lane_index))); 18352ff8a1eeSSteen Hegelund value = SD_LANE_SD_LANE_STAT_PMA_RST_DONE_GET(value); 18362ff8a1eeSSteen Hegelund if (value != 1) { 18372ff8a1eeSSteen Hegelund dev_err(dev, "10G PMA Reset failed: 0x%x\n", value); 18382ff8a1eeSSteen Hegelund return -EINVAL; 18392ff8a1eeSSteen Hegelund } 18402ff8a1eeSSteen Hegelund 1841*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_SER_RST_SER_RST_SET(0x0), 18422ff8a1eeSSteen Hegelund SD_LANE_SD_SER_RST_SER_RST, 1843*8595ffb5SSteen Hegelund priv, 1844*8595ffb5SSteen Hegelund SD_LANE_SD_SER_RST(lane_index)); 18452ff8a1eeSSteen Hegelund 1846*8595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_DES_RST_DES_RST_SET(0x0), 18472ff8a1eeSSteen Hegelund SD_LANE_SD_DES_RST_DES_RST, 1848*8595ffb5SSteen Hegelund priv, 1849*8595ffb5SSteen Hegelund SD_LANE_SD_DES_RST(lane_index)); 18502ff8a1eeSSteen Hegelund 18512ff8a1eeSSteen Hegelund return 0; 18522ff8a1eeSSteen Hegelund } 18532ff8a1eeSSteen Hegelund 18542ff8a1eeSSteen Hegelund static int sparx5_sd25g28_config(struct sparx5_serdes_macro *macro, bool reset) 18552ff8a1eeSSteen Hegelund { 18562ff8a1eeSSteen Hegelund struct sparx5_sd25g28_media_preset media = media_presets_25g[macro->media]; 1857*8595ffb5SSteen Hegelund struct sparx5_sd25g28_mode_preset mode; 18582ff8a1eeSSteen Hegelund struct sparx5_sd25g28_args args = { 18592ff8a1eeSSteen Hegelund .rxinvert = 1, 18602ff8a1eeSSteen Hegelund .txinvert = 0, 18612ff8a1eeSSteen Hegelund .txswing = 240, 18622ff8a1eeSSteen Hegelund .com_pll_reserve = 0xf, 18632ff8a1eeSSteen Hegelund .reg_rst = reset, 18642ff8a1eeSSteen Hegelund }; 18652ff8a1eeSSteen Hegelund struct sparx5_sd25g28_params params; 18662ff8a1eeSSteen Hegelund int err; 18672ff8a1eeSSteen Hegelund 18682ff8a1eeSSteen Hegelund err = sparx5_sd10g25_get_mode_preset(macro, &mode); 18692ff8a1eeSSteen Hegelund if (err) 18702ff8a1eeSSteen Hegelund return err; 18712ff8a1eeSSteen Hegelund sparx5_sd25g28_get_params(macro, &media, &mode, &args, ¶ms); 18722ff8a1eeSSteen Hegelund sparx5_sd25g28_reset(macro->priv->regs, ¶ms, macro->stpidx); 1873*8595ffb5SSteen Hegelund return sparx5_sd25g28_apply_params(macro, ¶ms); 18742ff8a1eeSSteen Hegelund } 18752ff8a1eeSSteen Hegelund 18762ff8a1eeSSteen Hegelund static int sparx5_sd10g28_config(struct sparx5_serdes_macro *macro, bool reset) 18772ff8a1eeSSteen Hegelund { 18782ff8a1eeSSteen Hegelund struct sparx5_sd10g28_media_preset media = media_presets_10g[macro->media]; 1879*8595ffb5SSteen Hegelund struct sparx5_sd10g28_mode_preset mode; 1880*8595ffb5SSteen Hegelund struct sparx5_sd10g28_params params; 18812ff8a1eeSSteen Hegelund struct sparx5_sd10g28_args args = { 18822ff8a1eeSSteen Hegelund .is_6g = (macro->serdestype == SPX5_SDT_6G), 18832ff8a1eeSSteen Hegelund .txinvert = 0, 18842ff8a1eeSSteen Hegelund .rxinvert = 1, 18852ff8a1eeSSteen Hegelund .txswing = 240, 18862ff8a1eeSSteen Hegelund .reg_rst = reset, 18872ff8a1eeSSteen Hegelund }; 18882ff8a1eeSSteen Hegelund int err; 18892ff8a1eeSSteen Hegelund 18902ff8a1eeSSteen Hegelund err = sparx5_sd10g28_get_mode_preset(macro, &mode, &args); 18912ff8a1eeSSteen Hegelund if (err) 18922ff8a1eeSSteen Hegelund return err; 18932ff8a1eeSSteen Hegelund sparx5_sd10g28_get_params(macro, &media, &mode, &args, ¶ms); 1894*8595ffb5SSteen Hegelund sparx5_sd10g28_reset(macro->priv->regs, macro->sidx); 1895*8595ffb5SSteen Hegelund return sparx5_sd10g28_apply_params(macro, ¶ms); 18962ff8a1eeSSteen Hegelund } 18972ff8a1eeSSteen Hegelund 18982ff8a1eeSSteen Hegelund /* Power down serdes TX driver */ 18992ff8a1eeSSteen Hegelund static int sparx5_serdes_power_save(struct sparx5_serdes_macro *macro, u32 pwdn) 19002ff8a1eeSSteen Hegelund { 19012ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 1902*8595ffb5SSteen Hegelund void __iomem *sd_inst; 19032ff8a1eeSSteen Hegelund 19042ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_6G) 19052ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, macro->stpidx); 19062ff8a1eeSSteen Hegelund else if (macro->serdestype == SPX5_SDT_10G) 19072ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, macro->stpidx); 19082ff8a1eeSSteen Hegelund else 19092ff8a1eeSSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD25G_LANE, macro->stpidx); 19102ff8a1eeSSteen Hegelund 19112ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) { 19122ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER_SET(pwdn), 19132ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04_LN_CFG_PD_DRIVER, 19142ff8a1eeSSteen Hegelund sd_inst, 19152ff8a1eeSSteen Hegelund SD25G_LANE_LANE_04(0)); 19162ff8a1eeSSteen Hegelund } else { 19172ff8a1eeSSteen Hegelund /* 6G and 10G */ 19182ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_PD_DRIVER_SET(pwdn), 19192ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_PD_DRIVER, 19202ff8a1eeSSteen Hegelund sd_inst, 19212ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06(0)); 19222ff8a1eeSSteen Hegelund } 19232ff8a1eeSSteen Hegelund return 0; 19242ff8a1eeSSteen Hegelund } 19252ff8a1eeSSteen Hegelund 19262ff8a1eeSSteen Hegelund static int sparx5_serdes_clock_config(struct sparx5_serdes_macro *macro) 19272ff8a1eeSSteen Hegelund { 19282ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 19292ff8a1eeSSteen Hegelund 19302ff8a1eeSSteen Hegelund if (macro->serdesmode == SPX5_SD_MODE_100FX) { 19312ff8a1eeSSteen Hegelund u32 freq = priv->coreclock == 250000000 ? 2 : 19322ff8a1eeSSteen Hegelund priv->coreclock == 500000000 ? 1 : 0; 19332ff8a1eeSSteen Hegelund 19342ff8a1eeSSteen Hegelund sdx5_rmw(SD_LANE_MISC_CORE_CLK_FREQ_SET(freq), 19352ff8a1eeSSteen Hegelund SD_LANE_MISC_CORE_CLK_FREQ, 19362ff8a1eeSSteen Hegelund priv, 19372ff8a1eeSSteen Hegelund SD_LANE_MISC(macro->sidx)); 19382ff8a1eeSSteen Hegelund } 19392ff8a1eeSSteen Hegelund return 0; 19402ff8a1eeSSteen Hegelund } 19412ff8a1eeSSteen Hegelund 1942*8595ffb5SSteen Hegelund static int sparx5_cmu_apply_cfg(struct sparx5_serdes_private *priv, 19432ff8a1eeSSteen Hegelund u32 cmu_idx, 19442ff8a1eeSSteen Hegelund void __iomem *cmu_tgt, 19452ff8a1eeSSteen Hegelund void __iomem *cmu_cfg_tgt, 19462ff8a1eeSSteen Hegelund u32 spd10g) 19472ff8a1eeSSteen Hegelund { 1948*8595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 1949*8595ffb5SSteen Hegelund struct device *dev = priv->dev; 1950*8595ffb5SSteen Hegelund int value; 1951*8595ffb5SSteen Hegelund 1952*8595ffb5SSteen Hegelund cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 1953*8595ffb5SSteen Hegelund cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 1954*8595ffb5SSteen Hegelund 1955*8595ffb5SSteen Hegelund if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 1956*8595ffb5SSteen Hegelund cmu_idx == 10 || cmu_idx == 13) { 1957*8595ffb5SSteen Hegelund spd10g = 0; 1958*8595ffb5SSteen Hegelund } 1959*8595ffb5SSteen Hegelund 1960*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(1), 19612ff8a1eeSSteen Hegelund SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 1962*8595ffb5SSteen Hegelund cmu_cfg_tgt, 1963*8595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 1964*8595ffb5SSteen Hegelund 1965*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST_SET(0), 19662ff8a1eeSSteen Hegelund SD_CMU_CFG_SD_CMU_CFG_EXT_CFG_RST, 1967*8595ffb5SSteen Hegelund cmu_cfg_tgt, 1968*8595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 1969*8595ffb5SSteen Hegelund 1970*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(1), 19712ff8a1eeSSteen Hegelund SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 1972*8595ffb5SSteen Hegelund cmu_cfg_tgt, 1973*8595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 1974*8595ffb5SSteen Hegelund 1975*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT_SET(0x1) | 19762ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT_SET(0x1) | 19772ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT_SET(0x1) | 19782ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT_SET(0x1) | 19792ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_EN_RATECHG_CTRL_SET(0x0), 19802ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_DWIDTHCTRL_FROM_HWT | 19812ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_REFCK_SSC_EN_FROM_HWT | 19822ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_LINK_BUF_EN_FROM_HWT | 19832ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_BIAS_EN_FROM_HWT | 19842ff8a1eeSSteen Hegelund SD_CMU_CMU_45_R_EN_RATECHG_CTRL, 1985*8595ffb5SSteen Hegelund cmu_tgt, 1986*8595ffb5SSteen Hegelund SD_CMU_CMU_45(cmu_idx)); 19872ff8a1eeSSteen Hegelund 1988*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0_SET(0), 1989*8595ffb5SSteen Hegelund SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0, 1990*8595ffb5SSteen Hegelund cmu_tgt, 1991*8595ffb5SSteen Hegelund SD_CMU_CMU_47(cmu_idx)); 1992*8595ffb5SSteen Hegelund 1993*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_1B_CFG_RESERVE_7_0_SET(0), 1994*8595ffb5SSteen Hegelund SD_CMU_CMU_1B_CFG_RESERVE_7_0, 1995*8595ffb5SSteen Hegelund cmu_tgt, 1996*8595ffb5SSteen Hegelund SD_CMU_CMU_1B(cmu_idx)); 1997*8595ffb5SSteen Hegelund 1998*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_JC_BYP_SET(0x1), 1999*8595ffb5SSteen Hegelund SD_CMU_CMU_0D_CFG_JC_BYP, 2000*8595ffb5SSteen Hegelund cmu_tgt, 2001*8595ffb5SSteen Hegelund SD_CMU_CMU_0D(cmu_idx)); 2002*8595ffb5SSteen Hegelund 2003*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_1F_CFG_VTUNE_SEL_SET(1), 2004*8595ffb5SSteen Hegelund SD_CMU_CMU_1F_CFG_VTUNE_SEL, 2005*8595ffb5SSteen Hegelund cmu_tgt, 2006*8595ffb5SSteen Hegelund SD_CMU_CMU_1F(cmu_idx)); 2007*8595ffb5SSteen Hegelund 2008*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0_SET(3), 2009*8595ffb5SSteen Hegelund SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0, 2010*8595ffb5SSteen Hegelund cmu_tgt, 2011*8595ffb5SSteen Hegelund SD_CMU_CMU_00(cmu_idx)); 2012*8595ffb5SSteen Hegelund 2013*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0_SET(3), 2014*8595ffb5SSteen Hegelund SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0, 2015*8595ffb5SSteen Hegelund cmu_tgt, 2016*8595ffb5SSteen Hegelund SD_CMU_CMU_05(cmu_idx)); 2017*8595ffb5SSteen Hegelund 2018*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_30_R_PLL_DLOL_EN_SET(1), 2019*8595ffb5SSteen Hegelund SD_CMU_CMU_30_R_PLL_DLOL_EN, 2020*8595ffb5SSteen Hegelund cmu_tgt, 2021*8595ffb5SSteen Hegelund SD_CMU_CMU_30(cmu_idx)); 2022*8595ffb5SSteen Hegelund 2023*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_09_CFG_SW_10G_SET(spd10g), 2024*8595ffb5SSteen Hegelund SD_CMU_CMU_09_CFG_SW_10G, 2025*8595ffb5SSteen Hegelund cmu_tgt, 2026*8595ffb5SSteen Hegelund SD_CMU_CMU_09(cmu_idx)); 2027*8595ffb5SSteen Hegelund 2028*8595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(0), 2029*8595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 2030*8595ffb5SSteen Hegelund cmu_cfg_tgt, 2031*8595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 2032*8595ffb5SSteen Hegelund 20332ff8a1eeSSteen Hegelund msleep(20); 20342ff8a1eeSSteen Hegelund 20352ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(0), 20362ff8a1eeSSteen Hegelund SD_CMU_CMU_44_R_PLL_RSTN, 20372ff8a1eeSSteen Hegelund cmu_tgt, 20382ff8a1eeSSteen Hegelund SD_CMU_CMU_44(cmu_idx)); 20392ff8a1eeSSteen Hegelund 20402ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_44_R_PLL_RSTN_SET(1), 20412ff8a1eeSSteen Hegelund SD_CMU_CMU_44_R_PLL_RSTN, 20422ff8a1eeSSteen Hegelund cmu_tgt, 20432ff8a1eeSSteen Hegelund SD_CMU_CMU_44(cmu_idx)); 20442ff8a1eeSSteen Hegelund 20452ff8a1eeSSteen Hegelund msleep(20); 20462ff8a1eeSSteen Hegelund 20472ff8a1eeSSteen Hegelund value = readl(sdx5_addr(regs, SD_CMU_CMU_E0(cmu_idx))); 20482ff8a1eeSSteen Hegelund value = SD_CMU_CMU_E0_PLL_LOL_UDL_GET(value); 20492ff8a1eeSSteen Hegelund 20502ff8a1eeSSteen Hegelund if (value) { 20512ff8a1eeSSteen Hegelund dev_err(dev, "CMU PLL Loss of Lock: 0x%x\n", value); 20522ff8a1eeSSteen Hegelund return -EINVAL; 20532ff8a1eeSSteen Hegelund } 20542ff8a1eeSSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD_SET(0), 20552ff8a1eeSSteen Hegelund SD_CMU_CMU_0D_CFG_PMA_TX_CK_PD, 20562ff8a1eeSSteen Hegelund cmu_tgt, 20572ff8a1eeSSteen Hegelund SD_CMU_CMU_0D(cmu_idx)); 20582ff8a1eeSSteen Hegelund return 0; 20592ff8a1eeSSteen Hegelund } 20602ff8a1eeSSteen Hegelund 20612ff8a1eeSSteen Hegelund static int sparx5_cmu_cfg(struct sparx5_serdes_private *priv, u32 cmu_idx) 20622ff8a1eeSSteen Hegelund { 20632ff8a1eeSSteen Hegelund void __iomem *cmu_tgt, *cmu_cfg_tgt; 20642ff8a1eeSSteen Hegelund u32 spd10g = 1; 20652ff8a1eeSSteen Hegelund 20662ff8a1eeSSteen Hegelund if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 20672ff8a1eeSSteen Hegelund cmu_idx == 10 || cmu_idx == 13) { 20682ff8a1eeSSteen Hegelund spd10g = 0; 20692ff8a1eeSSteen Hegelund } 20702ff8a1eeSSteen Hegelund 20712ff8a1eeSSteen Hegelund cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 20722ff8a1eeSSteen Hegelund cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 20732ff8a1eeSSteen Hegelund 2074*8595ffb5SSteen Hegelund return sparx5_cmu_apply_cfg(priv, cmu_idx, cmu_tgt, cmu_cfg_tgt, spd10g); 20752ff8a1eeSSteen Hegelund } 20762ff8a1eeSSteen Hegelund 20772ff8a1eeSSteen Hegelund static int sparx5_serdes_cmu_enable(struct sparx5_serdes_private *priv) 20782ff8a1eeSSteen Hegelund { 20792ff8a1eeSSteen Hegelund int idx, err = 0; 20802ff8a1eeSSteen Hegelund 20812ff8a1eeSSteen Hegelund if (!priv->cmu_enabled) { 20822ff8a1eeSSteen Hegelund for (idx = 0; idx < SPX5_CMU_MAX; idx++) { 20832ff8a1eeSSteen Hegelund err = sparx5_cmu_cfg(priv, idx); 20842ff8a1eeSSteen Hegelund if (err) { 20852ff8a1eeSSteen Hegelund dev_err(priv->dev, "CMU %u, error: %d\n", idx, err); 20862ff8a1eeSSteen Hegelund goto leave; 20872ff8a1eeSSteen Hegelund } 20882ff8a1eeSSteen Hegelund } 20892ff8a1eeSSteen Hegelund priv->cmu_enabled = true; 20902ff8a1eeSSteen Hegelund } 20912ff8a1eeSSteen Hegelund leave: 20922ff8a1eeSSteen Hegelund return err; 20932ff8a1eeSSteen Hegelund } 20942ff8a1eeSSteen Hegelund 20952ff8a1eeSSteen Hegelund static int sparx5_serdes_get_serdesmode(phy_interface_t portmode, int speed) 20962ff8a1eeSSteen Hegelund { 20972ff8a1eeSSteen Hegelund switch (portmode) { 20982ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 20992ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 21002ff8a1eeSSteen Hegelund if (speed == SPEED_2500) 21012ff8a1eeSSteen Hegelund return SPX5_SD_MODE_2G5; 21022ff8a1eeSSteen Hegelund if (speed == SPEED_100) 21032ff8a1eeSSteen Hegelund return SPX5_SD_MODE_100FX; 21042ff8a1eeSSteen Hegelund return SPX5_SD_MODE_1000BASEX; 21052ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 21062ff8a1eeSSteen Hegelund /* The same Serdes mode is used for both SGMII and 1000BaseX */ 21072ff8a1eeSSteen Hegelund return SPX5_SD_MODE_1000BASEX; 21082ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 21092ff8a1eeSSteen Hegelund return SPX5_SD_MODE_QSGMII; 21102ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 21112ff8a1eeSSteen Hegelund return SPX5_SD_MODE_SFI; 21122ff8a1eeSSteen Hegelund default: 21132ff8a1eeSSteen Hegelund return -EINVAL; 21142ff8a1eeSSteen Hegelund } 21152ff8a1eeSSteen Hegelund } 21162ff8a1eeSSteen Hegelund 21172ff8a1eeSSteen Hegelund static int sparx5_serdes_config(struct sparx5_serdes_macro *macro) 21182ff8a1eeSSteen Hegelund { 21192ff8a1eeSSteen Hegelund struct device *dev = macro->priv->dev; 21202ff8a1eeSSteen Hegelund int serdesmode; 21212ff8a1eeSSteen Hegelund int err; 21222ff8a1eeSSteen Hegelund 21232ff8a1eeSSteen Hegelund err = sparx5_serdes_cmu_enable(macro->priv); 21242ff8a1eeSSteen Hegelund if (err) 21252ff8a1eeSSteen Hegelund return err; 21262ff8a1eeSSteen Hegelund 21272ff8a1eeSSteen Hegelund serdesmode = sparx5_serdes_get_serdesmode(macro->portmode, macro->speed); 21282ff8a1eeSSteen Hegelund if (serdesmode < 0) { 21292ff8a1eeSSteen Hegelund dev_err(dev, "SerDes %u, interface not supported: %s\n", 21302ff8a1eeSSteen Hegelund macro->sidx, 21312ff8a1eeSSteen Hegelund phy_modes(macro->portmode)); 21322ff8a1eeSSteen Hegelund return serdesmode; 21332ff8a1eeSSteen Hegelund } 21342ff8a1eeSSteen Hegelund macro->serdesmode = serdesmode; 21352ff8a1eeSSteen Hegelund 21362ff8a1eeSSteen Hegelund sparx5_serdes_clock_config(macro); 21372ff8a1eeSSteen Hegelund 21382ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) 21392ff8a1eeSSteen Hegelund err = sparx5_sd25g28_config(macro, false); 21402ff8a1eeSSteen Hegelund else 21412ff8a1eeSSteen Hegelund err = sparx5_sd10g28_config(macro, false); 21422ff8a1eeSSteen Hegelund if (err) { 21432ff8a1eeSSteen Hegelund dev_err(dev, "SerDes %u, config error: %d\n", 21442ff8a1eeSSteen Hegelund macro->sidx, err); 21452ff8a1eeSSteen Hegelund } 21462ff8a1eeSSteen Hegelund return err; 21472ff8a1eeSSteen Hegelund } 21482ff8a1eeSSteen Hegelund 21492ff8a1eeSSteen Hegelund static int sparx5_serdes_power_on(struct phy *phy) 21502ff8a1eeSSteen Hegelund { 21512ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 21522ff8a1eeSSteen Hegelund 21532ff8a1eeSSteen Hegelund return sparx5_serdes_power_save(macro, false); 21542ff8a1eeSSteen Hegelund } 21552ff8a1eeSSteen Hegelund 21562ff8a1eeSSteen Hegelund static int sparx5_serdes_power_off(struct phy *phy) 21572ff8a1eeSSteen Hegelund { 21582ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 21592ff8a1eeSSteen Hegelund 21602ff8a1eeSSteen Hegelund return sparx5_serdes_power_save(macro, true); 21612ff8a1eeSSteen Hegelund } 21622ff8a1eeSSteen Hegelund 21632ff8a1eeSSteen Hegelund static int sparx5_serdes_set_mode(struct phy *phy, enum phy_mode mode, int submode) 21642ff8a1eeSSteen Hegelund { 21652ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro; 21662ff8a1eeSSteen Hegelund 21672ff8a1eeSSteen Hegelund if (mode != PHY_MODE_ETHERNET) 21682ff8a1eeSSteen Hegelund return -EINVAL; 21692ff8a1eeSSteen Hegelund 21702ff8a1eeSSteen Hegelund switch (submode) { 21712ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 21722ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 21732ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 21742ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 21752ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 21762ff8a1eeSSteen Hegelund macro = phy_get_drvdata(phy); 21772ff8a1eeSSteen Hegelund macro->portmode = submode; 21782ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 21792ff8a1eeSSteen Hegelund return 0; 21802ff8a1eeSSteen Hegelund default: 21812ff8a1eeSSteen Hegelund return -EINVAL; 21822ff8a1eeSSteen Hegelund } 21832ff8a1eeSSteen Hegelund } 21842ff8a1eeSSteen Hegelund 21852ff8a1eeSSteen Hegelund static int sparx5_serdes_set_media(struct phy *phy, enum phy_media media) 21862ff8a1eeSSteen Hegelund { 21872ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 21882ff8a1eeSSteen Hegelund 21892ff8a1eeSSteen Hegelund if (media != macro->media) { 21902ff8a1eeSSteen Hegelund macro->media = media; 21912ff8a1eeSSteen Hegelund if (macro->serdesmode != SPX5_SD_MODE_NONE) 21922ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 21932ff8a1eeSSteen Hegelund } 21942ff8a1eeSSteen Hegelund return 0; 21952ff8a1eeSSteen Hegelund } 21962ff8a1eeSSteen Hegelund 21972ff8a1eeSSteen Hegelund static int sparx5_serdes_set_speed(struct phy *phy, int speed) 21982ff8a1eeSSteen Hegelund { 21992ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22002ff8a1eeSSteen Hegelund 22012ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_10G_START && speed > SPEED_5000) 22022ff8a1eeSSteen Hegelund return -EINVAL; 22032ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_25G_START && speed > SPEED_10000) 22042ff8a1eeSSteen Hegelund return -EINVAL; 22052ff8a1eeSSteen Hegelund if (speed != macro->speed) { 22062ff8a1eeSSteen Hegelund macro->speed = speed; 22072ff8a1eeSSteen Hegelund if (macro->serdesmode != SPX5_SD_MODE_NONE) 22082ff8a1eeSSteen Hegelund sparx5_serdes_config(macro); 22092ff8a1eeSSteen Hegelund } 22102ff8a1eeSSteen Hegelund return 0; 22112ff8a1eeSSteen Hegelund } 22122ff8a1eeSSteen Hegelund 22132ff8a1eeSSteen Hegelund static int sparx5_serdes_reset(struct phy *phy) 22142ff8a1eeSSteen Hegelund { 22152ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22162ff8a1eeSSteen Hegelund int err; 22172ff8a1eeSSteen Hegelund 22182ff8a1eeSSteen Hegelund err = sparx5_serdes_cmu_enable(macro->priv); 22192ff8a1eeSSteen Hegelund if (err) 22202ff8a1eeSSteen Hegelund return err; 22212ff8a1eeSSteen Hegelund if (macro->serdestype == SPX5_SDT_25G) 22222ff8a1eeSSteen Hegelund err = sparx5_sd25g28_config(macro, true); 22232ff8a1eeSSteen Hegelund else 22242ff8a1eeSSteen Hegelund err = sparx5_sd10g28_config(macro, true); 22252ff8a1eeSSteen Hegelund if (err) { 22262ff8a1eeSSteen Hegelund dev_err(&phy->dev, "SerDes %u, reset error: %d\n", 22272ff8a1eeSSteen Hegelund macro->sidx, err); 22282ff8a1eeSSteen Hegelund } 22292ff8a1eeSSteen Hegelund return err; 22302ff8a1eeSSteen Hegelund } 22312ff8a1eeSSteen Hegelund 22322ff8a1eeSSteen Hegelund static int sparx5_serdes_validate(struct phy *phy, enum phy_mode mode, 22332ff8a1eeSSteen Hegelund int submode, 22342ff8a1eeSSteen Hegelund union phy_configure_opts *opts) 22352ff8a1eeSSteen Hegelund { 22362ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = phy_get_drvdata(phy); 22372ff8a1eeSSteen Hegelund 22382ff8a1eeSSteen Hegelund if (mode != PHY_MODE_ETHERNET) 22392ff8a1eeSSteen Hegelund return -EINVAL; 22402ff8a1eeSSteen Hegelund 22412ff8a1eeSSteen Hegelund if (macro->speed == 0) 22422ff8a1eeSSteen Hegelund return -EINVAL; 22432ff8a1eeSSteen Hegelund 22442ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_10G_START && macro->speed > SPEED_5000) 22452ff8a1eeSSteen Hegelund return -EINVAL; 22462ff8a1eeSSteen Hegelund if (macro->sidx < SPX5_SERDES_25G_START && macro->speed > SPEED_10000) 22472ff8a1eeSSteen Hegelund return -EINVAL; 22482ff8a1eeSSteen Hegelund 22492ff8a1eeSSteen Hegelund switch (submode) { 22502ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_1000BASEX: 22512ff8a1eeSSteen Hegelund if (macro->speed != SPEED_100 && /* This is for 100BASE-FX */ 22522ff8a1eeSSteen Hegelund macro->speed != SPEED_1000) 22532ff8a1eeSSteen Hegelund return -EINVAL; 22542ff8a1eeSSteen Hegelund break; 22552ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_SGMII: 22562ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_2500BASEX: 22572ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_QSGMII: 22582ff8a1eeSSteen Hegelund if (macro->speed >= SPEED_5000) 22592ff8a1eeSSteen Hegelund return -EINVAL; 22602ff8a1eeSSteen Hegelund break; 22612ff8a1eeSSteen Hegelund case PHY_INTERFACE_MODE_10GBASER: 22622ff8a1eeSSteen Hegelund if (macro->speed < SPEED_5000) 22632ff8a1eeSSteen Hegelund return -EINVAL; 22642ff8a1eeSSteen Hegelund break; 22652ff8a1eeSSteen Hegelund default: 22662ff8a1eeSSteen Hegelund return -EINVAL; 22672ff8a1eeSSteen Hegelund } 22682ff8a1eeSSteen Hegelund return 0; 22692ff8a1eeSSteen Hegelund } 22702ff8a1eeSSteen Hegelund 22712ff8a1eeSSteen Hegelund static const struct phy_ops sparx5_serdes_ops = { 22722ff8a1eeSSteen Hegelund .power_on = sparx5_serdes_power_on, 22732ff8a1eeSSteen Hegelund .power_off = sparx5_serdes_power_off, 22742ff8a1eeSSteen Hegelund .set_mode = sparx5_serdes_set_mode, 22752ff8a1eeSSteen Hegelund .set_media = sparx5_serdes_set_media, 22762ff8a1eeSSteen Hegelund .set_speed = sparx5_serdes_set_speed, 22772ff8a1eeSSteen Hegelund .reset = sparx5_serdes_reset, 22782ff8a1eeSSteen Hegelund .validate = sparx5_serdes_validate, 22792ff8a1eeSSteen Hegelund .owner = THIS_MODULE, 22802ff8a1eeSSteen Hegelund }; 22812ff8a1eeSSteen Hegelund 22822ff8a1eeSSteen Hegelund static int sparx5_phy_create(struct sparx5_serdes_private *priv, 22832ff8a1eeSSteen Hegelund int idx, struct phy **phy) 22842ff8a1eeSSteen Hegelund { 22852ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro; 22862ff8a1eeSSteen Hegelund 22872ff8a1eeSSteen Hegelund *phy = devm_phy_create(priv->dev, NULL, &sparx5_serdes_ops); 22882ff8a1eeSSteen Hegelund if (IS_ERR(*phy)) 22892ff8a1eeSSteen Hegelund return PTR_ERR(*phy); 22902ff8a1eeSSteen Hegelund 22912ff8a1eeSSteen Hegelund macro = devm_kzalloc(priv->dev, sizeof(*macro), GFP_KERNEL); 22922ff8a1eeSSteen Hegelund if (!macro) 22932ff8a1eeSSteen Hegelund return -ENOMEM; 22942ff8a1eeSSteen Hegelund 22952ff8a1eeSSteen Hegelund macro->sidx = idx; 22962ff8a1eeSSteen Hegelund macro->priv = priv; 22972ff8a1eeSSteen Hegelund macro->speed = SPEED_UNKNOWN; 22982ff8a1eeSSteen Hegelund if (idx < SPX5_SERDES_10G_START) { 22992ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_6G; 23002ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx; 23012ff8a1eeSSteen Hegelund } else if (idx < SPX5_SERDES_25G_START) { 23022ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_10G; 23032ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx - SPX5_SERDES_10G_START; 23042ff8a1eeSSteen Hegelund } else { 23052ff8a1eeSSteen Hegelund macro->serdestype = SPX5_SDT_25G; 23062ff8a1eeSSteen Hegelund macro->stpidx = macro->sidx - SPX5_SERDES_25G_START; 23072ff8a1eeSSteen Hegelund } 23082ff8a1eeSSteen Hegelund 23092ff8a1eeSSteen Hegelund phy_set_drvdata(*phy, macro); 23102ff8a1eeSSteen Hegelund 23112ff8a1eeSSteen Hegelund return 0; 23122ff8a1eeSSteen Hegelund } 23132ff8a1eeSSteen Hegelund 23142ff8a1eeSSteen Hegelund static struct sparx5_serdes_io_resource sparx5_serdes_iomap[] = { 23152ff8a1eeSSteen Hegelund { TARGET_SD_CMU, 0x0 }, /* 0x610808000: sd_cmu_0 */ 23162ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 1, 0x8000 }, /* 0x610810000: sd_cmu_1 */ 23172ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 2, 0x10000 }, /* 0x610818000: sd_cmu_2 */ 23182ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 3, 0x18000 }, /* 0x610820000: sd_cmu_3 */ 23192ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 4, 0x20000 }, /* 0x610828000: sd_cmu_4 */ 23202ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 5, 0x28000 }, /* 0x610830000: sd_cmu_5 */ 23212ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 6, 0x30000 }, /* 0x610838000: sd_cmu_6 */ 23222ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 7, 0x38000 }, /* 0x610840000: sd_cmu_7 */ 23232ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 8, 0x40000 }, /* 0x610848000: sd_cmu_8 */ 23242ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG, 0x48000 }, /* 0x610850000: sd_cmu_cfg_0 */ 23252ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 1, 0x50000 }, /* 0x610858000: sd_cmu_cfg_1 */ 23262ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 2, 0x58000 }, /* 0x610860000: sd_cmu_cfg_2 */ 23272ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 3, 0x60000 }, /* 0x610868000: sd_cmu_cfg_3 */ 23282ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 4, 0x68000 }, /* 0x610870000: sd_cmu_cfg_4 */ 23292ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 5, 0x70000 }, /* 0x610878000: sd_cmu_cfg_5 */ 23302ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 6, 0x78000 }, /* 0x610880000: sd_cmu_cfg_6 */ 23312ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 7, 0x80000 }, /* 0x610888000: sd_cmu_cfg_7 */ 23322ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 8, 0x88000 }, /* 0x610890000: sd_cmu_cfg_8 */ 23332ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE, 0x90000 }, /* 0x610898000: sd6g_lane_0 */ 23342ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 1, 0x98000 }, /* 0x6108a0000: sd6g_lane_1 */ 23352ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 2, 0xa0000 }, /* 0x6108a8000: sd6g_lane_2 */ 23362ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 3, 0xa8000 }, /* 0x6108b0000: sd6g_lane_3 */ 23372ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 4, 0xb0000 }, /* 0x6108b8000: sd6g_lane_4 */ 23382ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 5, 0xb8000 }, /* 0x6108c0000: sd6g_lane_5 */ 23392ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 6, 0xc0000 }, /* 0x6108c8000: sd6g_lane_6 */ 23402ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 7, 0xc8000 }, /* 0x6108d0000: sd6g_lane_7 */ 23412ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 8, 0xd0000 }, /* 0x6108d8000: sd6g_lane_8 */ 23422ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 9, 0xd8000 }, /* 0x6108e0000: sd6g_lane_9 */ 23432ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 10, 0xe0000 }, /* 0x6108e8000: sd6g_lane_10 */ 23442ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 11, 0xe8000 }, /* 0x6108f0000: sd6g_lane_11 */ 23452ff8a1eeSSteen Hegelund { TARGET_SD6G_LANE + 12, 0xf0000 }, /* 0x6108f8000: sd6g_lane_12 */ 23462ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE, 0xf8000 }, /* 0x610900000: sd10g_lane_0 */ 23472ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 1, 0x100000 }, /* 0x610908000: sd10g_lane_1 */ 23482ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 2, 0x108000 }, /* 0x610910000: sd10g_lane_2 */ 23492ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 3, 0x110000 }, /* 0x610918000: sd10g_lane_3 */ 23502ff8a1eeSSteen Hegelund { TARGET_SD_LANE, 0x1a0000 }, /* 0x6109a8000: sd_lane_0 */ 23512ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 1, 0x1a8000 }, /* 0x6109b0000: sd_lane_1 */ 23522ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 2, 0x1b0000 }, /* 0x6109b8000: sd_lane_2 */ 23532ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 3, 0x1b8000 }, /* 0x6109c0000: sd_lane_3 */ 23542ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 4, 0x1c0000 }, /* 0x6109c8000: sd_lane_4 */ 23552ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 5, 0x1c8000 }, /* 0x6109d0000: sd_lane_5 */ 23562ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 6, 0x1d0000 }, /* 0x6109d8000: sd_lane_6 */ 23572ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 7, 0x1d8000 }, /* 0x6109e0000: sd_lane_7 */ 23582ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 8, 0x1e0000 }, /* 0x6109e8000: sd_lane_8 */ 23592ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 9, 0x1e8000 }, /* 0x6109f0000: sd_lane_9 */ 23602ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 10, 0x1f0000 }, /* 0x6109f8000: sd_lane_10 */ 23612ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 11, 0x1f8000 }, /* 0x610a00000: sd_lane_11 */ 23622ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 12, 0x200000 }, /* 0x610a08000: sd_lane_12 */ 23632ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 13, 0x208000 }, /* 0x610a10000: sd_lane_13 */ 23642ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 14, 0x210000 }, /* 0x610a18000: sd_lane_14 */ 23652ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 15, 0x218000 }, /* 0x610a20000: sd_lane_15 */ 23662ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 16, 0x220000 }, /* 0x610a28000: sd_lane_16 */ 23672ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 9, 0x400000 }, /* 0x610c08000: sd_cmu_9 */ 23682ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 10, 0x408000 }, /* 0x610c10000: sd_cmu_10 */ 23692ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 11, 0x410000 }, /* 0x610c18000: sd_cmu_11 */ 23702ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 12, 0x418000 }, /* 0x610c20000: sd_cmu_12 */ 23712ff8a1eeSSteen Hegelund { TARGET_SD_CMU + 13, 0x420000 }, /* 0x610c28000: sd_cmu_13 */ 23722ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 9, 0x428000 }, /* 0x610c30000: sd_cmu_cfg_9 */ 23732ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 10, 0x430000 }, /* 0x610c38000: sd_cmu_cfg_10 */ 23742ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 11, 0x438000 }, /* 0x610c40000: sd_cmu_cfg_11 */ 23752ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 12, 0x440000 }, /* 0x610c48000: sd_cmu_cfg_12 */ 23762ff8a1eeSSteen Hegelund { TARGET_SD_CMU_CFG + 13, 0x448000 }, /* 0x610c50000: sd_cmu_cfg_13 */ 23772ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 4, 0x450000 }, /* 0x610c58000: sd10g_lane_4 */ 23782ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 5, 0x458000 }, /* 0x610c60000: sd10g_lane_5 */ 23792ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 6, 0x460000 }, /* 0x610c68000: sd10g_lane_6 */ 23802ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 7, 0x468000 }, /* 0x610c70000: sd10g_lane_7 */ 23812ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 8, 0x470000 }, /* 0x610c78000: sd10g_lane_8 */ 23822ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 9, 0x478000 }, /* 0x610c80000: sd10g_lane_9 */ 23832ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 10, 0x480000 }, /* 0x610c88000: sd10g_lane_10 */ 23842ff8a1eeSSteen Hegelund { TARGET_SD10G_LANE + 11, 0x488000 }, /* 0x610c90000: sd10g_lane_11 */ 23852ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE, 0x490000 }, /* 0x610c98000: sd25g_lane_0 */ 23862ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 1, 0x498000 }, /* 0x610ca0000: sd25g_lane_1 */ 23872ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 2, 0x4a0000 }, /* 0x610ca8000: sd25g_lane_2 */ 23882ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 3, 0x4a8000 }, /* 0x610cb0000: sd25g_lane_3 */ 23892ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 4, 0x4b0000 }, /* 0x610cb8000: sd25g_lane_4 */ 23902ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 5, 0x4b8000 }, /* 0x610cc0000: sd25g_lane_5 */ 23912ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 6, 0x4c0000 }, /* 0x610cc8000: sd25g_lane_6 */ 23922ff8a1eeSSteen Hegelund { TARGET_SD25G_LANE + 7, 0x4c8000 }, /* 0x610cd0000: sd25g_lane_7 */ 23932ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 17, 0x550000 }, /* 0x610d58000: sd_lane_17 */ 23942ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 18, 0x558000 }, /* 0x610d60000: sd_lane_18 */ 23952ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 19, 0x560000 }, /* 0x610d68000: sd_lane_19 */ 23962ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 20, 0x568000 }, /* 0x610d70000: sd_lane_20 */ 23972ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 21, 0x570000 }, /* 0x610d78000: sd_lane_21 */ 23982ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 22, 0x578000 }, /* 0x610d80000: sd_lane_22 */ 23992ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 23, 0x580000 }, /* 0x610d88000: sd_lane_23 */ 24002ff8a1eeSSteen Hegelund { TARGET_SD_LANE + 24, 0x588000 }, /* 0x610d90000: sd_lane_24 */ 24012ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G, 0x590000 }, /* 0x610d98000: sd_lane_25g_25 */ 24022ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 1, 0x598000 }, /* 0x610da0000: sd_lane_25g_26 */ 24032ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 2, 0x5a0000 }, /* 0x610da8000: sd_lane_25g_27 */ 24042ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 3, 0x5a8000 }, /* 0x610db0000: sd_lane_25g_28 */ 24052ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 4, 0x5b0000 }, /* 0x610db8000: sd_lane_25g_29 */ 24062ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 5, 0x5b8000 }, /* 0x610dc0000: sd_lane_25g_30 */ 24072ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 6, 0x5c0000 }, /* 0x610dc8000: sd_lane_25g_31 */ 24082ff8a1eeSSteen Hegelund { TARGET_SD_LANE_25G + 7, 0x5c8000 }, /* 0x610dd0000: sd_lane_25g_32 */ 24092ff8a1eeSSteen Hegelund }; 24102ff8a1eeSSteen Hegelund 24112ff8a1eeSSteen Hegelund /* Client lookup function, uses serdes index */ 24122ff8a1eeSSteen Hegelund static struct phy *sparx5_serdes_xlate(struct device *dev, 24132ff8a1eeSSteen Hegelund struct of_phandle_args *args) 24142ff8a1eeSSteen Hegelund { 24152ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv = dev_get_drvdata(dev); 24162ff8a1eeSSteen Hegelund int idx; 24172ff8a1eeSSteen Hegelund unsigned int sidx; 24182ff8a1eeSSteen Hegelund 24192ff8a1eeSSteen Hegelund if (args->args_count != 1) 24202ff8a1eeSSteen Hegelund return ERR_PTR(-EINVAL); 24212ff8a1eeSSteen Hegelund 24222ff8a1eeSSteen Hegelund sidx = args->args[0]; 24232ff8a1eeSSteen Hegelund 24242ff8a1eeSSteen Hegelund /* Check validity: ERR_PTR(-ENODEV) if not valid */ 24252ff8a1eeSSteen Hegelund for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 24262ff8a1eeSSteen Hegelund struct sparx5_serdes_macro *macro = 24272ff8a1eeSSteen Hegelund phy_get_drvdata(priv->phys[idx]); 24282ff8a1eeSSteen Hegelund 24292ff8a1eeSSteen Hegelund if (sidx != macro->sidx) 24302ff8a1eeSSteen Hegelund continue; 24312ff8a1eeSSteen Hegelund 24322ff8a1eeSSteen Hegelund return priv->phys[idx]; 24332ff8a1eeSSteen Hegelund } 24342ff8a1eeSSteen Hegelund return ERR_PTR(-ENODEV); 24352ff8a1eeSSteen Hegelund } 24362ff8a1eeSSteen Hegelund 24372ff8a1eeSSteen Hegelund static int sparx5_serdes_probe(struct platform_device *pdev) 24382ff8a1eeSSteen Hegelund { 24392ff8a1eeSSteen Hegelund struct device_node *np = pdev->dev.of_node; 24402ff8a1eeSSteen Hegelund struct sparx5_serdes_private *priv; 24412ff8a1eeSSteen Hegelund struct phy_provider *provider; 24422ff8a1eeSSteen Hegelund struct resource *iores; 24432ff8a1eeSSteen Hegelund void __iomem *iomem; 24442ff8a1eeSSteen Hegelund unsigned long clock; 24452ff8a1eeSSteen Hegelund struct clk *clk; 24462ff8a1eeSSteen Hegelund int idx; 24472ff8a1eeSSteen Hegelund int err; 24482ff8a1eeSSteen Hegelund 24492ff8a1eeSSteen Hegelund if (!np && !pdev->dev.platform_data) 24502ff8a1eeSSteen Hegelund return -ENODEV; 24512ff8a1eeSSteen Hegelund 24522ff8a1eeSSteen Hegelund priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 24532ff8a1eeSSteen Hegelund if (!priv) 24542ff8a1eeSSteen Hegelund return -ENOMEM; 24552ff8a1eeSSteen Hegelund 24562ff8a1eeSSteen Hegelund platform_set_drvdata(pdev, priv); 24572ff8a1eeSSteen Hegelund priv->dev = &pdev->dev; 24582ff8a1eeSSteen Hegelund 24592ff8a1eeSSteen Hegelund /* Get coreclock */ 24602ff8a1eeSSteen Hegelund clk = devm_clk_get(priv->dev, NULL); 24612ff8a1eeSSteen Hegelund if (IS_ERR(clk)) { 24622ff8a1eeSSteen Hegelund dev_err(priv->dev, "Failed to get coreclock\n"); 24632ff8a1eeSSteen Hegelund return PTR_ERR(clk); 24642ff8a1eeSSteen Hegelund } 24652ff8a1eeSSteen Hegelund clock = clk_get_rate(clk); 24662ff8a1eeSSteen Hegelund if (clock == 0) { 24672ff8a1eeSSteen Hegelund dev_err(priv->dev, "Invalid coreclock %lu\n", clock); 24682ff8a1eeSSteen Hegelund return -EINVAL; 24692ff8a1eeSSteen Hegelund } 24702ff8a1eeSSteen Hegelund priv->coreclock = clock; 24712ff8a1eeSSteen Hegelund 24722ff8a1eeSSteen Hegelund iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); 24732ff8a1eeSSteen Hegelund iomem = devm_ioremap(priv->dev, iores->start, iores->end - iores->start + 1); 24742ff8a1eeSSteen Hegelund if (IS_ERR(iomem)) { 24752ff8a1eeSSteen Hegelund dev_err(priv->dev, "Unable to get serdes registers: %s\n", 24762ff8a1eeSSteen Hegelund iores->name); 24772ff8a1eeSSteen Hegelund return PTR_ERR(iomem); 24782ff8a1eeSSteen Hegelund } 24792ff8a1eeSSteen Hegelund for (idx = 0; idx < ARRAY_SIZE(sparx5_serdes_iomap); idx++) { 24802ff8a1eeSSteen Hegelund struct sparx5_serdes_io_resource *iomap = &sparx5_serdes_iomap[idx]; 24812ff8a1eeSSteen Hegelund 24822ff8a1eeSSteen Hegelund priv->regs[iomap->id] = iomem + iomap->offset; 24832ff8a1eeSSteen Hegelund } 24842ff8a1eeSSteen Hegelund for (idx = 0; idx < SPX5_SERDES_MAX; idx++) { 24852ff8a1eeSSteen Hegelund err = sparx5_phy_create(priv, idx, &priv->phys[idx]); 24862ff8a1eeSSteen Hegelund if (err) 24872ff8a1eeSSteen Hegelund return err; 24882ff8a1eeSSteen Hegelund } 24892ff8a1eeSSteen Hegelund 24902ff8a1eeSSteen Hegelund provider = devm_of_phy_provider_register(priv->dev, sparx5_serdes_xlate); 24912ff8a1eeSSteen Hegelund 24922ff8a1eeSSteen Hegelund return PTR_ERR_OR_ZERO(provider); 24932ff8a1eeSSteen Hegelund } 24942ff8a1eeSSteen Hegelund 24952ff8a1eeSSteen Hegelund static const struct of_device_id sparx5_serdes_match[] = { 24962ff8a1eeSSteen Hegelund { .compatible = "microchip,sparx5-serdes" }, 24972ff8a1eeSSteen Hegelund { } 24982ff8a1eeSSteen Hegelund }; 24992ff8a1eeSSteen Hegelund MODULE_DEVICE_TABLE(of, sparx5_serdes_match); 25002ff8a1eeSSteen Hegelund 25012ff8a1eeSSteen Hegelund static struct platform_driver sparx5_serdes_driver = { 25022ff8a1eeSSteen Hegelund .probe = sparx5_serdes_probe, 25032ff8a1eeSSteen Hegelund .driver = { 25042ff8a1eeSSteen Hegelund .name = "sparx5-serdes", 25052ff8a1eeSSteen Hegelund .of_match_table = sparx5_serdes_match, 25062ff8a1eeSSteen Hegelund }, 25072ff8a1eeSSteen Hegelund }; 25082ff8a1eeSSteen Hegelund 25092ff8a1eeSSteen Hegelund module_platform_driver(sparx5_serdes_driver); 25102ff8a1eeSSteen Hegelund 25112ff8a1eeSSteen Hegelund MODULE_DESCRIPTION("Microchip Sparx5 switch serdes driver"); 25122ff8a1eeSSteen Hegelund MODULE_AUTHOR("Steen Hegelund <steen.hegelund@microchip.com>"); 25132ff8a1eeSSteen Hegelund MODULE_LICENSE("GPL v2"); 2514