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 9428595ffb5SSteen Hegelund static int sparx5_sd25g28_apply_params(struct sparx5_serdes_macro *macro, 9438595ffb5SSteen Hegelund struct sparx5_sd25g28_params *params) 9442ff8a1eeSSteen Hegelund { 9458595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 9468595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 9478595ffb5SSteen Hegelund struct device *dev = priv->dev; 9488595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 9498595ffb5SSteen Hegelund u32 value; 9508595ffb5SSteen Hegelund 9518595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(1), 9522ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 9538595ffb5SSteen Hegelund priv, 9548595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 9558595ffb5SSteen Hegelund 9568595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xFF), 9572ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 9588595ffb5SSteen Hegelund priv, 9598595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 9608595ffb5SSteen Hegelund 9618595ffb5SSteen 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, 9668595ffb5SSteen Hegelund priv, 9678595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 9688595ffb5SSteen Hegelund 9698595ffb5SSteen 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, 9728595ffb5SSteen Hegelund priv, 9738595ffb5SSteen Hegelund SD25G_LANE_CMU_31(sd_index)); 9748595ffb5SSteen Hegelund 9758595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_09_CFG_EN_DUMMY_SET(params->cfg_en_dummy), 9762ff8a1eeSSteen Hegelund SD25G_LANE_CMU_09_CFG_EN_DUMMY, 9778595ffb5SSteen Hegelund priv, 9788595ffb5SSteen Hegelund SD25G_LANE_CMU_09(sd_index)); 9798595ffb5SSteen Hegelund 9808595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0_SET 9818595ffb5SSteen Hegelund (params->cfg_pll_reserve_3_0), 9822ff8a1eeSSteen Hegelund SD25G_LANE_CMU_13_CFG_PLL_RESERVE_3_0, 9838595ffb5SSteen Hegelund priv, 9848595ffb5SSteen Hegelund SD25G_LANE_CMU_13(sd_index)); 9858595ffb5SSteen Hegelund 9868595ffb5SSteen 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, 9888595ffb5SSteen Hegelund priv, 9898595ffb5SSteen Hegelund SD25G_LANE_CMU_40(sd_index)); 9908595ffb5SSteen Hegelund 9918595ffb5SSteen 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, 9948595ffb5SSteen Hegelund priv, 9958595ffb5SSteen Hegelund SD25G_LANE_CMU_46(sd_index)); 9968595ffb5SSteen Hegelund 9978595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0_SET 9988595ffb5SSteen Hegelund (params->l0_cfg_tx_reserve_7_0), 9992ff8a1eeSSteen Hegelund SD25G_LANE_CMU_45_L0_CFG_TX_RESERVE_7_0, 10008595ffb5SSteen Hegelund priv, 10018595ffb5SSteen Hegelund SD25G_LANE_CMU_45(sd_index)); 10028595ffb5SSteen Hegelund 10038595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(0), 10042ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 10058595ffb5SSteen Hegelund priv, 10068595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 10078595ffb5SSteen Hegelund 10088595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN_SET(1), 10092ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0B_CFG_VCO_CAL_RESETN, 10108595ffb5SSteen Hegelund priv, 10118595ffb5SSteen Hegelund SD25G_LANE_CMU_0B(sd_index)); 10128595ffb5SSteen Hegelund 10138595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(0), 10142ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 10158595ffb5SSteen Hegelund priv, 10168595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 10178595ffb5SSteen Hegelund 10188595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_19_R_CK_RESETB_SET(1), 10192ff8a1eeSSteen Hegelund SD25G_LANE_CMU_19_R_CK_RESETB, 10208595ffb5SSteen Hegelund priv, 10218595ffb5SSteen Hegelund SD25G_LANE_CMU_19(sd_index)); 10228595ffb5SSteen Hegelund 10238595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(0), 10242ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 10258595ffb5SSteen Hegelund priv, 10268595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 10278595ffb5SSteen Hegelund 10288595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_18_R_PLL_RSTN_SET(1), 10292ff8a1eeSSteen Hegelund SD25G_LANE_CMU_18_R_PLL_RSTN, 10308595ffb5SSteen Hegelund priv, 10318595ffb5SSteen Hegelund SD25G_LANE_CMU_18(sd_index)); 10328595ffb5SSteen Hegelund 10338595ffb5SSteen 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, 10358595ffb5SSteen Hegelund priv, 10368595ffb5SSteen Hegelund SD25G_LANE_CMU_1A(sd_index)); 10378595ffb5SSteen Hegelund 10388595ffb5SSteen 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, 10448595ffb5SSteen Hegelund priv, 10458595ffb5SSteen Hegelund SD25G_LANE_CMU_30(sd_index)); 10468595ffb5SSteen Hegelund 10478595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0C_CFG_PLL_LOL_SET_SET(params->cfg_pll_lol_set) | 10488595ffb5SSteen Hegelund SD25G_LANE_CMU_0C_CFG_VCO_DIV_MODE_1_0_SET 10498595ffb5SSteen 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, 10528595ffb5SSteen Hegelund priv, 10538595ffb5SSteen Hegelund SD25G_LANE_CMU_0C(sd_index)); 10548595ffb5SSteen Hegelund 10558595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0_SET 10568595ffb5SSteen Hegelund (params->cfg_pre_divsel_1_0), 10572ff8a1eeSSteen Hegelund SD25G_LANE_CMU_0D_CFG_PRE_DIVSEL_1_0, 10588595ffb5SSteen Hegelund priv, 10598595ffb5SSteen Hegelund SD25G_LANE_CMU_0D(sd_index)); 10608595ffb5SSteen Hegelund 10618595ffb5SSteen 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, 10638595ffb5SSteen Hegelund priv, 10648595ffb5SSteen Hegelund SD25G_LANE_CMU_0E(sd_index)); 10658595ffb5SSteen Hegelund 10668595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0x00), 10672ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 10688595ffb5SSteen Hegelund priv, 10698595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 10708595ffb5SSteen Hegelund 10718595ffb5SSteen 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, 10748595ffb5SSteen Hegelund priv, 10758595ffb5SSteen Hegelund SD25G_LANE_LANE_0C(sd_index)); 10768595ffb5SSteen Hegelund 10778595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0_SET 10788595ffb5SSteen Hegelund (params->cfg_tx_prediv_1_0), 10792ff8a1eeSSteen Hegelund SD25G_LANE_LANE_01_LN_CFG_TX_PREDIV_1_0, 10808595ffb5SSteen Hegelund priv, 10818595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 10828595ffb5SSteen Hegelund 10838595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0_SET 10848595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 10852ff8a1eeSSteen Hegelund SD25G_LANE_LANE_18_LN_CFG_RXDIV_SEL_2_0, 10868595ffb5SSteen Hegelund priv, 10878595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 10888595ffb5SSteen Hegelund 10898595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0_SET 10908595ffb5SSteen Hegelund (params->cfg_tx_subrate_2_0), 10912ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_TX_SUBRATE_2_0, 10928595ffb5SSteen Hegelund priv, 10938595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 10948595ffb5SSteen Hegelund 10958595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0_SET 10968595ffb5SSteen Hegelund (params->cfg_rx_subrate_2_0), 10972ff8a1eeSSteen Hegelund SD25G_LANE_LANE_28_LN_CFG_RX_SUBRATE_2_0, 10988595ffb5SSteen Hegelund priv, 10998595ffb5SSteen Hegelund SD25G_LANE_LANE_28(sd_index)); 11008595ffb5SSteen Hegelund 11018595ffb5SSteen 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, 11038595ffb5SSteen Hegelund priv, 11048595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 11058595ffb5SSteen Hegelund 11068595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1_SET 11078595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 11082ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0F_LN_CFG_DFETAP_EN_5_1, 11098595ffb5SSteen Hegelund priv, 11108595ffb5SSteen Hegelund SD25G_LANE_LANE_0F(sd_index)); 11118595ffb5SSteen Hegelund 11128595ffb5SSteen 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, 11148595ffb5SSteen Hegelund priv, 11158595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 11168595ffb5SSteen Hegelund 11178595ffb5SSteen 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, 11198595ffb5SSteen Hegelund priv, 11208595ffb5SSteen Hegelund SD25G_LANE_LANE_1D(sd_index)); 11218595ffb5SSteen Hegelund 11228595ffb5SSteen 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, 11248595ffb5SSteen Hegelund priv, 11258595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 11268595ffb5SSteen Hegelund 11278595ffb5SSteen 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, 11308595ffb5SSteen Hegelund priv, 11318595ffb5SSteen Hegelund SD25G_LANE_LANE_01(sd_index)); 11328595ffb5SSteen Hegelund 11338595ffb5SSteen 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, 11358595ffb5SSteen Hegelund priv, 11368595ffb5SSteen Hegelund SD25G_LANE_LANE_03(sd_index)); 11378595ffb5SSteen Hegelund 11388595ffb5SSteen 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, 11408595ffb5SSteen Hegelund priv, 11418595ffb5SSteen Hegelund SD25G_LANE_LANE_06(sd_index)); 11428595ffb5SSteen Hegelund 11438595ffb5SSteen 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, 11478595ffb5SSteen Hegelund priv, 11488595ffb5SSteen Hegelund SD25G_LANE_LANE_07(sd_index)); 11498595ffb5SSteen Hegelund 11508595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8_SET 11518595ffb5SSteen Hegelund (params->cfg_tx_reserve_15_8), 11522ff8a1eeSSteen Hegelund SD25G_LANE_LANE_43_LN_CFG_TX_RESERVE_15_8, 11538595ffb5SSteen Hegelund priv, 11548595ffb5SSteen Hegelund SD25G_LANE_LANE_43(sd_index)); 11558595ffb5SSteen Hegelund 11568595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0_SET 11578595ffb5SSteen Hegelund (params->cfg_tx_reserve_7_0), 11582ff8a1eeSSteen Hegelund SD25G_LANE_LANE_42_LN_CFG_TX_RESERVE_7_0, 11598595ffb5SSteen Hegelund priv, 11608595ffb5SSteen Hegelund SD25G_LANE_LANE_42(sd_index)); 11618595ffb5SSteen Hegelund 11628595ffb5SSteen 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, 11648595ffb5SSteen Hegelund priv, 11658595ffb5SSteen Hegelund SD25G_LANE_LANE_05(sd_index)); 11668595ffb5SSteen Hegelund 11678595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN_SET 11688595ffb5SSteen Hegelund (params->cfg_txcal_man_en), 11692ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0B_LN_CFG_TXCAL_MAN_EN, 11708595ffb5SSteen Hegelund priv, 11718595ffb5SSteen Hegelund SD25G_LANE_LANE_0B(sd_index)); 11728595ffb5SSteen Hegelund 11738595ffb5SSteen 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, 11768595ffb5SSteen Hegelund priv, 11778595ffb5SSteen Hegelund SD25G_LANE_LANE_0A(sd_index)); 11788595ffb5SSteen Hegelund 11798595ffb5SSteen 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, 11828595ffb5SSteen Hegelund priv, 11838595ffb5SSteen Hegelund SD25G_LANE_LANE_09(sd_index)); 11848595ffb5SSteen Hegelund 11858595ffb5SSteen 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, 11878595ffb5SSteen Hegelund priv, 11888595ffb5SSteen Hegelund SD25G_LANE_LANE_1A(sd_index)); 11898595ffb5SSteen Hegelund 11908595ffb5SSteen 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, 11928595ffb5SSteen Hegelund priv, 11938595ffb5SSteen Hegelund SD25G_LANE_LANE_1B(sd_index)); 11948595ffb5SSteen Hegelund 11958595ffb5SSteen 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, 11978595ffb5SSteen Hegelund priv, 11988595ffb5SSteen Hegelund SD25G_LANE_LANE_2B(sd_index)); 11998595ffb5SSteen Hegelund 12008595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER_SET 12018595ffb5SSteen Hegelund (params->cfg_dis_2ndorder), 12022ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2C_LN_CFG_DIS_2NDORDER, 12038595ffb5SSteen Hegelund priv, 12048595ffb5SSteen Hegelund SD25G_LANE_LANE_2C(sd_index)); 12058595ffb5SSteen Hegelund 12068595ffb5SSteen 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, 12088595ffb5SSteen Hegelund priv, 12098595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 12108595ffb5SSteen Hegelund 12118595ffb5SSteen 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, 12148595ffb5SSteen Hegelund priv, 12158595ffb5SSteen Hegelund SD25G_LANE_LANE_00(sd_index)); 12168595ffb5SSteen Hegelund 12178595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0_SET 12188595ffb5SSteen Hegelund (params->cfg_rx_reserve_7_0), 12192ff8a1eeSSteen Hegelund SD25G_LANE_LANE_44_LN_CFG_RX_RESERVE_7_0, 12208595ffb5SSteen Hegelund priv, 12218595ffb5SSteen Hegelund SD25G_LANE_LANE_44(sd_index)); 12228595ffb5SSteen Hegelund 12238595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8_SET 12248595ffb5SSteen Hegelund (params->cfg_rx_reserve_15_8), 12252ff8a1eeSSteen Hegelund SD25G_LANE_LANE_45_LN_CFG_RX_RESERVE_15_8, 12268595ffb5SSteen Hegelund priv, 12278595ffb5SSteen Hegelund SD25G_LANE_LANE_45(sd_index)); 12288595ffb5SSteen Hegelund 12298595ffb5SSteen 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, 12338595ffb5SSteen Hegelund priv, 12348595ffb5SSteen Hegelund SD25G_LANE_LANE_0D(sd_index)); 12358595ffb5SSteen Hegelund 12368595ffb5SSteen 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, 12398595ffb5SSteen Hegelund priv, 12408595ffb5SSteen Hegelund SD25G_LANE_LANE_21(sd_index)); 12418595ffb5SSteen Hegelund 12428595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0_SET 12438595ffb5SSteen Hegelund (params->cfg_eqr_force_3_0), 12442ff8a1eeSSteen Hegelund SD25G_LANE_LANE_22_LN_CFG_EQR_FORCE_3_0, 12458595ffb5SSteen Hegelund priv, 12468595ffb5SSteen Hegelund SD25G_LANE_LANE_22(sd_index)); 12478595ffb5SSteen Hegelund 12488595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_EQC_FORCE_3_0_SET 12498595ffb5SSteen 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, 12538595ffb5SSteen Hegelund priv, 12548595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 12558595ffb5SSteen Hegelund 12568595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN_SET 12578595ffb5SSteen Hegelund (params->cfg_sum_setcm_en), 12582ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1E_LN_CFG_SUM_SETCM_EN, 12598595ffb5SSteen Hegelund priv, 12608595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 12618595ffb5SSteen Hegelund 12628595ffb5SSteen 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, 12658595ffb5SSteen Hegelund priv, 12668595ffb5SSteen Hegelund SD25G_LANE_LANE_25(sd_index)); 12678595ffb5SSteen Hegelund 12688595ffb5SSteen 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, 12718595ffb5SSteen Hegelund priv, 12728595ffb5SSteen Hegelund SD25G_LANE_LANE_26(sd_index)); 12738595ffb5SSteen Hegelund 12748595ffb5SSteen 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, 12768595ffb5SSteen Hegelund priv, 12778595ffb5SSteen Hegelund SD25G_LANE_LANE_18(sd_index)); 12788595ffb5SSteen Hegelund 12798595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0_SET 12808595ffb5SSteen Hegelund (params->cfg_dfedig_m_2_0), 12812ff8a1eeSSteen Hegelund SD25G_LANE_LANE_0E_LN_CFG_DFEDIG_M_2_0, 12828595ffb5SSteen Hegelund priv, 12838595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 12848595ffb5SSteen Hegelund 12858595ffb5SSteen 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, 12878595ffb5SSteen Hegelund priv, 12888595ffb5SSteen Hegelund SD25G_LANE_LANE_0E(sd_index)); 12898595ffb5SSteen Hegelund 12908595ffb5SSteen 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, 12948595ffb5SSteen Hegelund priv, 12958595ffb5SSteen Hegelund SD25G_LANE_LANE_40(sd_index)); 12968595ffb5SSteen Hegelund 12978595ffb5SSteen 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, 13018595ffb5SSteen Hegelund priv, 13028595ffb5SSteen Hegelund SD25G_LANE_LANE_04(sd_index)); 13038595ffb5SSteen Hegelund 13048595ffb5SSteen 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, 13068595ffb5SSteen Hegelund priv, 13078595ffb5SSteen Hegelund SD25G_LANE_LANE_1E(sd_index)); 13088595ffb5SSteen Hegelund 13098595ffb5SSteen 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, 13118595ffb5SSteen Hegelund priv, 13128595ffb5SSteen Hegelund SD25G_LANE_LANE_19(sd_index)); 13138595ffb5SSteen Hegelund 13148595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(0), 13152ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 13168595ffb5SSteen Hegelund priv, 13178595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 13188595ffb5SSteen Hegelund 13198595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG_SET(1), 13202ff8a1eeSSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_RSTN_DFEDIG, 13218595ffb5SSteen Hegelund priv, 13228595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 13238595ffb5SSteen Hegelund 13248595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_LANE_CFG_MACRO_RST_SET(0), 13252ff8a1eeSSteen Hegelund SD_LANE_25G_SD_LANE_CFG_MACRO_RST, 13268595ffb5SSteen Hegelund priv, 13278595ffb5SSteen Hegelund SD_LANE_25G_SD_LANE_CFG(sd_index)); 13288595ffb5SSteen Hegelund 13298595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(0), 13302ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 13318595ffb5SSteen Hegelund priv, 13328595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 13332ff8a1eeSSteen Hegelund 13342ff8a1eeSSteen Hegelund usleep_range(1000, 2000); 13352ff8a1eeSSteen Hegelund 13368595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN_SET(1), 13372ff8a1eeSSteen Hegelund SD25G_LANE_LANE_1C_LN_CFG_CDR_RSTN, 13388595ffb5SSteen Hegelund priv, 13398595ffb5SSteen Hegelund SD25G_LANE_LANE_1C(sd_index)); 13402ff8a1eeSSteen Hegelund 13412ff8a1eeSSteen Hegelund usleep_range(10000, 20000); 13422ff8a1eeSSteen Hegelund 13438595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0xff), 13442ff8a1eeSSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 13458595ffb5SSteen Hegelund priv, 13468595ffb5SSteen 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 } 13638595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS_SET(0x1), 13648595ffb5SSteen Hegelund SD25G_LANE_CMU_2A_R_DBG_LOL_STATUS, 13658595ffb5SSteen Hegelund priv, 13668595ffb5SSteen Hegelund SD25G_LANE_CMU_2A(sd_index)); 13678595ffb5SSteen Hegelund 13688595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_SER_RST_SER_RST_SET(0x0), 13698595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST_SER_RST, 13708595ffb5SSteen Hegelund priv, 13718595ffb5SSteen Hegelund SD_LANE_25G_SD_SER_RST(sd_index)); 13728595ffb5SSteen Hegelund 13738595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_25G_SD_DES_RST_DES_RST_SET(0x0), 13748595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST_DES_RST, 13758595ffb5SSteen Hegelund priv, 13768595ffb5SSteen Hegelund SD_LANE_25G_SD_DES_RST(sd_index)); 13778595ffb5SSteen Hegelund 13788595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX_SET(0), 13798595ffb5SSteen Hegelund SD25G_LANE_CMU_FF_REGISTER_TABLE_INDEX, 13808595ffb5SSteen Hegelund priv, 13818595ffb5SSteen Hegelund SD25G_LANE_CMU_FF(sd_index)); 13828595ffb5SSteen Hegelund 13838595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0_SET 13848595ffb5SSteen Hegelund (params->cfg_alos_thr_2_0), 13858595ffb5SSteen Hegelund SD25G_LANE_LANE_2D_LN_CFG_ALOS_THR_2_0, 13868595ffb5SSteen Hegelund priv, 13878595ffb5SSteen Hegelund SD25G_LANE_LANE_2D(sd_index)); 13888595ffb5SSteen Hegelund 13898595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ_SET(0), 13908595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_DIS_SQ, 13918595ffb5SSteen Hegelund priv, 13928595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 13938595ffb5SSteen Hegelund 13948595ffb5SSteen Hegelund sdx5_rmw(SD25G_LANE_LANE_2E_LN_CFG_PD_SQ_SET(0), 13958595ffb5SSteen Hegelund SD25G_LANE_LANE_2E_LN_CFG_PD_SQ, 13968595ffb5SSteen Hegelund priv, 13978595ffb5SSteen Hegelund SD25G_LANE_LANE_2E(sd_index)); 13988595ffb5SSteen Hegelund 13992ff8a1eeSSteen Hegelund return 0; 14002ff8a1eeSSteen Hegelund } 14012ff8a1eeSSteen Hegelund 14028595ffb5SSteen 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); 14108595ffb5SSteen Hegelund 14118595ffb5SSteen Hegelund sdx5_rmw_addr(SD_LANE_SD_LANE_CFG_EXT_CFG_RST_SET(0), 14128595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_EXT_CFG_RST, 14138595ffb5SSteen Hegelund sdx5_addr(regs, SD_LANE_SD_LANE_CFG(lane_index))); 14142ff8a1eeSSteen Hegelund } 14152ff8a1eeSSteen Hegelund 14168595ffb5SSteen Hegelund static int sparx5_sd10g28_apply_params(struct sparx5_serdes_macro *macro, 14178595ffb5SSteen Hegelund struct sparx5_sd10g28_params *params) 14182ff8a1eeSSteen Hegelund { 14198595ffb5SSteen Hegelund struct sparx5_serdes_private *priv = macro->priv; 14208595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 14218595ffb5SSteen Hegelund struct device *dev = priv->dev; 14228595ffb5SSteen Hegelund u32 lane_index = macro->sidx; 14238595ffb5SSteen Hegelund u32 sd_index = macro->stpidx; 14248595ffb5SSteen Hegelund void __iomem *sd_inst; 14258595ffb5SSteen Hegelund u32 value; 14268595ffb5SSteen Hegelund 14278595ffb5SSteen Hegelund if (params->is_6g) 14288595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD6G_LANE, sd_index); 14298595ffb5SSteen Hegelund else 14308595ffb5SSteen Hegelund sd_inst = sdx5_inst_get(priv, TARGET_SD10G_LANE, sd_index); 14318595ffb5SSteen Hegelund 14328595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(1), 14332ff8a1eeSSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 14348595ffb5SSteen Hegelund priv, 14358595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 14368595ffb5SSteen Hegelund 14378595ffb5SSteen 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, 14478595ffb5SSteen Hegelund sd_inst, 14488595ffb5SSteen Hegelund SD10G_LANE_LANE_93(sd_index)); 14498595ffb5SSteen Hegelund 14508595ffb5SSteen 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, 14588595ffb5SSteen Hegelund sd_inst, 14598595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 14608595ffb5SSteen Hegelund 14618595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_RXEQ_REG_SET(0x1), 14622ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_RXEQ_REG, 14638595ffb5SSteen Hegelund sd_inst, 14648595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 14658595ffb5SSteen Hegelund 14668595ffb5SSteen 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, 14728595ffb5SSteen Hegelund sd_inst, 14738595ffb5SSteen Hegelund SD10G_LANE_LANE_A1(sd_index)); 14748595ffb5SSteen Hegelund 14758595ffb5SSteen 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, 14798595ffb5SSteen Hegelund priv, 14808595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 14818595ffb5SSteen Hegelund 14828595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0_SET 14838595ffb5SSteen Hegelund (params->cfg_lane_reserve_7_0), 14842ff8a1eeSSteen Hegelund SD10G_LANE_LANE_40_CFG_LANE_RESERVE_7_0, 14858595ffb5SSteen Hegelund sd_inst, 14868595ffb5SSteen Hegelund SD10G_LANE_LANE_40(sd_index)); 14878595ffb5SSteen Hegelund 14888595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL_SET 14898595ffb5SSteen Hegelund (params->cfg_ssc_rtl_clk_sel), 14902ff8a1eeSSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RTL_CLK_SEL, 14918595ffb5SSteen Hegelund sd_inst, 14928595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 14938595ffb5SSteen Hegelund 14948595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_35_CFG_TXRATE_1_0_SET 14958595ffb5SSteen Hegelund (params->cfg_txrate_1_0) | 14968595ffb5SSteen Hegelund SD10G_LANE_LANE_35_CFG_RXRATE_1_0_SET 14978595ffb5SSteen 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, 15008595ffb5SSteen Hegelund sd_inst, 15018595ffb5SSteen Hegelund SD10G_LANE_LANE_35(sd_index)); 15028595ffb5SSteen Hegelund 15038595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0_SET 15048595ffb5SSteen Hegelund (params->r_d_width_ctrl_2_0), 15052ff8a1eeSSteen Hegelund SD10G_LANE_LANE_94_R_DWIDTHCTRL_2_0, 15068595ffb5SSteen Hegelund sd_inst, 15078595ffb5SSteen Hegelund SD10G_LANE_LANE_94(sd_index)); 15088595ffb5SSteen Hegelund 15098595ffb5SSteen 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, 15128595ffb5SSteen Hegelund sd_inst, 15138595ffb5SSteen Hegelund SD10G_LANE_LANE_01(sd_index)); 15148595ffb5SSteen Hegelund 15158595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0_SET 15168595ffb5SSteen Hegelund (params->cfg_rxdiv_sel_2_0), 15172ff8a1eeSSteen Hegelund SD10G_LANE_LANE_30_CFG_RXDIV_SEL_2_0, 15188595ffb5SSteen Hegelund sd_inst, 15198595ffb5SSteen Hegelund SD10G_LANE_LANE_30(sd_index)); 15208595ffb5SSteen Hegelund 15218595ffb5SSteen 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, 15248595ffb5SSteen Hegelund sd_inst, 15258595ffb5SSteen Hegelund SD10G_LANE_LANE_A2(sd_index)); 15268595ffb5SSteen Hegelund 15278595ffb5SSteen 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, 15298595ffb5SSteen Hegelund sd_inst, 15308595ffb5SSteen Hegelund SD10G_LANE_LANE_13(sd_index)); 15318595ffb5SSteen Hegelund 15328595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_DFECK_EN_SET 15338595ffb5SSteen Hegelund (params->cfg_dfeck_en) | 15342ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_DFE_PD_SET(params->cfg_dfe_pd) | 15358595ffb5SSteen Hegelund SD10G_LANE_LANE_23_CFG_ERRAMP_PD_SET 15368595ffb5SSteen 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, 15408595ffb5SSteen Hegelund sd_inst, 15418595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 15428595ffb5SSteen Hegelund 15438595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1_SET 15448595ffb5SSteen Hegelund (params->cfg_dfetap_en_5_1), 15452ff8a1eeSSteen Hegelund SD10G_LANE_LANE_22_CFG_DFETAP_EN_5_1, 15468595ffb5SSteen Hegelund sd_inst, 15478595ffb5SSteen Hegelund SD10G_LANE_LANE_22(sd_index)); 15488595ffb5SSteen Hegelund 15498595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_1A_CFG_PI_DFE_EN_SET 15508595ffb5SSteen Hegelund (params->cfg_pi_DFE_en), 15512ff8a1eeSSteen Hegelund SD10G_LANE_LANE_1A_CFG_PI_DFE_EN, 15528595ffb5SSteen Hegelund sd_inst, 15538595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 15548595ffb5SSteen Hegelund 15558595ffb5SSteen 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) | 15588595ffb5SSteen Hegelund SD10G_LANE_LANE_02_CFG_TAP_ADV_3_0_SET 15598595ffb5SSteen 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, 15648595ffb5SSteen Hegelund sd_inst, 15658595ffb5SSteen Hegelund SD10G_LANE_LANE_02(sd_index)); 15668595ffb5SSteen Hegelund 15678595ffb5SSteen 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, 15698595ffb5SSteen Hegelund sd_inst, 15708595ffb5SSteen Hegelund SD10G_LANE_LANE_03(sd_index)); 15718595ffb5SSteen Hegelund 15728595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0_SET 15738595ffb5SSteen Hegelund (params->cfg_tap_dly_4_0), 15742ff8a1eeSSteen Hegelund SD10G_LANE_LANE_04_CFG_TAP_DLY_4_0, 15758595ffb5SSteen Hegelund sd_inst, 15768595ffb5SSteen Hegelund SD10G_LANE_LANE_04(sd_index)); 15778595ffb5SSteen Hegelund 15788595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0_SET 15798595ffb5SSteen Hegelund (params->cfg_vga_ctrl_3_0), 15802ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CTRL_3_0, 15818595ffb5SSteen Hegelund sd_inst, 15828595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 15838595ffb5SSteen Hegelund 15848595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0_SET 15858595ffb5SSteen Hegelund (params->cfg_vga_cp_2_0), 15862ff8a1eeSSteen Hegelund SD10G_LANE_LANE_2F_CFG_VGA_CP_2_0, 15878595ffb5SSteen Hegelund sd_inst, 15888595ffb5SSteen Hegelund SD10G_LANE_LANE_2F(sd_index)); 15898595ffb5SSteen Hegelund 15908595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0_SET 15918595ffb5SSteen Hegelund (params->cfg_eq_res_3_0), 15922ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0B_CFG_EQ_RES_3_0, 15938595ffb5SSteen Hegelund sd_inst, 15948595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 15958595ffb5SSteen Hegelund 15968595ffb5SSteen 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, 15988595ffb5SSteen Hegelund sd_inst, 15998595ffb5SSteen Hegelund SD10G_LANE_LANE_0D(sd_index)); 16008595ffb5SSteen Hegelund 16018595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0E_CFG_EQC_FORCE_3_0_SET 16028595ffb5SSteen Hegelund (params->cfg_eq_c_force_3_0) | 16038595ffb5SSteen Hegelund SD10G_LANE_LANE_0E_CFG_SUM_SETCM_EN_SET 16048595ffb5SSteen 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, 16078595ffb5SSteen Hegelund sd_inst, 16088595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 16098595ffb5SSteen Hegelund 16108595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_23_CFG_EN_DFEDIG_SET 16118595ffb5SSteen Hegelund (params->cfg_en_dfedig), 16122ff8a1eeSSteen Hegelund SD10G_LANE_LANE_23_CFG_EN_DFEDIG, 16138595ffb5SSteen Hegelund sd_inst, 16148595ffb5SSteen Hegelund SD10G_LANE_LANE_23(sd_index)); 16158595ffb5SSteen Hegelund 16168595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_EN_PREEMPH_SET 16178595ffb5SSteen Hegelund (params->cfg_en_preemph), 16182ff8a1eeSSteen Hegelund SD10G_LANE_LANE_06_CFG_EN_PREEMPH, 16198595ffb5SSteen Hegelund sd_inst, 16208595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 16218595ffb5SSteen Hegelund 16228595ffb5SSteen 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, 16288595ffb5SSteen Hegelund sd_inst, 16298595ffb5SSteen Hegelund SD10G_LANE_LANE_33(sd_index)); 16308595ffb5SSteen Hegelund 16318595ffb5SSteen 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, 16348595ffb5SSteen Hegelund sd_inst, 16358595ffb5SSteen Hegelund SD10G_LANE_LANE_52(sd_index)); 16368595ffb5SSteen Hegelund 16378595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_TXSWING_HALF_SET 16388595ffb5SSteen Hegelund (params->cfg_txswing_half), 16392ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_TXSWING_HALF, 16408595ffb5SSteen Hegelund sd_inst, 16418595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 16428595ffb5SSteen Hegelund 16438595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER_SET 16448595ffb5SSteen Hegelund (params->cfg_dis_2nd_order), 16452ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3C_CFG_DIS_2NDORDER, 16468595ffb5SSteen Hegelund sd_inst, 16478595ffb5SSteen Hegelund SD10G_LANE_LANE_3C(sd_index)); 16488595ffb5SSteen Hegelund 16498595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_39_CFG_RX_SSC_LH_SET 16508595ffb5SSteen Hegelund (params->cfg_rx_ssc_lh), 16512ff8a1eeSSteen Hegelund SD10G_LANE_LANE_39_CFG_RX_SSC_LH, 16528595ffb5SSteen Hegelund sd_inst, 16538595ffb5SSteen Hegelund SD10G_LANE_LANE_39(sd_index)); 16548595ffb5SSteen Hegelund 16558595ffb5SSteen 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, 16588595ffb5SSteen Hegelund sd_inst, 16598595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 16608595ffb5SSteen Hegelund 16618595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16_SET 16628595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_23_16), 16632ff8a1eeSSteen Hegelund SD10G_LANE_LANE_16_CFG_PI_EXT_DAC_23_16, 16648595ffb5SSteen Hegelund sd_inst, 16658595ffb5SSteen Hegelund SD10G_LANE_LANE_16(sd_index)); 16668595ffb5SSteen Hegelund 16678595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8_SET 16688595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_15_8), 16692ff8a1eeSSteen Hegelund SD10G_LANE_LANE_15_CFG_PI_EXT_DAC_15_8, 16708595ffb5SSteen Hegelund sd_inst, 16718595ffb5SSteen Hegelund SD10G_LANE_LANE_15(sd_index)); 16728595ffb5SSteen Hegelund 16738595ffb5SSteen 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, 16768595ffb5SSteen Hegelund sd_inst, 16778595ffb5SSteen Hegelund SD10G_LANE_LANE_26(sd_index)); 16788595ffb5SSteen Hegelund 16798595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0_SET 16808595ffb5SSteen Hegelund (params->cfg_cdr_kf_gen1_2_0), 16812ff8a1eeSSteen Hegelund SD10G_LANE_LANE_42_CFG_CDR_KF_GEN1_2_0, 16828595ffb5SSteen Hegelund sd_inst, 16838595ffb5SSteen Hegelund SD10G_LANE_LANE_42(sd_index)); 16848595ffb5SSteen Hegelund 16858595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0_SET 16868595ffb5SSteen Hegelund (params->r_cdr_m_gen1_7_0), 16872ff8a1eeSSteen Hegelund SD10G_LANE_LANE_0F_R_CDR_M_GEN1_7_0, 16888595ffb5SSteen Hegelund sd_inst, 16898595ffb5SSteen Hegelund SD10G_LANE_LANE_0F(sd_index)); 16908595ffb5SSteen Hegelund 16918595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0_SET 16928595ffb5SSteen Hegelund (params->cfg_pi_bw_gen1_3_0), 16932ff8a1eeSSteen Hegelund SD10G_LANE_LANE_24_CFG_PI_BW_GEN1_3_0, 16948595ffb5SSteen Hegelund sd_inst, 16958595ffb5SSteen Hegelund SD10G_LANE_LANE_24(sd_index)); 16968595ffb5SSteen Hegelund 16978595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0_SET 16988595ffb5SSteen Hegelund (params->cfg_pi_ext_dac_7_0), 16992ff8a1eeSSteen Hegelund SD10G_LANE_LANE_14_CFG_PI_EXT_DAC_7_0, 17008595ffb5SSteen Hegelund sd_inst, 17018595ffb5SSteen Hegelund SD10G_LANE_LANE_14(sd_index)); 17028595ffb5SSteen Hegelund 17038595ffb5SSteen 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, 17058595ffb5SSteen Hegelund sd_inst, 17068595ffb5SSteen Hegelund SD10G_LANE_LANE_1A(sd_index)); 17078595ffb5SSteen Hegelund 17088595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0_SET 17098595ffb5SSteen Hegelund (params->cfg_mp_max_3_0), 17102ff8a1eeSSteen Hegelund SD10G_LANE_LANE_3A_CFG_MP_MAX_3_0, 17118595ffb5SSteen Hegelund sd_inst, 17128595ffb5SSteen Hegelund SD10G_LANE_LANE_3A(sd_index)); 17138595ffb5SSteen Hegelund 17148595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG_SET 17158595ffb5SSteen Hegelund (params->cfg_rstn_dfedig), 17162ff8a1eeSSteen Hegelund SD10G_LANE_LANE_31_CFG_RSTN_DFEDIG, 17178595ffb5SSteen Hegelund sd_inst, 17188595ffb5SSteen Hegelund SD10G_LANE_LANE_31(sd_index)); 17198595ffb5SSteen Hegelund 17208595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0_SET 17218595ffb5SSteen Hegelund (params->cfg_alos_thr_3_0), 17222ff8a1eeSSteen Hegelund SD10G_LANE_LANE_48_CFG_ALOS_THR_3_0, 17238595ffb5SSteen Hegelund sd_inst, 17248595ffb5SSteen Hegelund SD10G_LANE_LANE_48(sd_index)); 17258595ffb5SSteen Hegelund 17268595ffb5SSteen 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, 17298595ffb5SSteen Hegelund sd_inst, 17308595ffb5SSteen Hegelund SD10G_LANE_LANE_36(sd_index)); 17318595ffb5SSteen Hegelund 17328595ffb5SSteen 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, 17358595ffb5SSteen Hegelund sd_inst, 17368595ffb5SSteen Hegelund SD10G_LANE_LANE_32(sd_index)); 17378595ffb5SSteen Hegelund 17388595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0_SET 17398595ffb5SSteen Hegelund (params->cfg_ip_pre_base_1_0), 17402ff8a1eeSSteen Hegelund SD10G_LANE_LANE_37_CFG_IP_PRE_BASE_1_0, 17418595ffb5SSteen Hegelund sd_inst, 17428595ffb5SSteen Hegelund SD10G_LANE_LANE_37(sd_index)); 17438595ffb5SSteen Hegelund 17448595ffb5SSteen 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, 17478595ffb5SSteen Hegelund sd_inst, 17488595ffb5SSteen Hegelund SD10G_LANE_LANE_41(sd_index)); 17498595ffb5SSteen Hegelund 17508595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN_SET 17518595ffb5SSteen Hegelund (params->r_en_auto_cdr_rstn), 17522ff8a1eeSSteen Hegelund SD10G_LANE_LANE_9E_R_EN_AUTO_CDR_RSTN, 17538595ffb5SSteen Hegelund sd_inst, 17548595ffb5SSteen Hegelund SD10G_LANE_LANE_9E(sd_index)); 17558595ffb5SSteen Hegelund 17568595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_0C_CFG_OSCAL_AFE_SET 17578595ffb5SSteen Hegelund (params->cfg_oscal_afe) | 17588595ffb5SSteen Hegelund SD10G_LANE_LANE_0C_CFG_PD_OSDAC_AFE_SET 17598595ffb5SSteen 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, 17628595ffb5SSteen Hegelund sd_inst, 17638595ffb5SSteen Hegelund SD10G_LANE_LANE_0C(sd_index)); 17648595ffb5SSteen Hegelund 17658595ffb5SSteen 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, 17688595ffb5SSteen Hegelund sd_inst, 17698595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 17708595ffb5SSteen Hegelund 17718595ffb5SSteen 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, 17748595ffb5SSteen Hegelund sd_inst, 17758595ffb5SSteen Hegelund SD10G_LANE_LANE_0B(sd_index)); 17768595ffb5SSteen Hegelund 17778595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_83_R_TX_POL_INV_SET 17788595ffb5SSteen Hegelund (params->r_tx_pol_inv) | 17798595ffb5SSteen Hegelund SD10G_LANE_LANE_83_R_RX_POL_INV_SET 17808595ffb5SSteen 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, 17838595ffb5SSteen Hegelund sd_inst, 17848595ffb5SSteen Hegelund SD10G_LANE_LANE_83(sd_index)); 17858595ffb5SSteen Hegelund 17868595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_06_CFG_RX2TX_LP_EN_SET 17878595ffb5SSteen Hegelund (params->cfg_rx2tx_lp_en) | 17888595ffb5SSteen Hegelund SD10G_LANE_LANE_06_CFG_TX2RX_LP_EN_SET 17898595ffb5SSteen 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, 17928595ffb5SSteen Hegelund sd_inst, 17938595ffb5SSteen Hegelund SD10G_LANE_LANE_06(sd_index)); 17948595ffb5SSteen Hegelund 17958595ffb5SSteen 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, 17998595ffb5SSteen Hegelund sd_inst, 18008595ffb5SSteen Hegelund SD10G_LANE_LANE_0E(sd_index)); 18012ff8a1eeSSteen Hegelund 18028595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_LANE_CFG_MACRO_RST_SET(0), 18038595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG_MACRO_RST, 18048595ffb5SSteen Hegelund priv, 18058595ffb5SSteen Hegelund SD_LANE_SD_LANE_CFG(lane_index)); 18068595ffb5SSteen Hegelund 18078595ffb5SSteen Hegelund sdx5_inst_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 18088595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 18098595ffb5SSteen Hegelund sd_inst, 18108595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 18118595ffb5SSteen Hegelund 18128595ffb5SSteen Hegelund sdx5_rmw(SD10G_LANE_LANE_50_CFG_SSC_RESETB_SET(1), 18138595ffb5SSteen Hegelund SD10G_LANE_LANE_50_CFG_SSC_RESETB, 18148595ffb5SSteen Hegelund priv, 18158595ffb5SSteen Hegelund SD10G_LANE_LANE_50(sd_index)); 18168595ffb5SSteen Hegelund 18178595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_SD_125_RST_DIS_SET(params->fx_100), 18188595ffb5SSteen Hegelund SD_LANE_MISC_SD_125_RST_DIS, 18198595ffb5SSteen Hegelund priv, 18208595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 18218595ffb5SSteen Hegelund 18228595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_RX_ENA_SET(params->fx_100), 18238595ffb5SSteen Hegelund SD_LANE_MISC_RX_ENA, 18248595ffb5SSteen Hegelund priv, 18258595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 18268595ffb5SSteen Hegelund 18278595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_MISC_MUX_ENA_SET(params->fx_100), 18288595ffb5SSteen Hegelund SD_LANE_MISC_MUX_ENA, 18298595ffb5SSteen Hegelund priv, 18308595ffb5SSteen Hegelund SD_LANE_MISC(lane_index)); 18318595ffb5SSteen 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 18418595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_SER_RST_SER_RST_SET(0x0), 18422ff8a1eeSSteen Hegelund SD_LANE_SD_SER_RST_SER_RST, 18438595ffb5SSteen Hegelund priv, 18448595ffb5SSteen Hegelund SD_LANE_SD_SER_RST(lane_index)); 18452ff8a1eeSSteen Hegelund 18468595ffb5SSteen Hegelund sdx5_rmw(SD_LANE_SD_DES_RST_DES_RST_SET(0x0), 18472ff8a1eeSSteen Hegelund SD_LANE_SD_DES_RST_DES_RST, 18488595ffb5SSteen Hegelund priv, 18498595ffb5SSteen 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]; 18578595ffb5SSteen 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); 18738595ffb5SSteen 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]; 18798595ffb5SSteen Hegelund struct sparx5_sd10g28_mode_preset mode; 18808595ffb5SSteen 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); 18948595ffb5SSteen Hegelund sparx5_sd10g28_reset(macro->priv->regs, macro->sidx); 18958595ffb5SSteen 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; 19028595ffb5SSteen 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 19428595ffb5SSteen 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 { 19488595ffb5SSteen Hegelund void __iomem **regs = priv->regs; 19498595ffb5SSteen Hegelund struct device *dev = priv->dev; 19508595ffb5SSteen Hegelund int value; 19518595ffb5SSteen Hegelund 19528595ffb5SSteen Hegelund cmu_tgt = sdx5_inst_get(priv, TARGET_SD_CMU, cmu_idx); 19538595ffb5SSteen Hegelund cmu_cfg_tgt = sdx5_inst_get(priv, TARGET_SD_CMU_CFG, cmu_idx); 19548595ffb5SSteen Hegelund 19558595ffb5SSteen Hegelund if (cmu_idx == 1 || cmu_idx == 4 || cmu_idx == 7 || 19568595ffb5SSteen Hegelund cmu_idx == 10 || cmu_idx == 13) { 19578595ffb5SSteen Hegelund spd10g = 0; 19588595ffb5SSteen Hegelund } 19598595ffb5SSteen Hegelund 19608595ffb5SSteen 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, 19628595ffb5SSteen Hegelund cmu_cfg_tgt, 19638595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 19648595ffb5SSteen Hegelund 19658595ffb5SSteen 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, 19678595ffb5SSteen Hegelund cmu_cfg_tgt, 19688595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 19698595ffb5SSteen Hegelund 19708595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(1), 19712ff8a1eeSSteen Hegelund SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 19728595ffb5SSteen Hegelund cmu_cfg_tgt, 19738595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 19748595ffb5SSteen Hegelund 19758595ffb5SSteen 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, 19858595ffb5SSteen Hegelund cmu_tgt, 19868595ffb5SSteen Hegelund SD_CMU_CMU_45(cmu_idx)); 19872ff8a1eeSSteen Hegelund 19888595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0_SET(0), 19898595ffb5SSteen Hegelund SD_CMU_CMU_47_R_PCS2PMA_PHYMODE_4_0, 19908595ffb5SSteen Hegelund cmu_tgt, 19918595ffb5SSteen Hegelund SD_CMU_CMU_47(cmu_idx)); 19928595ffb5SSteen Hegelund 19938595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_1B_CFG_RESERVE_7_0_SET(0), 19948595ffb5SSteen Hegelund SD_CMU_CMU_1B_CFG_RESERVE_7_0, 19958595ffb5SSteen Hegelund cmu_tgt, 19968595ffb5SSteen Hegelund SD_CMU_CMU_1B(cmu_idx)); 19978595ffb5SSteen Hegelund 19988595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_0D_CFG_JC_BYP_SET(0x1), 19998595ffb5SSteen Hegelund SD_CMU_CMU_0D_CFG_JC_BYP, 20008595ffb5SSteen Hegelund cmu_tgt, 20018595ffb5SSteen Hegelund SD_CMU_CMU_0D(cmu_idx)); 20028595ffb5SSteen Hegelund 20038595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_1F_CFG_VTUNE_SEL_SET(1), 20048595ffb5SSteen Hegelund SD_CMU_CMU_1F_CFG_VTUNE_SEL, 20058595ffb5SSteen Hegelund cmu_tgt, 20068595ffb5SSteen Hegelund SD_CMU_CMU_1F(cmu_idx)); 20078595ffb5SSteen Hegelund 20088595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0_SET(3), 20098595ffb5SSteen Hegelund SD_CMU_CMU_00_CFG_PLL_TP_SEL_1_0, 20108595ffb5SSteen Hegelund cmu_tgt, 20118595ffb5SSteen Hegelund SD_CMU_CMU_00(cmu_idx)); 20128595ffb5SSteen Hegelund 20138595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0_SET(3), 20148595ffb5SSteen Hegelund SD_CMU_CMU_05_CFG_BIAS_TP_SEL_1_0, 20158595ffb5SSteen Hegelund cmu_tgt, 20168595ffb5SSteen Hegelund SD_CMU_CMU_05(cmu_idx)); 20178595ffb5SSteen Hegelund 20188595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_30_R_PLL_DLOL_EN_SET(1), 20198595ffb5SSteen Hegelund SD_CMU_CMU_30_R_PLL_DLOL_EN, 20208595ffb5SSteen Hegelund cmu_tgt, 20218595ffb5SSteen Hegelund SD_CMU_CMU_30(cmu_idx)); 20228595ffb5SSteen Hegelund 20238595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CMU_09_CFG_SW_10G_SET(spd10g), 20248595ffb5SSteen Hegelund SD_CMU_CMU_09_CFG_SW_10G, 20258595ffb5SSteen Hegelund cmu_tgt, 20268595ffb5SSteen Hegelund SD_CMU_CMU_09(cmu_idx)); 20278595ffb5SSteen Hegelund 20288595ffb5SSteen Hegelund sdx5_inst_rmw(SD_CMU_CFG_SD_CMU_CFG_CMU_RST_SET(0), 20298595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG_CMU_RST, 20308595ffb5SSteen Hegelund cmu_cfg_tgt, 20318595ffb5SSteen Hegelund SD_CMU_CFG_SD_CMU_CFG(cmu_idx)); 20328595ffb5SSteen 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 20748595ffb5SSteen 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); 2473*cbc336c0Skernel test robot iomem = devm_ioremap(priv->dev, iores->start, resource_size(iores)); 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