162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2017, The Linux Foundation. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/clk.h> 762306a36Sopenharmony_ci#include <linux/clk-provider.h> 862306a36Sopenharmony_ci#include <linux/delay.h> 962306a36Sopenharmony_ci#include <linux/err.h> 1062306a36Sopenharmony_ci#include <linux/io.h> 1162306a36Sopenharmony_ci#include <linux/iopoll.h> 1262306a36Sopenharmony_ci#include <linux/kernel.h> 1362306a36Sopenharmony_ci#include <linux/module.h> 1462306a36Sopenharmony_ci#include <linux/of.h> 1562306a36Sopenharmony_ci#include <linux/of_address.h> 1662306a36Sopenharmony_ci#include <linux/phy/phy.h> 1762306a36Sopenharmony_ci#include <linux/platform_device.h> 1862306a36Sopenharmony_ci#include <linux/regulator/consumer.h> 1962306a36Sopenharmony_ci#include <linux/reset.h> 2062306a36Sopenharmony_ci#include <linux/slab.h> 2162306a36Sopenharmony_ci#include <linux/usb/typec.h> 2262306a36Sopenharmony_ci#include <linux/usb/typec_mux.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include <drm/drm_bridge.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#include <dt-bindings/phy/phy-qcom-qmp.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include "phy-qcom-qmp.h" 2962306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-misc-v3.h" 3062306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-usb-v4.h" 3162306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-usb-v5.h" 3262306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-usb-v6.h" 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* QPHY_SW_RESET bit */ 3562306a36Sopenharmony_ci#define SW_RESET BIT(0) 3662306a36Sopenharmony_ci/* QPHY_POWER_DOWN_CONTROL */ 3762306a36Sopenharmony_ci#define SW_PWRDN BIT(0) 3862306a36Sopenharmony_ci/* QPHY_START_CONTROL bits */ 3962306a36Sopenharmony_ci#define SERDES_START BIT(0) 4062306a36Sopenharmony_ci#define PCS_START BIT(1) 4162306a36Sopenharmony_ci/* QPHY_PCS_STATUS bit */ 4262306a36Sopenharmony_ci#define PHYSTATUS BIT(6) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* QPHY_V3_DP_COM_RESET_OVRD_CTRL register bits */ 4562306a36Sopenharmony_ci/* DP PHY soft reset */ 4662306a36Sopenharmony_ci#define SW_DPPHY_RESET BIT(0) 4762306a36Sopenharmony_ci/* mux to select DP PHY reset control, 0:HW control, 1: software reset */ 4862306a36Sopenharmony_ci#define SW_DPPHY_RESET_MUX BIT(1) 4962306a36Sopenharmony_ci/* USB3 PHY soft reset */ 5062306a36Sopenharmony_ci#define SW_USB3PHY_RESET BIT(2) 5162306a36Sopenharmony_ci/* mux to select USB3 PHY reset control, 0:HW control, 1: software reset */ 5262306a36Sopenharmony_ci#define SW_USB3PHY_RESET_MUX BIT(3) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* QPHY_V3_DP_COM_PHY_MODE_CTRL register bits */ 5562306a36Sopenharmony_ci#define USB3_MODE BIT(0) /* enables USB3 mode */ 5662306a36Sopenharmony_ci#define DP_MODE BIT(1) /* enables DP mode */ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* QPHY_PCS_AUTONOMOUS_MODE_CTRL register bits */ 5962306a36Sopenharmony_ci#define ARCVR_DTCT_EN BIT(0) 6062306a36Sopenharmony_ci#define ALFPS_DTCT_EN BIT(1) 6162306a36Sopenharmony_ci#define ARCVR_DTCT_EVENT_SEL BIT(4) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */ 6462306a36Sopenharmony_ci#define IRQ_CLEAR BIT(0) 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */ 6762306a36Sopenharmony_ci#define CLAMP_EN BIT(0) /* enables i/o clamp_n */ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* QPHY_V3_DP_COM_TYPEC_CTRL register bits */ 7062306a36Sopenharmony_ci#define SW_PORTSELECT_VAL BIT(0) 7162306a36Sopenharmony_ci#define SW_PORTSELECT_MUX BIT(1) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define PHY_INIT_COMPLETE_TIMEOUT 10000 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct qmp_phy_init_tbl { 7662306a36Sopenharmony_ci unsigned int offset; 7762306a36Sopenharmony_ci unsigned int val; 7862306a36Sopenharmony_ci /* 7962306a36Sopenharmony_ci * mask of lanes for which this register is written 8062306a36Sopenharmony_ci * for cases when second lane needs different values 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_ci u8 lane_mask; 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define QMP_PHY_INIT_CFG(o, v) \ 8662306a36Sopenharmony_ci { \ 8762306a36Sopenharmony_ci .offset = o, \ 8862306a36Sopenharmony_ci .val = v, \ 8962306a36Sopenharmony_ci .lane_mask = 0xff, \ 9062306a36Sopenharmony_ci } 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define QMP_PHY_INIT_CFG_LANE(o, v, l) \ 9362306a36Sopenharmony_ci { \ 9462306a36Sopenharmony_ci .offset = o, \ 9562306a36Sopenharmony_ci .val = v, \ 9662306a36Sopenharmony_ci .lane_mask = l, \ 9762306a36Sopenharmony_ci } 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* set of registers with offsets different per-PHY */ 10062306a36Sopenharmony_cienum qphy_reg_layout { 10162306a36Sopenharmony_ci /* PCS registers */ 10262306a36Sopenharmony_ci QPHY_SW_RESET, 10362306a36Sopenharmony_ci QPHY_START_CTRL, 10462306a36Sopenharmony_ci QPHY_PCS_STATUS, 10562306a36Sopenharmony_ci QPHY_PCS_AUTONOMOUS_MODE_CTRL, 10662306a36Sopenharmony_ci QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR, 10762306a36Sopenharmony_ci QPHY_PCS_POWER_DOWN_CONTROL, 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci QPHY_COM_RESETSM_CNTRL, 11062306a36Sopenharmony_ci QPHY_COM_C_READY_STATUS, 11162306a36Sopenharmony_ci QPHY_COM_CMN_STATUS, 11262306a36Sopenharmony_ci QPHY_COM_BIAS_EN_CLKBUFLR_EN, 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci QPHY_DP_PHY_STATUS, 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci QPHY_TX_TX_POL_INV, 11762306a36Sopenharmony_ci QPHY_TX_TX_DRV_LVL, 11862306a36Sopenharmony_ci QPHY_TX_TX_EMP_POST1_LVL, 11962306a36Sopenharmony_ci QPHY_TX_HIGHZ_DRVR_EN, 12062306a36Sopenharmony_ci QPHY_TX_TRANSCEIVER_BIAS_EN, 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* Keep last to ensure regs_layout arrays are properly initialized */ 12362306a36Sopenharmony_ci QPHY_LAYOUT_SIZE 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 12762306a36Sopenharmony_ci [QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET, 12862306a36Sopenharmony_ci [QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL, 12962306a36Sopenharmony_ci [QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS, 13062306a36Sopenharmony_ci [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL, 13162306a36Sopenharmony_ci [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL, 13262306a36Sopenharmony_ci [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR, 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci [QPHY_COM_RESETSM_CNTRL] = QSERDES_V3_COM_RESETSM_CNTRL, 13562306a36Sopenharmony_ci [QPHY_COM_C_READY_STATUS] = QSERDES_V3_COM_C_READY_STATUS, 13662306a36Sopenharmony_ci [QPHY_COM_CMN_STATUS] = QSERDES_V3_COM_CMN_STATUS, 13762306a36Sopenharmony_ci [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci [QPHY_DP_PHY_STATUS] = QSERDES_V3_DP_PHY_STATUS, 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci [QPHY_TX_TX_POL_INV] = QSERDES_V3_TX_TX_POL_INV, 14262306a36Sopenharmony_ci [QPHY_TX_TX_DRV_LVL] = QSERDES_V3_TX_TX_DRV_LVL, 14362306a36Sopenharmony_ci [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V3_TX_TX_EMP_POST1_LVL, 14462306a36Sopenharmony_ci [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V3_TX_HIGHZ_DRVR_EN, 14562306a36Sopenharmony_ci [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic const unsigned int qmp_v45_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 14962306a36Sopenharmony_ci [QPHY_SW_RESET] = QPHY_V4_PCS_SW_RESET, 15062306a36Sopenharmony_ci [QPHY_START_CTRL] = QPHY_V4_PCS_START_CONTROL, 15162306a36Sopenharmony_ci [QPHY_PCS_STATUS] = QPHY_V4_PCS_PCS_STATUS1, 15262306a36Sopenharmony_ci [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V4_PCS_POWER_DOWN_CONTROL, 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci /* In PCS_USB */ 15562306a36Sopenharmony_ci [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL, 15662306a36Sopenharmony_ci [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci [QPHY_COM_RESETSM_CNTRL] = QSERDES_V4_COM_RESETSM_CNTRL, 15962306a36Sopenharmony_ci [QPHY_COM_C_READY_STATUS] = QSERDES_V4_COM_C_READY_STATUS, 16062306a36Sopenharmony_ci [QPHY_COM_CMN_STATUS] = QSERDES_V4_COM_CMN_STATUS, 16162306a36Sopenharmony_ci [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci [QPHY_DP_PHY_STATUS] = QSERDES_V4_DP_PHY_STATUS, 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci [QPHY_TX_TX_POL_INV] = QSERDES_V4_TX_TX_POL_INV, 16662306a36Sopenharmony_ci [QPHY_TX_TX_DRV_LVL] = QSERDES_V4_TX_TX_DRV_LVL, 16762306a36Sopenharmony_ci [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V4_TX_TX_EMP_POST1_LVL, 16862306a36Sopenharmony_ci [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V4_TX_HIGHZ_DRVR_EN, 16962306a36Sopenharmony_ci [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V4_TX_TRANSCEIVER_BIAS_EN, 17062306a36Sopenharmony_ci}; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_cistatic const unsigned int qmp_v5_5nm_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 17362306a36Sopenharmony_ci [QPHY_SW_RESET] = QPHY_V5_PCS_SW_RESET, 17462306a36Sopenharmony_ci [QPHY_START_CTRL] = QPHY_V5_PCS_START_CONTROL, 17562306a36Sopenharmony_ci [QPHY_PCS_STATUS] = QPHY_V5_PCS_PCS_STATUS1, 17662306a36Sopenharmony_ci [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_POWER_DOWN_CONTROL, 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci /* In PCS_USB */ 17962306a36Sopenharmony_ci [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL, 18062306a36Sopenharmony_ci [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci [QPHY_COM_RESETSM_CNTRL] = QSERDES_V5_COM_RESETSM_CNTRL, 18362306a36Sopenharmony_ci [QPHY_COM_C_READY_STATUS] = QSERDES_V5_COM_C_READY_STATUS, 18462306a36Sopenharmony_ci [QPHY_COM_CMN_STATUS] = QSERDES_V5_COM_CMN_STATUS, 18562306a36Sopenharmony_ci [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN, 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci [QPHY_DP_PHY_STATUS] = QSERDES_V5_DP_PHY_STATUS, 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci [QPHY_TX_TX_POL_INV] = QSERDES_V5_5NM_TX_TX_POL_INV, 19062306a36Sopenharmony_ci [QPHY_TX_TX_DRV_LVL] = QSERDES_V5_5NM_TX_TX_DRV_LVL, 19162306a36Sopenharmony_ci [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL, 19262306a36Sopenharmony_ci [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN, 19362306a36Sopenharmony_ci [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN, 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistatic const unsigned int qmp_v6_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 19762306a36Sopenharmony_ci [QPHY_SW_RESET] = QPHY_V5_PCS_SW_RESET, 19862306a36Sopenharmony_ci [QPHY_START_CTRL] = QPHY_V5_PCS_START_CONTROL, 19962306a36Sopenharmony_ci [QPHY_PCS_STATUS] = QPHY_V5_PCS_PCS_STATUS1, 20062306a36Sopenharmony_ci [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_POWER_DOWN_CONTROL, 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci /* In PCS_USB */ 20362306a36Sopenharmony_ci [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL, 20462306a36Sopenharmony_ci [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci [QPHY_COM_RESETSM_CNTRL] = QSERDES_V6_COM_RESETSM_CNTRL, 20762306a36Sopenharmony_ci [QPHY_COM_C_READY_STATUS] = QSERDES_V6_COM_C_READY_STATUS, 20862306a36Sopenharmony_ci [QPHY_COM_CMN_STATUS] = QSERDES_V6_COM_CMN_STATUS, 20962306a36Sopenharmony_ci [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN, 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci [QPHY_DP_PHY_STATUS] = QSERDES_V6_DP_PHY_STATUS, 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci [QPHY_TX_TX_POL_INV] = QSERDES_V6_TX_TX_POL_INV, 21462306a36Sopenharmony_ci [QPHY_TX_TX_DRV_LVL] = QSERDES_V6_TX_TX_DRV_LVL, 21562306a36Sopenharmony_ci [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V6_TX_TX_EMP_POST1_LVL, 21662306a36Sopenharmony_ci [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V6_TX_HIGHZ_DRVR_EN, 21762306a36Sopenharmony_ci [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V6_TX_TRANSCEIVER_BIAS_EN, 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = { 22162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07), 22262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14), 22362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08), 22462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30), 22562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02), 22662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08), 22762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16), 22862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01), 22962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80), 23062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82), 23162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab), 23262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea), 23362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02), 23462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06), 23562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16), 23662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36), 23762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 23862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 23962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01), 24062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9), 24162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a), 24262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00), 24362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34), 24462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15), 24562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04), 24662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00), 24762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00), 24862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00), 24962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a), 25062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01), 25162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31), 25262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01), 25362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00), 25462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00), 25562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85), 25662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07), 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = { 26062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10), 26162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12), 26262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16), 26362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09), 26462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06), 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl[] = { 26862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01), 26962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x37), 27062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02), 27162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x0e), 27262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06), 27362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30), 27462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x02), 27562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x00), 27662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 27762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 27862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00), 27962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00), 28062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a), 28162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a), 28262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00), 28362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x3f), 28462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x1f), 28562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07), 28662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36), 28762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16), 28862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06), 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_rbr[] = { 29262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x0c), 29362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69), 29462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80), 29562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07), 29662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x6f), 29762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x08), 29862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00), 29962306a36Sopenharmony_ci}; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr[] = { 30262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x04), 30362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69), 30462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80), 30562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07), 30662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x0f), 30762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0e), 30862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00), 30962306a36Sopenharmony_ci}; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr2[] = { 31262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00), 31362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x8c), 31462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x00), 31562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x0a), 31662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x1f), 31762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x1c), 31862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00), 31962306a36Sopenharmony_ci}; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr3[] = { 32262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x03), 32362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69), 32462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80), 32562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07), 32662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x2f), 32762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x2a), 32862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x08), 32962306a36Sopenharmony_ci}; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_tx_tbl[] = { 33262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 0x1a), 33362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_VMODE_CTRL1, 0x40), 33462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_PRE_STALL_LDO_BOOST_EN, 0x30), 33562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_INTERFACE_SELECT, 0x3d), 33662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_CLKBUF_ENABLE, 0x0f), 33762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_RESET_TSYNC_EN, 0x03), 33862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRAN_DRVR_EMP_EN, 0x03), 33962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00), 34062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_INTERFACE_MODE, 0x00), 34162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_BAND, 0x4), 34262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_POL_INV, 0x0a), 34362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_DRV_LVL, 0x38), 34462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_EMP_POST1_LVL, 0x20), 34562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06), 34662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07), 34762306a36Sopenharmony_ci}; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = { 35062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b), 35162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 35262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e), 35362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18), 35462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 35562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80), 35662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03), 35762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16), 35862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75), 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = { 36262306a36Sopenharmony_ci /* FLL settings */ 36362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83), 36462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09), 36562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2), 36662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40), 36762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02), 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci /* Lock Det settings */ 37062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1), 37162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f), 37262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47), 37362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b), 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba), 37662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f), 37762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f), 37862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7), 37962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e), 38062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65), 38162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b), 38262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15), 38362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d), 38462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15), 38562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d), 38662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15), 38762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d), 38862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15), 38962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d), 39062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15), 39162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d), 39262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15), 39362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d), 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02), 39662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 39762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44), 39862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 39962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 40062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 40162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40), 40262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00), 40362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75), 40462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86), 40562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13), 40662306a36Sopenharmony_ci}; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6350_usb3_rx_tbl[] = { 40962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b), 41062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 41162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e), 41262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18), 41362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 41462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80), 41562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03), 41662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16), 41762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05), 41862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75), 41962306a36Sopenharmony_ci}; 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6350_usb3_pcs_tbl[] = { 42262306a36Sopenharmony_ci /* FLL settings */ 42362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83), 42462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09), 42562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2), 42662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40), 42762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02), 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci /* Lock Det settings */ 43062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1), 43162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f), 43262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47), 43362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b), 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xcc), 43662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f), 43762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f), 43862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7), 43962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e), 44062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65), 44162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b), 44262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15), 44362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d), 44462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15), 44562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d), 44662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15), 44762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d), 44862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15), 44962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d), 45062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15), 45162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d), 45262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15), 45362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d), 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02), 45662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 45762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44), 45862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 45962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 46062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 46162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40), 46262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00), 46362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75), 46462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86), 46562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13), 46662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_DET_HIGH_COUNT_VAL, 0x04), 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x21), 46962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG2, 0x60), 47062306a36Sopenharmony_ci}; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = { 47362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01), 47462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31), 47562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01), 47662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde), 47762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07), 47862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde), 47962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07), 48062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a), 48162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20), 48262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06), 48362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06), 48462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16), 48562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16), 48662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36), 48762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36), 48862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a), 48962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04), 49062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14), 49162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34), 49262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34), 49362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82), 49462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82), 49562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82), 49662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab), 49762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea), 49862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02), 49962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02), 50062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab), 50162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea), 50262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02), 50362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24), 50462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24), 50562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02), 50662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01), 50762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08), 50862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca), 50962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e), 51062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca), 51162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e), 51262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11), 51362306a36Sopenharmony_ci}; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = { 51662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00), 51762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00), 51862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5), 51962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12), 52062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20), 52162306a36Sopenharmony_ci}; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = { 52462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05), 52562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 52662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 52762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 52862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 52962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99), 53062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04), 53162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08), 53262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05), 53362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05), 53462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54), 53562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e), 53662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 53762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 53862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 53962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 54062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 54162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 54262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04), 54362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 54462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf), 54562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf), 54662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f), 54762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f), 54862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94), 54962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc), 55062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc), 55162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c), 55262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b), 55362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3), 55462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04), 55562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 55662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 55762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c), 55862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f), 55962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10), 56062306a36Sopenharmony_ci}; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = { 56362306a36Sopenharmony_ci /* Lock Det settings */ 56462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 56562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 56662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 56962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa), 57062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 57162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 57262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 57362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 57462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 57562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 57662306a36Sopenharmony_ci}; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_pcs_usb_tbl[] = { 57962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 58062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 58162306a36Sopenharmony_ci}; 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = { 58462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60), 58562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60), 58662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11), 58762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02), 58862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5), 58962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12), 59062306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1), 59162306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2), 59262306a36Sopenharmony_ci}; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = { 59562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06), 59662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 59762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 59862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 59962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 60062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99), 60162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04), 60262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08), 60362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05), 60462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05), 60562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54), 60662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c), 60762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 60862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 60962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 61062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 61162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 61262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 61362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04), 61462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 61562306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1), 61662306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2), 61762306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1), 61862306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2), 61962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f), 62062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f), 62162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97), 62262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc), 62362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc), 62462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c), 62562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b), 62662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4), 62762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04), 62862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 62962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 63062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c), 63162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f), 63262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10), 63362306a36Sopenharmony_ci}; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = { 63662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 63762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 63862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20), 63962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 64062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 64162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9), 64262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 64362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 64462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 64562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 64662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 64762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 64862306a36Sopenharmony_ci}; 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_pcs_usb_tbl[] = { 65162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 65262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 65362306a36Sopenharmony_ci}; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_tx_tbl[] = { 65662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_TX, 0x00), 65762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_RX, 0x00), 65862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x16), 65962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e), 66062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x35), 66162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f), 66262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x7f), 66362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_5, 0x3f), 66462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RCV_DETECT_LVL_2, 0x12), 66562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21), 66662306a36Sopenharmony_ci}; 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_rx_tbl[] = { 66962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a), 67062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05), 67162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 67262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 67362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 67462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 67562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99), 67662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08), 67762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08), 67862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00), 67962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04), 68062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54), 68162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f), 68262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 68362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 68462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 68562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 68662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 68762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47), 68862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04), 68962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 69062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbb), 69162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7b), 69262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbb), 69362306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3d, 1), 69462306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3c, 2), 69562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdb), 69662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64), 69762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24), 69862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xd2), 69962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x13), 70062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9), 70162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_EN_TIMER, 0x04), 70262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 70362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 70462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c), 70562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00), 70662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_RX_VTH_CODE, 0x10), 70762306a36Sopenharmony_ci}; 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_pcs_tbl[] = { 71062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 71162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 71262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 71362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 71462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20), 71562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 71662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 71762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa), 71862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 71962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 72062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 72162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 72262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 72362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 72462306a36Sopenharmony_ci}; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_pcs_usb_tbl[] = { 72762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40), 72862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00), 72962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 73062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 73162306a36Sopenharmony_ci}; 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_serdes_tbl[] = { 73462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE1, 0xc0), 73562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE1, 0x01), 73662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x02), 73762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x16), 73862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x36), 73962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORECLK_DIV_MODE1, 0x04), 74062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x16), 74162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x41), 74262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x41), 74362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE1, 0x00), 74462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE1, 0x55), 74562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE1, 0x75), 74662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE1, 0x01), 74762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01), 74862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE1, 0x25), 74962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE1, 0x02), 75062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0x5c), 75162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x0f), 75262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x5c), 75362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0f), 75462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE0, 0xc0), 75562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0, 0x01), 75662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x02), 75762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16), 75862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36), 75962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x08), 76062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x1a), 76162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41), 76262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE0, 0x00), 76362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x55), 76462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x75), 76562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x01), 76662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE0, 0x25), 76762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE0, 0x02), 76862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a), 76962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_EN_CENTER, 0x01), 77062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER1, 0x62), 77162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER2, 0x02), 77262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x0c), 77362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x1a), 77462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_CFG, 0x14), 77562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04), 77662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x20), 77762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16), 77862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_1, 0xb6), 77962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_2, 0x4b), 78062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_3, 0x37), 78162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_ADDITIONAL_MISC, 0x0c), 78262306a36Sopenharmony_ci}; 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_tx_tbl[] = { 78562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_TX, 0x00), 78662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_RX, 0x00), 78762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x1f), 78862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x09), 78962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_1, 0xf5), 79062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_3, 0x3f), 79162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_4, 0x3f), 79262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_5, 0x5f), 79362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RCV_DETECT_LVL_2, 0x12), 79462306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x21, 1), 79562306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x05, 2), 79662306a36Sopenharmony_ci}; 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_rx_tbl[] = { 79962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FO_GAIN, 0x0a), 80062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_GAIN, 0x06), 80162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 80262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 80362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 80462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 80562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_PI_CONTROLS, 0x99), 80662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH1, 0x08), 80762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH2, 0x08), 80862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN1, 0x00), 80962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN2, 0x0a), 81062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 81162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL1, 0x54), 81262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL2, 0x0f), 81362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_GM_CAL, 0x13), 81462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 81562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 81662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 81762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_LOW, 0x07), 81862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 81962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47), 82062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CNTRL, 0x04), 82162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 82262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_LOW, 0xdc), 82362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH, 0x5c), 82462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH2, 0x9c), 82562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH3, 0x1d), 82662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH4, 0x09), 82762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_EN_TIMER, 0x04), 82862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 82962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_DCC_CTRL1, 0x0c), 83062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_VTH_CODE, 0x10), 83162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_CTRL1, 0x14), 83262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_TRIM, 0x08), 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0x3f, 1), 83562306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 1), 83662306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xff, 1), 83762306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 1), 83862306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xed, 1), 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0xbf, 2), 84162306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 2), 84262306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xbf, 2), 84362306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 2), 84462306a36Sopenharmony_ci QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xfd, 2), 84562306a36Sopenharmony_ci}; 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_pcs_tbl[] = { 84862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG1, 0xc4), 84962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG2, 0x89), 85062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG3, 0x20), 85162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG6, 0x13), 85262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_REFGEN_REQ_CONFIG1, 0x21), 85362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RX_SIGDET_LVL, 0x99), 85462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 85562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 85662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_CDR_RESET_TIME, 0x0a), 85762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG1, 0x88), 85862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG2, 0x13), 85962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG, 0x0c), 86062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG1, 0x4b), 86162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG5, 0x10), 86262306a36Sopenharmony_ci}; 86362306a36Sopenharmony_ci 86462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_pcs_usb_tbl[] = { 86562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68), 86662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 86762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 86862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40), 86962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00), 87062306a36Sopenharmony_ci}; 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl[] = { 87362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05), 87462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b), 87562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x02), 87662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x0c), 87762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x06), 87862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x30), 87962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f), 88062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36), 88162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16), 88262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06), 88362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x02), 88462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 88562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 88662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x00), 88762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x00), 88862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x0a), 88962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x0a), 89062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_CTRL, 0x00), 89162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x17), 89262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f), 89362306a36Sopenharmony_ci}; 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_rbr[] = { 89662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x05), 89762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69), 89862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80), 89962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07), 90062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x6f), 90162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x08), 90262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04), 90362306a36Sopenharmony_ci}; 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr[] = { 90662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x03), 90762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69), 90862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80), 90962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07), 91062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x0f), 91162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0e), 91262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08), 91362306a36Sopenharmony_ci}; 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr2[] = { 91662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01), 91762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x8c), 91862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x00), 91962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x0a), 92062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x1f), 92162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x1c), 92262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08), 92362306a36Sopenharmony_ci}; 92462306a36Sopenharmony_ci 92562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr3[] = { 92662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x00), 92762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69), 92862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80), 92962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07), 93062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x2f), 93162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x2a), 93262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08), 93362306a36Sopenharmony_ci}; 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_tx_tbl[] = { 93662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_VMODE_CTRL1, 0x40), 93762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_PRE_STALL_LDO_BOOST_EN, 0x30), 93862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_INTERFACE_SELECT, 0x3b), 93962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_CLKBUF_ENABLE, 0x0f), 94062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RESET_TSYNC_EN, 0x03), 94162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0f), 94262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00), 94362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_INTERFACE_MODE, 0x00), 94462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11), 94562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x11), 94662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_BAND, 0x4), 94762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_POL_INV, 0x0a), 94862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_DRV_LVL, 0x2a), 94962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_EMP_POST1_LVL, 0x20), 95062306a36Sopenharmony_ci}; 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v5_dp_serdes_tbl[] = { 95362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05), 95462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b), 95562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x02), 95662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x0c), 95762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x06), 95862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x30), 95962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f), 96062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36), 96162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36), 96262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16), 96362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16), 96462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06), 96562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06), 96662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x02), 96762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 96862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 96962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02), 97062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x00), 97162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x0a), 97262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x0a), 97362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_CTRL, 0x00), 97462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x17), 97562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f), 97662306a36Sopenharmony_ci}; 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v5_dp_tx_tbl[] = { 97962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_VMODE_CTRL1, 0x40), 98062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_PRE_STALL_LDO_BOOST_EN, 0x30), 98162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_INTERFACE_SELECT, 0x3b), 98262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_CLKBUF_ENABLE, 0x0f), 98362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RESET_TSYNC_EN, 0x03), 98462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_TRAN_DRVR_EMP_EN, 0x0f), 98562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00), 98662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_INTERFACE_MODE, 0x00), 98762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x11), 98862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x11), 98962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_BAND, 0x04), 99062306a36Sopenharmony_ci}; 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v5_5nm_dp_tx_tbl[] = { 99362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x51), 99462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN, 0x1a), 99562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_VMODE_CTRL1, 0x40), 99662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_PRE_STALL_LDO_BOOST_EN, 0x0), 99762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_INTERFACE_SELECT, 0xff), 99862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_CLKBUF_ENABLE, 0x0f), 99962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RESET_TSYNC_EN, 0x03), 100062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRAN_DRVR_EMP_EN, 0xf), 100162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00), 100262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_TX, 0x11), 100362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_RX, 0x11), 100462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TX_BAND, 0x01), 100562306a36Sopenharmony_ci}; 100662306a36Sopenharmony_ci 100762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl[] = { 100862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SVS_MODE_CLK_SEL, 0x15), 100962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x3b), 101062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYS_CLK_CTRL, 0x02), 101162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_ENABLE1, 0x0c), 101262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x06), 101362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_SELECT, 0x30), 101462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f), 101562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36), 101662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16), 101762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x06), 101862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x00), 101962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x12), 102062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 102162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 102262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x00), 102362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a), 102462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CORE_CLK_DIV_MODE0, 0x14), 102562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_CTRL, 0x00), 102662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN, 0x17), 102762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x0f), 102862306a36Sopenharmony_ci}; 102962306a36Sopenharmony_ci 103062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_tx_tbl[] = { 103162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_VMODE_CTRL1, 0x40), 103262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_PRE_STALL_LDO_BOOST_EN, 0x30), 103362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_INTERFACE_SELECT, 0x3b), 103462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_CLKBUF_ENABLE, 0x0f), 103562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RESET_TSYNC_EN, 0x03), 103662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_TRAN_DRVR_EMP_EN, 0x0f), 103762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00), 103862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_INTERFACE_MODE, 0x00), 103962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x0c), 104062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x0c), 104162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_BAND, 0x4), 104262306a36Sopenharmony_ci}; 104362306a36Sopenharmony_ci 104462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_rbr[] = { 104562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x05), 104662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34), 104762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0), 104862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b), 104962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x37), 105062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x04), 105162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x04), 105262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71), 105362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c), 105462306a36Sopenharmony_ci}; 105562306a36Sopenharmony_ci 105662306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr[] = { 105762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x03), 105862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34), 105962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0), 106062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b), 106162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x07), 106262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x07), 106362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08), 106462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71), 106562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c), 106662306a36Sopenharmony_ci}; 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr2[] = { 106962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01), 107062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x46), 107162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x00), 107262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x05), 107362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x0f), 107462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x0e), 107562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08), 107662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x97), 107762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x10), 107862306a36Sopenharmony_ci}; 107962306a36Sopenharmony_ci 108062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr3[] = { 108162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x00), 108262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34), 108362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0), 108462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b), 108562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x17), 108662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x15), 108762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08), 108862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71), 108962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c), 109062306a36Sopenharmony_ci}; 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_serdes_tbl[] = { 109362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01), 109462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31), 109562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER2, 0x01), 109662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE0, 0xfd), 109762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE0, 0x0d), 109862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE1, 0xfd), 109962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE1, 0x0d), 110062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_BUF_ENABLE, 0x0a), 110162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x02), 110262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x02), 110362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x16), 110462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x16), 110562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x36), 110662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x36), 110762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0x1a), 110862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x04), 110962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0x14), 111062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x34), 111162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x34), 111262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x82), 111362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x04), 111462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MSB_MODE0, 0x01), 111562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0x04), 111662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MSB_MODE1, 0x01), 111762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE0, 0x55), 111862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE0, 0xd5), 111962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE0, 0x05), 112062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE1, 0x55), 112162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE1, 0xd5), 112262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE1, 0x05), 112362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02), 112462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE1_MODE0, 0xd4), 112562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE2_MODE0, 0x00), 112662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE1_MODE1, 0xd4), 112762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE2_MODE1, 0x00), 112862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x13), 112962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00), 113062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE0, 0x0a), 113162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE1, 0x04), 113262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORE_CLK_EN, 0x60), 113362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_CONFIG, 0x76), 113462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0xff), 113562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_INTEGLOOP_GAIN0_MODE0, 0x20), 113662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_INTEGLOOP_GAIN0_MODE1, 0x20), 113762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_INITVAL2, 0x00), 113862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAXVAL2, 0x01), 113962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_COM_SVS_MODE_CLK_SEL, 0x0a), 114062306a36Sopenharmony_ci}; 114162306a36Sopenharmony_ci 114262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_tx_tbl[] = { 114362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_1, 0x05), 114462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_2, 0xc2), 114562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x10), 114662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_TX, 0x1f), 114762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_RX, 0x0a), 114862306a36Sopenharmony_ci}; 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_rx_tbl[] = { 115162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_CNTRL, 0x04), 115262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 115362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_ENABLES, 0x00), 115462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B0, 0xd2), 115562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B1, 0xd2), 115662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B2, 0xdb), 115762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B3, 0x21), 115862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B4, 0x3f), 115962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B5, 0x80), 116062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B6, 0x45), 116162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B7, 0x00), 116262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B0, 0x6b), 116362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B1, 0x63), 116462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B2, 0xb6), 116562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B3, 0x23), 116662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B4, 0x35), 116762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B5, 0x30), 116862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B6, 0x8e), 116962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B7, 0x00), 117062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_CAL_CODE_OVERRIDE, 0x00), 117162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_CAL_CTRL2, 0x80), 117262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_SUMMER_CAL_SPD_MODE, 0x1b), 117362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 117462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_PI_CONTROLS, 0x15), 117562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_SB2_GAIN2_RATE2, 0x0a), 117662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_POSTCAL_OFFSET, 0x7c), 117762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_VGA_CAL_CNTRL1, 0x00), 117862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_VGA_CAL_MAN_VAL, 0x0d), 117962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_DAC_ENABLE1, 0x00), 118062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_3, 0x45), 118162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_GM_CAL, 0x09), 118262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_FO_GAIN_RATE2, 0x09), 118362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_SO_GAIN_RATE2, 0x05), 118462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_Q_PI_INTRINSIC_BIAS_RATE32, 0x3f), 118562306a36Sopenharmony_ci}; 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_pcs_tbl[] = { 118862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 118962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 119062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG1, 0xd0), 119162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG2, 0x07), 119262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG3, 0x20), 119362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG6, 0x13), 119462306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x21), 119562306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0xaa), 119662306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_CONFIG, 0x0a), 119762306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG1, 0x88), 119862306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG2, 0x13), 119962306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCS_TX_RX_CONFIG, 0x0c), 120062306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_EQ_CONFIG1, 0x4b), 120162306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_EQ_CONFIG5, 0x10), 120262306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 120362306a36Sopenharmony_ci QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 120462306a36Sopenharmony_ci}; 120562306a36Sopenharmony_ci 120662306a36Sopenharmony_ci/* list of regulators */ 120762306a36Sopenharmony_cistruct qmp_regulator_data { 120862306a36Sopenharmony_ci const char *name; 120962306a36Sopenharmony_ci unsigned int enable_load; 121062306a36Sopenharmony_ci}; 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_cistatic struct qmp_regulator_data qmp_phy_vreg_l[] = { 121362306a36Sopenharmony_ci { .name = "vdda-phy", .enable_load = 21800 }, 121462306a36Sopenharmony_ci { .name = "vdda-pll", .enable_load = 36000 }, 121562306a36Sopenharmony_ci}; 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_cistatic const u8 qmp_dp_v3_pre_emphasis_hbr3_hbr2[4][4] = { 121862306a36Sopenharmony_ci { 0x00, 0x0c, 0x15, 0x1a }, 121962306a36Sopenharmony_ci { 0x02, 0x0e, 0x16, 0xff }, 122062306a36Sopenharmony_ci { 0x02, 0x11, 0xff, 0xff }, 122162306a36Sopenharmony_ci { 0x04, 0xff, 0xff, 0xff } 122262306a36Sopenharmony_ci}; 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_cistatic const u8 qmp_dp_v3_voltage_swing_hbr3_hbr2[4][4] = { 122562306a36Sopenharmony_ci { 0x02, 0x12, 0x16, 0x1a }, 122662306a36Sopenharmony_ci { 0x09, 0x19, 0x1f, 0xff }, 122762306a36Sopenharmony_ci { 0x10, 0x1f, 0xff, 0xff }, 122862306a36Sopenharmony_ci { 0x1f, 0xff, 0xff, 0xff } 122962306a36Sopenharmony_ci}; 123062306a36Sopenharmony_ci 123162306a36Sopenharmony_cistatic const u8 qmp_dp_v3_pre_emphasis_hbr_rbr[4][4] = { 123262306a36Sopenharmony_ci { 0x00, 0x0c, 0x14, 0x19 }, 123362306a36Sopenharmony_ci { 0x00, 0x0b, 0x12, 0xff }, 123462306a36Sopenharmony_ci { 0x00, 0x0b, 0xff, 0xff }, 123562306a36Sopenharmony_ci { 0x04, 0xff, 0xff, 0xff } 123662306a36Sopenharmony_ci}; 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_cistatic const u8 qmp_dp_v3_voltage_swing_hbr_rbr[4][4] = { 123962306a36Sopenharmony_ci { 0x08, 0x0f, 0x16, 0x1f }, 124062306a36Sopenharmony_ci { 0x11, 0x1e, 0x1f, 0xff }, 124162306a36Sopenharmony_ci { 0x19, 0x1f, 0xff, 0xff }, 124262306a36Sopenharmony_ci { 0x1f, 0xff, 0xff, 0xff } 124362306a36Sopenharmony_ci}; 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_cistatic const u8 qmp_dp_v4_pre_emphasis_hbr3_hbr2[4][4] = { 124662306a36Sopenharmony_ci { 0x00, 0x0c, 0x15, 0x1b }, 124762306a36Sopenharmony_ci { 0x02, 0x0e, 0x16, 0xff }, 124862306a36Sopenharmony_ci { 0x02, 0x11, 0xff, 0xff }, 124962306a36Sopenharmony_ci { 0x04, 0xff, 0xff, 0xff } 125062306a36Sopenharmony_ci}; 125162306a36Sopenharmony_ci 125262306a36Sopenharmony_cistatic const u8 qmp_dp_v4_pre_emphasis_hbr_rbr[4][4] = { 125362306a36Sopenharmony_ci { 0x00, 0x0d, 0x14, 0x1a }, 125462306a36Sopenharmony_ci { 0x00, 0x0e, 0x15, 0xff }, 125562306a36Sopenharmony_ci { 0x00, 0x0d, 0xff, 0xff }, 125662306a36Sopenharmony_ci { 0x03, 0xff, 0xff, 0xff } 125762306a36Sopenharmony_ci}; 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_cistatic const u8 qmp_dp_v4_voltage_swing_hbr_rbr[4][4] = { 126062306a36Sopenharmony_ci { 0x08, 0x0f, 0x16, 0x1f }, 126162306a36Sopenharmony_ci { 0x11, 0x1e, 0x1f, 0xff }, 126262306a36Sopenharmony_ci { 0x16, 0x1f, 0xff, 0xff }, 126362306a36Sopenharmony_ci { 0x1f, 0xff, 0xff, 0xff } 126462306a36Sopenharmony_ci}; 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_cistatic const u8 qmp_dp_v5_pre_emphasis_hbr3_hbr2[4][4] = { 126762306a36Sopenharmony_ci { 0x20, 0x2c, 0x35, 0x3b }, 126862306a36Sopenharmony_ci { 0x22, 0x2e, 0x36, 0xff }, 126962306a36Sopenharmony_ci { 0x22, 0x31, 0xff, 0xff }, 127062306a36Sopenharmony_ci { 0x24, 0xff, 0xff, 0xff } 127162306a36Sopenharmony_ci}; 127262306a36Sopenharmony_ci 127362306a36Sopenharmony_cistatic const u8 qmp_dp_v5_voltage_swing_hbr3_hbr2[4][4] = { 127462306a36Sopenharmony_ci { 0x22, 0x32, 0x36, 0x3a }, 127562306a36Sopenharmony_ci { 0x29, 0x39, 0x3f, 0xff }, 127662306a36Sopenharmony_ci { 0x30, 0x3f, 0xff, 0xff }, 127762306a36Sopenharmony_ci { 0x3f, 0xff, 0xff, 0xff } 127862306a36Sopenharmony_ci}; 127962306a36Sopenharmony_ci 128062306a36Sopenharmony_cistatic const u8 qmp_dp_v5_pre_emphasis_hbr_rbr[4][4] = { 128162306a36Sopenharmony_ci { 0x20, 0x2d, 0x34, 0x3a }, 128262306a36Sopenharmony_ci { 0x20, 0x2e, 0x35, 0xff }, 128362306a36Sopenharmony_ci { 0x20, 0x2e, 0xff, 0xff }, 128462306a36Sopenharmony_ci { 0x24, 0xff, 0xff, 0xff } 128562306a36Sopenharmony_ci}; 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_cistatic const u8 qmp_dp_v5_voltage_swing_hbr_rbr[4][4] = { 128862306a36Sopenharmony_ci { 0x28, 0x2f, 0x36, 0x3f }, 128962306a36Sopenharmony_ci { 0x31, 0x3e, 0x3f, 0xff }, 129062306a36Sopenharmony_ci { 0x36, 0x3f, 0xff, 0xff }, 129162306a36Sopenharmony_ci { 0x3f, 0xff, 0xff, 0xff } 129262306a36Sopenharmony_ci}; 129362306a36Sopenharmony_ci 129462306a36Sopenharmony_cistatic const u8 qmp_dp_v6_pre_emphasis_hbr_rbr[4][4] = { 129562306a36Sopenharmony_ci { 0x20, 0x2d, 0x34, 0x3a }, 129662306a36Sopenharmony_ci { 0x20, 0x2e, 0x35, 0xff }, 129762306a36Sopenharmony_ci { 0x20, 0x2e, 0xff, 0xff }, 129862306a36Sopenharmony_ci { 0x22, 0xff, 0xff, 0xff } 129962306a36Sopenharmony_ci}; 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_cistruct qmp_combo; 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_cistruct qmp_combo_offsets { 130462306a36Sopenharmony_ci u16 com; 130562306a36Sopenharmony_ci u16 txa; 130662306a36Sopenharmony_ci u16 rxa; 130762306a36Sopenharmony_ci u16 txb; 130862306a36Sopenharmony_ci u16 rxb; 130962306a36Sopenharmony_ci u16 usb3_serdes; 131062306a36Sopenharmony_ci u16 usb3_pcs_misc; 131162306a36Sopenharmony_ci u16 usb3_pcs; 131262306a36Sopenharmony_ci u16 usb3_pcs_usb; 131362306a36Sopenharmony_ci u16 dp_serdes; 131462306a36Sopenharmony_ci u16 dp_txa; 131562306a36Sopenharmony_ci u16 dp_txb; 131662306a36Sopenharmony_ci u16 dp_dp_phy; 131762306a36Sopenharmony_ci}; 131862306a36Sopenharmony_ci 131962306a36Sopenharmony_cistruct qmp_phy_cfg { 132062306a36Sopenharmony_ci const struct qmp_combo_offsets *offsets; 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci /* Init sequence for PHY blocks - serdes, tx, rx, pcs */ 132362306a36Sopenharmony_ci const struct qmp_phy_init_tbl *serdes_tbl; 132462306a36Sopenharmony_ci int serdes_tbl_num; 132562306a36Sopenharmony_ci const struct qmp_phy_init_tbl *tx_tbl; 132662306a36Sopenharmony_ci int tx_tbl_num; 132762306a36Sopenharmony_ci const struct qmp_phy_init_tbl *rx_tbl; 132862306a36Sopenharmony_ci int rx_tbl_num; 132962306a36Sopenharmony_ci const struct qmp_phy_init_tbl *pcs_tbl; 133062306a36Sopenharmony_ci int pcs_tbl_num; 133162306a36Sopenharmony_ci const struct qmp_phy_init_tbl *pcs_usb_tbl; 133262306a36Sopenharmony_ci int pcs_usb_tbl_num; 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci const struct qmp_phy_init_tbl *dp_serdes_tbl; 133562306a36Sopenharmony_ci int dp_serdes_tbl_num; 133662306a36Sopenharmony_ci const struct qmp_phy_init_tbl *dp_tx_tbl; 133762306a36Sopenharmony_ci int dp_tx_tbl_num; 133862306a36Sopenharmony_ci 133962306a36Sopenharmony_ci /* Init sequence for DP PHY block link rates */ 134062306a36Sopenharmony_ci const struct qmp_phy_init_tbl *serdes_tbl_rbr; 134162306a36Sopenharmony_ci int serdes_tbl_rbr_num; 134262306a36Sopenharmony_ci const struct qmp_phy_init_tbl *serdes_tbl_hbr; 134362306a36Sopenharmony_ci int serdes_tbl_hbr_num; 134462306a36Sopenharmony_ci const struct qmp_phy_init_tbl *serdes_tbl_hbr2; 134562306a36Sopenharmony_ci int serdes_tbl_hbr2_num; 134662306a36Sopenharmony_ci const struct qmp_phy_init_tbl *serdes_tbl_hbr3; 134762306a36Sopenharmony_ci int serdes_tbl_hbr3_num; 134862306a36Sopenharmony_ci 134962306a36Sopenharmony_ci /* DP PHY swing and pre_emphasis tables */ 135062306a36Sopenharmony_ci const u8 (*swing_hbr_rbr)[4][4]; 135162306a36Sopenharmony_ci const u8 (*swing_hbr3_hbr2)[4][4]; 135262306a36Sopenharmony_ci const u8 (*pre_emphasis_hbr_rbr)[4][4]; 135362306a36Sopenharmony_ci const u8 (*pre_emphasis_hbr3_hbr2)[4][4]; 135462306a36Sopenharmony_ci 135562306a36Sopenharmony_ci /* DP PHY callbacks */ 135662306a36Sopenharmony_ci int (*configure_dp_phy)(struct qmp_combo *qmp); 135762306a36Sopenharmony_ci void (*configure_dp_tx)(struct qmp_combo *qmp); 135862306a36Sopenharmony_ci int (*calibrate_dp_phy)(struct qmp_combo *qmp); 135962306a36Sopenharmony_ci void (*dp_aux_init)(struct qmp_combo *qmp); 136062306a36Sopenharmony_ci 136162306a36Sopenharmony_ci /* resets to be requested */ 136262306a36Sopenharmony_ci const char * const *reset_list; 136362306a36Sopenharmony_ci int num_resets; 136462306a36Sopenharmony_ci /* regulators to be requested */ 136562306a36Sopenharmony_ci const struct qmp_regulator_data *vreg_list; 136662306a36Sopenharmony_ci int num_vregs; 136762306a36Sopenharmony_ci 136862306a36Sopenharmony_ci /* array of registers with different offsets */ 136962306a36Sopenharmony_ci const unsigned int *regs; 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ci /* true, if PHY needs delay after POWER_DOWN */ 137262306a36Sopenharmony_ci bool has_pwrdn_delay; 137362306a36Sopenharmony_ci 137462306a36Sopenharmony_ci /* Offset from PCS to PCS_USB region */ 137562306a36Sopenharmony_ci unsigned int pcs_usb_offset; 137662306a36Sopenharmony_ci 137762306a36Sopenharmony_ci}; 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_cistruct qmp_combo { 138062306a36Sopenharmony_ci struct device *dev; 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg; 138362306a36Sopenharmony_ci 138462306a36Sopenharmony_ci void __iomem *com; 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci void __iomem *serdes; 138762306a36Sopenharmony_ci void __iomem *tx; 138862306a36Sopenharmony_ci void __iomem *rx; 138962306a36Sopenharmony_ci void __iomem *pcs; 139062306a36Sopenharmony_ci void __iomem *tx2; 139162306a36Sopenharmony_ci void __iomem *rx2; 139262306a36Sopenharmony_ci void __iomem *pcs_misc; 139362306a36Sopenharmony_ci void __iomem *pcs_usb; 139462306a36Sopenharmony_ci 139562306a36Sopenharmony_ci void __iomem *dp_serdes; 139662306a36Sopenharmony_ci void __iomem *dp_tx; 139762306a36Sopenharmony_ci void __iomem *dp_tx2; 139862306a36Sopenharmony_ci void __iomem *dp_dp_phy; 139962306a36Sopenharmony_ci 140062306a36Sopenharmony_ci struct clk *pipe_clk; 140162306a36Sopenharmony_ci struct clk_bulk_data *clks; 140262306a36Sopenharmony_ci int num_clks; 140362306a36Sopenharmony_ci struct reset_control_bulk_data *resets; 140462306a36Sopenharmony_ci struct regulator_bulk_data *vregs; 140562306a36Sopenharmony_ci 140662306a36Sopenharmony_ci struct mutex phy_mutex; 140762306a36Sopenharmony_ci int init_count; 140862306a36Sopenharmony_ci 140962306a36Sopenharmony_ci struct phy *usb_phy; 141062306a36Sopenharmony_ci enum phy_mode mode; 141162306a36Sopenharmony_ci unsigned int usb_init_count; 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci struct phy *dp_phy; 141462306a36Sopenharmony_ci unsigned int dp_aux_cfg; 141562306a36Sopenharmony_ci struct phy_configure_opts_dp dp_opts; 141662306a36Sopenharmony_ci unsigned int dp_init_count; 141762306a36Sopenharmony_ci 141862306a36Sopenharmony_ci struct clk_fixed_rate pipe_clk_fixed; 141962306a36Sopenharmony_ci struct clk_hw dp_link_hw; 142062306a36Sopenharmony_ci struct clk_hw dp_pixel_hw; 142162306a36Sopenharmony_ci 142262306a36Sopenharmony_ci struct drm_bridge bridge; 142362306a36Sopenharmony_ci 142462306a36Sopenharmony_ci struct typec_switch_dev *sw; 142562306a36Sopenharmony_ci enum typec_orientation orientation; 142662306a36Sopenharmony_ci}; 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_cistatic void qmp_v3_dp_aux_init(struct qmp_combo *qmp); 142962306a36Sopenharmony_cistatic void qmp_v3_configure_dp_tx(struct qmp_combo *qmp); 143062306a36Sopenharmony_cistatic int qmp_v3_configure_dp_phy(struct qmp_combo *qmp); 143162306a36Sopenharmony_cistatic int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp); 143262306a36Sopenharmony_ci 143362306a36Sopenharmony_cistatic void qmp_v4_dp_aux_init(struct qmp_combo *qmp); 143462306a36Sopenharmony_cistatic void qmp_v4_configure_dp_tx(struct qmp_combo *qmp); 143562306a36Sopenharmony_cistatic int qmp_v4_configure_dp_phy(struct qmp_combo *qmp); 143662306a36Sopenharmony_cistatic int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp); 143762306a36Sopenharmony_ci 143862306a36Sopenharmony_cistatic inline void qphy_setbits(void __iomem *base, u32 offset, u32 val) 143962306a36Sopenharmony_ci{ 144062306a36Sopenharmony_ci u32 reg; 144162306a36Sopenharmony_ci 144262306a36Sopenharmony_ci reg = readl(base + offset); 144362306a36Sopenharmony_ci reg |= val; 144462306a36Sopenharmony_ci writel(reg, base + offset); 144562306a36Sopenharmony_ci 144662306a36Sopenharmony_ci /* ensure that above write is through */ 144762306a36Sopenharmony_ci readl(base + offset); 144862306a36Sopenharmony_ci} 144962306a36Sopenharmony_ci 145062306a36Sopenharmony_cistatic inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val) 145162306a36Sopenharmony_ci{ 145262306a36Sopenharmony_ci u32 reg; 145362306a36Sopenharmony_ci 145462306a36Sopenharmony_ci reg = readl(base + offset); 145562306a36Sopenharmony_ci reg &= ~val; 145662306a36Sopenharmony_ci writel(reg, base + offset); 145762306a36Sopenharmony_ci 145862306a36Sopenharmony_ci /* ensure that above write is through */ 145962306a36Sopenharmony_ci readl(base + offset); 146062306a36Sopenharmony_ci} 146162306a36Sopenharmony_ci 146262306a36Sopenharmony_ci/* list of clocks required by phy */ 146362306a36Sopenharmony_cistatic const char * const qmp_combo_phy_clk_l[] = { 146462306a36Sopenharmony_ci "aux", "cfg_ahb", "ref", "com_aux", 146562306a36Sopenharmony_ci}; 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_ci/* list of resets */ 146862306a36Sopenharmony_cistatic const char * const msm8996_usb3phy_reset_l[] = { 146962306a36Sopenharmony_ci "phy", "common", 147062306a36Sopenharmony_ci}; 147162306a36Sopenharmony_ci 147262306a36Sopenharmony_cistatic const char * const sc7180_usb3phy_reset_l[] = { 147362306a36Sopenharmony_ci "phy", 147462306a36Sopenharmony_ci}; 147562306a36Sopenharmony_ci 147662306a36Sopenharmony_cistatic const struct qmp_combo_offsets qmp_combo_offsets_v3 = { 147762306a36Sopenharmony_ci .com = 0x0000, 147862306a36Sopenharmony_ci .txa = 0x1200, 147962306a36Sopenharmony_ci .rxa = 0x1400, 148062306a36Sopenharmony_ci .txb = 0x1600, 148162306a36Sopenharmony_ci .rxb = 0x1800, 148262306a36Sopenharmony_ci .usb3_serdes = 0x1000, 148362306a36Sopenharmony_ci .usb3_pcs_misc = 0x1a00, 148462306a36Sopenharmony_ci .usb3_pcs = 0x1c00, 148562306a36Sopenharmony_ci .usb3_pcs_usb = 0x1f00, 148662306a36Sopenharmony_ci .dp_serdes = 0x2000, 148762306a36Sopenharmony_ci .dp_txa = 0x2200, 148862306a36Sopenharmony_ci .dp_txb = 0x2600, 148962306a36Sopenharmony_ci .dp_dp_phy = 0x2a00, 149062306a36Sopenharmony_ci}; 149162306a36Sopenharmony_ci 149262306a36Sopenharmony_cistatic const struct qmp_combo_offsets qmp_combo_offsets_v5 = { 149362306a36Sopenharmony_ci .com = 0x0000, 149462306a36Sopenharmony_ci .txa = 0x0400, 149562306a36Sopenharmony_ci .rxa = 0x0600, 149662306a36Sopenharmony_ci .txb = 0x0a00, 149762306a36Sopenharmony_ci .rxb = 0x0c00, 149862306a36Sopenharmony_ci .usb3_serdes = 0x1000, 149962306a36Sopenharmony_ci .usb3_pcs_misc = 0x1200, 150062306a36Sopenharmony_ci .usb3_pcs = 0x1400, 150162306a36Sopenharmony_ci .usb3_pcs_usb = 0x1700, 150262306a36Sopenharmony_ci .dp_serdes = 0x2000, 150362306a36Sopenharmony_ci .dp_dp_phy = 0x2200, 150462306a36Sopenharmony_ci}; 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_cistatic const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = { 150762306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v3, 150862306a36Sopenharmony_ci 150962306a36Sopenharmony_ci .serdes_tbl = qmp_v3_usb3_serdes_tbl, 151062306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 151162306a36Sopenharmony_ci .tx_tbl = qmp_v3_usb3_tx_tbl, 151262306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl), 151362306a36Sopenharmony_ci .rx_tbl = qmp_v3_usb3_rx_tbl, 151462306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl), 151562306a36Sopenharmony_ci .pcs_tbl = qmp_v3_usb3_pcs_tbl, 151662306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl), 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v3_dp_serdes_tbl, 151962306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl), 152062306a36Sopenharmony_ci .dp_tx_tbl = qmp_v3_dp_tx_tbl, 152162306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl), 152262306a36Sopenharmony_ci 152362306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr, 152462306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr), 152562306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr, 152662306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr), 152762306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2, 152862306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2), 152962306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3, 153062306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3), 153162306a36Sopenharmony_ci 153262306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr, 153362306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr, 153462306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2, 153562306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2, 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_ci .dp_aux_init = qmp_v3_dp_aux_init, 153862306a36Sopenharmony_ci .configure_dp_tx = qmp_v3_configure_dp_tx, 153962306a36Sopenharmony_ci .configure_dp_phy = qmp_v3_configure_dp_phy, 154062306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v3_calibrate_dp_phy, 154162306a36Sopenharmony_ci 154262306a36Sopenharmony_ci .reset_list = sc7180_usb3phy_reset_l, 154362306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l), 154462306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 154562306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 154662306a36Sopenharmony_ci .regs = qmp_v3_usb3phy_regs_layout, 154762306a36Sopenharmony_ci 154862306a36Sopenharmony_ci .has_pwrdn_delay = true, 154962306a36Sopenharmony_ci}; 155062306a36Sopenharmony_ci 155162306a36Sopenharmony_cistatic const struct qmp_phy_cfg sdm845_usb3dpphy_cfg = { 155262306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v3, 155362306a36Sopenharmony_ci 155462306a36Sopenharmony_ci .serdes_tbl = qmp_v3_usb3_serdes_tbl, 155562306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 155662306a36Sopenharmony_ci .tx_tbl = qmp_v3_usb3_tx_tbl, 155762306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl), 155862306a36Sopenharmony_ci .rx_tbl = qmp_v3_usb3_rx_tbl, 155962306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl), 156062306a36Sopenharmony_ci .pcs_tbl = qmp_v3_usb3_pcs_tbl, 156162306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl), 156262306a36Sopenharmony_ci 156362306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v3_dp_serdes_tbl, 156462306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl), 156562306a36Sopenharmony_ci .dp_tx_tbl = qmp_v3_dp_tx_tbl, 156662306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl), 156762306a36Sopenharmony_ci 156862306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr, 156962306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr), 157062306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr, 157162306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr), 157262306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2, 157362306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2), 157462306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3, 157562306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3), 157662306a36Sopenharmony_ci 157762306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr, 157862306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr, 157962306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2, 158062306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2, 158162306a36Sopenharmony_ci 158262306a36Sopenharmony_ci .dp_aux_init = qmp_v3_dp_aux_init, 158362306a36Sopenharmony_ci .configure_dp_tx = qmp_v3_configure_dp_tx, 158462306a36Sopenharmony_ci .configure_dp_phy = qmp_v3_configure_dp_phy, 158562306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v3_calibrate_dp_phy, 158662306a36Sopenharmony_ci 158762306a36Sopenharmony_ci .reset_list = msm8996_usb3phy_reset_l, 158862306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 158962306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 159062306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 159162306a36Sopenharmony_ci .regs = qmp_v3_usb3phy_regs_layout, 159262306a36Sopenharmony_ci 159362306a36Sopenharmony_ci .has_pwrdn_delay = true, 159462306a36Sopenharmony_ci}; 159562306a36Sopenharmony_ci 159662306a36Sopenharmony_cistatic const struct qmp_phy_cfg sc8180x_usb3dpphy_cfg = { 159762306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v3, 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_ci .serdes_tbl = sm8150_usb3_serdes_tbl, 160062306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 160162306a36Sopenharmony_ci .tx_tbl = sm8150_usb3_tx_tbl, 160262306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_tx_tbl), 160362306a36Sopenharmony_ci .rx_tbl = sm8150_usb3_rx_tbl, 160462306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_rx_tbl), 160562306a36Sopenharmony_ci .pcs_tbl = sm8150_usb3_pcs_tbl, 160662306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_tbl), 160762306a36Sopenharmony_ci .pcs_usb_tbl = sm8150_usb3_pcs_usb_tbl, 160862306a36Sopenharmony_ci .pcs_usb_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_usb_tbl), 160962306a36Sopenharmony_ci 161062306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v4_dp_serdes_tbl, 161162306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl), 161262306a36Sopenharmony_ci .dp_tx_tbl = qmp_v4_dp_tx_tbl, 161362306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v4_dp_tx_tbl), 161462306a36Sopenharmony_ci 161562306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr, 161662306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr), 161762306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr, 161862306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr), 161962306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2, 162062306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2), 162162306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3, 162262306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3), 162362306a36Sopenharmony_ci 162462306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr, 162562306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr, 162662306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2, 162762306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2, 162862306a36Sopenharmony_ci 162962306a36Sopenharmony_ci .dp_aux_init = qmp_v4_dp_aux_init, 163062306a36Sopenharmony_ci .configure_dp_tx = qmp_v4_configure_dp_tx, 163162306a36Sopenharmony_ci .configure_dp_phy = qmp_v4_configure_dp_phy, 163262306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 163362306a36Sopenharmony_ci 163462306a36Sopenharmony_ci .reset_list = msm8996_usb3phy_reset_l, 163562306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 163662306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 163762306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 163862306a36Sopenharmony_ci .regs = qmp_v45_usb3phy_regs_layout, 163962306a36Sopenharmony_ci .pcs_usb_offset = 0x300, 164062306a36Sopenharmony_ci 164162306a36Sopenharmony_ci .has_pwrdn_delay = true, 164262306a36Sopenharmony_ci}; 164362306a36Sopenharmony_ci 164462306a36Sopenharmony_cistatic const struct qmp_phy_cfg sc8280xp_usb43dpphy_cfg = { 164562306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v5, 164662306a36Sopenharmony_ci 164762306a36Sopenharmony_ci .serdes_tbl = sc8280xp_usb43dp_serdes_tbl, 164862306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_serdes_tbl), 164962306a36Sopenharmony_ci .tx_tbl = sc8280xp_usb43dp_tx_tbl, 165062306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_tx_tbl), 165162306a36Sopenharmony_ci .rx_tbl = sc8280xp_usb43dp_rx_tbl, 165262306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_rx_tbl), 165362306a36Sopenharmony_ci .pcs_tbl = sc8280xp_usb43dp_pcs_tbl, 165462306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_pcs_tbl), 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v5_dp_serdes_tbl, 165762306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v5_dp_serdes_tbl), 165862306a36Sopenharmony_ci .dp_tx_tbl = qmp_v5_5nm_dp_tx_tbl, 165962306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v5_5nm_dp_tx_tbl), 166062306a36Sopenharmony_ci 166162306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr, 166262306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr), 166362306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr, 166462306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr), 166562306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2, 166662306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2), 166762306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3, 166862306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3), 166962306a36Sopenharmony_ci 167062306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v5_voltage_swing_hbr_rbr, 167162306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v5_pre_emphasis_hbr_rbr, 167262306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v5_voltage_swing_hbr3_hbr2, 167362306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2, 167462306a36Sopenharmony_ci 167562306a36Sopenharmony_ci .dp_aux_init = qmp_v4_dp_aux_init, 167662306a36Sopenharmony_ci .configure_dp_tx = qmp_v4_configure_dp_tx, 167762306a36Sopenharmony_ci .configure_dp_phy = qmp_v4_configure_dp_phy, 167862306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 167962306a36Sopenharmony_ci 168062306a36Sopenharmony_ci .reset_list = msm8996_usb3phy_reset_l, 168162306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 168262306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 168362306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 168462306a36Sopenharmony_ci .regs = qmp_v5_5nm_usb3phy_regs_layout, 168562306a36Sopenharmony_ci}; 168662306a36Sopenharmony_ci 168762306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = { 168862306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v3, 168962306a36Sopenharmony_ci 169062306a36Sopenharmony_ci .serdes_tbl = qmp_v3_usb3_serdes_tbl, 169162306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 169262306a36Sopenharmony_ci .tx_tbl = qmp_v3_usb3_tx_tbl, 169362306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl), 169462306a36Sopenharmony_ci .rx_tbl = sm6350_usb3_rx_tbl, 169562306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(sm6350_usb3_rx_tbl), 169662306a36Sopenharmony_ci .pcs_tbl = sm6350_usb3_pcs_tbl, 169762306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(sm6350_usb3_pcs_tbl), 169862306a36Sopenharmony_ci 169962306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v3_dp_serdes_tbl, 170062306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl), 170162306a36Sopenharmony_ci .dp_tx_tbl = qmp_v3_dp_tx_tbl, 170262306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl), 170362306a36Sopenharmony_ci 170462306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr, 170562306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr), 170662306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr, 170762306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr), 170862306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2, 170962306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2), 171062306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3, 171162306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3), 171262306a36Sopenharmony_ci 171362306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr, 171462306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr, 171562306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2, 171662306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2, 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_ci .dp_aux_init = qmp_v3_dp_aux_init, 171962306a36Sopenharmony_ci .configure_dp_tx = qmp_v3_configure_dp_tx, 172062306a36Sopenharmony_ci .configure_dp_phy = qmp_v3_configure_dp_phy, 172162306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v3_calibrate_dp_phy, 172262306a36Sopenharmony_ci 172362306a36Sopenharmony_ci .reset_list = msm8996_usb3phy_reset_l, 172462306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 172562306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 172662306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 172762306a36Sopenharmony_ci .regs = qmp_v3_usb3phy_regs_layout, 172862306a36Sopenharmony_ci}; 172962306a36Sopenharmony_ci 173062306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = { 173162306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v3, 173262306a36Sopenharmony_ci 173362306a36Sopenharmony_ci .serdes_tbl = sm8150_usb3_serdes_tbl, 173462306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 173562306a36Sopenharmony_ci .tx_tbl = sm8250_usb3_tx_tbl, 173662306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_tx_tbl), 173762306a36Sopenharmony_ci .rx_tbl = sm8250_usb3_rx_tbl, 173862306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_rx_tbl), 173962306a36Sopenharmony_ci .pcs_tbl = sm8250_usb3_pcs_tbl, 174062306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_tbl), 174162306a36Sopenharmony_ci .pcs_usb_tbl = sm8250_usb3_pcs_usb_tbl, 174262306a36Sopenharmony_ci .pcs_usb_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_usb_tbl), 174362306a36Sopenharmony_ci 174462306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v4_dp_serdes_tbl, 174562306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl), 174662306a36Sopenharmony_ci .dp_tx_tbl = qmp_v4_dp_tx_tbl, 174762306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v4_dp_tx_tbl), 174862306a36Sopenharmony_ci 174962306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr, 175062306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr), 175162306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr, 175262306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr), 175362306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2, 175462306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2), 175562306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3, 175662306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3), 175762306a36Sopenharmony_ci 175862306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr, 175962306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr, 176062306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2, 176162306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2, 176262306a36Sopenharmony_ci 176362306a36Sopenharmony_ci .dp_aux_init = qmp_v4_dp_aux_init, 176462306a36Sopenharmony_ci .configure_dp_tx = qmp_v4_configure_dp_tx, 176562306a36Sopenharmony_ci .configure_dp_phy = qmp_v4_configure_dp_phy, 176662306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 176762306a36Sopenharmony_ci 176862306a36Sopenharmony_ci .reset_list = msm8996_usb3phy_reset_l, 176962306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 177062306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 177162306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 177262306a36Sopenharmony_ci .regs = qmp_v45_usb3phy_regs_layout, 177362306a36Sopenharmony_ci .pcs_usb_offset = 0x300, 177462306a36Sopenharmony_ci 177562306a36Sopenharmony_ci .has_pwrdn_delay = true, 177662306a36Sopenharmony_ci}; 177762306a36Sopenharmony_ci 177862306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8350_usb3dpphy_cfg = { 177962306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v3, 178062306a36Sopenharmony_ci 178162306a36Sopenharmony_ci .serdes_tbl = sm8150_usb3_serdes_tbl, 178262306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 178362306a36Sopenharmony_ci .tx_tbl = sm8350_usb3_tx_tbl, 178462306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(sm8350_usb3_tx_tbl), 178562306a36Sopenharmony_ci .rx_tbl = sm8350_usb3_rx_tbl, 178662306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(sm8350_usb3_rx_tbl), 178762306a36Sopenharmony_ci .pcs_tbl = sm8350_usb3_pcs_tbl, 178862306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_tbl), 178962306a36Sopenharmony_ci .pcs_usb_tbl = sm8350_usb3_pcs_usb_tbl, 179062306a36Sopenharmony_ci .pcs_usb_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_usb_tbl), 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v4_dp_serdes_tbl, 179362306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl), 179462306a36Sopenharmony_ci .dp_tx_tbl = qmp_v5_dp_tx_tbl, 179562306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v5_dp_tx_tbl), 179662306a36Sopenharmony_ci 179762306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr, 179862306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr), 179962306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr, 180062306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr), 180162306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2, 180262306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2), 180362306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3, 180462306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3), 180562306a36Sopenharmony_ci 180662306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v4_voltage_swing_hbr_rbr, 180762306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v4_pre_emphasis_hbr_rbr, 180862306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2, 180962306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v4_pre_emphasis_hbr3_hbr2, 181062306a36Sopenharmony_ci 181162306a36Sopenharmony_ci .dp_aux_init = qmp_v4_dp_aux_init, 181262306a36Sopenharmony_ci .configure_dp_tx = qmp_v4_configure_dp_tx, 181362306a36Sopenharmony_ci .configure_dp_phy = qmp_v4_configure_dp_phy, 181462306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 181562306a36Sopenharmony_ci 181662306a36Sopenharmony_ci .reset_list = msm8996_usb3phy_reset_l, 181762306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 181862306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 181962306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 182062306a36Sopenharmony_ci .regs = qmp_v45_usb3phy_regs_layout, 182162306a36Sopenharmony_ci 182262306a36Sopenharmony_ci .has_pwrdn_delay = true, 182362306a36Sopenharmony_ci}; 182462306a36Sopenharmony_ci 182562306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8550_usb3dpphy_cfg = { 182662306a36Sopenharmony_ci .offsets = &qmp_combo_offsets_v3, 182762306a36Sopenharmony_ci 182862306a36Sopenharmony_ci .serdes_tbl = sm8550_usb3_serdes_tbl, 182962306a36Sopenharmony_ci .serdes_tbl_num = ARRAY_SIZE(sm8550_usb3_serdes_tbl), 183062306a36Sopenharmony_ci .tx_tbl = sm8550_usb3_tx_tbl, 183162306a36Sopenharmony_ci .tx_tbl_num = ARRAY_SIZE(sm8550_usb3_tx_tbl), 183262306a36Sopenharmony_ci .rx_tbl = sm8550_usb3_rx_tbl, 183362306a36Sopenharmony_ci .rx_tbl_num = ARRAY_SIZE(sm8550_usb3_rx_tbl), 183462306a36Sopenharmony_ci .pcs_tbl = sm8550_usb3_pcs_tbl, 183562306a36Sopenharmony_ci .pcs_tbl_num = ARRAY_SIZE(sm8550_usb3_pcs_tbl), 183662306a36Sopenharmony_ci .pcs_usb_tbl = sm8550_usb3_pcs_usb_tbl, 183762306a36Sopenharmony_ci .pcs_usb_tbl_num = ARRAY_SIZE(sm8550_usb3_pcs_usb_tbl), 183862306a36Sopenharmony_ci 183962306a36Sopenharmony_ci .dp_serdes_tbl = qmp_v6_dp_serdes_tbl, 184062306a36Sopenharmony_ci .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl), 184162306a36Sopenharmony_ci .dp_tx_tbl = qmp_v6_dp_tx_tbl, 184262306a36Sopenharmony_ci .dp_tx_tbl_num = ARRAY_SIZE(qmp_v6_dp_tx_tbl), 184362306a36Sopenharmony_ci 184462306a36Sopenharmony_ci .serdes_tbl_rbr = qmp_v6_dp_serdes_tbl_rbr, 184562306a36Sopenharmony_ci .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_rbr), 184662306a36Sopenharmony_ci .serdes_tbl_hbr = qmp_v6_dp_serdes_tbl_hbr, 184762306a36Sopenharmony_ci .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr), 184862306a36Sopenharmony_ci .serdes_tbl_hbr2 = qmp_v6_dp_serdes_tbl_hbr2, 184962306a36Sopenharmony_ci .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr2), 185062306a36Sopenharmony_ci .serdes_tbl_hbr3 = qmp_v6_dp_serdes_tbl_hbr3, 185162306a36Sopenharmony_ci .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr3), 185262306a36Sopenharmony_ci 185362306a36Sopenharmony_ci .swing_hbr_rbr = &qmp_dp_v5_voltage_swing_hbr_rbr, 185462306a36Sopenharmony_ci .pre_emphasis_hbr_rbr = &qmp_dp_v6_pre_emphasis_hbr_rbr, 185562306a36Sopenharmony_ci .swing_hbr3_hbr2 = &qmp_dp_v5_voltage_swing_hbr3_hbr2, 185662306a36Sopenharmony_ci .pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2, 185762306a36Sopenharmony_ci 185862306a36Sopenharmony_ci .dp_aux_init = qmp_v4_dp_aux_init, 185962306a36Sopenharmony_ci .configure_dp_tx = qmp_v4_configure_dp_tx, 186062306a36Sopenharmony_ci .configure_dp_phy = qmp_v4_configure_dp_phy, 186162306a36Sopenharmony_ci .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 186262306a36Sopenharmony_ci 186362306a36Sopenharmony_ci .regs = qmp_v6_usb3phy_regs_layout, 186462306a36Sopenharmony_ci .reset_list = msm8996_usb3phy_reset_l, 186562306a36Sopenharmony_ci .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 186662306a36Sopenharmony_ci .vreg_list = qmp_phy_vreg_l, 186762306a36Sopenharmony_ci .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 186862306a36Sopenharmony_ci}; 186962306a36Sopenharmony_ci 187062306a36Sopenharmony_cistatic void qmp_combo_configure_lane(void __iomem *base, 187162306a36Sopenharmony_ci const struct qmp_phy_init_tbl tbl[], 187262306a36Sopenharmony_ci int num, 187362306a36Sopenharmony_ci u8 lane_mask) 187462306a36Sopenharmony_ci{ 187562306a36Sopenharmony_ci int i; 187662306a36Sopenharmony_ci const struct qmp_phy_init_tbl *t = tbl; 187762306a36Sopenharmony_ci 187862306a36Sopenharmony_ci if (!t) 187962306a36Sopenharmony_ci return; 188062306a36Sopenharmony_ci 188162306a36Sopenharmony_ci for (i = 0; i < num; i++, t++) { 188262306a36Sopenharmony_ci if (!(t->lane_mask & lane_mask)) 188362306a36Sopenharmony_ci continue; 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_ci writel(t->val, base + t->offset); 188662306a36Sopenharmony_ci } 188762306a36Sopenharmony_ci} 188862306a36Sopenharmony_ci 188962306a36Sopenharmony_cistatic void qmp_combo_configure(void __iomem *base, 189062306a36Sopenharmony_ci const struct qmp_phy_init_tbl tbl[], 189162306a36Sopenharmony_ci int num) 189262306a36Sopenharmony_ci{ 189362306a36Sopenharmony_ci qmp_combo_configure_lane(base, tbl, num, 0xff); 189462306a36Sopenharmony_ci} 189562306a36Sopenharmony_ci 189662306a36Sopenharmony_cistatic int qmp_combo_dp_serdes_init(struct qmp_combo *qmp) 189762306a36Sopenharmony_ci{ 189862306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 189962306a36Sopenharmony_ci void __iomem *serdes = qmp->dp_serdes; 190062306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 190162306a36Sopenharmony_ci 190262306a36Sopenharmony_ci qmp_combo_configure(serdes, cfg->dp_serdes_tbl, cfg->dp_serdes_tbl_num); 190362306a36Sopenharmony_ci 190462306a36Sopenharmony_ci switch (dp_opts->link_rate) { 190562306a36Sopenharmony_ci case 1620: 190662306a36Sopenharmony_ci qmp_combo_configure(serdes, cfg->serdes_tbl_rbr, 190762306a36Sopenharmony_ci cfg->serdes_tbl_rbr_num); 190862306a36Sopenharmony_ci break; 190962306a36Sopenharmony_ci case 2700: 191062306a36Sopenharmony_ci qmp_combo_configure(serdes, cfg->serdes_tbl_hbr, 191162306a36Sopenharmony_ci cfg->serdes_tbl_hbr_num); 191262306a36Sopenharmony_ci break; 191362306a36Sopenharmony_ci case 5400: 191462306a36Sopenharmony_ci qmp_combo_configure(serdes, cfg->serdes_tbl_hbr2, 191562306a36Sopenharmony_ci cfg->serdes_tbl_hbr2_num); 191662306a36Sopenharmony_ci break; 191762306a36Sopenharmony_ci case 8100: 191862306a36Sopenharmony_ci qmp_combo_configure(serdes, cfg->serdes_tbl_hbr3, 191962306a36Sopenharmony_ci cfg->serdes_tbl_hbr3_num); 192062306a36Sopenharmony_ci break; 192162306a36Sopenharmony_ci default: 192262306a36Sopenharmony_ci /* Other link rates aren't supported */ 192362306a36Sopenharmony_ci return -EINVAL; 192462306a36Sopenharmony_ci } 192562306a36Sopenharmony_ci 192662306a36Sopenharmony_ci return 0; 192762306a36Sopenharmony_ci} 192862306a36Sopenharmony_ci 192962306a36Sopenharmony_cistatic void qmp_v3_dp_aux_init(struct qmp_combo *qmp) 193062306a36Sopenharmony_ci{ 193162306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 193262306a36Sopenharmony_ci 193362306a36Sopenharmony_ci writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 193462306a36Sopenharmony_ci DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, 193562306a36Sopenharmony_ci qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 193662306a36Sopenharmony_ci 193762306a36Sopenharmony_ci /* Turn on BIAS current for PHY/PLL */ 193862306a36Sopenharmony_ci writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX | 193962306a36Sopenharmony_ci QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL, 194062306a36Sopenharmony_ci qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]); 194162306a36Sopenharmony_ci 194262306a36Sopenharmony_ci writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 194362306a36Sopenharmony_ci 194462306a36Sopenharmony_ci writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 194562306a36Sopenharmony_ci DP_PHY_PD_CTL_LANE_0_1_PWRDN | 194662306a36Sopenharmony_ci DP_PHY_PD_CTL_LANE_2_3_PWRDN | DP_PHY_PD_CTL_PLL_PWRDN | 194762306a36Sopenharmony_ci DP_PHY_PD_CTL_DP_CLAMP_EN, 194862306a36Sopenharmony_ci qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 194962306a36Sopenharmony_ci 195062306a36Sopenharmony_ci writel(QSERDES_V3_COM_BIAS_EN | 195162306a36Sopenharmony_ci QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN | 195262306a36Sopenharmony_ci QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL | 195362306a36Sopenharmony_ci QSERDES_V3_COM_CLKBUF_RX_DRIVE_L, 195462306a36Sopenharmony_ci qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]); 195562306a36Sopenharmony_ci 195662306a36Sopenharmony_ci writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0); 195762306a36Sopenharmony_ci writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 195862306a36Sopenharmony_ci writel(0x24, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 195962306a36Sopenharmony_ci writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3); 196062306a36Sopenharmony_ci writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4); 196162306a36Sopenharmony_ci writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5); 196262306a36Sopenharmony_ci writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6); 196362306a36Sopenharmony_ci writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7); 196462306a36Sopenharmony_ci writel(0xbb, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8); 196562306a36Sopenharmony_ci writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9); 196662306a36Sopenharmony_ci qmp->dp_aux_cfg = 0; 196762306a36Sopenharmony_ci 196862306a36Sopenharmony_ci writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK | 196962306a36Sopenharmony_ci PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK | 197062306a36Sopenharmony_ci PHY_AUX_REQ_ERR_MASK, 197162306a36Sopenharmony_ci qmp->dp_dp_phy + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK); 197262306a36Sopenharmony_ci} 197362306a36Sopenharmony_ci 197462306a36Sopenharmony_cistatic int qmp_combo_configure_dp_swing(struct qmp_combo *qmp) 197562306a36Sopenharmony_ci{ 197662306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 197762306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 197862306a36Sopenharmony_ci unsigned int v_level = 0, p_level = 0; 197962306a36Sopenharmony_ci u8 voltage_swing_cfg, pre_emphasis_cfg; 198062306a36Sopenharmony_ci int i; 198162306a36Sopenharmony_ci 198262306a36Sopenharmony_ci for (i = 0; i < dp_opts->lanes; i++) { 198362306a36Sopenharmony_ci v_level = max(v_level, dp_opts->voltage[i]); 198462306a36Sopenharmony_ci p_level = max(p_level, dp_opts->pre[i]); 198562306a36Sopenharmony_ci } 198662306a36Sopenharmony_ci 198762306a36Sopenharmony_ci if (dp_opts->link_rate <= 2700) { 198862306a36Sopenharmony_ci voltage_swing_cfg = (*cfg->swing_hbr_rbr)[v_level][p_level]; 198962306a36Sopenharmony_ci pre_emphasis_cfg = (*cfg->pre_emphasis_hbr_rbr)[v_level][p_level]; 199062306a36Sopenharmony_ci } else { 199162306a36Sopenharmony_ci voltage_swing_cfg = (*cfg->swing_hbr3_hbr2)[v_level][p_level]; 199262306a36Sopenharmony_ci pre_emphasis_cfg = (*cfg->pre_emphasis_hbr3_hbr2)[v_level][p_level]; 199362306a36Sopenharmony_ci } 199462306a36Sopenharmony_ci 199562306a36Sopenharmony_ci /* TODO: Move check to config check */ 199662306a36Sopenharmony_ci if (voltage_swing_cfg == 0xFF && pre_emphasis_cfg == 0xFF) 199762306a36Sopenharmony_ci return -EINVAL; 199862306a36Sopenharmony_ci 199962306a36Sopenharmony_ci /* Enable MUX to use Cursor values from these registers */ 200062306a36Sopenharmony_ci voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN; 200162306a36Sopenharmony_ci pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN; 200262306a36Sopenharmony_ci 200362306a36Sopenharmony_ci writel(voltage_swing_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]); 200462306a36Sopenharmony_ci writel(pre_emphasis_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 200562306a36Sopenharmony_ci writel(voltage_swing_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]); 200662306a36Sopenharmony_ci writel(pre_emphasis_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 200762306a36Sopenharmony_ci 200862306a36Sopenharmony_ci return 0; 200962306a36Sopenharmony_ci} 201062306a36Sopenharmony_ci 201162306a36Sopenharmony_cistatic void qmp_v3_configure_dp_tx(struct qmp_combo *qmp) 201262306a36Sopenharmony_ci{ 201362306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 201462306a36Sopenharmony_ci u32 bias_en, drvr_en; 201562306a36Sopenharmony_ci 201662306a36Sopenharmony_ci if (qmp_combo_configure_dp_swing(qmp) < 0) 201762306a36Sopenharmony_ci return; 201862306a36Sopenharmony_ci 201962306a36Sopenharmony_ci if (dp_opts->lanes == 1) { 202062306a36Sopenharmony_ci bias_en = 0x3e; 202162306a36Sopenharmony_ci drvr_en = 0x13; 202262306a36Sopenharmony_ci } else { 202362306a36Sopenharmony_ci bias_en = 0x3f; 202462306a36Sopenharmony_ci drvr_en = 0x10; 202562306a36Sopenharmony_ci } 202662306a36Sopenharmony_ci 202762306a36Sopenharmony_ci writel(drvr_en, qmp->dp_tx + QSERDES_V3_TX_HIGHZ_DRVR_EN); 202862306a36Sopenharmony_ci writel(bias_en, qmp->dp_tx + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN); 202962306a36Sopenharmony_ci writel(drvr_en, qmp->dp_tx2 + QSERDES_V3_TX_HIGHZ_DRVR_EN); 203062306a36Sopenharmony_ci writel(bias_en, qmp->dp_tx2 + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN); 203162306a36Sopenharmony_ci} 203262306a36Sopenharmony_ci 203362306a36Sopenharmony_cistatic bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp) 203462306a36Sopenharmony_ci{ 203562306a36Sopenharmony_ci bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE); 203662306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 203762306a36Sopenharmony_ci u32 val; 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_ci val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 204062306a36Sopenharmony_ci DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN; 204162306a36Sopenharmony_ci 204262306a36Sopenharmony_ci if (dp_opts->lanes == 4 || reverse) 204362306a36Sopenharmony_ci val |= DP_PHY_PD_CTL_LANE_0_1_PWRDN; 204462306a36Sopenharmony_ci if (dp_opts->lanes == 4 || !reverse) 204562306a36Sopenharmony_ci val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN; 204662306a36Sopenharmony_ci 204762306a36Sopenharmony_ci writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 204862306a36Sopenharmony_ci 204962306a36Sopenharmony_ci if (reverse) 205062306a36Sopenharmony_ci writel(0x4c, qmp->pcs + QSERDES_DP_PHY_MODE); 205162306a36Sopenharmony_ci else 205262306a36Sopenharmony_ci writel(0x5c, qmp->pcs + QSERDES_DP_PHY_MODE); 205362306a36Sopenharmony_ci 205462306a36Sopenharmony_ci return reverse; 205562306a36Sopenharmony_ci} 205662306a36Sopenharmony_ci 205762306a36Sopenharmony_cistatic int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp) 205862306a36Sopenharmony_ci{ 205962306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 206062306a36Sopenharmony_ci u32 phy_vco_div; 206162306a36Sopenharmony_ci unsigned long pixel_freq; 206262306a36Sopenharmony_ci 206362306a36Sopenharmony_ci switch (dp_opts->link_rate) { 206462306a36Sopenharmony_ci case 1620: 206562306a36Sopenharmony_ci phy_vco_div = 0x1; 206662306a36Sopenharmony_ci pixel_freq = 1620000000UL / 2; 206762306a36Sopenharmony_ci break; 206862306a36Sopenharmony_ci case 2700: 206962306a36Sopenharmony_ci phy_vco_div = 0x1; 207062306a36Sopenharmony_ci pixel_freq = 2700000000UL / 2; 207162306a36Sopenharmony_ci break; 207262306a36Sopenharmony_ci case 5400: 207362306a36Sopenharmony_ci phy_vco_div = 0x2; 207462306a36Sopenharmony_ci pixel_freq = 5400000000UL / 4; 207562306a36Sopenharmony_ci break; 207662306a36Sopenharmony_ci case 8100: 207762306a36Sopenharmony_ci phy_vco_div = 0x0; 207862306a36Sopenharmony_ci pixel_freq = 8100000000UL / 6; 207962306a36Sopenharmony_ci break; 208062306a36Sopenharmony_ci default: 208162306a36Sopenharmony_ci /* Other link rates aren't supported */ 208262306a36Sopenharmony_ci return -EINVAL; 208362306a36Sopenharmony_ci } 208462306a36Sopenharmony_ci writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_VCO_DIV); 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_ci clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000); 208762306a36Sopenharmony_ci clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq); 208862306a36Sopenharmony_ci 208962306a36Sopenharmony_ci return 0; 209062306a36Sopenharmony_ci} 209162306a36Sopenharmony_ci 209262306a36Sopenharmony_cistatic int qmp_v3_configure_dp_phy(struct qmp_combo *qmp) 209362306a36Sopenharmony_ci{ 209462306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 209562306a36Sopenharmony_ci u32 status; 209662306a36Sopenharmony_ci int ret; 209762306a36Sopenharmony_ci 209862306a36Sopenharmony_ci qmp_combo_configure_dp_mode(qmp); 209962306a36Sopenharmony_ci 210062306a36Sopenharmony_ci writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL); 210162306a36Sopenharmony_ci writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL); 210262306a36Sopenharmony_ci 210362306a36Sopenharmony_ci ret = qmp_combo_configure_dp_clocks(qmp); 210462306a36Sopenharmony_ci if (ret) 210562306a36Sopenharmony_ci return ret; 210662306a36Sopenharmony_ci 210762306a36Sopenharmony_ci writel(0x04, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 210862306a36Sopenharmony_ci writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 210962306a36Sopenharmony_ci writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 211062306a36Sopenharmony_ci writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 211162306a36Sopenharmony_ci writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 211262306a36Sopenharmony_ci 211362306a36Sopenharmony_ci writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]); 211462306a36Sopenharmony_ci 211562306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS], 211662306a36Sopenharmony_ci status, 211762306a36Sopenharmony_ci ((status & BIT(0)) > 0), 211862306a36Sopenharmony_ci 500, 211962306a36Sopenharmony_ci 10000)) 212062306a36Sopenharmony_ci return -ETIMEDOUT; 212162306a36Sopenharmony_ci 212262306a36Sopenharmony_ci writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 212362306a36Sopenharmony_ci 212462306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 212562306a36Sopenharmony_ci status, 212662306a36Sopenharmony_ci ((status & BIT(1)) > 0), 212762306a36Sopenharmony_ci 500, 212862306a36Sopenharmony_ci 10000)) 212962306a36Sopenharmony_ci return -ETIMEDOUT; 213062306a36Sopenharmony_ci 213162306a36Sopenharmony_ci writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 213262306a36Sopenharmony_ci udelay(2000); 213362306a36Sopenharmony_ci writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_ci return readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 213662306a36Sopenharmony_ci status, 213762306a36Sopenharmony_ci ((status & BIT(1)) > 0), 213862306a36Sopenharmony_ci 500, 213962306a36Sopenharmony_ci 10000); 214062306a36Sopenharmony_ci} 214162306a36Sopenharmony_ci 214262306a36Sopenharmony_ci/* 214362306a36Sopenharmony_ci * We need to calibrate the aux setting here as many times 214462306a36Sopenharmony_ci * as the caller tries 214562306a36Sopenharmony_ci */ 214662306a36Sopenharmony_cistatic int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp) 214762306a36Sopenharmony_ci{ 214862306a36Sopenharmony_ci static const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d }; 214962306a36Sopenharmony_ci u8 val; 215062306a36Sopenharmony_ci 215162306a36Sopenharmony_ci qmp->dp_aux_cfg++; 215262306a36Sopenharmony_ci qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings); 215362306a36Sopenharmony_ci val = cfg1_settings[qmp->dp_aux_cfg]; 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 215662306a36Sopenharmony_ci 215762306a36Sopenharmony_ci return 0; 215862306a36Sopenharmony_ci} 215962306a36Sopenharmony_ci 216062306a36Sopenharmony_cistatic void qmp_v4_dp_aux_init(struct qmp_combo *qmp) 216162306a36Sopenharmony_ci{ 216262306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 216362306a36Sopenharmony_ci 216462306a36Sopenharmony_ci writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 216562306a36Sopenharmony_ci DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, 216662306a36Sopenharmony_ci qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 216762306a36Sopenharmony_ci 216862306a36Sopenharmony_ci /* Turn on BIAS current for PHY/PLL */ 216962306a36Sopenharmony_ci writel(0x17, qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]); 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_ci writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0); 217262306a36Sopenharmony_ci writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 217362306a36Sopenharmony_ci writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 217462306a36Sopenharmony_ci writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3); 217562306a36Sopenharmony_ci writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4); 217662306a36Sopenharmony_ci writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5); 217762306a36Sopenharmony_ci writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6); 217862306a36Sopenharmony_ci writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7); 217962306a36Sopenharmony_ci writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8); 218062306a36Sopenharmony_ci writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9); 218162306a36Sopenharmony_ci qmp->dp_aux_cfg = 0; 218262306a36Sopenharmony_ci 218362306a36Sopenharmony_ci writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK | 218462306a36Sopenharmony_ci PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK | 218562306a36Sopenharmony_ci PHY_AUX_REQ_ERR_MASK, 218662306a36Sopenharmony_ci qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK); 218762306a36Sopenharmony_ci} 218862306a36Sopenharmony_ci 218962306a36Sopenharmony_cistatic void qmp_v4_configure_dp_tx(struct qmp_combo *qmp) 219062306a36Sopenharmony_ci{ 219162306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 219262306a36Sopenharmony_ci 219362306a36Sopenharmony_ci /* Program default values before writing proper values */ 219462306a36Sopenharmony_ci writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]); 219562306a36Sopenharmony_ci writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]); 219662306a36Sopenharmony_ci 219762306a36Sopenharmony_ci writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 219862306a36Sopenharmony_ci writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 219962306a36Sopenharmony_ci 220062306a36Sopenharmony_ci qmp_combo_configure_dp_swing(qmp); 220162306a36Sopenharmony_ci} 220262306a36Sopenharmony_ci 220362306a36Sopenharmony_cistatic int qmp_v456_configure_dp_phy(struct qmp_combo *qmp) 220462306a36Sopenharmony_ci{ 220562306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 220662306a36Sopenharmony_ci u32 status; 220762306a36Sopenharmony_ci int ret; 220862306a36Sopenharmony_ci 220962306a36Sopenharmony_ci writel(0x0f, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_CFG_1); 221062306a36Sopenharmony_ci 221162306a36Sopenharmony_ci qmp_combo_configure_dp_mode(qmp); 221262306a36Sopenharmony_ci 221362306a36Sopenharmony_ci writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 221462306a36Sopenharmony_ci writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 221562306a36Sopenharmony_ci 221662306a36Sopenharmony_ci writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX0_TX1_LANE_CTL); 221762306a36Sopenharmony_ci writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX2_TX3_LANE_CTL); 221862306a36Sopenharmony_ci 221962306a36Sopenharmony_ci ret = qmp_combo_configure_dp_clocks(qmp); 222062306a36Sopenharmony_ci if (ret) 222162306a36Sopenharmony_ci return ret; 222262306a36Sopenharmony_ci 222362306a36Sopenharmony_ci writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 222462306a36Sopenharmony_ci writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 222562306a36Sopenharmony_ci writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 222662306a36Sopenharmony_ci writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 222762306a36Sopenharmony_ci 222862306a36Sopenharmony_ci writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]); 222962306a36Sopenharmony_ci 223062306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS], 223162306a36Sopenharmony_ci status, 223262306a36Sopenharmony_ci ((status & BIT(0)) > 0), 223362306a36Sopenharmony_ci 500, 223462306a36Sopenharmony_ci 10000)) 223562306a36Sopenharmony_ci return -ETIMEDOUT; 223662306a36Sopenharmony_ci 223762306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS], 223862306a36Sopenharmony_ci status, 223962306a36Sopenharmony_ci ((status & BIT(0)) > 0), 224062306a36Sopenharmony_ci 500, 224162306a36Sopenharmony_ci 10000)) 224262306a36Sopenharmony_ci return -ETIMEDOUT; 224362306a36Sopenharmony_ci 224462306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS], 224562306a36Sopenharmony_ci status, 224662306a36Sopenharmony_ci ((status & BIT(1)) > 0), 224762306a36Sopenharmony_ci 500, 224862306a36Sopenharmony_ci 10000)) 224962306a36Sopenharmony_ci return -ETIMEDOUT; 225062306a36Sopenharmony_ci 225162306a36Sopenharmony_ci writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 225262306a36Sopenharmony_ci 225362306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 225462306a36Sopenharmony_ci status, 225562306a36Sopenharmony_ci ((status & BIT(0)) > 0), 225662306a36Sopenharmony_ci 500, 225762306a36Sopenharmony_ci 10000)) 225862306a36Sopenharmony_ci return -ETIMEDOUT; 225962306a36Sopenharmony_ci 226062306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 226162306a36Sopenharmony_ci status, 226262306a36Sopenharmony_ci ((status & BIT(1)) > 0), 226362306a36Sopenharmony_ci 500, 226462306a36Sopenharmony_ci 10000)) 226562306a36Sopenharmony_ci return -ETIMEDOUT; 226662306a36Sopenharmony_ci 226762306a36Sopenharmony_ci return 0; 226862306a36Sopenharmony_ci} 226962306a36Sopenharmony_ci 227062306a36Sopenharmony_cistatic int qmp_v4_configure_dp_phy(struct qmp_combo *qmp) 227162306a36Sopenharmony_ci{ 227262306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 227362306a36Sopenharmony_ci bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE); 227462306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 227562306a36Sopenharmony_ci u32 bias0_en, drvr0_en, bias1_en, drvr1_en; 227662306a36Sopenharmony_ci u32 status; 227762306a36Sopenharmony_ci int ret; 227862306a36Sopenharmony_ci 227962306a36Sopenharmony_ci ret = qmp_v456_configure_dp_phy(qmp); 228062306a36Sopenharmony_ci if (ret < 0) 228162306a36Sopenharmony_ci return ret; 228262306a36Sopenharmony_ci 228362306a36Sopenharmony_ci /* 228462306a36Sopenharmony_ci * At least for 7nm DP PHY this has to be done after enabling link 228562306a36Sopenharmony_ci * clock. 228662306a36Sopenharmony_ci */ 228762306a36Sopenharmony_ci 228862306a36Sopenharmony_ci if (dp_opts->lanes == 1) { 228962306a36Sopenharmony_ci bias0_en = reverse ? 0x3e : 0x15; 229062306a36Sopenharmony_ci bias1_en = reverse ? 0x15 : 0x3e; 229162306a36Sopenharmony_ci drvr0_en = reverse ? 0x13 : 0x10; 229262306a36Sopenharmony_ci drvr1_en = reverse ? 0x10 : 0x13; 229362306a36Sopenharmony_ci } else if (dp_opts->lanes == 2) { 229462306a36Sopenharmony_ci bias0_en = reverse ? 0x3f : 0x15; 229562306a36Sopenharmony_ci bias1_en = reverse ? 0x15 : 0x3f; 229662306a36Sopenharmony_ci drvr0_en = 0x10; 229762306a36Sopenharmony_ci drvr1_en = 0x10; 229862306a36Sopenharmony_ci } else { 229962306a36Sopenharmony_ci bias0_en = 0x3f; 230062306a36Sopenharmony_ci bias1_en = 0x3f; 230162306a36Sopenharmony_ci drvr0_en = 0x10; 230262306a36Sopenharmony_ci drvr1_en = 0x10; 230362306a36Sopenharmony_ci } 230462306a36Sopenharmony_ci 230562306a36Sopenharmony_ci writel(drvr0_en, qmp->dp_tx + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]); 230662306a36Sopenharmony_ci writel(bias0_en, qmp->dp_tx + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]); 230762306a36Sopenharmony_ci writel(drvr1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]); 230862306a36Sopenharmony_ci writel(bias1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]); 230962306a36Sopenharmony_ci 231062306a36Sopenharmony_ci writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 231162306a36Sopenharmony_ci udelay(2000); 231262306a36Sopenharmony_ci writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 231362306a36Sopenharmony_ci 231462306a36Sopenharmony_ci if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 231562306a36Sopenharmony_ci status, 231662306a36Sopenharmony_ci ((status & BIT(1)) > 0), 231762306a36Sopenharmony_ci 500, 231862306a36Sopenharmony_ci 10000)) 231962306a36Sopenharmony_ci return -ETIMEDOUT; 232062306a36Sopenharmony_ci 232162306a36Sopenharmony_ci writel(0x0a, qmp->dp_tx + cfg->regs[QPHY_TX_TX_POL_INV]); 232262306a36Sopenharmony_ci writel(0x0a, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_POL_INV]); 232362306a36Sopenharmony_ci 232462306a36Sopenharmony_ci writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]); 232562306a36Sopenharmony_ci writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]); 232662306a36Sopenharmony_ci 232762306a36Sopenharmony_ci writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 232862306a36Sopenharmony_ci writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 232962306a36Sopenharmony_ci 233062306a36Sopenharmony_ci return 0; 233162306a36Sopenharmony_ci 233262306a36Sopenharmony_ci return 0; 233362306a36Sopenharmony_ci} 233462306a36Sopenharmony_ci 233562306a36Sopenharmony_ci/* 233662306a36Sopenharmony_ci * We need to calibrate the aux setting here as many times 233762306a36Sopenharmony_ci * as the caller tries 233862306a36Sopenharmony_ci */ 233962306a36Sopenharmony_cistatic int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp) 234062306a36Sopenharmony_ci{ 234162306a36Sopenharmony_ci static const u8 cfg1_settings[] = { 0x20, 0x13, 0x23, 0x1d }; 234262306a36Sopenharmony_ci u8 val; 234362306a36Sopenharmony_ci 234462306a36Sopenharmony_ci qmp->dp_aux_cfg++; 234562306a36Sopenharmony_ci qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings); 234662306a36Sopenharmony_ci val = cfg1_settings[qmp->dp_aux_cfg]; 234762306a36Sopenharmony_ci 234862306a36Sopenharmony_ci writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 234962306a36Sopenharmony_ci 235062306a36Sopenharmony_ci return 0; 235162306a36Sopenharmony_ci} 235262306a36Sopenharmony_ci 235362306a36Sopenharmony_cistatic int qmp_combo_dp_configure(struct phy *phy, union phy_configure_opts *opts) 235462306a36Sopenharmony_ci{ 235562306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts = &opts->dp; 235662306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 235762306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 235862306a36Sopenharmony_ci 235962306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 236062306a36Sopenharmony_ci 236162306a36Sopenharmony_ci memcpy(&qmp->dp_opts, dp_opts, sizeof(*dp_opts)); 236262306a36Sopenharmony_ci if (qmp->dp_opts.set_voltages) { 236362306a36Sopenharmony_ci cfg->configure_dp_tx(qmp); 236462306a36Sopenharmony_ci qmp->dp_opts.set_voltages = 0; 236562306a36Sopenharmony_ci } 236662306a36Sopenharmony_ci 236762306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 236862306a36Sopenharmony_ci 236962306a36Sopenharmony_ci return 0; 237062306a36Sopenharmony_ci} 237162306a36Sopenharmony_ci 237262306a36Sopenharmony_cistatic int qmp_combo_dp_calibrate(struct phy *phy) 237362306a36Sopenharmony_ci{ 237462306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 237562306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 237662306a36Sopenharmony_ci int ret = 0; 237762306a36Sopenharmony_ci 237862306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 237962306a36Sopenharmony_ci 238062306a36Sopenharmony_ci if (cfg->calibrate_dp_phy) 238162306a36Sopenharmony_ci ret = cfg->calibrate_dp_phy(qmp); 238262306a36Sopenharmony_ci 238362306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 238462306a36Sopenharmony_ci 238562306a36Sopenharmony_ci return ret; 238662306a36Sopenharmony_ci} 238762306a36Sopenharmony_ci 238862306a36Sopenharmony_cistatic int qmp_combo_com_init(struct qmp_combo *qmp, bool force) 238962306a36Sopenharmony_ci{ 239062306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 239162306a36Sopenharmony_ci void __iomem *com = qmp->com; 239262306a36Sopenharmony_ci int ret; 239362306a36Sopenharmony_ci u32 val; 239462306a36Sopenharmony_ci 239562306a36Sopenharmony_ci if (!force && qmp->init_count++) 239662306a36Sopenharmony_ci return 0; 239762306a36Sopenharmony_ci 239862306a36Sopenharmony_ci ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs); 239962306a36Sopenharmony_ci if (ret) { 240062306a36Sopenharmony_ci dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret); 240162306a36Sopenharmony_ci goto err_decrement_count; 240262306a36Sopenharmony_ci } 240362306a36Sopenharmony_ci 240462306a36Sopenharmony_ci ret = reset_control_bulk_assert(cfg->num_resets, qmp->resets); 240562306a36Sopenharmony_ci if (ret) { 240662306a36Sopenharmony_ci dev_err(qmp->dev, "reset assert failed\n"); 240762306a36Sopenharmony_ci goto err_disable_regulators; 240862306a36Sopenharmony_ci } 240962306a36Sopenharmony_ci 241062306a36Sopenharmony_ci ret = reset_control_bulk_deassert(cfg->num_resets, qmp->resets); 241162306a36Sopenharmony_ci if (ret) { 241262306a36Sopenharmony_ci dev_err(qmp->dev, "reset deassert failed\n"); 241362306a36Sopenharmony_ci goto err_disable_regulators; 241462306a36Sopenharmony_ci } 241562306a36Sopenharmony_ci 241662306a36Sopenharmony_ci ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks); 241762306a36Sopenharmony_ci if (ret) 241862306a36Sopenharmony_ci goto err_assert_reset; 241962306a36Sopenharmony_ci 242062306a36Sopenharmony_ci qphy_setbits(com, QPHY_V3_DP_COM_POWER_DOWN_CTRL, SW_PWRDN); 242162306a36Sopenharmony_ci 242262306a36Sopenharmony_ci /* override hardware control for reset of qmp phy */ 242362306a36Sopenharmony_ci qphy_setbits(com, QPHY_V3_DP_COM_RESET_OVRD_CTRL, 242462306a36Sopenharmony_ci SW_DPPHY_RESET_MUX | SW_DPPHY_RESET | 242562306a36Sopenharmony_ci SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET); 242662306a36Sopenharmony_ci 242762306a36Sopenharmony_ci /* Use software based port select and switch on typec orientation */ 242862306a36Sopenharmony_ci val = SW_PORTSELECT_MUX; 242962306a36Sopenharmony_ci if (qmp->orientation == TYPEC_ORIENTATION_REVERSE) 243062306a36Sopenharmony_ci val |= SW_PORTSELECT_VAL; 243162306a36Sopenharmony_ci writel(val, com + QPHY_V3_DP_COM_TYPEC_CTRL); 243262306a36Sopenharmony_ci writel(USB3_MODE | DP_MODE, com + QPHY_V3_DP_COM_PHY_MODE_CTRL); 243362306a36Sopenharmony_ci 243462306a36Sopenharmony_ci /* bring both QMP USB and QMP DP PHYs PCS block out of reset */ 243562306a36Sopenharmony_ci qphy_clrbits(com, QPHY_V3_DP_COM_RESET_OVRD_CTRL, 243662306a36Sopenharmony_ci SW_DPPHY_RESET_MUX | SW_DPPHY_RESET | 243762306a36Sopenharmony_ci SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET); 243862306a36Sopenharmony_ci 243962306a36Sopenharmony_ci qphy_clrbits(com, QPHY_V3_DP_COM_SWI_CTRL, 0x03); 244062306a36Sopenharmony_ci qphy_clrbits(com, QPHY_V3_DP_COM_SW_RESET, SW_RESET); 244162306a36Sopenharmony_ci 244262306a36Sopenharmony_ci qphy_setbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], 244362306a36Sopenharmony_ci SW_PWRDN); 244462306a36Sopenharmony_ci 244562306a36Sopenharmony_ci return 0; 244662306a36Sopenharmony_ci 244762306a36Sopenharmony_cierr_assert_reset: 244862306a36Sopenharmony_ci reset_control_bulk_assert(cfg->num_resets, qmp->resets); 244962306a36Sopenharmony_cierr_disable_regulators: 245062306a36Sopenharmony_ci regulator_bulk_disable(cfg->num_vregs, qmp->vregs); 245162306a36Sopenharmony_cierr_decrement_count: 245262306a36Sopenharmony_ci qmp->init_count--; 245362306a36Sopenharmony_ci 245462306a36Sopenharmony_ci return ret; 245562306a36Sopenharmony_ci} 245662306a36Sopenharmony_ci 245762306a36Sopenharmony_cistatic int qmp_combo_com_exit(struct qmp_combo *qmp, bool force) 245862306a36Sopenharmony_ci{ 245962306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 246062306a36Sopenharmony_ci 246162306a36Sopenharmony_ci if (!force && --qmp->init_count) 246262306a36Sopenharmony_ci return 0; 246362306a36Sopenharmony_ci 246462306a36Sopenharmony_ci reset_control_bulk_assert(cfg->num_resets, qmp->resets); 246562306a36Sopenharmony_ci 246662306a36Sopenharmony_ci clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks); 246762306a36Sopenharmony_ci 246862306a36Sopenharmony_ci regulator_bulk_disable(cfg->num_vregs, qmp->vregs); 246962306a36Sopenharmony_ci 247062306a36Sopenharmony_ci return 0; 247162306a36Sopenharmony_ci} 247262306a36Sopenharmony_ci 247362306a36Sopenharmony_cistatic int qmp_combo_dp_init(struct phy *phy) 247462306a36Sopenharmony_ci{ 247562306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 247662306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 247762306a36Sopenharmony_ci int ret; 247862306a36Sopenharmony_ci 247962306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 248062306a36Sopenharmony_ci 248162306a36Sopenharmony_ci ret = qmp_combo_com_init(qmp, false); 248262306a36Sopenharmony_ci if (ret) 248362306a36Sopenharmony_ci goto out_unlock; 248462306a36Sopenharmony_ci 248562306a36Sopenharmony_ci cfg->dp_aux_init(qmp); 248662306a36Sopenharmony_ci 248762306a36Sopenharmony_ci qmp->dp_init_count++; 248862306a36Sopenharmony_ci 248962306a36Sopenharmony_ciout_unlock: 249062306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 249162306a36Sopenharmony_ci return ret; 249262306a36Sopenharmony_ci} 249362306a36Sopenharmony_ci 249462306a36Sopenharmony_cistatic int qmp_combo_dp_exit(struct phy *phy) 249562306a36Sopenharmony_ci{ 249662306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 249762306a36Sopenharmony_ci 249862306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 249962306a36Sopenharmony_ci 250062306a36Sopenharmony_ci qmp_combo_com_exit(qmp, false); 250162306a36Sopenharmony_ci 250262306a36Sopenharmony_ci qmp->dp_init_count--; 250362306a36Sopenharmony_ci 250462306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 250562306a36Sopenharmony_ci 250662306a36Sopenharmony_ci return 0; 250762306a36Sopenharmony_ci} 250862306a36Sopenharmony_ci 250962306a36Sopenharmony_cistatic int qmp_combo_dp_power_on(struct phy *phy) 251062306a36Sopenharmony_ci{ 251162306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 251262306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 251362306a36Sopenharmony_ci void __iomem *tx = qmp->dp_tx; 251462306a36Sopenharmony_ci void __iomem *tx2 = qmp->dp_tx2; 251562306a36Sopenharmony_ci 251662306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 251762306a36Sopenharmony_ci 251862306a36Sopenharmony_ci qmp_combo_dp_serdes_init(qmp); 251962306a36Sopenharmony_ci 252062306a36Sopenharmony_ci qmp_combo_configure_lane(tx, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 1); 252162306a36Sopenharmony_ci qmp_combo_configure_lane(tx2, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 2); 252262306a36Sopenharmony_ci 252362306a36Sopenharmony_ci /* Configure special DP tx tunings */ 252462306a36Sopenharmony_ci cfg->configure_dp_tx(qmp); 252562306a36Sopenharmony_ci 252662306a36Sopenharmony_ci /* Configure link rate, swing, etc. */ 252762306a36Sopenharmony_ci cfg->configure_dp_phy(qmp); 252862306a36Sopenharmony_ci 252962306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 253062306a36Sopenharmony_ci 253162306a36Sopenharmony_ci return 0; 253262306a36Sopenharmony_ci} 253362306a36Sopenharmony_ci 253462306a36Sopenharmony_cistatic int qmp_combo_dp_power_off(struct phy *phy) 253562306a36Sopenharmony_ci{ 253662306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 253762306a36Sopenharmony_ci 253862306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 253962306a36Sopenharmony_ci 254062306a36Sopenharmony_ci /* Assert DP PHY power down */ 254162306a36Sopenharmony_ci writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 254262306a36Sopenharmony_ci 254362306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 254462306a36Sopenharmony_ci 254562306a36Sopenharmony_ci return 0; 254662306a36Sopenharmony_ci} 254762306a36Sopenharmony_ci 254862306a36Sopenharmony_cistatic int qmp_combo_usb_power_on(struct phy *phy) 254962306a36Sopenharmony_ci{ 255062306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 255162306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 255262306a36Sopenharmony_ci void __iomem *serdes = qmp->serdes; 255362306a36Sopenharmony_ci void __iomem *tx = qmp->tx; 255462306a36Sopenharmony_ci void __iomem *rx = qmp->rx; 255562306a36Sopenharmony_ci void __iomem *tx2 = qmp->tx2; 255662306a36Sopenharmony_ci void __iomem *rx2 = qmp->rx2; 255762306a36Sopenharmony_ci void __iomem *pcs = qmp->pcs; 255862306a36Sopenharmony_ci void __iomem *pcs_usb = qmp->pcs_usb; 255962306a36Sopenharmony_ci void __iomem *status; 256062306a36Sopenharmony_ci unsigned int val; 256162306a36Sopenharmony_ci int ret; 256262306a36Sopenharmony_ci 256362306a36Sopenharmony_ci qmp_combo_configure(serdes, cfg->serdes_tbl, cfg->serdes_tbl_num); 256462306a36Sopenharmony_ci 256562306a36Sopenharmony_ci ret = clk_prepare_enable(qmp->pipe_clk); 256662306a36Sopenharmony_ci if (ret) { 256762306a36Sopenharmony_ci dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret); 256862306a36Sopenharmony_ci return ret; 256962306a36Sopenharmony_ci } 257062306a36Sopenharmony_ci 257162306a36Sopenharmony_ci /* Tx, Rx, and PCS configurations */ 257262306a36Sopenharmony_ci qmp_combo_configure_lane(tx, cfg->tx_tbl, cfg->tx_tbl_num, 1); 257362306a36Sopenharmony_ci qmp_combo_configure_lane(tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2); 257462306a36Sopenharmony_ci 257562306a36Sopenharmony_ci qmp_combo_configure_lane(rx, cfg->rx_tbl, cfg->rx_tbl_num, 1); 257662306a36Sopenharmony_ci qmp_combo_configure_lane(rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2); 257762306a36Sopenharmony_ci 257862306a36Sopenharmony_ci qmp_combo_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num); 257962306a36Sopenharmony_ci 258062306a36Sopenharmony_ci if (pcs_usb) 258162306a36Sopenharmony_ci qmp_combo_configure(pcs_usb, cfg->pcs_usb_tbl, cfg->pcs_usb_tbl_num); 258262306a36Sopenharmony_ci 258362306a36Sopenharmony_ci if (cfg->has_pwrdn_delay) 258462306a36Sopenharmony_ci usleep_range(10, 20); 258562306a36Sopenharmony_ci 258662306a36Sopenharmony_ci /* Pull PHY out of reset state */ 258762306a36Sopenharmony_ci qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET); 258862306a36Sopenharmony_ci 258962306a36Sopenharmony_ci /* start SerDes and Phy-Coding-Sublayer */ 259062306a36Sopenharmony_ci qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], SERDES_START | PCS_START); 259162306a36Sopenharmony_ci 259262306a36Sopenharmony_ci status = pcs + cfg->regs[QPHY_PCS_STATUS]; 259362306a36Sopenharmony_ci ret = readl_poll_timeout(status, val, !(val & PHYSTATUS), 200, 259462306a36Sopenharmony_ci PHY_INIT_COMPLETE_TIMEOUT); 259562306a36Sopenharmony_ci if (ret) { 259662306a36Sopenharmony_ci dev_err(qmp->dev, "phy initialization timed-out\n"); 259762306a36Sopenharmony_ci goto err_disable_pipe_clk; 259862306a36Sopenharmony_ci } 259962306a36Sopenharmony_ci 260062306a36Sopenharmony_ci return 0; 260162306a36Sopenharmony_ci 260262306a36Sopenharmony_cierr_disable_pipe_clk: 260362306a36Sopenharmony_ci clk_disable_unprepare(qmp->pipe_clk); 260462306a36Sopenharmony_ci 260562306a36Sopenharmony_ci return ret; 260662306a36Sopenharmony_ci} 260762306a36Sopenharmony_ci 260862306a36Sopenharmony_cistatic int qmp_combo_usb_power_off(struct phy *phy) 260962306a36Sopenharmony_ci{ 261062306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 261162306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 261262306a36Sopenharmony_ci 261362306a36Sopenharmony_ci clk_disable_unprepare(qmp->pipe_clk); 261462306a36Sopenharmony_ci 261562306a36Sopenharmony_ci /* PHY reset */ 261662306a36Sopenharmony_ci qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET); 261762306a36Sopenharmony_ci 261862306a36Sopenharmony_ci /* stop SerDes and Phy-Coding-Sublayer */ 261962306a36Sopenharmony_ci qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL], 262062306a36Sopenharmony_ci SERDES_START | PCS_START); 262162306a36Sopenharmony_ci 262262306a36Sopenharmony_ci /* Put PHY into POWER DOWN state: active low */ 262362306a36Sopenharmony_ci qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], 262462306a36Sopenharmony_ci SW_PWRDN); 262562306a36Sopenharmony_ci 262662306a36Sopenharmony_ci return 0; 262762306a36Sopenharmony_ci} 262862306a36Sopenharmony_ci 262962306a36Sopenharmony_cistatic int qmp_combo_usb_init(struct phy *phy) 263062306a36Sopenharmony_ci{ 263162306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 263262306a36Sopenharmony_ci int ret; 263362306a36Sopenharmony_ci 263462306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 263562306a36Sopenharmony_ci ret = qmp_combo_com_init(qmp, false); 263662306a36Sopenharmony_ci if (ret) 263762306a36Sopenharmony_ci goto out_unlock; 263862306a36Sopenharmony_ci 263962306a36Sopenharmony_ci ret = qmp_combo_usb_power_on(phy); 264062306a36Sopenharmony_ci if (ret) { 264162306a36Sopenharmony_ci qmp_combo_com_exit(qmp, false); 264262306a36Sopenharmony_ci goto out_unlock; 264362306a36Sopenharmony_ci } 264462306a36Sopenharmony_ci 264562306a36Sopenharmony_ci qmp->usb_init_count++; 264662306a36Sopenharmony_ci 264762306a36Sopenharmony_ciout_unlock: 264862306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 264962306a36Sopenharmony_ci return ret; 265062306a36Sopenharmony_ci} 265162306a36Sopenharmony_ci 265262306a36Sopenharmony_cistatic int qmp_combo_usb_exit(struct phy *phy) 265362306a36Sopenharmony_ci{ 265462306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 265562306a36Sopenharmony_ci int ret; 265662306a36Sopenharmony_ci 265762306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 265862306a36Sopenharmony_ci ret = qmp_combo_usb_power_off(phy); 265962306a36Sopenharmony_ci if (ret) 266062306a36Sopenharmony_ci goto out_unlock; 266162306a36Sopenharmony_ci 266262306a36Sopenharmony_ci ret = qmp_combo_com_exit(qmp, false); 266362306a36Sopenharmony_ci if (ret) 266462306a36Sopenharmony_ci goto out_unlock; 266562306a36Sopenharmony_ci 266662306a36Sopenharmony_ci qmp->usb_init_count--; 266762306a36Sopenharmony_ci 266862306a36Sopenharmony_ciout_unlock: 266962306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 267062306a36Sopenharmony_ci return ret; 267162306a36Sopenharmony_ci} 267262306a36Sopenharmony_ci 267362306a36Sopenharmony_cistatic int qmp_combo_usb_set_mode(struct phy *phy, enum phy_mode mode, int submode) 267462306a36Sopenharmony_ci{ 267562306a36Sopenharmony_ci struct qmp_combo *qmp = phy_get_drvdata(phy); 267662306a36Sopenharmony_ci 267762306a36Sopenharmony_ci qmp->mode = mode; 267862306a36Sopenharmony_ci 267962306a36Sopenharmony_ci return 0; 268062306a36Sopenharmony_ci} 268162306a36Sopenharmony_ci 268262306a36Sopenharmony_cistatic const struct phy_ops qmp_combo_usb_phy_ops = { 268362306a36Sopenharmony_ci .init = qmp_combo_usb_init, 268462306a36Sopenharmony_ci .exit = qmp_combo_usb_exit, 268562306a36Sopenharmony_ci .set_mode = qmp_combo_usb_set_mode, 268662306a36Sopenharmony_ci .owner = THIS_MODULE, 268762306a36Sopenharmony_ci}; 268862306a36Sopenharmony_ci 268962306a36Sopenharmony_cistatic const struct phy_ops qmp_combo_dp_phy_ops = { 269062306a36Sopenharmony_ci .init = qmp_combo_dp_init, 269162306a36Sopenharmony_ci .configure = qmp_combo_dp_configure, 269262306a36Sopenharmony_ci .power_on = qmp_combo_dp_power_on, 269362306a36Sopenharmony_ci .calibrate = qmp_combo_dp_calibrate, 269462306a36Sopenharmony_ci .power_off = qmp_combo_dp_power_off, 269562306a36Sopenharmony_ci .exit = qmp_combo_dp_exit, 269662306a36Sopenharmony_ci .owner = THIS_MODULE, 269762306a36Sopenharmony_ci}; 269862306a36Sopenharmony_ci 269962306a36Sopenharmony_cistatic void qmp_combo_enable_autonomous_mode(struct qmp_combo *qmp) 270062306a36Sopenharmony_ci{ 270162306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 270262306a36Sopenharmony_ci void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs; 270362306a36Sopenharmony_ci void __iomem *pcs_misc = qmp->pcs_misc; 270462306a36Sopenharmony_ci u32 intr_mask; 270562306a36Sopenharmony_ci 270662306a36Sopenharmony_ci if (qmp->mode == PHY_MODE_USB_HOST_SS || 270762306a36Sopenharmony_ci qmp->mode == PHY_MODE_USB_DEVICE_SS) 270862306a36Sopenharmony_ci intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN; 270962306a36Sopenharmony_ci else 271062306a36Sopenharmony_ci intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL; 271162306a36Sopenharmony_ci 271262306a36Sopenharmony_ci /* Clear any pending interrupts status */ 271362306a36Sopenharmony_ci qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 271462306a36Sopenharmony_ci /* Writing 1 followed by 0 clears the interrupt */ 271562306a36Sopenharmony_ci qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 271662306a36Sopenharmony_ci 271762306a36Sopenharmony_ci qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], 271862306a36Sopenharmony_ci ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL); 271962306a36Sopenharmony_ci 272062306a36Sopenharmony_ci /* Enable required PHY autonomous mode interrupts */ 272162306a36Sopenharmony_ci qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask); 272262306a36Sopenharmony_ci 272362306a36Sopenharmony_ci /* Enable i/o clamp_n for autonomous mode */ 272462306a36Sopenharmony_ci if (pcs_misc) 272562306a36Sopenharmony_ci qphy_clrbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN); 272662306a36Sopenharmony_ci} 272762306a36Sopenharmony_ci 272862306a36Sopenharmony_cistatic void qmp_combo_disable_autonomous_mode(struct qmp_combo *qmp) 272962306a36Sopenharmony_ci{ 273062306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 273162306a36Sopenharmony_ci void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs; 273262306a36Sopenharmony_ci void __iomem *pcs_misc = qmp->pcs_misc; 273362306a36Sopenharmony_ci 273462306a36Sopenharmony_ci /* Disable i/o clamp_n on resume for normal mode */ 273562306a36Sopenharmony_ci if (pcs_misc) 273662306a36Sopenharmony_ci qphy_setbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN); 273762306a36Sopenharmony_ci 273862306a36Sopenharmony_ci qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], 273962306a36Sopenharmony_ci ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN); 274062306a36Sopenharmony_ci 274162306a36Sopenharmony_ci qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 274262306a36Sopenharmony_ci /* Writing 1 followed by 0 clears the interrupt */ 274362306a36Sopenharmony_ci qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 274462306a36Sopenharmony_ci} 274562306a36Sopenharmony_ci 274662306a36Sopenharmony_cistatic int __maybe_unused qmp_combo_runtime_suspend(struct device *dev) 274762306a36Sopenharmony_ci{ 274862306a36Sopenharmony_ci struct qmp_combo *qmp = dev_get_drvdata(dev); 274962306a36Sopenharmony_ci 275062306a36Sopenharmony_ci dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qmp->mode); 275162306a36Sopenharmony_ci 275262306a36Sopenharmony_ci if (!qmp->init_count) { 275362306a36Sopenharmony_ci dev_vdbg(dev, "PHY not initialized, bailing out\n"); 275462306a36Sopenharmony_ci return 0; 275562306a36Sopenharmony_ci } 275662306a36Sopenharmony_ci 275762306a36Sopenharmony_ci qmp_combo_enable_autonomous_mode(qmp); 275862306a36Sopenharmony_ci 275962306a36Sopenharmony_ci clk_disable_unprepare(qmp->pipe_clk); 276062306a36Sopenharmony_ci clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks); 276162306a36Sopenharmony_ci 276262306a36Sopenharmony_ci return 0; 276362306a36Sopenharmony_ci} 276462306a36Sopenharmony_ci 276562306a36Sopenharmony_cistatic int __maybe_unused qmp_combo_runtime_resume(struct device *dev) 276662306a36Sopenharmony_ci{ 276762306a36Sopenharmony_ci struct qmp_combo *qmp = dev_get_drvdata(dev); 276862306a36Sopenharmony_ci int ret = 0; 276962306a36Sopenharmony_ci 277062306a36Sopenharmony_ci dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qmp->mode); 277162306a36Sopenharmony_ci 277262306a36Sopenharmony_ci if (!qmp->init_count) { 277362306a36Sopenharmony_ci dev_vdbg(dev, "PHY not initialized, bailing out\n"); 277462306a36Sopenharmony_ci return 0; 277562306a36Sopenharmony_ci } 277662306a36Sopenharmony_ci 277762306a36Sopenharmony_ci ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks); 277862306a36Sopenharmony_ci if (ret) 277962306a36Sopenharmony_ci return ret; 278062306a36Sopenharmony_ci 278162306a36Sopenharmony_ci ret = clk_prepare_enable(qmp->pipe_clk); 278262306a36Sopenharmony_ci if (ret) { 278362306a36Sopenharmony_ci dev_err(dev, "pipe_clk enable failed, err=%d\n", ret); 278462306a36Sopenharmony_ci clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks); 278562306a36Sopenharmony_ci return ret; 278662306a36Sopenharmony_ci } 278762306a36Sopenharmony_ci 278862306a36Sopenharmony_ci qmp_combo_disable_autonomous_mode(qmp); 278962306a36Sopenharmony_ci 279062306a36Sopenharmony_ci return 0; 279162306a36Sopenharmony_ci} 279262306a36Sopenharmony_ci 279362306a36Sopenharmony_cistatic const struct dev_pm_ops qmp_combo_pm_ops = { 279462306a36Sopenharmony_ci SET_RUNTIME_PM_OPS(qmp_combo_runtime_suspend, 279562306a36Sopenharmony_ci qmp_combo_runtime_resume, NULL) 279662306a36Sopenharmony_ci}; 279762306a36Sopenharmony_ci 279862306a36Sopenharmony_cistatic int qmp_combo_vreg_init(struct qmp_combo *qmp) 279962306a36Sopenharmony_ci{ 280062306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 280162306a36Sopenharmony_ci struct device *dev = qmp->dev; 280262306a36Sopenharmony_ci int num = cfg->num_vregs; 280362306a36Sopenharmony_ci int ret, i; 280462306a36Sopenharmony_ci 280562306a36Sopenharmony_ci qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL); 280662306a36Sopenharmony_ci if (!qmp->vregs) 280762306a36Sopenharmony_ci return -ENOMEM; 280862306a36Sopenharmony_ci 280962306a36Sopenharmony_ci for (i = 0; i < num; i++) 281062306a36Sopenharmony_ci qmp->vregs[i].supply = cfg->vreg_list[i].name; 281162306a36Sopenharmony_ci 281262306a36Sopenharmony_ci ret = devm_regulator_bulk_get(dev, num, qmp->vregs); 281362306a36Sopenharmony_ci if (ret) { 281462306a36Sopenharmony_ci dev_err(dev, "failed at devm_regulator_bulk_get\n"); 281562306a36Sopenharmony_ci return ret; 281662306a36Sopenharmony_ci } 281762306a36Sopenharmony_ci 281862306a36Sopenharmony_ci for (i = 0; i < num; i++) { 281962306a36Sopenharmony_ci ret = regulator_set_load(qmp->vregs[i].consumer, 282062306a36Sopenharmony_ci cfg->vreg_list[i].enable_load); 282162306a36Sopenharmony_ci if (ret) { 282262306a36Sopenharmony_ci dev_err(dev, "failed to set load at %s\n", 282362306a36Sopenharmony_ci qmp->vregs[i].supply); 282462306a36Sopenharmony_ci return ret; 282562306a36Sopenharmony_ci } 282662306a36Sopenharmony_ci } 282762306a36Sopenharmony_ci 282862306a36Sopenharmony_ci return 0; 282962306a36Sopenharmony_ci} 283062306a36Sopenharmony_ci 283162306a36Sopenharmony_cistatic int qmp_combo_reset_init(struct qmp_combo *qmp) 283262306a36Sopenharmony_ci{ 283362306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 283462306a36Sopenharmony_ci struct device *dev = qmp->dev; 283562306a36Sopenharmony_ci int i; 283662306a36Sopenharmony_ci int ret; 283762306a36Sopenharmony_ci 283862306a36Sopenharmony_ci qmp->resets = devm_kcalloc(dev, cfg->num_resets, 283962306a36Sopenharmony_ci sizeof(*qmp->resets), GFP_KERNEL); 284062306a36Sopenharmony_ci if (!qmp->resets) 284162306a36Sopenharmony_ci return -ENOMEM; 284262306a36Sopenharmony_ci 284362306a36Sopenharmony_ci for (i = 0; i < cfg->num_resets; i++) 284462306a36Sopenharmony_ci qmp->resets[i].id = cfg->reset_list[i]; 284562306a36Sopenharmony_ci 284662306a36Sopenharmony_ci ret = devm_reset_control_bulk_get_exclusive(dev, cfg->num_resets, qmp->resets); 284762306a36Sopenharmony_ci if (ret) 284862306a36Sopenharmony_ci return dev_err_probe(dev, ret, "failed to get resets\n"); 284962306a36Sopenharmony_ci 285062306a36Sopenharmony_ci return 0; 285162306a36Sopenharmony_ci} 285262306a36Sopenharmony_ci 285362306a36Sopenharmony_cistatic int qmp_combo_clk_init(struct qmp_combo *qmp) 285462306a36Sopenharmony_ci{ 285562306a36Sopenharmony_ci struct device *dev = qmp->dev; 285662306a36Sopenharmony_ci int num = ARRAY_SIZE(qmp_combo_phy_clk_l); 285762306a36Sopenharmony_ci int i; 285862306a36Sopenharmony_ci 285962306a36Sopenharmony_ci qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL); 286062306a36Sopenharmony_ci if (!qmp->clks) 286162306a36Sopenharmony_ci return -ENOMEM; 286262306a36Sopenharmony_ci 286362306a36Sopenharmony_ci for (i = 0; i < num; i++) 286462306a36Sopenharmony_ci qmp->clks[i].id = qmp_combo_phy_clk_l[i]; 286562306a36Sopenharmony_ci 286662306a36Sopenharmony_ci qmp->num_clks = num; 286762306a36Sopenharmony_ci 286862306a36Sopenharmony_ci return devm_clk_bulk_get_optional(dev, num, qmp->clks); 286962306a36Sopenharmony_ci} 287062306a36Sopenharmony_ci 287162306a36Sopenharmony_cistatic void phy_clk_release_provider(void *res) 287262306a36Sopenharmony_ci{ 287362306a36Sopenharmony_ci of_clk_del_provider(res); 287462306a36Sopenharmony_ci} 287562306a36Sopenharmony_ci 287662306a36Sopenharmony_ci/* 287762306a36Sopenharmony_ci * Register a fixed rate pipe clock. 287862306a36Sopenharmony_ci * 287962306a36Sopenharmony_ci * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate 288062306a36Sopenharmony_ci * controls it. The <s>_pipe_clk coming out of the GCC is requested 288162306a36Sopenharmony_ci * by the PHY driver for its operations. 288262306a36Sopenharmony_ci * We register the <s>_pipe_clksrc here. The gcc driver takes care 288362306a36Sopenharmony_ci * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk. 288462306a36Sopenharmony_ci * Below picture shows this relationship. 288562306a36Sopenharmony_ci * 288662306a36Sopenharmony_ci * +---------------+ 288762306a36Sopenharmony_ci * | PHY block |<<---------------------------------------+ 288862306a36Sopenharmony_ci * | | | 288962306a36Sopenharmony_ci * | +-------+ | +-----+ | 289062306a36Sopenharmony_ci * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ 289162306a36Sopenharmony_ci * clk | +-------+ | +-----+ 289262306a36Sopenharmony_ci * +---------------+ 289362306a36Sopenharmony_ci */ 289462306a36Sopenharmony_cistatic int phy_pipe_clk_register(struct qmp_combo *qmp, struct device_node *np) 289562306a36Sopenharmony_ci{ 289662306a36Sopenharmony_ci struct clk_fixed_rate *fixed = &qmp->pipe_clk_fixed; 289762306a36Sopenharmony_ci struct clk_init_data init = { }; 289862306a36Sopenharmony_ci char name[64]; 289962306a36Sopenharmony_ci 290062306a36Sopenharmony_ci snprintf(name, sizeof(name), "%s::pipe_clk", dev_name(qmp->dev)); 290162306a36Sopenharmony_ci init.name = name; 290262306a36Sopenharmony_ci init.ops = &clk_fixed_rate_ops; 290362306a36Sopenharmony_ci 290462306a36Sopenharmony_ci /* controllers using QMP phys use 125MHz pipe clock interface */ 290562306a36Sopenharmony_ci fixed->fixed_rate = 125000000; 290662306a36Sopenharmony_ci fixed->hw.init = &init; 290762306a36Sopenharmony_ci 290862306a36Sopenharmony_ci return devm_clk_hw_register(qmp->dev, &fixed->hw); 290962306a36Sopenharmony_ci} 291062306a36Sopenharmony_ci 291162306a36Sopenharmony_ci/* 291262306a36Sopenharmony_ci * Display Port PLL driver block diagram for branch clocks 291362306a36Sopenharmony_ci * 291462306a36Sopenharmony_ci * +------------------------------+ 291562306a36Sopenharmony_ci * | DP_VCO_CLK | 291662306a36Sopenharmony_ci * | | 291762306a36Sopenharmony_ci * | +-------------------+ | 291862306a36Sopenharmony_ci * | | (DP PLL/VCO) | | 291962306a36Sopenharmony_ci * | +---------+---------+ | 292062306a36Sopenharmony_ci * | v | 292162306a36Sopenharmony_ci * | +----------+-----------+ | 292262306a36Sopenharmony_ci * | | hsclk_divsel_clk_src | | 292362306a36Sopenharmony_ci * | +----------+-----------+ | 292462306a36Sopenharmony_ci * +------------------------------+ 292562306a36Sopenharmony_ci * | 292662306a36Sopenharmony_ci * +---------<---------v------------>----------+ 292762306a36Sopenharmony_ci * | | 292862306a36Sopenharmony_ci * +--------v----------------+ | 292962306a36Sopenharmony_ci * | dp_phy_pll_link_clk | | 293062306a36Sopenharmony_ci * | link_clk | | 293162306a36Sopenharmony_ci * +--------+----------------+ | 293262306a36Sopenharmony_ci * | | 293362306a36Sopenharmony_ci * | | 293462306a36Sopenharmony_ci * v v 293562306a36Sopenharmony_ci * Input to DISPCC block | 293662306a36Sopenharmony_ci * for link clk, crypto clk | 293762306a36Sopenharmony_ci * and interface clock | 293862306a36Sopenharmony_ci * | 293962306a36Sopenharmony_ci * | 294062306a36Sopenharmony_ci * +--------<------------+-----------------+---<---+ 294162306a36Sopenharmony_ci * | | | 294262306a36Sopenharmony_ci * +----v---------+ +--------v-----+ +--------v------+ 294362306a36Sopenharmony_ci * | vco_divided | | vco_divided | | vco_divided | 294462306a36Sopenharmony_ci * | _clk_src | | _clk_src | | _clk_src | 294562306a36Sopenharmony_ci * | | | | | | 294662306a36Sopenharmony_ci * |divsel_six | | divsel_two | | divsel_four | 294762306a36Sopenharmony_ci * +-------+------+ +-----+--------+ +--------+------+ 294862306a36Sopenharmony_ci * | | | 294962306a36Sopenharmony_ci * v---->----------v-------------<------v 295062306a36Sopenharmony_ci * | 295162306a36Sopenharmony_ci * +----------+-----------------+ 295262306a36Sopenharmony_ci * | dp_phy_pll_vco_div_clk | 295362306a36Sopenharmony_ci * +---------+------------------+ 295462306a36Sopenharmony_ci * | 295562306a36Sopenharmony_ci * v 295662306a36Sopenharmony_ci * Input to DISPCC block 295762306a36Sopenharmony_ci * for DP pixel clock 295862306a36Sopenharmony_ci * 295962306a36Sopenharmony_ci */ 296062306a36Sopenharmony_cistatic int qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req) 296162306a36Sopenharmony_ci{ 296262306a36Sopenharmony_ci switch (req->rate) { 296362306a36Sopenharmony_ci case 1620000000UL / 2: 296462306a36Sopenharmony_ci case 2700000000UL / 2: 296562306a36Sopenharmony_ci /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */ 296662306a36Sopenharmony_ci return 0; 296762306a36Sopenharmony_ci default: 296862306a36Sopenharmony_ci return -EINVAL; 296962306a36Sopenharmony_ci } 297062306a36Sopenharmony_ci} 297162306a36Sopenharmony_ci 297262306a36Sopenharmony_cistatic unsigned long qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 297362306a36Sopenharmony_ci{ 297462306a36Sopenharmony_ci const struct qmp_combo *qmp; 297562306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts; 297662306a36Sopenharmony_ci 297762306a36Sopenharmony_ci qmp = container_of(hw, struct qmp_combo, dp_pixel_hw); 297862306a36Sopenharmony_ci dp_opts = &qmp->dp_opts; 297962306a36Sopenharmony_ci 298062306a36Sopenharmony_ci switch (dp_opts->link_rate) { 298162306a36Sopenharmony_ci case 1620: 298262306a36Sopenharmony_ci return 1620000000UL / 2; 298362306a36Sopenharmony_ci case 2700: 298462306a36Sopenharmony_ci return 2700000000UL / 2; 298562306a36Sopenharmony_ci case 5400: 298662306a36Sopenharmony_ci return 5400000000UL / 4; 298762306a36Sopenharmony_ci case 8100: 298862306a36Sopenharmony_ci return 8100000000UL / 6; 298962306a36Sopenharmony_ci default: 299062306a36Sopenharmony_ci return 0; 299162306a36Sopenharmony_ci } 299262306a36Sopenharmony_ci} 299362306a36Sopenharmony_ci 299462306a36Sopenharmony_cistatic const struct clk_ops qmp_dp_pixel_clk_ops = { 299562306a36Sopenharmony_ci .determine_rate = qmp_dp_pixel_clk_determine_rate, 299662306a36Sopenharmony_ci .recalc_rate = qmp_dp_pixel_clk_recalc_rate, 299762306a36Sopenharmony_ci}; 299862306a36Sopenharmony_ci 299962306a36Sopenharmony_cistatic int qmp_dp_link_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req) 300062306a36Sopenharmony_ci{ 300162306a36Sopenharmony_ci switch (req->rate) { 300262306a36Sopenharmony_ci case 162000000: 300362306a36Sopenharmony_ci case 270000000: 300462306a36Sopenharmony_ci case 540000000: 300562306a36Sopenharmony_ci case 810000000: 300662306a36Sopenharmony_ci return 0; 300762306a36Sopenharmony_ci default: 300862306a36Sopenharmony_ci return -EINVAL; 300962306a36Sopenharmony_ci } 301062306a36Sopenharmony_ci} 301162306a36Sopenharmony_ci 301262306a36Sopenharmony_cistatic unsigned long qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 301362306a36Sopenharmony_ci{ 301462306a36Sopenharmony_ci const struct qmp_combo *qmp; 301562306a36Sopenharmony_ci const struct phy_configure_opts_dp *dp_opts; 301662306a36Sopenharmony_ci 301762306a36Sopenharmony_ci qmp = container_of(hw, struct qmp_combo, dp_link_hw); 301862306a36Sopenharmony_ci dp_opts = &qmp->dp_opts; 301962306a36Sopenharmony_ci 302062306a36Sopenharmony_ci switch (dp_opts->link_rate) { 302162306a36Sopenharmony_ci case 1620: 302262306a36Sopenharmony_ci case 2700: 302362306a36Sopenharmony_ci case 5400: 302462306a36Sopenharmony_ci case 8100: 302562306a36Sopenharmony_ci return dp_opts->link_rate * 100000; 302662306a36Sopenharmony_ci default: 302762306a36Sopenharmony_ci return 0; 302862306a36Sopenharmony_ci } 302962306a36Sopenharmony_ci} 303062306a36Sopenharmony_ci 303162306a36Sopenharmony_cistatic const struct clk_ops qmp_dp_link_clk_ops = { 303262306a36Sopenharmony_ci .determine_rate = qmp_dp_link_clk_determine_rate, 303362306a36Sopenharmony_ci .recalc_rate = qmp_dp_link_clk_recalc_rate, 303462306a36Sopenharmony_ci}; 303562306a36Sopenharmony_ci 303662306a36Sopenharmony_cistatic struct clk_hw *qmp_dp_clks_hw_get(struct of_phandle_args *clkspec, void *data) 303762306a36Sopenharmony_ci{ 303862306a36Sopenharmony_ci struct qmp_combo *qmp = data; 303962306a36Sopenharmony_ci unsigned int idx = clkspec->args[0]; 304062306a36Sopenharmony_ci 304162306a36Sopenharmony_ci if (idx >= 2) { 304262306a36Sopenharmony_ci pr_err("%s: invalid index %u\n", __func__, idx); 304362306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 304462306a36Sopenharmony_ci } 304562306a36Sopenharmony_ci 304662306a36Sopenharmony_ci if (idx == 0) 304762306a36Sopenharmony_ci return &qmp->dp_link_hw; 304862306a36Sopenharmony_ci 304962306a36Sopenharmony_ci return &qmp->dp_pixel_hw; 305062306a36Sopenharmony_ci} 305162306a36Sopenharmony_ci 305262306a36Sopenharmony_cistatic int phy_dp_clks_register(struct qmp_combo *qmp, struct device_node *np) 305362306a36Sopenharmony_ci{ 305462306a36Sopenharmony_ci struct clk_init_data init = { }; 305562306a36Sopenharmony_ci char name[64]; 305662306a36Sopenharmony_ci int ret; 305762306a36Sopenharmony_ci 305862306a36Sopenharmony_ci snprintf(name, sizeof(name), "%s::link_clk", dev_name(qmp->dev)); 305962306a36Sopenharmony_ci init.ops = &qmp_dp_link_clk_ops; 306062306a36Sopenharmony_ci init.name = name; 306162306a36Sopenharmony_ci qmp->dp_link_hw.init = &init; 306262306a36Sopenharmony_ci ret = devm_clk_hw_register(qmp->dev, &qmp->dp_link_hw); 306362306a36Sopenharmony_ci if (ret) 306462306a36Sopenharmony_ci return ret; 306562306a36Sopenharmony_ci 306662306a36Sopenharmony_ci snprintf(name, sizeof(name), "%s::vco_div_clk", dev_name(qmp->dev)); 306762306a36Sopenharmony_ci init.ops = &qmp_dp_pixel_clk_ops; 306862306a36Sopenharmony_ci init.name = name; 306962306a36Sopenharmony_ci qmp->dp_pixel_hw.init = &init; 307062306a36Sopenharmony_ci ret = devm_clk_hw_register(qmp->dev, &qmp->dp_pixel_hw); 307162306a36Sopenharmony_ci if (ret) 307262306a36Sopenharmony_ci return ret; 307362306a36Sopenharmony_ci 307462306a36Sopenharmony_ci return 0; 307562306a36Sopenharmony_ci} 307662306a36Sopenharmony_ci 307762306a36Sopenharmony_cistatic struct clk_hw *qmp_combo_clk_hw_get(struct of_phandle_args *clkspec, void *data) 307862306a36Sopenharmony_ci{ 307962306a36Sopenharmony_ci struct qmp_combo *qmp = data; 308062306a36Sopenharmony_ci 308162306a36Sopenharmony_ci switch (clkspec->args[0]) { 308262306a36Sopenharmony_ci case QMP_USB43DP_USB3_PIPE_CLK: 308362306a36Sopenharmony_ci return &qmp->pipe_clk_fixed.hw; 308462306a36Sopenharmony_ci case QMP_USB43DP_DP_LINK_CLK: 308562306a36Sopenharmony_ci return &qmp->dp_link_hw; 308662306a36Sopenharmony_ci case QMP_USB43DP_DP_VCO_DIV_CLK: 308762306a36Sopenharmony_ci return &qmp->dp_pixel_hw; 308862306a36Sopenharmony_ci } 308962306a36Sopenharmony_ci 309062306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 309162306a36Sopenharmony_ci} 309262306a36Sopenharmony_ci 309362306a36Sopenharmony_cistatic int qmp_combo_register_clocks(struct qmp_combo *qmp, struct device_node *usb_np, 309462306a36Sopenharmony_ci struct device_node *dp_np) 309562306a36Sopenharmony_ci{ 309662306a36Sopenharmony_ci int ret; 309762306a36Sopenharmony_ci 309862306a36Sopenharmony_ci ret = phy_pipe_clk_register(qmp, usb_np); 309962306a36Sopenharmony_ci if (ret) 310062306a36Sopenharmony_ci return ret; 310162306a36Sopenharmony_ci 310262306a36Sopenharmony_ci ret = phy_dp_clks_register(qmp, dp_np); 310362306a36Sopenharmony_ci if (ret) 310462306a36Sopenharmony_ci return ret; 310562306a36Sopenharmony_ci 310662306a36Sopenharmony_ci /* 310762306a36Sopenharmony_ci * Register a single provider for bindings without child nodes. 310862306a36Sopenharmony_ci */ 310962306a36Sopenharmony_ci if (usb_np == qmp->dev->of_node) 311062306a36Sopenharmony_ci return devm_of_clk_add_hw_provider(qmp->dev, qmp_combo_clk_hw_get, qmp); 311162306a36Sopenharmony_ci 311262306a36Sopenharmony_ci /* 311362306a36Sopenharmony_ci * Register multiple providers for legacy bindings with child nodes. 311462306a36Sopenharmony_ci */ 311562306a36Sopenharmony_ci ret = of_clk_add_hw_provider(usb_np, of_clk_hw_simple_get, 311662306a36Sopenharmony_ci &qmp->pipe_clk_fixed.hw); 311762306a36Sopenharmony_ci if (ret) 311862306a36Sopenharmony_ci return ret; 311962306a36Sopenharmony_ci 312062306a36Sopenharmony_ci /* 312162306a36Sopenharmony_ci * Roll a devm action because the clock provider is the child node, but 312262306a36Sopenharmony_ci * the child node is not actually a device. 312362306a36Sopenharmony_ci */ 312462306a36Sopenharmony_ci ret = devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, usb_np); 312562306a36Sopenharmony_ci if (ret) 312662306a36Sopenharmony_ci return ret; 312762306a36Sopenharmony_ci 312862306a36Sopenharmony_ci ret = of_clk_add_hw_provider(dp_np, qmp_dp_clks_hw_get, qmp); 312962306a36Sopenharmony_ci if (ret) 313062306a36Sopenharmony_ci return ret; 313162306a36Sopenharmony_ci 313262306a36Sopenharmony_ci return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, dp_np); 313362306a36Sopenharmony_ci} 313462306a36Sopenharmony_ci 313562306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_TYPEC) 313662306a36Sopenharmony_cistatic int qmp_combo_typec_switch_set(struct typec_switch_dev *sw, 313762306a36Sopenharmony_ci enum typec_orientation orientation) 313862306a36Sopenharmony_ci{ 313962306a36Sopenharmony_ci struct qmp_combo *qmp = typec_switch_get_drvdata(sw); 314062306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 314162306a36Sopenharmony_ci 314262306a36Sopenharmony_ci if (orientation == qmp->orientation || orientation == TYPEC_ORIENTATION_NONE) 314362306a36Sopenharmony_ci return 0; 314462306a36Sopenharmony_ci 314562306a36Sopenharmony_ci mutex_lock(&qmp->phy_mutex); 314662306a36Sopenharmony_ci qmp->orientation = orientation; 314762306a36Sopenharmony_ci 314862306a36Sopenharmony_ci if (qmp->init_count) { 314962306a36Sopenharmony_ci if (qmp->usb_init_count) 315062306a36Sopenharmony_ci qmp_combo_usb_power_off(qmp->usb_phy); 315162306a36Sopenharmony_ci qmp_combo_com_exit(qmp, true); 315262306a36Sopenharmony_ci 315362306a36Sopenharmony_ci qmp_combo_com_init(qmp, true); 315462306a36Sopenharmony_ci if (qmp->usb_init_count) 315562306a36Sopenharmony_ci qmp_combo_usb_power_on(qmp->usb_phy); 315662306a36Sopenharmony_ci if (qmp->dp_init_count) 315762306a36Sopenharmony_ci cfg->dp_aux_init(qmp); 315862306a36Sopenharmony_ci } 315962306a36Sopenharmony_ci mutex_unlock(&qmp->phy_mutex); 316062306a36Sopenharmony_ci 316162306a36Sopenharmony_ci return 0; 316262306a36Sopenharmony_ci} 316362306a36Sopenharmony_ci 316462306a36Sopenharmony_cistatic void qmp_combo_typec_unregister(void *data) 316562306a36Sopenharmony_ci{ 316662306a36Sopenharmony_ci struct qmp_combo *qmp = data; 316762306a36Sopenharmony_ci 316862306a36Sopenharmony_ci typec_switch_unregister(qmp->sw); 316962306a36Sopenharmony_ci} 317062306a36Sopenharmony_ci 317162306a36Sopenharmony_cistatic int qmp_combo_typec_switch_register(struct qmp_combo *qmp) 317262306a36Sopenharmony_ci{ 317362306a36Sopenharmony_ci struct typec_switch_desc sw_desc = {}; 317462306a36Sopenharmony_ci struct device *dev = qmp->dev; 317562306a36Sopenharmony_ci 317662306a36Sopenharmony_ci sw_desc.drvdata = qmp; 317762306a36Sopenharmony_ci sw_desc.fwnode = dev->fwnode; 317862306a36Sopenharmony_ci sw_desc.set = qmp_combo_typec_switch_set; 317962306a36Sopenharmony_ci qmp->sw = typec_switch_register(dev, &sw_desc); 318062306a36Sopenharmony_ci if (IS_ERR(qmp->sw)) { 318162306a36Sopenharmony_ci dev_err(dev, "Unable to register typec switch: %pe\n", qmp->sw); 318262306a36Sopenharmony_ci return PTR_ERR(qmp->sw); 318362306a36Sopenharmony_ci } 318462306a36Sopenharmony_ci 318562306a36Sopenharmony_ci return devm_add_action_or_reset(dev, qmp_combo_typec_unregister, qmp); 318662306a36Sopenharmony_ci} 318762306a36Sopenharmony_ci#else 318862306a36Sopenharmony_cistatic int qmp_combo_typec_switch_register(struct qmp_combo *qmp) 318962306a36Sopenharmony_ci{ 319062306a36Sopenharmony_ci return 0; 319162306a36Sopenharmony_ci} 319262306a36Sopenharmony_ci#endif 319362306a36Sopenharmony_ci 319462306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_DRM) 319562306a36Sopenharmony_cistatic int qmp_combo_bridge_attach(struct drm_bridge *bridge, 319662306a36Sopenharmony_ci enum drm_bridge_attach_flags flags) 319762306a36Sopenharmony_ci{ 319862306a36Sopenharmony_ci struct qmp_combo *qmp = container_of(bridge, struct qmp_combo, bridge); 319962306a36Sopenharmony_ci struct drm_bridge *next_bridge; 320062306a36Sopenharmony_ci 320162306a36Sopenharmony_ci if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) 320262306a36Sopenharmony_ci return -EINVAL; 320362306a36Sopenharmony_ci 320462306a36Sopenharmony_ci next_bridge = devm_drm_of_get_bridge(qmp->dev, qmp->dev->of_node, 0, 0); 320562306a36Sopenharmony_ci if (IS_ERR(next_bridge)) { 320662306a36Sopenharmony_ci dev_err(qmp->dev, "failed to acquire drm_bridge: %pe\n", next_bridge); 320762306a36Sopenharmony_ci return PTR_ERR(next_bridge); 320862306a36Sopenharmony_ci } 320962306a36Sopenharmony_ci 321062306a36Sopenharmony_ci return drm_bridge_attach(bridge->encoder, next_bridge, bridge, 321162306a36Sopenharmony_ci DRM_BRIDGE_ATTACH_NO_CONNECTOR); 321262306a36Sopenharmony_ci} 321362306a36Sopenharmony_ci 321462306a36Sopenharmony_cistatic const struct drm_bridge_funcs qmp_combo_bridge_funcs = { 321562306a36Sopenharmony_ci .attach = qmp_combo_bridge_attach, 321662306a36Sopenharmony_ci}; 321762306a36Sopenharmony_ci 321862306a36Sopenharmony_cistatic int qmp_combo_dp_register_bridge(struct qmp_combo *qmp) 321962306a36Sopenharmony_ci{ 322062306a36Sopenharmony_ci qmp->bridge.funcs = &qmp_combo_bridge_funcs; 322162306a36Sopenharmony_ci qmp->bridge.of_node = qmp->dev->of_node; 322262306a36Sopenharmony_ci 322362306a36Sopenharmony_ci return devm_drm_bridge_add(qmp->dev, &qmp->bridge); 322462306a36Sopenharmony_ci} 322562306a36Sopenharmony_ci#else 322662306a36Sopenharmony_cistatic int qmp_combo_dp_register_bridge(struct qmp_combo *qmp) 322762306a36Sopenharmony_ci{ 322862306a36Sopenharmony_ci return 0; 322962306a36Sopenharmony_ci} 323062306a36Sopenharmony_ci#endif 323162306a36Sopenharmony_ci 323262306a36Sopenharmony_cistatic int qmp_combo_parse_dt_lecacy_dp(struct qmp_combo *qmp, struct device_node *np) 323362306a36Sopenharmony_ci{ 323462306a36Sopenharmony_ci struct device *dev = qmp->dev; 323562306a36Sopenharmony_ci 323662306a36Sopenharmony_ci /* 323762306a36Sopenharmony_ci * Get memory resources from the DP child node: 323862306a36Sopenharmony_ci * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2; 323962306a36Sopenharmony_ci * tx2 -> 3; rx2 -> 4 324062306a36Sopenharmony_ci * 324162306a36Sopenharmony_ci * Note that only tx/tx2 and pcs (dp_phy) are used by the DP 324262306a36Sopenharmony_ci * implementation. 324362306a36Sopenharmony_ci */ 324462306a36Sopenharmony_ci qmp->dp_tx = devm_of_iomap(dev, np, 0, NULL); 324562306a36Sopenharmony_ci if (IS_ERR(qmp->dp_tx)) 324662306a36Sopenharmony_ci return PTR_ERR(qmp->dp_tx); 324762306a36Sopenharmony_ci 324862306a36Sopenharmony_ci qmp->dp_dp_phy = devm_of_iomap(dev, np, 2, NULL); 324962306a36Sopenharmony_ci if (IS_ERR(qmp->dp_dp_phy)) 325062306a36Sopenharmony_ci return PTR_ERR(qmp->dp_dp_phy); 325162306a36Sopenharmony_ci 325262306a36Sopenharmony_ci qmp->dp_tx2 = devm_of_iomap(dev, np, 3, NULL); 325362306a36Sopenharmony_ci if (IS_ERR(qmp->dp_tx2)) 325462306a36Sopenharmony_ci return PTR_ERR(qmp->dp_tx2); 325562306a36Sopenharmony_ci 325662306a36Sopenharmony_ci return 0; 325762306a36Sopenharmony_ci} 325862306a36Sopenharmony_ci 325962306a36Sopenharmony_cistatic int qmp_combo_parse_dt_lecacy_usb(struct qmp_combo *qmp, struct device_node *np) 326062306a36Sopenharmony_ci{ 326162306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 326262306a36Sopenharmony_ci struct device *dev = qmp->dev; 326362306a36Sopenharmony_ci 326462306a36Sopenharmony_ci /* 326562306a36Sopenharmony_ci * Get memory resources from the USB child node: 326662306a36Sopenharmony_ci * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2; 326762306a36Sopenharmony_ci * tx2 -> 3; rx2 -> 4; pcs_misc (optional) -> 5 326862306a36Sopenharmony_ci */ 326962306a36Sopenharmony_ci qmp->tx = devm_of_iomap(dev, np, 0, NULL); 327062306a36Sopenharmony_ci if (IS_ERR(qmp->tx)) 327162306a36Sopenharmony_ci return PTR_ERR(qmp->tx); 327262306a36Sopenharmony_ci 327362306a36Sopenharmony_ci qmp->rx = devm_of_iomap(dev, np, 1, NULL); 327462306a36Sopenharmony_ci if (IS_ERR(qmp->rx)) 327562306a36Sopenharmony_ci return PTR_ERR(qmp->rx); 327662306a36Sopenharmony_ci 327762306a36Sopenharmony_ci qmp->pcs = devm_of_iomap(dev, np, 2, NULL); 327862306a36Sopenharmony_ci if (IS_ERR(qmp->pcs)) 327962306a36Sopenharmony_ci return PTR_ERR(qmp->pcs); 328062306a36Sopenharmony_ci 328162306a36Sopenharmony_ci if (cfg->pcs_usb_offset) 328262306a36Sopenharmony_ci qmp->pcs_usb = qmp->pcs + cfg->pcs_usb_offset; 328362306a36Sopenharmony_ci 328462306a36Sopenharmony_ci qmp->tx2 = devm_of_iomap(dev, np, 3, NULL); 328562306a36Sopenharmony_ci if (IS_ERR(qmp->tx2)) 328662306a36Sopenharmony_ci return PTR_ERR(qmp->tx2); 328762306a36Sopenharmony_ci 328862306a36Sopenharmony_ci qmp->rx2 = devm_of_iomap(dev, np, 4, NULL); 328962306a36Sopenharmony_ci if (IS_ERR(qmp->rx2)) 329062306a36Sopenharmony_ci return PTR_ERR(qmp->rx2); 329162306a36Sopenharmony_ci 329262306a36Sopenharmony_ci qmp->pcs_misc = devm_of_iomap(dev, np, 5, NULL); 329362306a36Sopenharmony_ci if (IS_ERR(qmp->pcs_misc)) { 329462306a36Sopenharmony_ci dev_vdbg(dev, "PHY pcs_misc-reg not used\n"); 329562306a36Sopenharmony_ci qmp->pcs_misc = NULL; 329662306a36Sopenharmony_ci } 329762306a36Sopenharmony_ci 329862306a36Sopenharmony_ci qmp->pipe_clk = devm_get_clk_from_child(dev, np, NULL); 329962306a36Sopenharmony_ci if (IS_ERR(qmp->pipe_clk)) { 330062306a36Sopenharmony_ci return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk), 330162306a36Sopenharmony_ci "failed to get pipe clock\n"); 330262306a36Sopenharmony_ci } 330362306a36Sopenharmony_ci 330462306a36Sopenharmony_ci return 0; 330562306a36Sopenharmony_ci} 330662306a36Sopenharmony_ci 330762306a36Sopenharmony_cistatic int qmp_combo_parse_dt_legacy(struct qmp_combo *qmp, struct device_node *usb_np, 330862306a36Sopenharmony_ci struct device_node *dp_np) 330962306a36Sopenharmony_ci{ 331062306a36Sopenharmony_ci struct platform_device *pdev = to_platform_device(qmp->dev); 331162306a36Sopenharmony_ci int ret; 331262306a36Sopenharmony_ci 331362306a36Sopenharmony_ci qmp->serdes = devm_platform_ioremap_resource(pdev, 0); 331462306a36Sopenharmony_ci if (IS_ERR(qmp->serdes)) 331562306a36Sopenharmony_ci return PTR_ERR(qmp->serdes); 331662306a36Sopenharmony_ci 331762306a36Sopenharmony_ci qmp->com = devm_platform_ioremap_resource(pdev, 1); 331862306a36Sopenharmony_ci if (IS_ERR(qmp->com)) 331962306a36Sopenharmony_ci return PTR_ERR(qmp->com); 332062306a36Sopenharmony_ci 332162306a36Sopenharmony_ci qmp->dp_serdes = devm_platform_ioremap_resource(pdev, 2); 332262306a36Sopenharmony_ci if (IS_ERR(qmp->dp_serdes)) 332362306a36Sopenharmony_ci return PTR_ERR(qmp->dp_serdes); 332462306a36Sopenharmony_ci 332562306a36Sopenharmony_ci ret = qmp_combo_parse_dt_lecacy_usb(qmp, usb_np); 332662306a36Sopenharmony_ci if (ret) 332762306a36Sopenharmony_ci return ret; 332862306a36Sopenharmony_ci 332962306a36Sopenharmony_ci ret = qmp_combo_parse_dt_lecacy_dp(qmp, dp_np); 333062306a36Sopenharmony_ci if (ret) 333162306a36Sopenharmony_ci return ret; 333262306a36Sopenharmony_ci 333362306a36Sopenharmony_ci ret = devm_clk_bulk_get_all(qmp->dev, &qmp->clks); 333462306a36Sopenharmony_ci if (ret < 0) 333562306a36Sopenharmony_ci return ret; 333662306a36Sopenharmony_ci 333762306a36Sopenharmony_ci qmp->num_clks = ret; 333862306a36Sopenharmony_ci 333962306a36Sopenharmony_ci return 0; 334062306a36Sopenharmony_ci} 334162306a36Sopenharmony_ci 334262306a36Sopenharmony_cistatic int qmp_combo_parse_dt(struct qmp_combo *qmp) 334362306a36Sopenharmony_ci{ 334462306a36Sopenharmony_ci struct platform_device *pdev = to_platform_device(qmp->dev); 334562306a36Sopenharmony_ci const struct qmp_phy_cfg *cfg = qmp->cfg; 334662306a36Sopenharmony_ci const struct qmp_combo_offsets *offs = cfg->offsets; 334762306a36Sopenharmony_ci struct device *dev = qmp->dev; 334862306a36Sopenharmony_ci void __iomem *base; 334962306a36Sopenharmony_ci int ret; 335062306a36Sopenharmony_ci 335162306a36Sopenharmony_ci if (!offs) 335262306a36Sopenharmony_ci return -EINVAL; 335362306a36Sopenharmony_ci 335462306a36Sopenharmony_ci base = devm_platform_ioremap_resource(pdev, 0); 335562306a36Sopenharmony_ci if (IS_ERR(base)) 335662306a36Sopenharmony_ci return PTR_ERR(base); 335762306a36Sopenharmony_ci 335862306a36Sopenharmony_ci qmp->com = base + offs->com; 335962306a36Sopenharmony_ci qmp->tx = base + offs->txa; 336062306a36Sopenharmony_ci qmp->rx = base + offs->rxa; 336162306a36Sopenharmony_ci qmp->tx2 = base + offs->txb; 336262306a36Sopenharmony_ci qmp->rx2 = base + offs->rxb; 336362306a36Sopenharmony_ci 336462306a36Sopenharmony_ci qmp->serdes = base + offs->usb3_serdes; 336562306a36Sopenharmony_ci qmp->pcs_misc = base + offs->usb3_pcs_misc; 336662306a36Sopenharmony_ci qmp->pcs = base + offs->usb3_pcs; 336762306a36Sopenharmony_ci qmp->pcs_usb = base + offs->usb3_pcs_usb; 336862306a36Sopenharmony_ci 336962306a36Sopenharmony_ci qmp->dp_serdes = base + offs->dp_serdes; 337062306a36Sopenharmony_ci if (offs->dp_txa) { 337162306a36Sopenharmony_ci qmp->dp_tx = base + offs->dp_txa; 337262306a36Sopenharmony_ci qmp->dp_tx2 = base + offs->dp_txb; 337362306a36Sopenharmony_ci } else { 337462306a36Sopenharmony_ci qmp->dp_tx = base + offs->txa; 337562306a36Sopenharmony_ci qmp->dp_tx2 = base + offs->txb; 337662306a36Sopenharmony_ci } 337762306a36Sopenharmony_ci qmp->dp_dp_phy = base + offs->dp_dp_phy; 337862306a36Sopenharmony_ci 337962306a36Sopenharmony_ci ret = qmp_combo_clk_init(qmp); 338062306a36Sopenharmony_ci if (ret) 338162306a36Sopenharmony_ci return ret; 338262306a36Sopenharmony_ci 338362306a36Sopenharmony_ci qmp->pipe_clk = devm_clk_get(dev, "usb3_pipe"); 338462306a36Sopenharmony_ci if (IS_ERR(qmp->pipe_clk)) { 338562306a36Sopenharmony_ci return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk), 338662306a36Sopenharmony_ci "failed to get usb3_pipe clock\n"); 338762306a36Sopenharmony_ci } 338862306a36Sopenharmony_ci 338962306a36Sopenharmony_ci return 0; 339062306a36Sopenharmony_ci} 339162306a36Sopenharmony_ci 339262306a36Sopenharmony_cistatic struct phy *qmp_combo_phy_xlate(struct device *dev, struct of_phandle_args *args) 339362306a36Sopenharmony_ci{ 339462306a36Sopenharmony_ci struct qmp_combo *qmp = dev_get_drvdata(dev); 339562306a36Sopenharmony_ci 339662306a36Sopenharmony_ci if (args->args_count == 0) 339762306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 339862306a36Sopenharmony_ci 339962306a36Sopenharmony_ci switch (args->args[0]) { 340062306a36Sopenharmony_ci case QMP_USB43DP_USB3_PHY: 340162306a36Sopenharmony_ci return qmp->usb_phy; 340262306a36Sopenharmony_ci case QMP_USB43DP_DP_PHY: 340362306a36Sopenharmony_ci return qmp->dp_phy; 340462306a36Sopenharmony_ci } 340562306a36Sopenharmony_ci 340662306a36Sopenharmony_ci return ERR_PTR(-EINVAL); 340762306a36Sopenharmony_ci} 340862306a36Sopenharmony_ci 340962306a36Sopenharmony_cistatic int qmp_combo_probe(struct platform_device *pdev) 341062306a36Sopenharmony_ci{ 341162306a36Sopenharmony_ci struct qmp_combo *qmp; 341262306a36Sopenharmony_ci struct device *dev = &pdev->dev; 341362306a36Sopenharmony_ci struct device_node *dp_np, *usb_np; 341462306a36Sopenharmony_ci struct phy_provider *phy_provider; 341562306a36Sopenharmony_ci int ret; 341662306a36Sopenharmony_ci 341762306a36Sopenharmony_ci qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL); 341862306a36Sopenharmony_ci if (!qmp) 341962306a36Sopenharmony_ci return -ENOMEM; 342062306a36Sopenharmony_ci 342162306a36Sopenharmony_ci qmp->dev = dev; 342262306a36Sopenharmony_ci 342362306a36Sopenharmony_ci qmp->orientation = TYPEC_ORIENTATION_NORMAL; 342462306a36Sopenharmony_ci 342562306a36Sopenharmony_ci qmp->cfg = of_device_get_match_data(dev); 342662306a36Sopenharmony_ci if (!qmp->cfg) 342762306a36Sopenharmony_ci return -EINVAL; 342862306a36Sopenharmony_ci 342962306a36Sopenharmony_ci mutex_init(&qmp->phy_mutex); 343062306a36Sopenharmony_ci 343162306a36Sopenharmony_ci ret = qmp_combo_reset_init(qmp); 343262306a36Sopenharmony_ci if (ret) 343362306a36Sopenharmony_ci return ret; 343462306a36Sopenharmony_ci 343562306a36Sopenharmony_ci ret = qmp_combo_vreg_init(qmp); 343662306a36Sopenharmony_ci if (ret) 343762306a36Sopenharmony_ci return ret; 343862306a36Sopenharmony_ci 343962306a36Sopenharmony_ci ret = qmp_combo_typec_switch_register(qmp); 344062306a36Sopenharmony_ci if (ret) 344162306a36Sopenharmony_ci return ret; 344262306a36Sopenharmony_ci 344362306a36Sopenharmony_ci ret = qmp_combo_dp_register_bridge(qmp); 344462306a36Sopenharmony_ci if (ret) 344562306a36Sopenharmony_ci return ret; 344662306a36Sopenharmony_ci 344762306a36Sopenharmony_ci /* Check for legacy binding with child nodes. */ 344862306a36Sopenharmony_ci usb_np = of_get_child_by_name(dev->of_node, "usb3-phy"); 344962306a36Sopenharmony_ci if (usb_np) { 345062306a36Sopenharmony_ci dp_np = of_get_child_by_name(dev->of_node, "dp-phy"); 345162306a36Sopenharmony_ci if (!dp_np) { 345262306a36Sopenharmony_ci of_node_put(usb_np); 345362306a36Sopenharmony_ci return -EINVAL; 345462306a36Sopenharmony_ci } 345562306a36Sopenharmony_ci 345662306a36Sopenharmony_ci ret = qmp_combo_parse_dt_legacy(qmp, usb_np, dp_np); 345762306a36Sopenharmony_ci } else { 345862306a36Sopenharmony_ci usb_np = of_node_get(dev->of_node); 345962306a36Sopenharmony_ci dp_np = of_node_get(dev->of_node); 346062306a36Sopenharmony_ci 346162306a36Sopenharmony_ci ret = qmp_combo_parse_dt(qmp); 346262306a36Sopenharmony_ci } 346362306a36Sopenharmony_ci if (ret) 346462306a36Sopenharmony_ci goto err_node_put; 346562306a36Sopenharmony_ci 346662306a36Sopenharmony_ci pm_runtime_set_active(dev); 346762306a36Sopenharmony_ci ret = devm_pm_runtime_enable(dev); 346862306a36Sopenharmony_ci if (ret) 346962306a36Sopenharmony_ci goto err_node_put; 347062306a36Sopenharmony_ci /* 347162306a36Sopenharmony_ci * Prevent runtime pm from being ON by default. Users can enable 347262306a36Sopenharmony_ci * it using power/control in sysfs. 347362306a36Sopenharmony_ci */ 347462306a36Sopenharmony_ci pm_runtime_forbid(dev); 347562306a36Sopenharmony_ci 347662306a36Sopenharmony_ci ret = qmp_combo_register_clocks(qmp, usb_np, dp_np); 347762306a36Sopenharmony_ci if (ret) 347862306a36Sopenharmony_ci goto err_node_put; 347962306a36Sopenharmony_ci 348062306a36Sopenharmony_ci qmp->usb_phy = devm_phy_create(dev, usb_np, &qmp_combo_usb_phy_ops); 348162306a36Sopenharmony_ci if (IS_ERR(qmp->usb_phy)) { 348262306a36Sopenharmony_ci ret = PTR_ERR(qmp->usb_phy); 348362306a36Sopenharmony_ci dev_err(dev, "failed to create USB PHY: %d\n", ret); 348462306a36Sopenharmony_ci goto err_node_put; 348562306a36Sopenharmony_ci } 348662306a36Sopenharmony_ci 348762306a36Sopenharmony_ci phy_set_drvdata(qmp->usb_phy, qmp); 348862306a36Sopenharmony_ci 348962306a36Sopenharmony_ci qmp->dp_phy = devm_phy_create(dev, dp_np, &qmp_combo_dp_phy_ops); 349062306a36Sopenharmony_ci if (IS_ERR(qmp->dp_phy)) { 349162306a36Sopenharmony_ci ret = PTR_ERR(qmp->dp_phy); 349262306a36Sopenharmony_ci dev_err(dev, "failed to create DP PHY: %d\n", ret); 349362306a36Sopenharmony_ci goto err_node_put; 349462306a36Sopenharmony_ci } 349562306a36Sopenharmony_ci 349662306a36Sopenharmony_ci phy_set_drvdata(qmp->dp_phy, qmp); 349762306a36Sopenharmony_ci 349862306a36Sopenharmony_ci dev_set_drvdata(dev, qmp); 349962306a36Sopenharmony_ci 350062306a36Sopenharmony_ci if (usb_np == dev->of_node) 350162306a36Sopenharmony_ci phy_provider = devm_of_phy_provider_register(dev, qmp_combo_phy_xlate); 350262306a36Sopenharmony_ci else 350362306a36Sopenharmony_ci phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 350462306a36Sopenharmony_ci 350562306a36Sopenharmony_ci of_node_put(usb_np); 350662306a36Sopenharmony_ci of_node_put(dp_np); 350762306a36Sopenharmony_ci 350862306a36Sopenharmony_ci return PTR_ERR_OR_ZERO(phy_provider); 350962306a36Sopenharmony_ci 351062306a36Sopenharmony_cierr_node_put: 351162306a36Sopenharmony_ci of_node_put(usb_np); 351262306a36Sopenharmony_ci of_node_put(dp_np); 351362306a36Sopenharmony_ci return ret; 351462306a36Sopenharmony_ci} 351562306a36Sopenharmony_ci 351662306a36Sopenharmony_cistatic const struct of_device_id qmp_combo_of_match_table[] = { 351762306a36Sopenharmony_ci { 351862306a36Sopenharmony_ci .compatible = "qcom,sc7180-qmp-usb3-dp-phy", 351962306a36Sopenharmony_ci .data = &sc7180_usb3dpphy_cfg, 352062306a36Sopenharmony_ci }, 352162306a36Sopenharmony_ci { 352262306a36Sopenharmony_ci .compatible = "qcom,sc7280-qmp-usb3-dp-phy", 352362306a36Sopenharmony_ci .data = &sm8250_usb3dpphy_cfg, 352462306a36Sopenharmony_ci }, 352562306a36Sopenharmony_ci { 352662306a36Sopenharmony_ci .compatible = "qcom,sc8180x-qmp-usb3-dp-phy", 352762306a36Sopenharmony_ci .data = &sc8180x_usb3dpphy_cfg, 352862306a36Sopenharmony_ci }, 352962306a36Sopenharmony_ci { 353062306a36Sopenharmony_ci .compatible = "qcom,sc8280xp-qmp-usb43dp-phy", 353162306a36Sopenharmony_ci .data = &sc8280xp_usb43dpphy_cfg, 353262306a36Sopenharmony_ci }, 353362306a36Sopenharmony_ci { 353462306a36Sopenharmony_ci .compatible = "qcom,sdm845-qmp-usb3-dp-phy", 353562306a36Sopenharmony_ci .data = &sdm845_usb3dpphy_cfg, 353662306a36Sopenharmony_ci }, 353762306a36Sopenharmony_ci { 353862306a36Sopenharmony_ci .compatible = "qcom,sm6350-qmp-usb3-dp-phy", 353962306a36Sopenharmony_ci .data = &sm6350_usb3dpphy_cfg, 354062306a36Sopenharmony_ci }, 354162306a36Sopenharmony_ci { 354262306a36Sopenharmony_ci .compatible = "qcom,sm8150-qmp-usb3-dp-phy", 354362306a36Sopenharmony_ci .data = &sc8180x_usb3dpphy_cfg, 354462306a36Sopenharmony_ci }, 354562306a36Sopenharmony_ci { 354662306a36Sopenharmony_ci .compatible = "qcom,sm8250-qmp-usb3-dp-phy", 354762306a36Sopenharmony_ci .data = &sm8250_usb3dpphy_cfg, 354862306a36Sopenharmony_ci }, 354962306a36Sopenharmony_ci { 355062306a36Sopenharmony_ci .compatible = "qcom,sm8350-qmp-usb3-dp-phy", 355162306a36Sopenharmony_ci .data = &sm8350_usb3dpphy_cfg, 355262306a36Sopenharmony_ci }, 355362306a36Sopenharmony_ci { 355462306a36Sopenharmony_ci .compatible = "qcom,sm8450-qmp-usb3-dp-phy", 355562306a36Sopenharmony_ci .data = &sm8350_usb3dpphy_cfg, 355662306a36Sopenharmony_ci }, 355762306a36Sopenharmony_ci { 355862306a36Sopenharmony_ci .compatible = "qcom,sm8550-qmp-usb3-dp-phy", 355962306a36Sopenharmony_ci .data = &sm8550_usb3dpphy_cfg, 356062306a36Sopenharmony_ci }, 356162306a36Sopenharmony_ci { } 356262306a36Sopenharmony_ci}; 356362306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, qmp_combo_of_match_table); 356462306a36Sopenharmony_ci 356562306a36Sopenharmony_cistatic struct platform_driver qmp_combo_driver = { 356662306a36Sopenharmony_ci .probe = qmp_combo_probe, 356762306a36Sopenharmony_ci .driver = { 356862306a36Sopenharmony_ci .name = "qcom-qmp-combo-phy", 356962306a36Sopenharmony_ci .pm = &qmp_combo_pm_ops, 357062306a36Sopenharmony_ci .of_match_table = qmp_combo_of_match_table, 357162306a36Sopenharmony_ci }, 357262306a36Sopenharmony_ci}; 357362306a36Sopenharmony_ci 357462306a36Sopenharmony_cimodule_platform_driver(qmp_combo_driver); 357562306a36Sopenharmony_ci 357662306a36Sopenharmony_ciMODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>"); 357762306a36Sopenharmony_ciMODULE_DESCRIPTION("Qualcomm QMP USB+DP combo PHY driver"); 357862306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3579