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

phy: qcom-qmp: Add msm8998 PCIe QMP PHY support

Documentation for this PHY, and the proper configuration settings,
is *not* publicly available. Therefore the initialization sequence
is copied wholesale from downstream:

https://source.codeaurora.org/quic/la/kernel/msm-4.4/tree/arch/arm/boot/dts/qcom/msm8998-v2.dtsi?h=LE.UM.1.3.r3.25#n372

Reviewed-by: Vivek Gautam <vivek.gautam@codeaurora.org>
Signed-off-by: Marc Gonzalez <marc.w.gonzalez@free.fr>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>

authored by

Marc Gonzalez and committed by
Kishon Vijay Abraham I
73d7ec89 7e7b8ca6

+122
+110
drivers/phy/qualcomm/phy-qcom-qmp.c
··· 242 242 QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M3P5DB_V0, 0x0e), 243 243 }; 244 244 245 + static const struct qmp_phy_init_tbl msm8998_pcie_serdes_tbl[] = { 246 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14), 247 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30), 248 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x0f), 249 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06), 250 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01), 251 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20), 252 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00), 253 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01), 254 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9), 255 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER1, 0xff), 256 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER2, 0x3f), 257 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01), 258 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00), 259 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a), 260 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_EP_DIV, 0x19), 261 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x90), 262 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82), 263 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x03), 264 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x55), 265 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x55), 266 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00), 267 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0d), 268 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x04), 269 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00), 270 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x08), 271 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16), 272 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x34), 273 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06), 274 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x33), 275 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02), 276 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x07), 277 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x04), 278 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 279 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 280 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x09), 281 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01), 282 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x40), 283 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01), 284 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x02), 285 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00), 286 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x7e), 287 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x15), 288 + }; 289 + 290 + static const struct qmp_phy_init_tbl msm8998_pcie_tx_tbl[] = { 291 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x02), 292 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12), 293 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10), 294 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06), 295 + }; 296 + 297 + static const struct qmp_phy_init_tbl msm8998_pcie_rx_tbl[] = { 298 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03), 299 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x1c), 300 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x14), 301 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0a), 302 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04), 303 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a), 304 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b), 305 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x04), 306 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN_HALF, 0x04), 307 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x00), 308 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80), 309 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40), 310 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x71), 311 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x40), 312 + }; 313 + 314 + static const struct qmp_phy_init_tbl msm8998_pcie_pcs_tbl[] = { 315 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_ENDPOINT_REFCLK_DRIVE, 0x04), 316 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_OSC_DTCT_ACTIONS, 0x00), 317 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x01), 318 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00), 319 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x20), 320 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00), 321 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01), 322 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME, 0x73), 323 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x99), 324 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_SIGDET_CNTRL, 0x03), 325 + }; 326 + 245 327 static const struct qmp_phy_init_tbl msm8996_usb3_serdes_tbl[] = { 246 328 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x14), 247 329 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08), ··· 1231 1149 .no_pcs_sw_reset = true, 1232 1150 }; 1233 1151 1152 + static const struct qmp_phy_cfg msm8998_pciephy_cfg = { 1153 + .type = PHY_TYPE_PCIE, 1154 + .nlanes = 1, 1155 + 1156 + .serdes_tbl = msm8998_pcie_serdes_tbl, 1157 + .serdes_tbl_num = ARRAY_SIZE(msm8998_pcie_serdes_tbl), 1158 + .tx_tbl = msm8998_pcie_tx_tbl, 1159 + .tx_tbl_num = ARRAY_SIZE(msm8998_pcie_tx_tbl), 1160 + .rx_tbl = msm8998_pcie_rx_tbl, 1161 + .rx_tbl_num = ARRAY_SIZE(msm8998_pcie_rx_tbl), 1162 + .pcs_tbl = msm8998_pcie_pcs_tbl, 1163 + .pcs_tbl_num = ARRAY_SIZE(msm8998_pcie_pcs_tbl), 1164 + .clk_list = msm8996_phy_clk_l, 1165 + .num_clks = ARRAY_SIZE(msm8996_phy_clk_l), 1166 + .reset_list = ipq8074_pciephy_reset_l, 1167 + .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l), 1168 + .vreg_list = qmp_phy_vreg_l, 1169 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1170 + .regs = pciephy_regs_layout, 1171 + 1172 + .start_ctrl = SERDES_START | PCS_START, 1173 + .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, 1174 + .mask_com_pcs_ready = PCS_READY, 1175 + }; 1176 + 1234 1177 static const struct qmp_phy_cfg msm8998_usb3phy_cfg = { 1235 1178 .type = PHY_TYPE_USB3, 1236 1179 .nlanes = 1, ··· 1977 1870 }, { 1978 1871 .compatible = "qcom,msm8996-qmp-usb3-phy", 1979 1872 .data = &msm8996_usb3phy_cfg, 1873 + }, { 1874 + .compatible = "qcom,msm8998-qmp-pcie-phy", 1875 + .data = &msm8998_pciephy_cfg, 1980 1876 }, { 1981 1877 .compatible = "qcom,msm8998-qmp-ufs-phy", 1982 1878 .data = &sdm845_ufsphy_cfg,
+12
drivers/phy/qualcomm/phy-qcom-qmp.h
··· 241 241 #define QSERDES_V3_RX_RX_BAND 0x110 242 242 #define QSERDES_V3_RX_RX_INTERFACE_MODE 0x11c 243 243 #define QSERDES_V3_RX_RX_MODE_00 0x164 244 + #define QSERDES_V3_RX_RX_MODE_01 0x168 244 245 245 246 /* Only for QMP V3 PHY - PCS registers */ 246 247 #define QPHY_V3_PCS_POWER_DOWN_CONTROL 0x004 ··· 281 280 #define QPHY_V3_PCS_TSYNC_RSYNC_TIME 0x08c 282 281 #define QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK 0x0a0 283 282 #define QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK 0x0a4 283 + #define QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME 0x0a8 284 284 #define QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK 0x0b0 285 285 #define QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME 0x0b8 286 286 #define QPHY_V3_PCS_RXEQTRAINING_RUN_TIME 0x0bc ··· 294 292 #define QPHY_V3_PCS_RX_MIN_HIBERN8_TIME 0x138 295 293 #define QPHY_V3_PCS_RX_SIGDET_CTRL1 0x13c 296 294 #define QPHY_V3_PCS_RX_SIGDET_CTRL2 0x140 295 + #define QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB 0x1a8 296 + #define QPHY_V3_PCS_OSC_DTCT_ACTIONS 0x1ac 297 + #define QPHY_V3_PCS_SIGDET_CNTRL 0x1b0 297 298 #define QPHY_V3_PCS_TX_MID_TERM_CTRL1 0x1bc 298 299 #define QPHY_V3_PCS_MULTI_LANE_CTRL1 0x1c4 299 300 #define QPHY_V3_PCS_RX_SIGDET_LVL 0x1d8 301 + #define QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB 0x1dc 302 + #define QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB 0x1e0 300 303 #define QPHY_V3_PCS_REFGEN_REQ_CONFIG1 0x20c 301 304 #define QPHY_V3_PCS_REFGEN_REQ_CONFIG2 0x210 302 305 303 306 /* Only for QMP V3 PHY - PCS_MISC registers */ 304 307 #define QPHY_V3_PCS_MISC_CLAMP_ENABLE 0x0c 308 + #define QPHY_V3_PCS_MISC_OSC_DTCT_CONFIG2 0x2c 309 + #define QPHY_V3_PCS_MISC_PCIE_INT_AUX_CLK_CONFIG1 0x44 310 + #define QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG2 0x54 311 + #define QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG4 0x5c 312 + #define QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG5 0x60 305 313 306 314 #endif