Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phy: cadence-torrent: Add single link USXGMII configuration for 156.25MHz refclk

Add register sequences for single link USXGMII configuration supporting
156.25MHz reference clock frequency.

Signed-off-by: Swapnil Jakhade <sjakhade@cadence.com>
Reviewed-by: Roger Quadros <rogerq@kernel.org>
Link: https://lore.kernel.org/r/20230530143853.26571-2-sjakhade@cadence.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Swapnil Jakhade and committed by
Vinod Koul
16e0f0ea d746f127

+228 -5
+228 -5
drivers/phy/cadence/phy-cadence-torrent.c
··· 27 27 #define REF_CLK_19_2MHZ 19200000 28 28 #define REF_CLK_25MHZ 25000000 29 29 #define REF_CLK_100MHZ 100000000 30 + #define REF_CLK_156_25MHZ 156250000 30 31 31 32 #define MAX_NUM_LANES 4 32 33 #define DEFAULT_MAX_BIT_RATE 8100 /* in Mbps */ 33 34 34 35 #define NUM_SSC_MODE 3 35 - #define NUM_REF_CLK 3 36 - #define NUM_PHY_TYPE 6 36 + #define NUM_REF_CLK 4 37 + #define NUM_PHY_TYPE 7 37 38 38 39 #define POLL_TIMEOUT_US 5000 39 40 #define PLL_LOCK_TIMEOUT 100000 ··· 107 106 #define CMN_PLL0_HIGH_THR_M0 0x0093U 108 107 #define CMN_PLL0_DSM_DIAG_M0 0x0094U 109 108 #define CMN_PLL0_DSM_FBH_OVRD_M0 0x0095U 109 + #define CMN_PLL0_DSM_FBL_OVRD_M0 0x0096U 110 110 #define CMN_PLL0_SS_CTRL1_M0 0x0098U 111 111 #define CMN_PLL0_SS_CTRL2_M0 0x0099U 112 112 #define CMN_PLL0_SS_CTRL3_M0 0x009AU ··· 198 196 #define RX_PSC_A2 0x0002U 199 197 #define RX_PSC_A3 0x0003U 200 198 #define RX_PSC_CAL 0x0006U 199 + #define RX_SDCAL0_INIT_TMR 0x0044U 200 + #define RX_SDCAL0_ITER_TMR 0x0045U 201 + #define RX_SDCAL1_INIT_TMR 0x004CU 202 + #define RX_SDCAL1_ITER_TMR 0x004DU 201 203 #define RX_CDRLF_CNFG 0x0080U 202 204 #define RX_CDRLF_CNFG3 0x0082U 203 205 #define RX_SIGDET_HL_FILT_TMR 0x0090U ··· 300 294 TYPE_SGMII, 301 295 TYPE_QSGMII, 302 296 TYPE_USB, 297 + TYPE_USXGMII, 303 298 }; 304 299 305 300 enum cdns_torrent_ref_clk { 306 301 CLK_19_2_MHZ, 307 302 CLK_25_MHZ, 308 - CLK_100_MHZ 303 + CLK_100_MHZ, 304 + CLK_156_25_MHZ 309 305 }; 310 306 311 307 enum cdns_torrent_ssc_mode { ··· 411 403 [NUM_SSC_MODE]; 412 404 struct cdns_torrent_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 413 405 [NUM_SSC_MODE]; 406 + struct cdns_torrent_vals *phy_pma_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 407 + [NUM_SSC_MODE]; 414 408 struct cdns_torrent_vals *cmn_vals[NUM_REF_CLK][NUM_PHY_TYPE] 415 409 [NUM_PHY_TYPE][NUM_SSC_MODE]; 416 410 struct cdns_torrent_vals *tx_ln_vals[NUM_REF_CLK][NUM_PHY_TYPE] ··· 654 644 return "QSGMII"; 655 645 case TYPE_USB: 656 646 return "USB"; 647 + case TYPE_USXGMII: 648 + return "USXGMII"; 657 649 default: 658 650 return "None"; 659 651 } ··· 2256 2244 struct cdns_torrent_inst *inst = phy_get_drvdata(phy); 2257 2245 enum cdns_torrent_phy_type phy_type = inst->phy_type; 2258 2246 enum cdns_torrent_ssc_mode ssc = inst->ssc_mode; 2247 + struct cdns_torrent_vals *phy_pma_cmn_vals; 2259 2248 struct cdns_torrent_vals *pcs_cmn_vals; 2260 2249 struct cdns_reg_pairs *reg_pairs; 2261 2250 struct regmap *regmap; ··· 2271 2258 2272 2259 /** 2273 2260 * Spread spectrum generation is not required or supported 2274 - * for SGMII/QSGMII 2261 + * for SGMII/QSGMII/USXGMII 2275 2262 */ 2276 - if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII) 2263 + if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII || phy_type == TYPE_USXGMII) 2277 2264 ssc = NO_SSC; 2278 2265 2279 2266 /* PHY configuration specific registers for single link */ ··· 2312 2299 reg_pairs = pcs_cmn_vals->reg_pairs; 2313 2300 num_regs = pcs_cmn_vals->num_regs; 2314 2301 regmap = cdns_phy->regmap_phy_pcs_common_cdb; 2302 + for (i = 0; i < num_regs; i++) 2303 + regmap_write(regmap, reg_pairs[i].off, 2304 + reg_pairs[i].val); 2305 + } 2306 + 2307 + /* PHY PMA common registers configurations */ 2308 + phy_pma_cmn_vals = init_data->phy_pma_cmn_vals[phy_type][TYPE_NONE][ssc]; 2309 + if (phy_pma_cmn_vals) { 2310 + reg_pairs = phy_pma_cmn_vals->reg_pairs; 2311 + num_regs = phy_pma_cmn_vals->num_regs; 2312 + regmap = cdns_phy->regmap_phy_pma_common_cdb; 2315 2313 for (i = 0; i < num_regs; i++) 2316 2314 regmap_write(regmap, reg_pairs[i].off, 2317 2315 reg_pairs[i].val); ··· 2641 2617 case REF_CLK_100MHZ: 2642 2618 cdns_phy->ref_clk_rate = CLK_100_MHZ; 2643 2619 break; 2620 + case REF_CLK_156_25MHZ: 2621 + cdns_phy->ref_clk_rate = CLK_156_25_MHZ; 2622 + break; 2644 2623 default: 2645 2624 dev_err(cdns_phy->dev, "Invalid Ref Clock Rate\n"); 2646 2625 clk_disable_unprepare(cdns_phy->clk); ··· 2762 2735 break; 2763 2736 case PHY_TYPE_USB3: 2764 2737 cdns_phy->phys[node].phy_type = TYPE_USB; 2738 + break; 2739 + case PHY_TYPE_USXGMII: 2740 + cdns_phy->phys[node].phy_type = TYPE_USXGMII; 2765 2741 break; 2766 2742 default: 2767 2743 dev_err(dev, "Unsupported protocol\n"); ··· 2957 2927 static struct cdns_torrent_vals dp_usb_xcvr_diag_ln_vals = { 2958 2928 .reg_pairs = dp_usb_xcvr_diag_ln_regs, 2959 2929 .num_regs = ARRAY_SIZE(dp_usb_xcvr_diag_ln_regs), 2930 + }; 2931 + 2932 + /* TI USXGMII configuration: Enable cmn_refclk_rcv_out_en */ 2933 + static struct cdns_reg_pairs ti_usxgmii_phy_pma_cmn_regs[] = { 2934 + {0x0040, PHY_PMA_CMN_CTRL1}, 2935 + }; 2936 + 2937 + static struct cdns_torrent_vals ti_usxgmii_phy_pma_cmn_vals = { 2938 + .reg_pairs = ti_usxgmii_phy_pma_cmn_regs, 2939 + .num_regs = ARRAY_SIZE(ti_usxgmii_phy_pma_cmn_regs), 2940 + }; 2941 + 2942 + /* Single USXGMII link configuration */ 2943 + static struct cdns_reg_pairs sl_usxgmii_link_cmn_regs[] = { 2944 + {0x0000, PHY_PLL_CFG}, 2945 + {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M0} 2946 + }; 2947 + 2948 + static struct cdns_reg_pairs sl_usxgmii_xcvr_diag_ln_regs[] = { 2949 + {0x0000, XCVR_DIAG_HSCLK_SEL}, 2950 + {0x0001, XCVR_DIAG_HSCLK_DIV}, 2951 + {0x0001, XCVR_DIAG_PLLDRC_CTRL} 2952 + }; 2953 + 2954 + static struct cdns_torrent_vals sl_usxgmii_link_cmn_vals = { 2955 + .reg_pairs = sl_usxgmii_link_cmn_regs, 2956 + .num_regs = ARRAY_SIZE(sl_usxgmii_link_cmn_regs), 2957 + }; 2958 + 2959 + static struct cdns_torrent_vals sl_usxgmii_xcvr_diag_ln_vals = { 2960 + .reg_pairs = sl_usxgmii_xcvr_diag_ln_regs, 2961 + .num_regs = ARRAY_SIZE(sl_usxgmii_xcvr_diag_ln_regs), 2962 + }; 2963 + 2964 + /* Single link USXGMII, 156.25 MHz Ref clk, no SSC */ 2965 + static struct cdns_reg_pairs sl_usxgmii_156_25_no_ssc_cmn_regs[] = { 2966 + {0x0014, CMN_SSM_BIAS_TMR}, 2967 + {0x0028, CMN_PLLSM0_PLLPRE_TMR}, 2968 + {0x00A4, CMN_PLLSM0_PLLLOCK_TMR}, 2969 + {0x0028, CMN_PLLSM1_PLLPRE_TMR}, 2970 + {0x00A4, CMN_PLLSM1_PLLLOCK_TMR}, 2971 + {0x0062, CMN_BGCAL_INIT_TMR}, 2972 + {0x0062, CMN_BGCAL_ITER_TMR}, 2973 + {0x0014, CMN_IBCAL_INIT_TMR}, 2974 + {0x0018, CMN_TXPUCAL_INIT_TMR}, 2975 + {0x0005, CMN_TXPUCAL_ITER_TMR}, 2976 + {0x0018, CMN_TXPDCAL_INIT_TMR}, 2977 + {0x0005, CMN_TXPDCAL_ITER_TMR}, 2978 + {0x024A, CMN_RXCAL_INIT_TMR}, 2979 + {0x0005, CMN_RXCAL_ITER_TMR}, 2980 + {0x000B, CMN_SD_CAL_REFTIM_START}, 2981 + {0x0132, CMN_SD_CAL_PLLCNT_START}, 2982 + {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0}, 2983 + {0x0014, CMN_PLL0_DSM_FBH_OVRD_M0}, 2984 + {0x0014, CMN_PLL1_DSM_FBH_OVRD_M0}, 2985 + {0x0005, CMN_PLL0_DSM_FBL_OVRD_M0}, 2986 + {0x0005, CMN_PLL1_DSM_FBL_OVRD_M0}, 2987 + {0x061B, CMN_PLL0_VCOCAL_INIT_TMR}, 2988 + {0x061B, CMN_PLL1_VCOCAL_INIT_TMR}, 2989 + {0x0019, CMN_PLL0_VCOCAL_ITER_TMR}, 2990 + {0x0019, CMN_PLL1_VCOCAL_ITER_TMR}, 2991 + {0x1354, CMN_PLL0_VCOCAL_REFTIM_START}, 2992 + {0x1354, CMN_PLL1_VCOCAL_REFTIM_START}, 2993 + {0x1354, CMN_PLL0_VCOCAL_PLLCNT_START}, 2994 + {0x1354, CMN_PLL1_VCOCAL_PLLCNT_START}, 2995 + {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 2996 + {0x0003, CMN_PLL1_VCOCAL_TCTRL}, 2997 + {0x0138, CMN_PLL0_LOCK_REFCNT_START}, 2998 + {0x0138, CMN_PLL1_LOCK_REFCNT_START}, 2999 + {0x0138, CMN_PLL0_LOCK_PLLCNT_START}, 3000 + {0x0138, CMN_PLL1_LOCK_PLLCNT_START} 3001 + }; 3002 + 3003 + static struct cdns_reg_pairs usxgmii_156_25_no_ssc_tx_ln_regs[] = { 3004 + {0x07A2, TX_RCVDET_ST_TMR}, 3005 + {0x00F3, TX_PSC_A0}, 3006 + {0x04A2, TX_PSC_A2}, 3007 + {0x04A2, TX_PSC_A3}, 3008 + {0x0000, TX_TXCC_CPOST_MULT_00}, 3009 + {0x0000, XCVR_DIAG_PSC_OVRD} 3010 + }; 3011 + 3012 + static struct cdns_reg_pairs usxgmii_156_25_no_ssc_rx_ln_regs[] = { 3013 + {0x0014, RX_SDCAL0_INIT_TMR}, 3014 + {0x0062, RX_SDCAL0_ITER_TMR}, 3015 + {0x0014, RX_SDCAL1_INIT_TMR}, 3016 + {0x0062, RX_SDCAL1_ITER_TMR}, 3017 + {0x091D, RX_PSC_A0}, 3018 + {0x0900, RX_PSC_A2}, 3019 + {0x0100, RX_PSC_A3}, 3020 + {0x0030, RX_REE_SMGM_CTRL1}, 3021 + {0x03C7, RX_REE_GCSM1_EQENM_PH1}, 3022 + {0x01C7, RX_REE_GCSM1_EQENM_PH2}, 3023 + {0x0000, RX_DIAG_DFE_CTRL}, 3024 + {0x0019, RX_REE_TAP1_CLIP}, 3025 + {0x0019, RX_REE_TAP2TON_CLIP}, 3026 + {0x00B9, RX_DIAG_NQST_CTRL}, 3027 + {0x0C21, RX_DIAG_DFE_AMP_TUNE_2}, 3028 + {0x0002, RX_DIAG_DFE_AMP_TUNE_3}, 3029 + {0x0033, RX_DIAG_PI_RATE}, 3030 + {0x0001, RX_DIAG_ACYA}, 3031 + {0x018C, RX_CDRLF_CNFG} 3032 + }; 3033 + 3034 + static struct cdns_torrent_vals sl_usxgmii_156_25_no_ssc_cmn_vals = { 3035 + .reg_pairs = sl_usxgmii_156_25_no_ssc_cmn_regs, 3036 + .num_regs = ARRAY_SIZE(sl_usxgmii_156_25_no_ssc_cmn_regs), 3037 + }; 3038 + 3039 + static struct cdns_torrent_vals usxgmii_156_25_no_ssc_tx_ln_vals = { 3040 + .reg_pairs = usxgmii_156_25_no_ssc_tx_ln_regs, 3041 + .num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_tx_ln_regs), 3042 + }; 3043 + 3044 + static struct cdns_torrent_vals usxgmii_156_25_no_ssc_rx_ln_vals = { 3045 + .reg_pairs = usxgmii_156_25_no_ssc_rx_ln_regs, 3046 + .num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_rx_ln_regs), 2960 3047 }; 2961 3048 2962 3049 /* PCIe and DP link configuration */ ··· 4176 4029 [NO_SSC] = &usb_dp_link_cmn_vals, 4177 4030 }, 4178 4031 }, 4032 + [TYPE_USXGMII] = { 4033 + [TYPE_NONE] = { 4034 + [NO_SSC] = &sl_usxgmii_link_cmn_vals, 4035 + }, 4036 + }, 4179 4037 }, 4180 4038 .xcvr_diag_vals = { 4181 4039 [TYPE_DP] = { ··· 4274 4122 [NO_SSC] = &usb_dp_xcvr_diag_ln_vals, 4275 4123 }, 4276 4124 }, 4125 + [TYPE_USXGMII] = { 4126 + [TYPE_NONE] = { 4127 + [NO_SSC] = &sl_usxgmii_xcvr_diag_ln_vals, 4128 + }, 4129 + }, 4277 4130 }, 4278 4131 .pcs_cmn_vals = { 4279 4132 [TYPE_USB] = { ··· 4304 4147 }, 4305 4148 [TYPE_DP] = { 4306 4149 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4150 + }, 4151 + }, 4152 + }, 4153 + .phy_pma_cmn_vals = { 4154 + [TYPE_USXGMII] = { 4155 + [TYPE_NONE] = { 4156 + [NO_SSC] = NULL, 4307 4157 }, 4308 4158 }, 4309 4159 }, ··· 4419 4255 }, 4420 4256 [TYPE_DP] = { 4421 4257 [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4258 + }, 4259 + }, 4260 + }, 4261 + [CLK_156_25_MHZ] = { 4262 + [TYPE_USXGMII] = { 4263 + [TYPE_NONE] = { 4264 + [NO_SSC] = &sl_usxgmii_156_25_no_ssc_cmn_vals, 4422 4265 }, 4423 4266 }, 4424 4267 }, ··· 4538 4367 }, 4539 4368 }, 4540 4369 }, 4370 + [CLK_156_25_MHZ] = { 4371 + [TYPE_USXGMII] = { 4372 + [TYPE_NONE] = { 4373 + [NO_SSC] = &usxgmii_156_25_no_ssc_tx_ln_vals, 4374 + }, 4375 + }, 4376 + }, 4541 4377 }, 4542 4378 .rx_ln_vals = { 4543 4379 [CLK_19_2_MHZ] = { ··· 4651 4473 }, 4652 4474 [TYPE_DP] = { 4653 4475 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4476 + }, 4477 + }, 4478 + }, 4479 + [CLK_156_25_MHZ] = { 4480 + [TYPE_USXGMII] = { 4481 + [TYPE_NONE] = { 4482 + [NO_SSC] = &usxgmii_156_25_no_ssc_rx_ln_vals, 4654 4483 }, 4655 4484 }, 4656 4485 }, ··· 4759 4574 [NO_SSC] = &usb_dp_link_cmn_vals, 4760 4575 }, 4761 4576 }, 4577 + [TYPE_USXGMII] = { 4578 + [TYPE_NONE] = { 4579 + [NO_SSC] = &sl_usxgmii_link_cmn_vals, 4580 + }, 4581 + }, 4762 4582 }, 4763 4583 .xcvr_diag_vals = { 4764 4584 [TYPE_DP] = { ··· 4857 4667 [NO_SSC] = &usb_dp_xcvr_diag_ln_vals, 4858 4668 }, 4859 4669 }, 4670 + [TYPE_USXGMII] = { 4671 + [TYPE_NONE] = { 4672 + [NO_SSC] = &sl_usxgmii_xcvr_diag_ln_vals, 4673 + }, 4674 + }, 4860 4675 }, 4861 4676 .pcs_cmn_vals = { 4862 4677 [TYPE_USB] = { ··· 4887 4692 }, 4888 4693 [TYPE_DP] = { 4889 4694 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4695 + }, 4696 + }, 4697 + }, 4698 + .phy_pma_cmn_vals = { 4699 + [TYPE_USXGMII] = { 4700 + [TYPE_NONE] = { 4701 + [NO_SSC] = &ti_usxgmii_phy_pma_cmn_vals, 4890 4702 }, 4891 4703 }, 4892 4704 }, ··· 5002 4800 }, 5003 4801 [TYPE_DP] = { 5004 4802 [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4803 + }, 4804 + }, 4805 + }, 4806 + [CLK_156_25_MHZ] = { 4807 + [TYPE_USXGMII] = { 4808 + [TYPE_NONE] = { 4809 + [NO_SSC] = &sl_usxgmii_156_25_no_ssc_cmn_vals, 5005 4810 }, 5006 4811 }, 5007 4812 }, ··· 5121 4912 }, 5122 4913 }, 5123 4914 }, 4915 + [CLK_156_25_MHZ] = { 4916 + [TYPE_USXGMII] = { 4917 + [TYPE_NONE] = { 4918 + [NO_SSC] = &usxgmii_156_25_no_ssc_tx_ln_vals, 4919 + }, 4920 + }, 4921 + }, 5124 4922 }, 5125 4923 .rx_ln_vals = { 5126 4924 [CLK_19_2_MHZ] = { ··· 5234 5018 }, 5235 5019 [TYPE_DP] = { 5236 5020 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5021 + }, 5022 + }, 5023 + }, 5024 + [CLK_156_25_MHZ] = { 5025 + [TYPE_USXGMII] = { 5026 + [TYPE_NONE] = { 5027 + [NO_SSC] = &usxgmii_156_25_no_ssc_rx_ln_vals, 5237 5028 }, 5238 5029 }, 5239 5030 },