linux/drivers/phy/qualcomm/phy-qcom-qmp.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
   4 */
   5
   6#include <linux/clk.h>
   7#include <linux/clk-provider.h>
   8#include <linux/delay.h>
   9#include <linux/err.h>
  10#include <linux/io.h>
  11#include <linux/iopoll.h>
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/of.h>
  15#include <linux/of_device.h>
  16#include <linux/of_address.h>
  17#include <linux/phy/phy.h>
  18#include <linux/platform_device.h>
  19#include <linux/regulator/consumer.h>
  20#include <linux/reset.h>
  21#include <linux/slab.h>
  22
  23#include <dt-bindings/phy/phy.h>
  24
  25#include "phy-qcom-qmp.h"
  26
  27/* QPHY_SW_RESET bit */
  28#define SW_RESET                                BIT(0)
  29/* QPHY_POWER_DOWN_CONTROL */
  30#define SW_PWRDN                                BIT(0)
  31#define REFCLK_DRV_DSBL                         BIT(1)
  32/* QPHY_START_CONTROL bits */
  33#define SERDES_START                            BIT(0)
  34#define PCS_START                               BIT(1)
  35#define PLL_READY_GATE_EN                       BIT(3)
  36/* QPHY_PCS_STATUS bit */
  37#define PHYSTATUS                               BIT(6)
  38/* QPHY_PCS_READY_STATUS & QPHY_COM_PCS_READY_STATUS bit */
  39#define PCS_READY                               BIT(0)
  40
  41/* QPHY_V3_DP_COM_RESET_OVRD_CTRL register bits */
  42/* DP PHY soft reset */
  43#define SW_DPPHY_RESET                          BIT(0)
  44/* mux to select DP PHY reset control, 0:HW control, 1: software reset */
  45#define SW_DPPHY_RESET_MUX                      BIT(1)
  46/* USB3 PHY soft reset */
  47#define SW_USB3PHY_RESET                        BIT(2)
  48/* mux to select USB3 PHY reset control, 0:HW control, 1: software reset */
  49#define SW_USB3PHY_RESET_MUX                    BIT(3)
  50
  51/* QPHY_V3_DP_COM_PHY_MODE_CTRL register bits */
  52#define USB3_MODE                               BIT(0) /* enables USB3 mode */
  53#define DP_MODE                                 BIT(1) /* enables DP mode */
  54
  55/* QPHY_PCS_AUTONOMOUS_MODE_CTRL register bits */
  56#define ARCVR_DTCT_EN                           BIT(0)
  57#define ALFPS_DTCT_EN                           BIT(1)
  58#define ARCVR_DTCT_EVENT_SEL                    BIT(4)
  59
  60/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
  61#define IRQ_CLEAR                               BIT(0)
  62
  63/* QPHY_PCS_LFPS_RXTERM_IRQ_STATUS register bits */
  64#define RCVR_DETECT                             BIT(0)
  65
  66/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
  67#define CLAMP_EN                                BIT(0) /* enables i/o clamp_n */
  68
  69#define PHY_INIT_COMPLETE_TIMEOUT               10000
  70#define POWER_DOWN_DELAY_US_MIN                 10
  71#define POWER_DOWN_DELAY_US_MAX                 11
  72
  73#define MAX_PROP_NAME                           32
  74
  75/* Define the assumed distance between lanes for underspecified device trees. */
  76#define QMP_PHY_LEGACY_LANE_STRIDE              0x400
  77
  78struct qmp_phy_init_tbl {
  79        unsigned int offset;
  80        unsigned int val;
  81        /*
  82         * register part of layout ?
  83         * if yes, then offset gives index in the reg-layout
  84         */
  85        bool in_layout;
  86        /*
  87         * mask of lanes for which this register is written
  88         * for cases when second lane needs different values
  89         */
  90        u8 lane_mask;
  91};
  92
  93#define QMP_PHY_INIT_CFG(o, v)          \
  94        {                               \
  95                .offset = o,            \
  96                .val = v,               \
  97                .lane_mask = 0xff,      \
  98        }
  99
 100#define QMP_PHY_INIT_CFG_L(o, v)        \
 101        {                               \
 102                .offset = o,            \
 103                .val = v,               \
 104                .in_layout = true,      \
 105                .lane_mask = 0xff,      \
 106        }
 107
 108#define QMP_PHY_INIT_CFG_LANE(o, v, l)  \
 109        {                               \
 110                .offset = o,            \
 111                .val = v,               \
 112                .lane_mask = l,         \
 113        }
 114
 115/* set of registers with offsets different per-PHY */
 116enum qphy_reg_layout {
 117        /* Common block control registers */
 118        QPHY_COM_SW_RESET,
 119        QPHY_COM_POWER_DOWN_CONTROL,
 120        QPHY_COM_START_CONTROL,
 121        QPHY_COM_PCS_READY_STATUS,
 122        /* PCS registers */
 123        QPHY_PLL_LOCK_CHK_DLY_TIME,
 124        QPHY_FLL_CNTRL1,
 125        QPHY_FLL_CNTRL2,
 126        QPHY_FLL_CNT_VAL_L,
 127        QPHY_FLL_CNT_VAL_H_TOL,
 128        QPHY_FLL_MAN_CODE,
 129        QPHY_SW_RESET,
 130        QPHY_START_CTRL,
 131        QPHY_PCS_READY_STATUS,
 132        QPHY_PCS_STATUS,
 133        QPHY_PCS_AUTONOMOUS_MODE_CTRL,
 134        QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
 135        QPHY_PCS_LFPS_RXTERM_IRQ_STATUS,
 136        QPHY_PCS_POWER_DOWN_CONTROL,
 137        /* Keep last to ensure regs_layout arrays are properly initialized */
 138        QPHY_LAYOUT_SIZE
 139};
 140
 141static const unsigned int msm8996_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
 142        [QPHY_START_CTRL]               = 0x00,
 143        [QPHY_PCS_READY_STATUS]         = 0x168,
 144};
 145
 146static const unsigned int pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
 147        [QPHY_COM_SW_RESET]             = 0x400,
 148        [QPHY_COM_POWER_DOWN_CONTROL]   = 0x404,
 149        [QPHY_COM_START_CONTROL]        = 0x408,
 150        [QPHY_COM_PCS_READY_STATUS]     = 0x448,
 151        [QPHY_PLL_LOCK_CHK_DLY_TIME]    = 0xa8,
 152        [QPHY_FLL_CNTRL1]               = 0xc4,
 153        [QPHY_FLL_CNTRL2]               = 0xc8,
 154        [QPHY_FLL_CNT_VAL_L]            = 0xcc,
 155        [QPHY_FLL_CNT_VAL_H_TOL]        = 0xd0,
 156        [QPHY_FLL_MAN_CODE]             = 0xd4,
 157        [QPHY_SW_RESET]                 = 0x00,
 158        [QPHY_START_CTRL]               = 0x08,
 159        [QPHY_PCS_STATUS]               = 0x174,
 160};
 161
 162static const unsigned int usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
 163        [QPHY_FLL_CNTRL1]               = 0xc0,
 164        [QPHY_FLL_CNTRL2]               = 0xc4,
 165        [QPHY_FLL_CNT_VAL_L]            = 0xc8,
 166        [QPHY_FLL_CNT_VAL_H_TOL]        = 0xcc,
 167        [QPHY_FLL_MAN_CODE]             = 0xd0,
 168        [QPHY_SW_RESET]                 = 0x00,
 169        [QPHY_START_CTRL]               = 0x08,
 170        [QPHY_PCS_STATUS]               = 0x17c,
 171        [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d4,
 172        [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR]  = 0x0d8,
 173        [QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x178,
 174};
 175
 176static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
 177        [QPHY_SW_RESET]                 = 0x00,
 178        [QPHY_START_CTRL]               = 0x08,
 179        [QPHY_PCS_STATUS]               = 0x174,
 180        [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d8,
 181        [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR]  = 0x0dc,
 182        [QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x170,
 183};
 184
 185static const unsigned int sdm845_qmp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
 186        [QPHY_SW_RESET]                 = 0x00,
 187        [QPHY_START_CTRL]               = 0x08,
 188        [QPHY_PCS_STATUS]               = 0x174,
 189};
 190
 191static const unsigned int sdm845_qhp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
 192        [QPHY_SW_RESET]                 = 0x00,
 193        [QPHY_START_CTRL]               = 0x08,
 194        [QPHY_PCS_STATUS]               = 0x2ac,
 195};
 196
 197static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
 198        [QPHY_SW_RESET]                 = 0x00,
 199        [QPHY_START_CTRL]               = 0x44,
 200        [QPHY_PCS_STATUS]               = 0x14,
 201        [QPHY_PCS_POWER_DOWN_CONTROL]   = 0x40,
 202        [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x308,
 203        [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x314,
 204};
 205
 206static const unsigned int qmp_v4_usb3_uniphy_regs_layout[QPHY_LAYOUT_SIZE] = {
 207        [QPHY_SW_RESET]                 = 0x00,
 208        [QPHY_START_CTRL]               = 0x44,
 209        [QPHY_PCS_STATUS]               = 0x14,
 210        [QPHY_PCS_POWER_DOWN_CONTROL]   = 0x40,
 211        [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x608,
 212        [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR]  = 0x614,
 213};
 214
 215static const unsigned int sdm845_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
 216        [QPHY_START_CTRL]               = 0x00,
 217        [QPHY_PCS_READY_STATUS]         = 0x160,
 218};
 219
 220static const unsigned int sm8250_pcie_regs_layout[QPHY_LAYOUT_SIZE] = {
 221        [QPHY_SW_RESET]                 = 0x00,
 222        [QPHY_START_CTRL]               = 0x44,
 223        [QPHY_PCS_STATUS]               = 0x14,
 224        [QPHY_PCS_POWER_DOWN_CONTROL]   = 0x40,
 225};
 226
 227static const unsigned int sm8150_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
 228        [QPHY_START_CTRL]               = QPHY_V4_PCS_UFS_PHY_START,
 229        [QPHY_PCS_READY_STATUS]         = QPHY_V4_PCS_UFS_READY_STATUS,
 230        [QPHY_SW_RESET]                 = QPHY_V4_PCS_UFS_SW_RESET,
 231};
 232
 233static const struct qmp_phy_init_tbl ipq8074_usb3_serdes_tbl[] = {
 234        QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x1a),
 235        QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
 236        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
 237        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
 238        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
 239        QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
 240        QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
 241        QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
 242        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
 243        QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
 244        /* PLL and Loop filter settings */
 245        QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
 246        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
 247        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
 248        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
 249        QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
 250        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
 251        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
 252        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
 253        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x15),
 254        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x34),
 255        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
 256        QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
 257        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
 258        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
 259        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
 260        /* SSC settings */
 261        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
 262        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
 263        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
 264        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x00),
 265        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
 266        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0xde),
 267        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x07),
 268};
 269
 270static const struct qmp_phy_init_tbl ipq8074_usb3_rx_tbl[] = {
 271        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x06),
 272        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
 273        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4c),
 274        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xb8),
 275        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
 276        QMP_PHY_INIT_CFG(QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
 277        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x03),
 278        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
 279        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x0),
 280};
 281
 282static const struct qmp_phy_init_tbl ipq8074_usb3_pcs_tbl[] = {
 283        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
 284        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0e),
 285        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
 286        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
 287        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
 288        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
 289        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x85),
 290        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
 291        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
 292        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
 293        QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
 294        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
 295        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
 296        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
 297        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
 298        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
 299        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
 300        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
 301        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
 302        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
 303        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x88),
 304        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x17),
 305        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0f),
 306};
 307
 308static const struct qmp_phy_init_tbl msm8996_pcie_serdes_tbl[] = {
 309        QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x1c),
 310        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
 311        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
 312        QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
 313        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x42),
 314        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
 315        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
 316        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
 317        QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x01),
 318        QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
 319        QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
 320        QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
 321        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x09),
 322        QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
 323        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
 324        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
 325        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
 326        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
 327        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x1a),
 328        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x0a),
 329        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
 330        QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x02),
 331        QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1f),
 332        QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x04),
 333        QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
 334        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
 335        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
 336        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
 337        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
 338        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
 339        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
 340        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
 341        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x02),
 342        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
 343        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
 344        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
 345        QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x15),
 346        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
 347        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
 348        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
 349        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
 350        QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
 351        QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x40),
 352};
 353
 354static const struct qmp_phy_init_tbl msm8996_pcie_tx_tbl[] = {
 355        QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
 356        QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
 357};
 358
 359static const struct qmp_phy_init_tbl msm8996_pcie_rx_tbl[] = {
 360        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x1c),
 361        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x01),
 362        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x00),
 363        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
 364        QMP_PHY_INIT_CFG(QSERDES_RX_RX_BAND, 0x18),
 365        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x04),
 366        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN_HALF, 0x04),
 367        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
 368        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
 369        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x19),
 370};
 371
 372static const struct qmp_phy_init_tbl msm8996_pcie_pcs_tbl[] = {
 373        QMP_PHY_INIT_CFG(QPHY_RX_IDLE_DTCT_CNTRL, 0x4c),
 374        QMP_PHY_INIT_CFG(QPHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x00),
 375        QMP_PHY_INIT_CFG(QPHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
 376
 377        QMP_PHY_INIT_CFG_L(QPHY_PLL_LOCK_CHK_DLY_TIME, 0x05),
 378
 379        QMP_PHY_INIT_CFG(QPHY_ENDPOINT_REFCLK_DRIVE, 0x05),
 380        QMP_PHY_INIT_CFG(QPHY_POWER_DOWN_CONTROL, 0x02),
 381        QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG4, 0x00),
 382        QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG1, 0xa3),
 383        QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M3P5DB_V0, 0x0e),
 384};
 385
 386static const struct qmp_phy_init_tbl msm8998_pcie_serdes_tbl[] = {
 387        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
 388        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
 389        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x0f),
 390        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
 391        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
 392        QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
 393        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
 394        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
 395        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
 396        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER1, 0xff),
 397        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER2, 0x3f),
 398        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
 399        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
 400        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
 401        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_EP_DIV, 0x19),
 402        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x90),
 403        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
 404        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x03),
 405        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x55),
 406        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x55),
 407        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
 408        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0d),
 409        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x04),
 410        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
 411        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x08),
 412        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
 413        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x34),
 414        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
 415        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x33),
 416        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
 417        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x07),
 418        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x04),
 419        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
 420        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
 421        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x09),
 422        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
 423        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x40),
 424        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
 425        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x02),
 426        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
 427        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x7e),
 428        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x15),
 429};
 430
 431static const struct qmp_phy_init_tbl msm8998_pcie_tx_tbl[] = {
 432        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x02),
 433        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
 434        QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
 435        QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
 436};
 437
 438static const struct qmp_phy_init_tbl msm8998_pcie_rx_tbl[] = {
 439        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
 440        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x1c),
 441        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
 442        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0a),
 443        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
 444        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
 445        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
 446        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x04),
 447        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN_HALF, 0x04),
 448        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x00),
 449        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
 450        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
 451        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x71),
 452        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x40),
 453};
 454
 455static const struct qmp_phy_init_tbl msm8998_pcie_pcs_tbl[] = {
 456        QMP_PHY_INIT_CFG(QPHY_V3_PCS_ENDPOINT_REFCLK_DRIVE, 0x04),
 457        QMP_PHY_INIT_CFG(QPHY_V3_PCS_OSC_DTCT_ACTIONS, 0x00),
 458        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x01),
 459        QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
 460        QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x20),
 461        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
 462        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
 463        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME, 0x73),
 464        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x99),
 465        QMP_PHY_INIT_CFG(QPHY_V3_PCS_SIGDET_CNTRL, 0x03),
 466};
 467
 468static const struct qmp_phy_init_tbl msm8996_ufs_serdes_tbl[] = {
 469        QMP_PHY_INIT_CFG(QPHY_POWER_DOWN_CONTROL, 0x01),
 470        QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x0e),
 471        QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xd7),
 472        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
 473        QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
 474        QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
 475        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
 476        QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x05),
 477        QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
 478        QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV_MODE1, 0x0a),
 479        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x01),
 480        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x10),
 481        QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
 482        QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
 483        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
 484        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
 485        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x3f),
 486        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x54),
 487        QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x05),
 488        QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
 489        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
 490        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00),
 491        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x00),
 492        QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
 493        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
 494        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
 495        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
 496        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
 497        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE0, 0x28),
 498        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE0, 0x02),
 499        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xff),
 500        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x0c),
 501        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
 502        QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE1, 0x98),
 503        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE1, 0x00),
 504        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE1, 0x00),
 505        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE1, 0x00),
 506        QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE1, 0x0b),
 507        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE1, 0x16),
 508        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE1, 0x28),
 509        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE1, 0x80),
 510        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
 511        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE1, 0xd6),
 512        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE1, 0x00),
 513        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE1, 0x32),
 514        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE1, 0x0f),
 515        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE1, 0x00),
 516};
 517
 518static const struct qmp_phy_init_tbl msm8996_ufs_tx_tbl[] = {
 519        QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
 520        QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x02),
 521};
 522
 523static const struct qmp_phy_init_tbl msm8996_ufs_rx_tbl[] = {
 524        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x24),
 525        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x02),
 526        QMP_PHY_INIT_CFG(QSERDES_RX_RX_INTERFACE_MODE, 0x00),
 527        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x18),
 528        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0B),
 529        QMP_PHY_INIT_CFG(QSERDES_RX_RX_TERM_BW, 0x5b),
 530        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_LSB, 0xff),
 531        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_MSB, 0x3f),
 532        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_LSB, 0xff),
 533        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_MSB, 0x0f),
 534        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0E),
 535};
 536
 537static const struct qmp_phy_init_tbl msm8996_usb3_serdes_tbl[] = {
 538        QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x14),
 539        QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
 540        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
 541        QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
 542        QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
 543        QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
 544        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
 545        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
 546        QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x04),
 547        /* PLL and Loop filter settings */
 548        QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
 549        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
 550        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
 551        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
 552        QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
 553        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
 554        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
 555        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
 556        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x00),
 557        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x15),
 558        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x34),
 559        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
 560        QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
 561        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
 562        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
 563        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
 564        /* SSC settings */
 565        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
 566        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
 567        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
 568        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x00),
 569        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
 570        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0xde),
 571        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x07),
 572};
 573
 574static const struct qmp_phy_init_tbl msm8996_usb3_tx_tbl[] = {
 575        QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
 576        QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
 577        QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
 578};
 579
 580static const struct qmp_phy_init_tbl msm8996_usb3_rx_tbl[] = {
 581        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
 582        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x04),
 583        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
 584        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4c),
 585        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xbb),
 586        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
 587        QMP_PHY_INIT_CFG(QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
 588        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x03),
 589        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x18),
 590        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
 591};
 592
 593static const struct qmp_phy_init_tbl msm8996_usb3_pcs_tbl[] = {
 594        /* FLL settings */
 595        QMP_PHY_INIT_CFG_L(QPHY_FLL_CNTRL2, 0x03),
 596        QMP_PHY_INIT_CFG_L(QPHY_FLL_CNTRL1, 0x02),
 597        QMP_PHY_INIT_CFG_L(QPHY_FLL_CNT_VAL_L, 0x09),
 598        QMP_PHY_INIT_CFG_L(QPHY_FLL_CNT_VAL_H_TOL, 0x42),
 599        QMP_PHY_INIT_CFG_L(QPHY_FLL_MAN_CODE, 0x85),
 600
 601        /* Lock Det settings */
 602        QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG1, 0xd1),
 603        QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG2, 0x1f),
 604        QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG3, 0x47),
 605        QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG2, 0x08),
 606};
 607
 608static const struct qmp_phy_init_tbl ipq8074_pcie_serdes_tbl[] = {
 609        QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x18),
 610        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
 611        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0xf),
 612        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x1),
 613        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x0),
 614        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
 615        QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
 616        QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x6),
 617        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0xf),
 618        QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x0),
 619        QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x1),
 620        QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x20),
 621        QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0xa),
 622        QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
 623        QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0xa),
 624        QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xa),
 625        QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
 626        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x3),
 627        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
 628        QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
 629        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x0),
 630        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0xD),
 631        QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xD04),
 632        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
 633        QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x2),
 634        QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1f),
 635        QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0xb),
 636        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
 637        QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
 638        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x0),
 639        QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
 640        QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CTRL_BY_PSM, 0x1),
 641        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x1),
 642        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
 643        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x1),
 644        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x2),
 645        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x0),
 646        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
 647        QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
 648        QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
 649};
 650
 651static const struct qmp_phy_init_tbl ipq8074_pcie_tx_tbl[] = {
 652        QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
 653        QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x6),
 654        QMP_PHY_INIT_CFG(QSERDES_TX_RES_CODE_LANE_OFFSET, 0x2),
 655        QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
 656        QMP_PHY_INIT_CFG(QSERDES_TX_EMP_POST1_LVL, 0x36),
 657        QMP_PHY_INIT_CFG(QSERDES_TX_SLEW_CNTL, 0x0a),
 658};
 659
 660static const struct qmp_phy_init_tbl ipq8074_pcie_rx_tbl[] = {
 661        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x1c),
 662        QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
 663        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x1),
 664        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x0),
 665        QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
 666        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
 667        QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x4),
 668};
 669
 670static const struct qmp_phy_init_tbl ipq8074_pcie_pcs_tbl[] = {
 671        QMP_PHY_INIT_CFG(QPHY_ENDPOINT_REFCLK_DRIVE, 0x4),
 672        QMP_PHY_INIT_CFG(QPHY_OSC_DTCT_ACTIONS, 0x0),
 673        QMP_PHY_INIT_CFG(QPHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x40),
 674        QMP_PHY_INIT_CFG(QPHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x0),
 675        QMP_PHY_INIT_CFG(QPHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x40),
 676        QMP_PHY_INIT_CFG(QPHY_PLL_LOCK_CHK_DLY_TIME_AUXCLK_LSB, 0x0),
 677        QMP_PHY_INIT_CFG(QPHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x40),
 678        QMP_PHY_INIT_CFG_L(QPHY_PLL_LOCK_CHK_DLY_TIME, 0x73),
 679        QMP_PHY_INIT_CFG(QPHY_RX_SIGDET_LVL, 0x99),
 680        QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M6DB_V0, 0x15),
 681        QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M3P5DB_V0, 0xe),
 682        QMP_PHY_INIT_CFG_L(QPHY_SW_RESET, 0x0),
 683        QMP_PHY_INIT_CFG_L(QPHY_START_CTRL, 0x3),
 684};
 685
 686static const struct qmp_phy_init_tbl sdm845_qmp_pcie_serdes_tbl[] = {
 687        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
 688        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
 689        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x007),
 690        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
 691        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
 692        QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
 693        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
 694        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
 695        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
 696        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER1, 0xff),
 697        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER2, 0x3f),
 698        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
 699        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
 700        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
 701        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_EP_DIV, 0x19),
 702        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x90),
 703        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
 704        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
 705        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
 706        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
 707        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
 708        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0d),
 709        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x04),
 710        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
 711        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
 712        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
 713        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
 714        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_MODE, 0x01),
 715        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x33),
 716        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
 717        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
 718        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x04),
 719        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
 720        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
 721        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x09),
 722        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
 723        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x40),
 724        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
 725        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x02),
 726        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
 727        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x7e),
 728        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x15),
 729};
 730
 731static const struct qmp_phy_init_tbl sdm845_qmp_pcie_tx_tbl[] = {
 732        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x02),
 733        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
 734        QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
 735        QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
 736};
 737
 738static const struct qmp_phy_init_tbl sdm845_qmp_pcie_rx_tbl[] = {
 739        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
 740        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x10),
 741        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
 742        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
 743        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
 744        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
 745        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
 746        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x04),
 747        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN_HALF, 0x04),
 748        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x71),
 749        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
 750        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_01, 0x59),
 751        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
 752        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
 753        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x71),
 754        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x40),
 755};
 756
 757static const struct qmp_phy_init_tbl sdm845_qmp_pcie_pcs_tbl[] = {
 758        QMP_PHY_INIT_CFG(QPHY_V3_PCS_ENDPOINT_REFCLK_DRIVE, 0x04),
 759
 760        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
 761        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
 762        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
 763        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
 764        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
 765
 766        QMP_PHY_INIT_CFG(QPHY_V3_PCS_OSC_DTCT_ACTIONS, 0x00),
 767        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x01),
 768        QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
 769        QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x20),
 770        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
 771        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
 772        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME, 0x73),
 773
 774        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xbb),
 775        QMP_PHY_INIT_CFG(QPHY_V3_PCS_SIGDET_CNTRL, 0x03),
 776        QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x0d),
 777
 778        QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG4, 0x00),
 779};
 780
 781static const struct qmp_phy_init_tbl sdm845_qmp_pcie_pcs_misc_tbl[] = {
 782        QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_CONFIG2, 0x52),
 783        QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG2, 0x10),
 784        QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG4, 0x1a),
 785        QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG5, 0x06),
 786        QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_PCIE_INT_AUX_CLK_CONFIG1, 0x00),
 787};
 788
 789static const struct qmp_phy_init_tbl sdm845_qhp_pcie_serdes_tbl[] = {
 790        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SYSCLK_EN_SEL, 0x27),
 791        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_EN_CENTER, 0x01),
 792        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_PER1, 0x31),
 793        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_PER2, 0x01),
 794        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE1, 0xde),
 795        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE2, 0x07),
 796        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE1_MODE1, 0x4c),
 797        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE2_MODE1, 0x06),
 798        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BIAS_EN_CKBUFLR_EN, 0x18),
 799        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CLK_ENABLE1, 0xb0),
 800        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP1_MODE0, 0x8c),
 801        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP2_MODE0, 0x20),
 802        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP1_MODE1, 0x14),
 803        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP2_MODE1, 0x34),
 804        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CP_CTRL_MODE0, 0x06),
 805        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CP_CTRL_MODE1, 0x06),
 806        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_RCTRL_MODE0, 0x16),
 807        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_RCTRL_MODE1, 0x16),
 808        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_CCTRL_MODE0, 0x36),
 809        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_CCTRL_MODE1, 0x36),
 810        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_RESTRIM_CTRL2, 0x05),
 811        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP_EN, 0x42),
 812        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DEC_START_MODE0, 0x82),
 813        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DEC_START_MODE1, 0x68),
 814        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START1_MODE0, 0x55),
 815        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START2_MODE0, 0x55),
 816        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START3_MODE0, 0x03),
 817        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START1_MODE1, 0xab),
 818        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START2_MODE1, 0xaa),
 819        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START3_MODE1, 0x02),
 820        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
 821        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
 822        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VCO_TUNE_MAP, 0x10),
 823        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CLK_SELECT, 0x04),
 824        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_HSCLK_SEL1, 0x30),
 825        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORECLK_DIV, 0x04),
 826        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORE_CLK_EN, 0x73),
 827        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CMN_CONFIG, 0x0c),
 828        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SVS_MODE_CLK_SEL, 0x15),
 829        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORECLK_DIV_MODE1, 0x04),
 830        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CMN_MODE, 0x01),
 831        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VREGCLK_DIV1, 0x22),
 832        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VREGCLK_DIV2, 0x00),
 833        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BGV_TRIM, 0x20),
 834        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BG_CTRL, 0x07),
 835};
 836
 837static const struct qmp_phy_init_tbl sdm845_qhp_pcie_tx_tbl[] = {
 838        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL0, 0x00),
 839        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_TAP_EN, 0x0d),
 840        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_TX_BAND_MODE, 0x01),
 841        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_LANE_MODE, 0x1a),
 842        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PARALLEL_RATE, 0x2f),
 843        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE0, 0x09),
 844        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE1, 0x09),
 845        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE2, 0x1b),
 846        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PREAMP_CTRL_MODE1, 0x01),
 847        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PREAMP_CTRL_MODE2, 0x07),
 848        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE0, 0x31),
 849        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE1, 0x31),
 850        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE2, 0x03),
 851        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_THRESH_DFE, 0x02),
 852        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CGA_THRESH_DFE, 0x00),
 853        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXENGINE_EN0, 0x12),
 854        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_TRAIN_TIME, 0x25),
 855        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_DFE_OVRLP_TIME, 0x00),
 856        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_REFRESH_TIME, 0x05),
 857        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_ENABLE_TIME, 0x01),
 858        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_VGA_GAIN, 0x26),
 859        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_GAIN, 0x12),
 860        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EQ_GAIN, 0x04),
 861        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_OFFSET_GAIN, 0x04),
 862        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PRE_GAIN, 0x09),
 863        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EQ_INTVAL, 0x15),
 864        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EDAC_INITVAL, 0x28),
 865        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_INITB0, 0x7f),
 866        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_INITB1, 0x07),
 867        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RCVRDONE_THRESH1, 0x04),
 868        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_CTRL, 0x70),
 869        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE0, 0x8b),
 870        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE1, 0x08),
 871        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE2, 0x0a),
 872        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE0, 0x03),
 873        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE1, 0x04),
 874        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE2, 0x04),
 875        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_CONFIG, 0x0c),
 876        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_BAND, 0x02),
 877        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE0, 0x5c),
 878        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE1, 0x3e),
 879        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE2, 0x3f),
 880        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_ENABLES, 0x01),
 881        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_CNTRL, 0xa0),
 882        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_DEGLITCH_CNTRL, 0x08),
 883        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DCC_GAIN, 0x01),
 884        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_EN_SIGNAL, 0xc3),
 885        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PSM_RX_EN_CAL, 0x00),
 886        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_MISC_CNTRL0, 0xbc),
 887        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_TS0_TIMER, 0x7f),
 888        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DLL_HIGHDATARATE, 0x15),
 889        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL1, 0x0c),
 890        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL2, 0x0f),
 891        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RESETCODE_OFFSET, 0x04),
 892        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_VGA_INITVAL, 0x20),
 893        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RSM_START, 0x01),
 894};
 895
 896static const struct qmp_phy_init_tbl sdm845_qhp_pcie_rx_tbl[] = {
 897};
 898
 899static const struct qmp_phy_init_tbl sdm845_qhp_pcie_pcs_tbl[] = {
 900        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_POWER_STATE_CONFIG, 0x3f),
 901        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_PCS_TX_RX_CONFIG, 0x50),
 902        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_MAIN_V0_M3P5DB, 0x19),
 903        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_POST_V0_M3P5DB, 0x07),
 904        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_MAIN_V0_M6DB, 0x17),
 905        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_POST_V0_M6DB, 0x09),
 906        QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_POWER_STATE_CONFIG5, 0x9f),
 907};
 908
 909static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
 910        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
 911        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
 912        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
 913        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
 914        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
 915        QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
 916        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16),
 917        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
 918        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
 919        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
 920        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
 921        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
 922        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
 923        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
 924        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
 925        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
 926        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
 927        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
 928        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
 929        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
 930        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
 931        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
 932        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
 933        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
 934        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
 935        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
 936        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
 937        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
 938        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
 939        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
 940        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
 941        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
 942        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
 943        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
 944        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
 945        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
 946};
 947
 948static const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = {
 949        QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
 950        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
 951        QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
 952        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
 953        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
 954};
 955
 956static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl[] = {
 957        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
 958        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x37),
 959        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
 960        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x0e),
 961        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
 962        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
 963        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x02),
 964        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x00),
 965        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
 966        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
 967        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
 968        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
 969        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
 970        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
 971        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
 972        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x3f),
 973        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x1f),
 974        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
 975        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
 976        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
 977        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
 978};
 979
 980static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_rbr[] = {
 981        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x0c),
 982        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
 983        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
 984        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
 985        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x6f),
 986        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x08),
 987        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
 988};
 989
 990static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr[] = {
 991        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x04),
 992        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
 993        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
 994        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
 995        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x0f),
 996        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0e),
 997        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
 998};
 999
1000static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr2[] = {
1001        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
1002        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x8c),
1003        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x00),
1004        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x0a),
1005        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x1f),
1006        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x1c),
1007        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
1008};
1009
1010static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr3[] = {
1011        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x03),
1012        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
1013        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
1014        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
1015        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x2f),
1016        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x2a),
1017        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x08),
1018};
1019
1020static const struct qmp_phy_init_tbl qmp_v3_dp_tx_tbl[] = {
1021        QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 0x1a),
1022        QMP_PHY_INIT_CFG(QSERDES_V3_TX_VMODE_CTRL1, 0x40),
1023        QMP_PHY_INIT_CFG(QSERDES_V3_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
1024        QMP_PHY_INIT_CFG(QSERDES_V3_TX_INTERFACE_SELECT, 0x3d),
1025        QMP_PHY_INIT_CFG(QSERDES_V3_TX_CLKBUF_ENABLE, 0x0f),
1026        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RESET_TSYNC_EN, 0x03),
1027        QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRAN_DRVR_EMP_EN, 0x03),
1028        QMP_PHY_INIT_CFG(QSERDES_V3_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
1029        QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_INTERFACE_MODE, 0x00),
1030        QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_BAND, 0x4),
1031        QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_POL_INV, 0x0a),
1032        QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_DRV_LVL, 0x38),
1033        QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_EMP_POST1_LVL, 0x20),
1034        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
1035        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
1036};
1037
1038static const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = {
1039        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1040        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1041        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1042        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1043        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1044        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1045        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
1046        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
1047        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1048};
1049
1050static const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = {
1051        /* FLL settings */
1052        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1053        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1054        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1055        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1056        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1057
1058        /* Lock Det settings */
1059        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1060        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1061        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1062        QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1063
1064        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
1065        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1066        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1067        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
1068        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
1069        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
1070        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
1071        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1072        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1073        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
1074        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1075        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1076        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1077        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1078        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
1079        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1080        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1081        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1082        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1083
1084        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1085        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1086        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1087        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1088        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1089        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1090        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1091        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1092        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1093        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1094        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1095};
1096
1097static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_serdes_tbl[] = {
1098        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1099        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
1100        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1101        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1102        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1103        QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
1104        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1105        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1106        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
1107        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1108        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
1109        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
1110        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
1111        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1112        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1113        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1114        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1115        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1116        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1117        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
1118        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1119        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1120        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
1121        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
1122        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
1123        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1124        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
1125        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1126        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
1127        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
1128        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
1129        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
1130        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
1131        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
1132        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
1133        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
1134};
1135
1136static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_tx_tbl[] = {
1137        QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
1138        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
1139        QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0xc6),
1140        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x06),
1141        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
1142};
1143
1144static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_rx_tbl[] = {
1145        QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x0c),
1146        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x50),
1147        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1148        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
1149        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1150        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1151        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1152        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1153        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
1154        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1c),
1155        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1156};
1157
1158static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_pcs_tbl[] = {
1159        /* FLL settings */
1160        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1161        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1162        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1163        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1164        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1165
1166        /* Lock Det settings */
1167        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1168        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1169        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1170        QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1171
1172        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
1173        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1174        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1175        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb5),
1176        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4c),
1177        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x64),
1178        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6a),
1179        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1180        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1181        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
1182        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1183        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1184        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1185        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1186        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
1187        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1188        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1189        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1190        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1191
1192        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1193        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1194        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1195        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1196        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1197        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1198        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1199        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1200        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1201        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1202        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1203
1204        QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x21),
1205        QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG2, 0x60),
1206};
1207
1208static const struct qmp_phy_init_tbl sdm845_ufsphy_serdes_tbl[] = {
1209        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1210        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1211        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
1212        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1213        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1214        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0xd5),
1215        QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
1216        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1217        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
1218        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
1219        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
1220        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1221        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x04),
1222        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x05),
1223        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL1, 0xff),
1224        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL2, 0x00),
1225        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1226        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1227        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1228        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1229        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1230        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1231        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xda),
1232        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1233        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0xff),
1234        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0c),
1235        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE1, 0x98),
1236        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE1, 0x06),
1237        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE1, 0x16),
1238        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE1, 0x36),
1239        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
1240        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
1241        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE1, 0xc1),
1242        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE1, 0x00),
1243        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE1, 0x32),
1244        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE1, 0x0f),
1245
1246        /* Rate B */
1247        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x44),
1248};
1249
1250static const struct qmp_phy_init_tbl sdm845_ufsphy_tx_tbl[] = {
1251        QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
1252        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x04),
1253        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
1254};
1255
1256static const struct qmp_phy_init_tbl sdm845_ufsphy_rx_tbl[] = {
1257        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_LVL, 0x24),
1258        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x0f),
1259        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
1260        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
1261        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1262        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_TERM_BW, 0x5b),
1263        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
1264        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
1265        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1b),
1266        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
1267        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
1268        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN, 0x04),
1269        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
1270        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x81),
1271        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
1272        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
1273};
1274
1275static const struct qmp_phy_init_tbl sdm845_ufsphy_pcs_tbl[] = {
1276        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_CTRL2, 0x6e),
1277        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_LARGE_AMP_DRV_LVL, 0x0a),
1278        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_SMALL_AMP_DRV_LVL, 0x02),
1279        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SYM_RESYNC_CTRL, 0x03),
1280        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_MID_TERM_CTRL1, 0x43),
1281        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_CTRL1, 0x0f),
1282        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_MIN_HIBERN8_TIME, 0x9a),
1283        QMP_PHY_INIT_CFG(QPHY_V3_PCS_MULTI_LANE_CTRL1, 0x02),
1284};
1285
1286static const struct qmp_phy_init_tbl msm8998_usb3_serdes_tbl[] = {
1287        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1288        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1289        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
1290        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x06),
1291        QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
1292        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1293        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1294        QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
1295        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1296        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
1297        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
1298        QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
1299        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1300        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1301        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1302        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1303        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1304        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1305        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
1306        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1307        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1308        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
1309        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
1310        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
1311        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1312        QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
1313        QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1314        QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
1315        QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1316        QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_INITVAL, 0x80),
1317        QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_MODE, 0x01),
1318        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
1319        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
1320        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
1321        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
1322        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
1323        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
1324        QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
1325};
1326
1327static const struct qmp_phy_init_tbl msm8998_usb3_tx_tbl[] = {
1328        QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
1329        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
1330        QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
1331        QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x00),
1332};
1333
1334static const struct qmp_phy_init_tbl msm8998_usb3_rx_tbl[] = {
1335        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1336        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1337        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1338        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1339        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x07),
1340        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1341        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x43),
1342        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1c),
1343        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1344        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
1345        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
1346        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x80),
1347        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
1348        QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x06),
1349        QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x00),
1350        QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x03),
1351        QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05),
1352};
1353
1354static const struct qmp_phy_init_tbl msm8998_usb3_pcs_tbl[] = {
1355        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1356        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1357        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1358        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1359        QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1360        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1361        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1362        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1363        QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1364        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1365        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1366        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
1367        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
1368        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
1369        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
1370        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1371        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1372        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_LARGE_AMP_DRV_LVL, 0x15),
1373        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1374        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1375        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1376        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1377        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x0d),
1378        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1379        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1380        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1381        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1382        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1383        QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1384        QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1385        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1386        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1387        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1388        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1389        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x8a),
1390        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1391        QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1392        QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1393};
1394
1395static const struct qmp_phy_init_tbl sm8150_ufsphy_serdes_tbl[] = {
1396        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0xd9),
1397        QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x11),
1398        QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_HS_SWITCH_SEL, 0x00),
1399        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x01),
1400        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1401        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
1402        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_INITVAL2, 0x00),
1403        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1404        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1405        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1406        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1407        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1408        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0xff),
1409        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0c),
1410        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
1411        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1412        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x98),
1413        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1414        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1415        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1416        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x32),
1417        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x0f),
1418        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
1419        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
1420
1421        /* Rate B */
1422        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x06),
1423};
1424
1425static const struct qmp_phy_init_tbl sm8150_ufsphy_tx_tbl[] = {
1426        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
1427        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
1428        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
1429        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
1430        QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x05),
1431        QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0c),
1432};
1433
1434static const struct qmp_phy_init_tbl sm8150_ufsphy_rx_tbl[] = {
1435        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_LVL, 0x24),
1436        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x0f),
1437        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
1438        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_BAND, 0x18),
1439        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
1440        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
1441        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0xf1),
1442        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
1443        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x80),
1444        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
1445        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
1446        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x1b),
1447        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
1448        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
1449        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1d),
1450        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
1451        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x10),
1452        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1453        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1454        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x36),
1455        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x36),
1456        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xf6),
1457        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x3b),
1458        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x3d),
1459        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xe0),
1460        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xc8),
1461        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xc8),
1462        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
1463        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb1),
1464        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xe0),
1465        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0xc8),
1466        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
1467        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
1468        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
1469
1470};
1471
1472static const struct qmp_phy_init_tbl sm8150_ufsphy_pcs_tbl[] = {
1473        QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
1474        QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
1475        QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
1476        QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
1477        QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
1478        QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
1479        QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
1480};
1481
1482static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = {
1483        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
1484        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
1485        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
1486        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
1487        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
1488        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
1489        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
1490        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
1491        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
1492        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1493        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1494        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1495        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1496        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1497        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1498        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
1499        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
1500        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
1501        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
1502        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
1503        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
1504        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1505        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
1506        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
1507        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
1508        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
1509        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1510        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
1511        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
1512        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
1513        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
1514        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
1515        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
1516        QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
1517        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
1518        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
1519        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1520        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
1521        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
1522        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1523};
1524
1525static const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = {
1526        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00),
1527        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00),
1528        QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1529        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1530        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
1531};
1532
1533static const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = {
1534        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05),
1535        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1536        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1537        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1538        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1539        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1540        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1541        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1542        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1543        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1544        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1545        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e),
1546        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1547        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1548        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1549        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1550        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1551        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1552        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1553        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1554        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf),
1555        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf),
1556        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f),
1557        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1558        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94),
1559        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1560        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1561        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1562        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
1563        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
1564        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1565        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1566        QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
1567        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1568        QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1569        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
1570};
1571
1572static const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = {
1573        /* Lock Det settings */
1574        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1575        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1576        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1577
1578        QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1579        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
1580        QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1581        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1582        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1583        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1584        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1585        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1586        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1587        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
1588};
1589
1590static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_serdes_tbl[] = {
1591        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
1592        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1593        QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
1594        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1595        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
1596        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
1597        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
1598        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
1599        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1600        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1601        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1602        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1603        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
1604        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
1605        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
1606        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
1607        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
1608        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
1609        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
1610        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
1611        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
1612        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
1613        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
1614        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
1615        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
1616        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
1617        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1618        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1619        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1620        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
1621        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
1622        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
1623        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
1624        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
1625        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
1626        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
1627        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
1628        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
1629        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
1630        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1631};
1632
1633static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_tx_tbl[] = {
1634        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1635        QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x95),
1636        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x40),
1637        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x05),
1638};
1639
1640static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_rx_tbl[] = {
1641        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0xb8),
1642        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1643        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x37),
1644        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x2f),
1645        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xef),
1646        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
1647        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
1648        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1649        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1650        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1651        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1652        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1653        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1654        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1655        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1656        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1657        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1658        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1659        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1660        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x08),
1661        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1662        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1663        QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1664        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1665        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1666        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1667        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1668        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
1669        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1670        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1671        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1672        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1673        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1674        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x20),
1675        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
1676        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1677};
1678
1679static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_pcs_tbl[] = {
1680        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1681        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1682        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1683        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1684        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1685        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1686        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
1687        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_RXEQTRAINING_DFE_TIME_S2, 0x07),
1688        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1689        QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0f),
1690        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1691        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1692        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1693        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1694        QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1695        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1696};
1697
1698static const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = {
1699        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60),
1700        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60),
1701        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
1702        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
1703        QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1704        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1705        QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1),
1706        QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2),
1707};
1708
1709static const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = {
1710        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
1711        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1712        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1713        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1714        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1715        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1716        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1717        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1718        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1719        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1720        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1721        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1722        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1723        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1724        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1725        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1726        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1727        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1728        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1729        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1730        QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1),
1731        QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2),
1732        QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1),
1733        QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2),
1734        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f),
1735        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1736        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97),
1737        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1738        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1739        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1740        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
1741        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
1742        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1743        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1744        QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
1745        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1746        QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1747        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
1748};
1749
1750static const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = {
1751        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1752        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1753        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1754        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1755        QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1756        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
1757        QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1758        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1759        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1760        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1761        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1762        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1763        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1764        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
1765};
1766
1767static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_tx_tbl[] = {
1768        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1769        QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1770        QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_2, 0x82),
1771        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x40),
1772        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
1773        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
1774};
1775
1776static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_rx_tbl[] = {
1777        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0xb8),
1778        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0xff),
1779        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xbf),
1780        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f),
1781        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f),
1782        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
1783        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
1784        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1785        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1786        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1787        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1788        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1789        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1790        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1791        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1792        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1793        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1794        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1795        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1796        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0a),
1797        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1798        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1799        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1800        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1801        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1802        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1803        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
1804        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1805        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1806        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1807        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1808        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1809        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1810        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
1811        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1812        QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1813};
1814
1815static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_pcs_tbl[] = {
1816        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1817        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1818        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1819        QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1820        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1821        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1822        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
1823        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1824        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_RXEQTRAINING_DFE_TIME_S2, 0x07),
1825        QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1826        QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1827        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1828        QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1829        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1830        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1831        QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1832};
1833
1834static const struct qmp_phy_init_tbl sm8250_qmp_pcie_serdes_tbl[] = {
1835        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x08),
1836        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x34),
1837        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
1838        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
1839        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x42),
1840        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
1841        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x03),
1842        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0xb4),
1843        QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1844        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1845        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1846        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x03),
1847        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x55),
1848        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x55),
1849        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x1a),
1850        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x0a),
1851        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x68),
1852        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
1853        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xaa),
1854        QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
1855        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x34),
1856        QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x14),
1857        QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
1858        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1859        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1860        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1861        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1862        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1863        QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1864        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1865        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
1866        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x18),
1867        QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xa2),
1868        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
1869        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
1870        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
1871        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
1872        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
1873        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0x4c),
1874        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x06),
1875        QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x90),
1876};
1877
1878static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_serdes_tbl[] = {
1879        QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x07),
1880};
1881
1882static const struct qmp_phy_init_tbl sm8250_qmp_pcie_tx_tbl[] = {
1883        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1884        QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x35),
1885        QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
1886};
1887
1888static const struct qmp_phy_init_tbl sm8250_qmp_pcie_rx_tbl[] = {
1889        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
1890        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x03),
1891        QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1b),
1892        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1893        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1894        QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0x30),
1895        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x04),
1896        QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x07),
1897        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1898        QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x70),
1899        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
1900        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1901        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0f),
1902        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x03),
1903        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_ENABLES, 0x1c),
1904        QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
1905        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
1906        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xd4),
1907        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0x54),
1908        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xdb),
1909        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
1910        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0x31),
1911        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x24),
1912        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xff),
1913        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1914        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1915        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xe4),
1916        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xec),
1917        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
1918        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0x36),
1919};
1920
1921static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_rx_tbl[] = {
1922        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RCLK_AUXDATA_SEL, 0x00),
1923        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x00),
1924        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1925        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x3f),
1926        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x14),
1927        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x30),
1928};
1929
1930static const struct qmp_phy_init_tbl sm8250_qmp_pcie_pcs_tbl[] = {
1931        QMP_PHY_INIT_CFG(QPHY_V4_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
1932        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0x77),
1933        QMP_PHY_INIT_CFG(QPHY_V4_PCS_RATE_SLEW_CNTRL1, 0x0b),
1934};
1935
1936static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_pcs_tbl[] = {
1937        QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x0d),
1938        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x12),
1939};
1940
1941static const struct qmp_phy_init_tbl sm8250_qmp_pcie_pcs_misc_tbl[] = {
1942        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_ACTIONS, 0x00),
1943        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
1944        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
1945        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P6_P7_PRE, 0x33),
1946        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P10_PRE, 0x00),
1947        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P10_POST, 0x58),
1948        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
1949};
1950
1951static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_pcs_misc_tbl[] = {
1952        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_INT_AUX_CLK_CONFIG1, 0x00),
1953        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_EQ_CONFIG2, 0x0f),
1954};
1955
1956static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_tx_tbl[] = {
1957        QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
1958};
1959
1960static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_rx_tbl[] = {
1961        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
1962        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf),
1963        QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x15),
1964        QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1965};
1966
1967static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_pcs_tbl[] = {
1968        QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x05),
1969        QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG2, 0x0f),
1970};
1971
1972static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_pcs_misc_tbl[] = {
1973        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_POWER_STATE_CONFIG2, 0x0d),
1974        QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_POWER_STATE_CONFIG4, 0x07),
1975};
1976
1977/* struct qmp_phy_cfg - per-PHY initialization config */
1978struct qmp_phy_cfg {
1979        /* phy-type - PCIE/UFS/USB */
1980        unsigned int type;
1981        /* number of lanes provided by phy */
1982        int nlanes;
1983
1984        /* Init sequence for PHY blocks - serdes, tx, rx, pcs */
1985        const struct qmp_phy_init_tbl *serdes_tbl;
1986        int serdes_tbl_num;
1987        const struct qmp_phy_init_tbl *serdes_tbl_sec;
1988        int serdes_tbl_num_sec;
1989        const struct qmp_phy_init_tbl *tx_tbl;
1990        int tx_tbl_num;
1991        const struct qmp_phy_init_tbl *tx_tbl_sec;
1992        int tx_tbl_num_sec;
1993        const struct qmp_phy_init_tbl *rx_tbl;
1994        int rx_tbl_num;
1995        const struct qmp_phy_init_tbl *rx_tbl_sec;
1996        int rx_tbl_num_sec;
1997        const struct qmp_phy_init_tbl *pcs_tbl;
1998        int pcs_tbl_num;
1999        const struct qmp_phy_init_tbl *pcs_tbl_sec;
2000        int pcs_tbl_num_sec;
2001        const struct qmp_phy_init_tbl *pcs_misc_tbl;
2002        int pcs_misc_tbl_num;
2003        const struct qmp_phy_init_tbl *pcs_misc_tbl_sec;
2004        int pcs_misc_tbl_num_sec;
2005
2006        /* Init sequence for DP PHY block link rates */
2007        const struct qmp_phy_init_tbl *serdes_tbl_rbr;
2008        int serdes_tbl_rbr_num;
2009        const struct qmp_phy_init_tbl *serdes_tbl_hbr;
2010        int serdes_tbl_hbr_num;
2011        const struct qmp_phy_init_tbl *serdes_tbl_hbr2;
2012        int serdes_tbl_hbr2_num;
2013        const struct qmp_phy_init_tbl *serdes_tbl_hbr3;
2014        int serdes_tbl_hbr3_num;
2015
2016        /* clock ids to be requested */
2017        const char * const *clk_list;
2018        int num_clks;
2019        /* resets to be requested */
2020        const char * const *reset_list;
2021        int num_resets;
2022        /* regulators to be requested */
2023        const char * const *vreg_list;
2024        int num_vregs;
2025
2026        /* array of registers with different offsets */
2027        const unsigned int *regs;
2028
2029        unsigned int start_ctrl;
2030        unsigned int pwrdn_ctrl;
2031        unsigned int mask_com_pcs_ready;
2032
2033        /* true, if PHY has a separate PHY_COM control block */
2034        bool has_phy_com_ctrl;
2035        /* true, if PHY has a reset for individual lanes */
2036        bool has_lane_rst;
2037        /* true, if PHY needs delay after POWER_DOWN */
2038        bool has_pwrdn_delay;
2039        /* power_down delay in usec */
2040        int pwrdn_delay_min;
2041        int pwrdn_delay_max;
2042
2043        /* true, if PHY has a separate DP_COM control block */
2044        bool has_phy_dp_com_ctrl;
2045        /* true, if PHY has secondary tx/rx lanes to be configured */
2046        bool is_dual_lane_phy;
2047
2048        /* true, if PCS block has no separate SW_RESET register */
2049        bool no_pcs_sw_reset;
2050};
2051
2052struct qmp_phy_combo_cfg {
2053        const struct qmp_phy_cfg *usb_cfg;
2054        const struct qmp_phy_cfg *dp_cfg;
2055};
2056
2057/**
2058 * struct qmp_phy - per-lane phy descriptor
2059 *
2060 * @phy: generic phy
2061 * @cfg: phy specific configuration
2062 * @serdes: iomapped memory space for phy's serdes (i.e. PLL)
2063 * @tx: iomapped memory space for lane's tx
2064 * @rx: iomapped memory space for lane's rx
2065 * @pcs: iomapped memory space for lane's pcs
2066 * @tx2: iomapped memory space for second lane's tx (in dual lane PHYs)
2067 * @rx2: iomapped memory space for second lane's rx (in dual lane PHYs)
2068 * @pcs_misc: iomapped memory space for lane's pcs_misc
2069 * @pipe_clk: pipe lock
2070 * @index: lane index
2071 * @qmp: QMP phy to which this lane belongs
2072 * @lane_rst: lane's reset controller
2073 * @mode: current PHY mode
2074 */
2075struct qmp_phy {
2076        struct phy *phy;
2077        const struct qmp_phy_cfg *cfg;
2078        void __iomem *serdes;
2079        void __iomem *tx;
2080        void __iomem *rx;
2081        void __iomem *pcs;
2082        void __iomem *tx2;
2083        void __iomem *rx2;
2084        void __iomem *pcs_misc;
2085        struct clk *pipe_clk;
2086        unsigned int index;
2087        struct qcom_qmp *qmp;
2088        struct reset_control *lane_rst;
2089        enum phy_mode mode;
2090        unsigned int dp_aux_cfg;
2091        struct phy_configure_opts_dp dp_opts;
2092        struct qmp_phy_dp_clks *dp_clks;
2093};
2094
2095struct qmp_phy_dp_clks {
2096        struct qmp_phy *qphy;
2097        struct clk_hw dp_link_hw;
2098        struct clk_hw dp_pixel_hw;
2099};
2100
2101/**
2102 * struct qcom_qmp - structure holding QMP phy block attributes
2103 *
2104 * @dev: device
2105 * @dp_com: iomapped memory space for phy's dp_com control block
2106 *
2107 * @clks: array of clocks required by phy
2108 * @resets: array of resets required by phy
2109 * @vregs: regulator supplies bulk data
2110 *
2111 * @phys: array of per-lane phy descriptors
2112 * @phy_mutex: mutex lock for PHY common block initialization
2113 * @init_count: phy common block initialization count
2114 * @ufs_reset: optional UFS PHY reset handle
2115 */
2116struct qcom_qmp {
2117        struct device *dev;
2118        void __iomem *dp_com;
2119
2120        struct clk_bulk_data *clks;
2121        struct reset_control **resets;
2122        struct regulator_bulk_data *vregs;
2123
2124        struct qmp_phy **phys;
2125
2126        struct mutex phy_mutex;
2127        int init_count;
2128
2129        struct reset_control *ufs_reset;
2130};
2131
2132static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
2133{
2134        u32 reg;
2135
2136        reg = readl(base + offset);
2137        reg |= val;
2138        writel(reg, base + offset);
2139
2140        /* ensure that above write is through */
2141        readl(base + offset);
2142}
2143
2144static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
2145{
2146        u32 reg;
2147
2148        reg = readl(base + offset);
2149        reg &= ~val;
2150        writel(reg, base + offset);
2151
2152        /* ensure that above write is through */
2153        readl(base + offset);
2154}
2155
2156/* list of clocks required by phy */
2157static const char * const msm8996_phy_clk_l[] = {
2158        "aux", "cfg_ahb", "ref",
2159};
2160
2161static const char * const msm8996_ufs_phy_clk_l[] = {
2162        "ref",
2163};
2164
2165static const char * const qmp_v3_phy_clk_l[] = {
2166        "aux", "cfg_ahb", "ref", "com_aux",
2167};
2168
2169static const char * const sdm845_pciephy_clk_l[] = {
2170        "aux", "cfg_ahb", "ref", "refgen",
2171};
2172
2173static const char * const qmp_v4_phy_clk_l[] = {
2174        "aux", "ref_clk_src", "ref", "com_aux",
2175};
2176
2177/* the primary usb3 phy on sm8250 doesn't have a ref clock */
2178static const char * const qmp_v4_sm8250_usbphy_clk_l[] = {
2179        "aux", "ref_clk_src", "com_aux"
2180};
2181
2182static const char * const sdm845_ufs_phy_clk_l[] = {
2183        "ref", "ref_aux",
2184};
2185
2186/* list of resets */
2187static const char * const msm8996_pciephy_reset_l[] = {
2188        "phy", "common", "cfg",
2189};
2190
2191static const char * const msm8996_usb3phy_reset_l[] = {
2192        "phy", "common",
2193};
2194
2195static const char * const sc7180_usb3phy_reset_l[] = {
2196        "phy",
2197};
2198
2199static const char * const sdm845_pciephy_reset_l[] = {
2200        "phy",
2201};
2202
2203/* list of regulators */
2204static const char * const qmp_phy_vreg_l[] = {
2205        "vdda-phy", "vdda-pll",
2206};
2207
2208static const struct qmp_phy_cfg ipq8074_usb3phy_cfg = {
2209        .type                   = PHY_TYPE_USB3,
2210        .nlanes                 = 1,
2211
2212        .serdes_tbl             = ipq8074_usb3_serdes_tbl,
2213        .serdes_tbl_num         = ARRAY_SIZE(ipq8074_usb3_serdes_tbl),
2214        .tx_tbl                 = msm8996_usb3_tx_tbl,
2215        .tx_tbl_num             = ARRAY_SIZE(msm8996_usb3_tx_tbl),
2216        .rx_tbl                 = ipq8074_usb3_rx_tbl,
2217        .rx_tbl_num             = ARRAY_SIZE(ipq8074_usb3_rx_tbl),
2218        .pcs_tbl                = ipq8074_usb3_pcs_tbl,
2219        .pcs_tbl_num            = ARRAY_SIZE(ipq8074_usb3_pcs_tbl),
2220        .clk_list               = msm8996_phy_clk_l,
2221        .num_clks               = ARRAY_SIZE(msm8996_phy_clk_l),
2222        .reset_list             = msm8996_usb3phy_reset_l,
2223        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2224        .vreg_list              = qmp_phy_vreg_l,
2225        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2226        .regs                   = usb3phy_regs_layout,
2227
2228        .start_ctrl             = SERDES_START | PCS_START,
2229        .pwrdn_ctrl             = SW_PWRDN,
2230};
2231
2232static const struct qmp_phy_cfg msm8996_pciephy_cfg = {
2233        .type                   = PHY_TYPE_PCIE,
2234        .nlanes                 = 3,
2235
2236        .serdes_tbl             = msm8996_pcie_serdes_tbl,
2237        .serdes_tbl_num         = ARRAY_SIZE(msm8996_pcie_serdes_tbl),
2238        .tx_tbl                 = msm8996_pcie_tx_tbl,
2239        .tx_tbl_num             = ARRAY_SIZE(msm8996_pcie_tx_tbl),
2240        .rx_tbl                 = msm8996_pcie_rx_tbl,
2241        .rx_tbl_num             = ARRAY_SIZE(msm8996_pcie_rx_tbl),
2242        .pcs_tbl                = msm8996_pcie_pcs_tbl,
2243        .pcs_tbl_num            = ARRAY_SIZE(msm8996_pcie_pcs_tbl),
2244        .clk_list               = msm8996_phy_clk_l,
2245        .num_clks               = ARRAY_SIZE(msm8996_phy_clk_l),
2246        .reset_list             = msm8996_pciephy_reset_l,
2247        .num_resets             = ARRAY_SIZE(msm8996_pciephy_reset_l),
2248        .vreg_list              = qmp_phy_vreg_l,
2249        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2250        .regs                   = pciephy_regs_layout,
2251
2252        .start_ctrl             = PCS_START | PLL_READY_GATE_EN,
2253        .pwrdn_ctrl             = SW_PWRDN | REFCLK_DRV_DSBL,
2254        .mask_com_pcs_ready     = PCS_READY,
2255
2256        .has_phy_com_ctrl       = true,
2257        .has_lane_rst           = true,
2258        .has_pwrdn_delay        = true,
2259        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2260        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2261};
2262
2263static const struct qmp_phy_cfg msm8996_ufs_cfg = {
2264        .type                   = PHY_TYPE_UFS,
2265        .nlanes                 = 1,
2266
2267        .serdes_tbl             = msm8996_ufs_serdes_tbl,
2268        .serdes_tbl_num         = ARRAY_SIZE(msm8996_ufs_serdes_tbl),
2269        .tx_tbl                 = msm8996_ufs_tx_tbl,
2270        .tx_tbl_num             = ARRAY_SIZE(msm8996_ufs_tx_tbl),
2271        .rx_tbl                 = msm8996_ufs_rx_tbl,
2272        .rx_tbl_num             = ARRAY_SIZE(msm8996_ufs_rx_tbl),
2273
2274        .clk_list               = msm8996_ufs_phy_clk_l,
2275        .num_clks               = ARRAY_SIZE(msm8996_ufs_phy_clk_l),
2276
2277        .vreg_list              = qmp_phy_vreg_l,
2278        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2279
2280        .regs                   = msm8996_ufsphy_regs_layout,
2281
2282        .start_ctrl             = SERDES_START,
2283        .pwrdn_ctrl             = SW_PWRDN,
2284
2285        .no_pcs_sw_reset        = true,
2286};
2287
2288static const struct qmp_phy_cfg msm8996_usb3phy_cfg = {
2289        .type                   = PHY_TYPE_USB3,
2290        .nlanes                 = 1,
2291
2292        .serdes_tbl             = msm8996_usb3_serdes_tbl,
2293        .serdes_tbl_num         = ARRAY_SIZE(msm8996_usb3_serdes_tbl),
2294        .tx_tbl                 = msm8996_usb3_tx_tbl,
2295        .tx_tbl_num             = ARRAY_SIZE(msm8996_usb3_tx_tbl),
2296        .rx_tbl                 = msm8996_usb3_rx_tbl,
2297        .rx_tbl_num             = ARRAY_SIZE(msm8996_usb3_rx_tbl),
2298        .pcs_tbl                = msm8996_usb3_pcs_tbl,
2299        .pcs_tbl_num            = ARRAY_SIZE(msm8996_usb3_pcs_tbl),
2300        .clk_list               = msm8996_phy_clk_l,
2301        .num_clks               = ARRAY_SIZE(msm8996_phy_clk_l),
2302        .reset_list             = msm8996_usb3phy_reset_l,
2303        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2304        .vreg_list              = qmp_phy_vreg_l,
2305        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2306        .regs                   = usb3phy_regs_layout,
2307
2308        .start_ctrl             = SERDES_START | PCS_START,
2309        .pwrdn_ctrl             = SW_PWRDN,
2310};
2311
2312static const char * const ipq8074_pciephy_clk_l[] = {
2313        "aux", "cfg_ahb",
2314};
2315/* list of resets */
2316static const char * const ipq8074_pciephy_reset_l[] = {
2317        "phy", "common",
2318};
2319
2320static const struct qmp_phy_cfg ipq8074_pciephy_cfg = {
2321        .type                   = PHY_TYPE_PCIE,
2322        .nlanes                 = 1,
2323
2324        .serdes_tbl             = ipq8074_pcie_serdes_tbl,
2325        .serdes_tbl_num         = ARRAY_SIZE(ipq8074_pcie_serdes_tbl),
2326        .tx_tbl                 = ipq8074_pcie_tx_tbl,
2327        .tx_tbl_num             = ARRAY_SIZE(ipq8074_pcie_tx_tbl),
2328        .rx_tbl                 = ipq8074_pcie_rx_tbl,
2329        .rx_tbl_num             = ARRAY_SIZE(ipq8074_pcie_rx_tbl),
2330        .pcs_tbl                = ipq8074_pcie_pcs_tbl,
2331        .pcs_tbl_num            = ARRAY_SIZE(ipq8074_pcie_pcs_tbl),
2332        .clk_list               = ipq8074_pciephy_clk_l,
2333        .num_clks               = ARRAY_SIZE(ipq8074_pciephy_clk_l),
2334        .reset_list             = ipq8074_pciephy_reset_l,
2335        .num_resets             = ARRAY_SIZE(ipq8074_pciephy_reset_l),
2336        .vreg_list              = NULL,
2337        .num_vregs              = 0,
2338        .regs                   = pciephy_regs_layout,
2339
2340        .start_ctrl             = SERDES_START | PCS_START,
2341        .pwrdn_ctrl             = SW_PWRDN | REFCLK_DRV_DSBL,
2342
2343        .has_phy_com_ctrl       = false,
2344        .has_lane_rst           = false,
2345        .has_pwrdn_delay        = true,
2346        .pwrdn_delay_min        = 995,          /* us */
2347        .pwrdn_delay_max        = 1005,         /* us */
2348};
2349
2350static const struct qmp_phy_cfg sdm845_qmp_pciephy_cfg = {
2351        .type = PHY_TYPE_PCIE,
2352        .nlanes = 1,
2353
2354        .serdes_tbl             = sdm845_qmp_pcie_serdes_tbl,
2355        .serdes_tbl_num         = ARRAY_SIZE(sdm845_qmp_pcie_serdes_tbl),
2356        .tx_tbl                 = sdm845_qmp_pcie_tx_tbl,
2357        .tx_tbl_num             = ARRAY_SIZE(sdm845_qmp_pcie_tx_tbl),
2358        .rx_tbl                 = sdm845_qmp_pcie_rx_tbl,
2359        .rx_tbl_num             = ARRAY_SIZE(sdm845_qmp_pcie_rx_tbl),
2360        .pcs_tbl                = sdm845_qmp_pcie_pcs_tbl,
2361        .pcs_tbl_num            = ARRAY_SIZE(sdm845_qmp_pcie_pcs_tbl),
2362        .pcs_misc_tbl           = sdm845_qmp_pcie_pcs_misc_tbl,
2363        .pcs_misc_tbl_num       = ARRAY_SIZE(sdm845_qmp_pcie_pcs_misc_tbl),
2364        .clk_list               = sdm845_pciephy_clk_l,
2365        .num_clks               = ARRAY_SIZE(sdm845_pciephy_clk_l),
2366        .reset_list             = sdm845_pciephy_reset_l,
2367        .num_resets             = ARRAY_SIZE(sdm845_pciephy_reset_l),
2368        .vreg_list              = qmp_phy_vreg_l,
2369        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2370        .regs                   = sdm845_qmp_pciephy_regs_layout,
2371
2372        .start_ctrl             = PCS_START | SERDES_START,
2373        .pwrdn_ctrl             = SW_PWRDN | REFCLK_DRV_DSBL,
2374
2375        .has_pwrdn_delay        = true,
2376        .pwrdn_delay_min        = 995,          /* us */
2377        .pwrdn_delay_max        = 1005,         /* us */
2378};
2379
2380static const struct qmp_phy_cfg sdm845_qhp_pciephy_cfg = {
2381        .type = PHY_TYPE_PCIE,
2382        .nlanes = 1,
2383
2384        .serdes_tbl             = sdm845_qhp_pcie_serdes_tbl,
2385        .serdes_tbl_num         = ARRAY_SIZE(sdm845_qhp_pcie_serdes_tbl),
2386        .tx_tbl                 = sdm845_qhp_pcie_tx_tbl,
2387        .tx_tbl_num             = ARRAY_SIZE(sdm845_qhp_pcie_tx_tbl),
2388        .rx_tbl                 = sdm845_qhp_pcie_rx_tbl,
2389        .rx_tbl_num             = ARRAY_SIZE(sdm845_qhp_pcie_rx_tbl),
2390        .pcs_tbl                = sdm845_qhp_pcie_pcs_tbl,
2391        .pcs_tbl_num            = ARRAY_SIZE(sdm845_qhp_pcie_pcs_tbl),
2392        .clk_list               = sdm845_pciephy_clk_l,
2393        .num_clks               = ARRAY_SIZE(sdm845_pciephy_clk_l),
2394        .reset_list             = sdm845_pciephy_reset_l,
2395        .num_resets             = ARRAY_SIZE(sdm845_pciephy_reset_l),
2396        .vreg_list              = qmp_phy_vreg_l,
2397        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2398        .regs                   = sdm845_qhp_pciephy_regs_layout,
2399
2400        .start_ctrl             = PCS_START | SERDES_START,
2401        .pwrdn_ctrl             = SW_PWRDN | REFCLK_DRV_DSBL,
2402
2403        .has_pwrdn_delay        = true,
2404        .pwrdn_delay_min        = 995,          /* us */
2405        .pwrdn_delay_max        = 1005,         /* us */
2406};
2407
2408static const struct qmp_phy_cfg sm8250_qmp_gen3x1_pciephy_cfg = {
2409        .type = PHY_TYPE_PCIE,
2410        .nlanes = 1,
2411
2412        .serdes_tbl             = sm8250_qmp_pcie_serdes_tbl,
2413        .serdes_tbl_num         = ARRAY_SIZE(sm8250_qmp_pcie_serdes_tbl),
2414        .serdes_tbl_sec         = sm8250_qmp_gen3x1_pcie_serdes_tbl,
2415        .serdes_tbl_num_sec     = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_serdes_tbl),
2416        .tx_tbl                 = sm8250_qmp_pcie_tx_tbl,
2417        .tx_tbl_num             = ARRAY_SIZE(sm8250_qmp_pcie_tx_tbl),
2418        .rx_tbl                 = sm8250_qmp_pcie_rx_tbl,
2419        .rx_tbl_num             = ARRAY_SIZE(sm8250_qmp_pcie_rx_tbl),
2420        .rx_tbl_sec             = sm8250_qmp_gen3x1_pcie_rx_tbl,
2421        .rx_tbl_num_sec         = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_rx_tbl),
2422        .pcs_tbl                = sm8250_qmp_pcie_pcs_tbl,
2423        .pcs_tbl_num            = ARRAY_SIZE(sm8250_qmp_pcie_pcs_tbl),
2424        .pcs_tbl_sec            = sm8250_qmp_gen3x1_pcie_pcs_tbl,
2425        .pcs_tbl_num_sec                = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_pcs_tbl),
2426        .pcs_misc_tbl           = sm8250_qmp_pcie_pcs_misc_tbl,
2427        .pcs_misc_tbl_num       = ARRAY_SIZE(sm8250_qmp_pcie_pcs_misc_tbl),
2428        .pcs_misc_tbl_sec               = sm8250_qmp_gen3x1_pcie_pcs_misc_tbl,
2429        .pcs_misc_tbl_num_sec   = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_pcs_misc_tbl),
2430        .clk_list               = sdm845_pciephy_clk_l,
2431        .num_clks               = ARRAY_SIZE(sdm845_pciephy_clk_l),
2432        .reset_list             = sdm845_pciephy_reset_l,
2433        .num_resets             = ARRAY_SIZE(sdm845_pciephy_reset_l),
2434        .vreg_list              = qmp_phy_vreg_l,
2435        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2436        .regs                   = sm8250_pcie_regs_layout,
2437
2438        .start_ctrl             = PCS_START | SERDES_START,
2439        .pwrdn_ctrl             = SW_PWRDN | REFCLK_DRV_DSBL,
2440
2441        .has_pwrdn_delay        = true,
2442        .pwrdn_delay_min        = 995,          /* us */
2443        .pwrdn_delay_max        = 1005,         /* us */
2444};
2445
2446static const struct qmp_phy_cfg sm8250_qmp_gen3x2_pciephy_cfg = {
2447        .type = PHY_TYPE_PCIE,
2448        .nlanes = 2,
2449
2450        .serdes_tbl             = sm8250_qmp_pcie_serdes_tbl,
2451        .serdes_tbl_num         = ARRAY_SIZE(sm8250_qmp_pcie_serdes_tbl),
2452        .tx_tbl                 = sm8250_qmp_pcie_tx_tbl,
2453        .tx_tbl_num             = ARRAY_SIZE(sm8250_qmp_pcie_tx_tbl),
2454        .tx_tbl_sec             = sm8250_qmp_gen3x2_pcie_tx_tbl,
2455        .tx_tbl_num_sec         = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_tx_tbl),
2456        .rx_tbl                 = sm8250_qmp_pcie_rx_tbl,
2457        .rx_tbl_num             = ARRAY_SIZE(sm8250_qmp_pcie_rx_tbl),
2458        .rx_tbl_sec             = sm8250_qmp_gen3x2_pcie_rx_tbl,
2459        .rx_tbl_num_sec         = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_rx_tbl),
2460        .pcs_tbl                = sm8250_qmp_pcie_pcs_tbl,
2461        .pcs_tbl_num            = ARRAY_SIZE(sm8250_qmp_pcie_pcs_tbl),
2462        .pcs_tbl_sec            = sm8250_qmp_gen3x2_pcie_pcs_tbl,
2463        .pcs_tbl_num_sec                = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_pcs_tbl),
2464        .pcs_misc_tbl           = sm8250_qmp_pcie_pcs_misc_tbl,
2465        .pcs_misc_tbl_num       = ARRAY_SIZE(sm8250_qmp_pcie_pcs_misc_tbl),
2466        .pcs_misc_tbl_sec               = sm8250_qmp_gen3x2_pcie_pcs_misc_tbl,
2467        .pcs_misc_tbl_num_sec   = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_pcs_misc_tbl),
2468        .clk_list               = sdm845_pciephy_clk_l,
2469        .num_clks               = ARRAY_SIZE(sdm845_pciephy_clk_l),
2470        .reset_list             = sdm845_pciephy_reset_l,
2471        .num_resets             = ARRAY_SIZE(sdm845_pciephy_reset_l),
2472        .vreg_list              = qmp_phy_vreg_l,
2473        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2474        .regs                   = sm8250_pcie_regs_layout,
2475
2476        .start_ctrl             = PCS_START | SERDES_START,
2477        .pwrdn_ctrl             = SW_PWRDN | REFCLK_DRV_DSBL,
2478
2479        .is_dual_lane_phy       = true,
2480        .has_pwrdn_delay        = true,
2481        .pwrdn_delay_min        = 995,          /* us */
2482        .pwrdn_delay_max        = 1005,         /* us */
2483};
2484
2485static const struct qmp_phy_cfg qmp_v3_usb3phy_cfg = {
2486        .type                   = PHY_TYPE_USB3,
2487        .nlanes                 = 1,
2488
2489        .serdes_tbl             = qmp_v3_usb3_serdes_tbl,
2490        .serdes_tbl_num         = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
2491        .tx_tbl                 = qmp_v3_usb3_tx_tbl,
2492        .tx_tbl_num             = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
2493        .rx_tbl                 = qmp_v3_usb3_rx_tbl,
2494        .rx_tbl_num             = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
2495        .pcs_tbl                = qmp_v3_usb3_pcs_tbl,
2496        .pcs_tbl_num            = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
2497        .clk_list               = qmp_v3_phy_clk_l,
2498        .num_clks               = ARRAY_SIZE(qmp_v3_phy_clk_l),
2499        .reset_list             = msm8996_usb3phy_reset_l,
2500        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2501        .vreg_list              = qmp_phy_vreg_l,
2502        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2503        .regs                   = qmp_v3_usb3phy_regs_layout,
2504
2505        .start_ctrl             = SERDES_START | PCS_START,
2506        .pwrdn_ctrl             = SW_PWRDN,
2507
2508        .has_pwrdn_delay        = true,
2509        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2510        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2511
2512        .has_phy_dp_com_ctrl    = true,
2513        .is_dual_lane_phy       = true,
2514};
2515
2516static const struct qmp_phy_cfg sc7180_usb3phy_cfg = {
2517        .type                   = PHY_TYPE_USB3,
2518        .nlanes                 = 1,
2519
2520        .serdes_tbl             = qmp_v3_usb3_serdes_tbl,
2521        .serdes_tbl_num         = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
2522        .tx_tbl                 = qmp_v3_usb3_tx_tbl,
2523        .tx_tbl_num             = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
2524        .rx_tbl                 = qmp_v3_usb3_rx_tbl,
2525        .rx_tbl_num             = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
2526        .pcs_tbl                = qmp_v3_usb3_pcs_tbl,
2527        .pcs_tbl_num            = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
2528        .clk_list               = qmp_v3_phy_clk_l,
2529        .num_clks               = ARRAY_SIZE(qmp_v3_phy_clk_l),
2530        .reset_list             = sc7180_usb3phy_reset_l,
2531        .num_resets             = ARRAY_SIZE(sc7180_usb3phy_reset_l),
2532        .vreg_list              = qmp_phy_vreg_l,
2533        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2534        .regs                   = qmp_v3_usb3phy_regs_layout,
2535
2536        .start_ctrl             = SERDES_START | PCS_START,
2537        .pwrdn_ctrl             = SW_PWRDN,
2538
2539        .has_pwrdn_delay        = true,
2540        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2541        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2542
2543        .has_phy_dp_com_ctrl    = true,
2544        .is_dual_lane_phy       = true,
2545};
2546
2547static const struct qmp_phy_cfg sc7180_dpphy_cfg = {
2548        .type                   = PHY_TYPE_DP,
2549        .nlanes                 = 1,
2550
2551        .serdes_tbl             = qmp_v3_dp_serdes_tbl,
2552        .serdes_tbl_num         = ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
2553        .tx_tbl                 = qmp_v3_dp_tx_tbl,
2554        .tx_tbl_num             = ARRAY_SIZE(qmp_v3_dp_tx_tbl),
2555
2556        .serdes_tbl_rbr         = qmp_v3_dp_serdes_tbl_rbr,
2557        .serdes_tbl_rbr_num     = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
2558        .serdes_tbl_hbr         = qmp_v3_dp_serdes_tbl_hbr,
2559        .serdes_tbl_hbr_num     = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
2560        .serdes_tbl_hbr2        = qmp_v3_dp_serdes_tbl_hbr2,
2561        .serdes_tbl_hbr2_num    = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
2562        .serdes_tbl_hbr3        = qmp_v3_dp_serdes_tbl_hbr3,
2563        .serdes_tbl_hbr3_num    = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
2564
2565        .clk_list               = qmp_v3_phy_clk_l,
2566        .num_clks               = ARRAY_SIZE(qmp_v3_phy_clk_l),
2567        .reset_list             = sc7180_usb3phy_reset_l,
2568        .num_resets             = ARRAY_SIZE(sc7180_usb3phy_reset_l),
2569        .vreg_list              = qmp_phy_vreg_l,
2570        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2571        .regs                   = qmp_v3_usb3phy_regs_layout,
2572
2573        .has_phy_dp_com_ctrl    = true,
2574        .is_dual_lane_phy       = true,
2575};
2576
2577static const struct qmp_phy_combo_cfg sc7180_usb3dpphy_cfg = {
2578        .usb_cfg                = &sc7180_usb3phy_cfg,
2579        .dp_cfg                 = &sc7180_dpphy_cfg,
2580};
2581
2582static const struct qmp_phy_cfg qmp_v3_usb3_uniphy_cfg = {
2583        .type                   = PHY_TYPE_USB3,
2584        .nlanes                 = 1,
2585
2586        .serdes_tbl             = qmp_v3_usb3_uniphy_serdes_tbl,
2587        .serdes_tbl_num         = ARRAY_SIZE(qmp_v3_usb3_uniphy_serdes_tbl),
2588        .tx_tbl                 = qmp_v3_usb3_uniphy_tx_tbl,
2589        .tx_tbl_num             = ARRAY_SIZE(qmp_v3_usb3_uniphy_tx_tbl),
2590        .rx_tbl                 = qmp_v3_usb3_uniphy_rx_tbl,
2591        .rx_tbl_num             = ARRAY_SIZE(qmp_v3_usb3_uniphy_rx_tbl),
2592        .pcs_tbl                = qmp_v3_usb3_uniphy_pcs_tbl,
2593        .pcs_tbl_num            = ARRAY_SIZE(qmp_v3_usb3_uniphy_pcs_tbl),
2594        .clk_list               = qmp_v3_phy_clk_l,
2595        .num_clks               = ARRAY_SIZE(qmp_v3_phy_clk_l),
2596        .reset_list             = msm8996_usb3phy_reset_l,
2597        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2598        .vreg_list              = qmp_phy_vreg_l,
2599        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2600        .regs                   = qmp_v3_usb3phy_regs_layout,
2601
2602        .start_ctrl             = SERDES_START | PCS_START,
2603        .pwrdn_ctrl             = SW_PWRDN,
2604
2605        .has_pwrdn_delay        = true,
2606        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2607        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2608};
2609
2610static const struct qmp_phy_cfg sdm845_ufsphy_cfg = {
2611        .type                   = PHY_TYPE_UFS,
2612        .nlanes                 = 2,
2613
2614        .serdes_tbl             = sdm845_ufsphy_serdes_tbl,
2615        .serdes_tbl_num         = ARRAY_SIZE(sdm845_ufsphy_serdes_tbl),
2616        .tx_tbl                 = sdm845_ufsphy_tx_tbl,
2617        .tx_tbl_num             = ARRAY_SIZE(sdm845_ufsphy_tx_tbl),
2618        .rx_tbl                 = sdm845_ufsphy_rx_tbl,
2619        .rx_tbl_num             = ARRAY_SIZE(sdm845_ufsphy_rx_tbl),
2620        .pcs_tbl                = sdm845_ufsphy_pcs_tbl,
2621        .pcs_tbl_num            = ARRAY_SIZE(sdm845_ufsphy_pcs_tbl),
2622        .clk_list               = sdm845_ufs_phy_clk_l,
2623        .num_clks               = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
2624        .vreg_list              = qmp_phy_vreg_l,
2625        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2626        .regs                   = sdm845_ufsphy_regs_layout,
2627
2628        .start_ctrl             = SERDES_START,
2629        .pwrdn_ctrl             = SW_PWRDN,
2630
2631        .is_dual_lane_phy       = true,
2632        .no_pcs_sw_reset        = true,
2633};
2634
2635static const struct qmp_phy_cfg msm8998_pciephy_cfg = {
2636        .type                   = PHY_TYPE_PCIE,
2637        .nlanes                 = 1,
2638
2639        .serdes_tbl             = msm8998_pcie_serdes_tbl,
2640        .serdes_tbl_num         = ARRAY_SIZE(msm8998_pcie_serdes_tbl),
2641        .tx_tbl                 = msm8998_pcie_tx_tbl,
2642        .tx_tbl_num             = ARRAY_SIZE(msm8998_pcie_tx_tbl),
2643        .rx_tbl                 = msm8998_pcie_rx_tbl,
2644        .rx_tbl_num             = ARRAY_SIZE(msm8998_pcie_rx_tbl),
2645        .pcs_tbl                = msm8998_pcie_pcs_tbl,
2646        .pcs_tbl_num            = ARRAY_SIZE(msm8998_pcie_pcs_tbl),
2647        .clk_list               = msm8996_phy_clk_l,
2648        .num_clks               = ARRAY_SIZE(msm8996_phy_clk_l),
2649        .reset_list             = ipq8074_pciephy_reset_l,
2650        .num_resets             = ARRAY_SIZE(ipq8074_pciephy_reset_l),
2651        .vreg_list              = qmp_phy_vreg_l,
2652        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2653        .regs                   = pciephy_regs_layout,
2654
2655        .start_ctrl             = SERDES_START | PCS_START,
2656        .pwrdn_ctrl             = SW_PWRDN | REFCLK_DRV_DSBL,
2657};
2658
2659static const struct qmp_phy_cfg msm8998_usb3phy_cfg = {
2660        .type                   = PHY_TYPE_USB3,
2661        .nlanes                 = 1,
2662
2663        .serdes_tbl             = msm8998_usb3_serdes_tbl,
2664        .serdes_tbl_num         = ARRAY_SIZE(msm8998_usb3_serdes_tbl),
2665        .tx_tbl                 = msm8998_usb3_tx_tbl,
2666        .tx_tbl_num             = ARRAY_SIZE(msm8998_usb3_tx_tbl),
2667        .rx_tbl                 = msm8998_usb3_rx_tbl,
2668        .rx_tbl_num             = ARRAY_SIZE(msm8998_usb3_rx_tbl),
2669        .pcs_tbl                = msm8998_usb3_pcs_tbl,
2670        .pcs_tbl_num            = ARRAY_SIZE(msm8998_usb3_pcs_tbl),
2671        .clk_list               = msm8996_phy_clk_l,
2672        .num_clks               = ARRAY_SIZE(msm8996_phy_clk_l),
2673        .reset_list             = msm8996_usb3phy_reset_l,
2674        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2675        .vreg_list              = qmp_phy_vreg_l,
2676        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2677        .regs                   = qmp_v3_usb3phy_regs_layout,
2678
2679        .start_ctrl             = SERDES_START | PCS_START,
2680        .pwrdn_ctrl             = SW_PWRDN,
2681
2682        .is_dual_lane_phy       = true,
2683};
2684
2685static const struct qmp_phy_cfg sm8150_ufsphy_cfg = {
2686        .type                   = PHY_TYPE_UFS,
2687        .nlanes                 = 2,
2688
2689        .serdes_tbl             = sm8150_ufsphy_serdes_tbl,
2690        .serdes_tbl_num         = ARRAY_SIZE(sm8150_ufsphy_serdes_tbl),
2691        .tx_tbl                 = sm8150_ufsphy_tx_tbl,
2692        .tx_tbl_num             = ARRAY_SIZE(sm8150_ufsphy_tx_tbl),
2693        .rx_tbl                 = sm8150_ufsphy_rx_tbl,
2694        .rx_tbl_num             = ARRAY_SIZE(sm8150_ufsphy_rx_tbl),
2695        .pcs_tbl                = sm8150_ufsphy_pcs_tbl,
2696        .pcs_tbl_num            = ARRAY_SIZE(sm8150_ufsphy_pcs_tbl),
2697        .clk_list               = sdm845_ufs_phy_clk_l,
2698        .num_clks               = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
2699        .vreg_list              = qmp_phy_vreg_l,
2700        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2701        .regs                   = sm8150_ufsphy_regs_layout,
2702
2703        .start_ctrl             = SERDES_START,
2704        .pwrdn_ctrl             = SW_PWRDN,
2705
2706        .is_dual_lane_phy       = true,
2707};
2708
2709static const struct qmp_phy_cfg sm8150_usb3phy_cfg = {
2710        .type                   = PHY_TYPE_USB3,
2711        .nlanes                 = 1,
2712
2713        .serdes_tbl             = sm8150_usb3_serdes_tbl,
2714        .serdes_tbl_num         = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
2715        .tx_tbl                 = sm8150_usb3_tx_tbl,
2716        .tx_tbl_num             = ARRAY_SIZE(sm8150_usb3_tx_tbl),
2717        .rx_tbl                 = sm8150_usb3_rx_tbl,
2718        .rx_tbl_num             = ARRAY_SIZE(sm8150_usb3_rx_tbl),
2719        .pcs_tbl                = sm8150_usb3_pcs_tbl,
2720        .pcs_tbl_num            = ARRAY_SIZE(sm8150_usb3_pcs_tbl),
2721        .clk_list               = qmp_v4_phy_clk_l,
2722        .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
2723        .reset_list             = msm8996_usb3phy_reset_l,
2724        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2725        .vreg_list              = qmp_phy_vreg_l,
2726        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2727        .regs                   = qmp_v4_usb3phy_regs_layout,
2728
2729        .start_ctrl             = SERDES_START | PCS_START,
2730        .pwrdn_ctrl             = SW_PWRDN,
2731
2732        .has_pwrdn_delay        = true,
2733        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2734        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2735
2736        .has_phy_dp_com_ctrl    = true,
2737        .is_dual_lane_phy       = true,
2738};
2739
2740static const struct qmp_phy_cfg sm8150_usb3_uniphy_cfg = {
2741        .type                   = PHY_TYPE_USB3,
2742        .nlanes                 = 1,
2743
2744        .serdes_tbl             = sm8150_usb3_uniphy_serdes_tbl,
2745        .serdes_tbl_num         = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
2746        .tx_tbl                 = sm8150_usb3_uniphy_tx_tbl,
2747        .tx_tbl_num             = ARRAY_SIZE(sm8150_usb3_uniphy_tx_tbl),
2748        .rx_tbl                 = sm8150_usb3_uniphy_rx_tbl,
2749        .rx_tbl_num             = ARRAY_SIZE(sm8150_usb3_uniphy_rx_tbl),
2750        .pcs_tbl                = sm8150_usb3_uniphy_pcs_tbl,
2751        .pcs_tbl_num            = ARRAY_SIZE(sm8150_usb3_uniphy_pcs_tbl),
2752        .clk_list               = qmp_v4_phy_clk_l,
2753        .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
2754        .reset_list             = msm8996_usb3phy_reset_l,
2755        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2756        .vreg_list              = qmp_phy_vreg_l,
2757        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2758        .regs                   = qmp_v4_usb3_uniphy_regs_layout,
2759
2760        .start_ctrl             = SERDES_START | PCS_START,
2761        .pwrdn_ctrl             = SW_PWRDN,
2762
2763        .has_pwrdn_delay        = true,
2764        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2765        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2766};
2767
2768static const struct qmp_phy_cfg sm8250_usb3phy_cfg = {
2769        .type                   = PHY_TYPE_USB3,
2770        .nlanes                 = 1,
2771
2772        .serdes_tbl             = sm8150_usb3_serdes_tbl,
2773        .serdes_tbl_num         = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
2774        .tx_tbl                 = sm8250_usb3_tx_tbl,
2775        .tx_tbl_num             = ARRAY_SIZE(sm8250_usb3_tx_tbl),
2776        .rx_tbl                 = sm8250_usb3_rx_tbl,
2777        .rx_tbl_num             = ARRAY_SIZE(sm8250_usb3_rx_tbl),
2778        .pcs_tbl                = sm8250_usb3_pcs_tbl,
2779        .pcs_tbl_num            = ARRAY_SIZE(sm8250_usb3_pcs_tbl),
2780        .clk_list               = qmp_v4_sm8250_usbphy_clk_l,
2781        .num_clks               = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l),
2782        .reset_list             = msm8996_usb3phy_reset_l,
2783        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2784        .vreg_list              = qmp_phy_vreg_l,
2785        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2786        .regs                   = qmp_v4_usb3phy_regs_layout,
2787
2788        .start_ctrl             = SERDES_START | PCS_START,
2789        .pwrdn_ctrl             = SW_PWRDN,
2790
2791        .has_pwrdn_delay        = true,
2792        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2793        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2794
2795        .has_phy_dp_com_ctrl    = true,
2796        .is_dual_lane_phy       = true,
2797};
2798
2799static const struct qmp_phy_cfg sm8250_usb3_uniphy_cfg = {
2800        .type                   = PHY_TYPE_USB3,
2801        .nlanes                 = 1,
2802
2803        .serdes_tbl             = sm8150_usb3_uniphy_serdes_tbl,
2804        .serdes_tbl_num         = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
2805        .tx_tbl                 = sm8250_usb3_uniphy_tx_tbl,
2806        .tx_tbl_num             = ARRAY_SIZE(sm8250_usb3_uniphy_tx_tbl),
2807        .rx_tbl                 = sm8250_usb3_uniphy_rx_tbl,
2808        .rx_tbl_num             = ARRAY_SIZE(sm8250_usb3_uniphy_rx_tbl),
2809        .pcs_tbl                = sm8250_usb3_uniphy_pcs_tbl,
2810        .pcs_tbl_num            = ARRAY_SIZE(sm8250_usb3_uniphy_pcs_tbl),
2811        .clk_list               = qmp_v4_phy_clk_l,
2812        .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
2813        .reset_list             = msm8996_usb3phy_reset_l,
2814        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2815        .vreg_list              = qmp_phy_vreg_l,
2816        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
2817        .regs                   = qmp_v4_usb3_uniphy_regs_layout,
2818
2819        .start_ctrl             = SERDES_START | PCS_START,
2820        .pwrdn_ctrl             = SW_PWRDN,
2821
2822        .has_pwrdn_delay        = true,
2823        .pwrdn_delay_min        = POWER_DOWN_DELAY_US_MIN,
2824        .pwrdn_delay_max        = POWER_DOWN_DELAY_US_MAX,
2825};
2826
2827static void qcom_qmp_phy_configure_lane(void __iomem *base,
2828                                        const unsigned int *regs,
2829                                        const struct qmp_phy_init_tbl tbl[],
2830                                        int num,
2831                                        u8 lane_mask)
2832{
2833        int i;
2834        const struct qmp_phy_init_tbl *t = tbl;
2835
2836        if (!t)
2837                return;
2838
2839        for (i = 0; i < num; i++, t++) {
2840                if (!(t->lane_mask & lane_mask))
2841                        continue;
2842
2843                if (t->in_layout)
2844                        writel(t->val, base + regs[t->offset]);
2845                else
2846                        writel(t->val, base + t->offset);
2847        }
2848}
2849
2850static void qcom_qmp_phy_configure(void __iomem *base,
2851                                   const unsigned int *regs,
2852                                   const struct qmp_phy_init_tbl tbl[],
2853                                   int num)
2854{
2855        qcom_qmp_phy_configure_lane(base, regs, tbl, num, 0xff);
2856}
2857
2858static int qcom_qmp_phy_serdes_init(struct qmp_phy *qphy)
2859{
2860        struct qcom_qmp *qmp = qphy->qmp;
2861        const struct qmp_phy_cfg *cfg = qphy->cfg;
2862        void __iomem *serdes = qphy->serdes;
2863        const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
2864        const struct qmp_phy_init_tbl *serdes_tbl = cfg->serdes_tbl;
2865        int serdes_tbl_num = cfg->serdes_tbl_num;
2866        int ret;
2867
2868        qcom_qmp_phy_configure(serdes, cfg->regs, serdes_tbl, serdes_tbl_num);
2869        if (cfg->serdes_tbl_sec)
2870                qcom_qmp_phy_configure(serdes, cfg->regs, cfg->serdes_tbl_sec,
2871                                       cfg->serdes_tbl_num_sec);
2872
2873        if (cfg->type == PHY_TYPE_DP) {
2874                switch (dp_opts->link_rate) {
2875                case 1620:
2876                        qcom_qmp_phy_configure(serdes, cfg->regs,
2877                                               cfg->serdes_tbl_rbr,
2878                                               cfg->serdes_tbl_rbr_num);
2879                        break;
2880                case 2700:
2881                        qcom_qmp_phy_configure(serdes, cfg->regs,
2882                                               cfg->serdes_tbl_hbr,
2883                                               cfg->serdes_tbl_hbr_num);
2884                        break;
2885                case 5400:
2886                        qcom_qmp_phy_configure(serdes, cfg->regs,
2887                                               cfg->serdes_tbl_hbr2,
2888                                               cfg->serdes_tbl_hbr2_num);
2889                        break;
2890                case 8100:
2891                        qcom_qmp_phy_configure(serdes, cfg->regs,
2892                                               cfg->serdes_tbl_hbr3,
2893                                               cfg->serdes_tbl_hbr3_num);
2894                        break;
2895                default:
2896                        /* Other link rates aren't supported */
2897                        return -EINVAL;
2898                }
2899        }
2900
2901
2902        if (cfg->has_phy_com_ctrl) {
2903                void __iomem *status;
2904                unsigned int mask, val;
2905
2906                qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET], SW_RESET);
2907                qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
2908                             SERDES_START | PCS_START);
2909
2910                status = serdes + cfg->regs[QPHY_COM_PCS_READY_STATUS];
2911                mask = cfg->mask_com_pcs_ready;
2912
2913                ret = readl_poll_timeout(status, val, (val & mask), 10,
2914                                         PHY_INIT_COMPLETE_TIMEOUT);
2915                if (ret) {
2916                        dev_err(qmp->dev,
2917                                "phy common block init timed-out\n");
2918                        return ret;
2919                }
2920        }
2921
2922        return 0;
2923}
2924
2925static void qcom_qmp_phy_dp_aux_init(struct qmp_phy *qphy)
2926{
2927        writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
2928               DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
2929               qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
2930
2931        /* Turn on BIAS current for PHY/PLL */
2932        writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX |
2933               QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL,
2934               qphy->serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
2935
2936        writel(DP_PHY_PD_CTL_PSR_PWRDN, qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
2937
2938        writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
2939               DP_PHY_PD_CTL_LANE_0_1_PWRDN |
2940               DP_PHY_PD_CTL_LANE_2_3_PWRDN | DP_PHY_PD_CTL_PLL_PWRDN |
2941               DP_PHY_PD_CTL_DP_CLAMP_EN,
2942               qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
2943
2944        writel(QSERDES_V3_COM_BIAS_EN |
2945               QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN |
2946               QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL |
2947               QSERDES_V3_COM_CLKBUF_RX_DRIVE_L,
2948               qphy->serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
2949
2950        writel(0x00, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG0);
2951        writel(0x13, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG1);
2952        writel(0x24, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG2);
2953        writel(0x00, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG3);
2954        writel(0x0a, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG4);
2955        writel(0x26, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG5);
2956        writel(0x0a, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG6);
2957        writel(0x03, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG7);
2958        writel(0xbb, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG8);
2959        writel(0x03, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG9);
2960        qphy->dp_aux_cfg = 0;
2961
2962        writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
2963               PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
2964               PHY_AUX_REQ_ERR_MASK,
2965               qphy->pcs + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK);
2966}
2967
2968static const u8 qmp_dp_v3_pre_emphasis_hbr_rbr[4][4] = {
2969        { 0x00, 0x0c, 0x14, 0x19 },
2970        { 0x00, 0x0b, 0x12, 0xff },
2971        { 0x00, 0x0b, 0xff, 0xff },
2972        { 0x04, 0xff, 0xff, 0xff }
2973};
2974
2975static const u8 qmp_dp_v3_voltage_swing_hbr_rbr[4][4] = {
2976        { 0x08, 0x0f, 0x16, 0x1f },
2977        { 0x11, 0x1e, 0x1f, 0xff },
2978        { 0x19, 0x1f, 0xff, 0xff },
2979        { 0x1f, 0xff, 0xff, 0xff }
2980};
2981
2982static void qcom_qmp_phy_configure_dp_tx(struct qmp_phy *qphy)
2983{
2984        const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
2985        unsigned int v_level = 0, p_level = 0;
2986        u32 bias_en, drvr_en;
2987        u8 voltage_swing_cfg, pre_emphasis_cfg;
2988        int i;
2989
2990        for (i = 0; i < dp_opts->lanes; i++) {
2991                v_level = max(v_level, dp_opts->voltage[i]);
2992                p_level = max(p_level, dp_opts->pre[i]);
2993        }
2994
2995        if (dp_opts->lanes == 1) {
2996                bias_en = 0x3e;
2997                drvr_en = 0x13;
2998        } else {
2999                bias_en = 0x3f;
3000                drvr_en = 0x10;
3001        }
3002
3003        voltage_swing_cfg = qmp_dp_v3_voltage_swing_hbr_rbr[v_level][p_level];
3004        pre_emphasis_cfg = qmp_dp_v3_pre_emphasis_hbr_rbr[v_level][p_level];
3005
3006        /* TODO: Move check to config check */
3007        if (voltage_swing_cfg == 0xFF && pre_emphasis_cfg == 0xFF)
3008                return;
3009
3010        /* Enable MUX to use Cursor values from these registers */
3011        voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN;
3012        pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN;
3013
3014        writel(voltage_swing_cfg, qphy->tx + QSERDES_V3_TX_TX_DRV_LVL);
3015        writel(pre_emphasis_cfg, qphy->tx + QSERDES_V3_TX_TX_EMP_POST1_LVL);
3016        writel(voltage_swing_cfg, qphy->tx2 + QSERDES_V3_TX_TX_DRV_LVL);
3017        writel(pre_emphasis_cfg, qphy->tx2 + QSERDES_V3_TX_TX_EMP_POST1_LVL);
3018
3019        writel(drvr_en, qphy->tx + QSERDES_V3_TX_HIGHZ_DRVR_EN);
3020        writel(bias_en, qphy->tx + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
3021        writel(drvr_en, qphy->tx2 + QSERDES_V3_TX_HIGHZ_DRVR_EN);
3022        writel(bias_en, qphy->tx2 + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
3023}
3024
3025static int qcom_qmp_dp_phy_configure(struct phy *phy, union phy_configure_opts *opts)
3026{
3027        const struct phy_configure_opts_dp *dp_opts = &opts->dp;
3028        struct qmp_phy *qphy = phy_get_drvdata(phy);
3029
3030        memcpy(&qphy->dp_opts, dp_opts, sizeof(*dp_opts));
3031        if (qphy->dp_opts.set_voltages) {
3032                qcom_qmp_phy_configure_dp_tx(qphy);
3033                qphy->dp_opts.set_voltages = 0;
3034        }
3035
3036        return 0;
3037}
3038
3039static int qcom_qmp_phy_configure_dp_phy(struct qmp_phy *qphy)
3040{
3041        const struct qmp_phy_dp_clks *dp_clks = qphy->dp_clks;
3042        const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
3043        u32 val, phy_vco_div, status;
3044        unsigned long pixel_freq;
3045
3046        val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
3047              DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN;
3048
3049        /*
3050         * TODO: Assume orientation is CC1 for now and two lanes, need to
3051         * use type-c connector to understand orientation and lanes.
3052         *
3053         * Otherwise val changes to be like below if this code understood
3054         * the orientation of the type-c cable.
3055         *
3056         * if (lane_cnt == 4 || orientation == ORIENTATION_CC2)
3057         *      val |= DP_PHY_PD_CTL_LANE_0_1_PWRDN;
3058         * if (lane_cnt == 4 || orientation == ORIENTATION_CC1)
3059         *      val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
3060         * if (orientation == ORIENTATION_CC2)
3061         *      writel(0x4c, qphy->pcs + QSERDES_V3_DP_PHY_MODE);
3062         */
3063        val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
3064        writel(val, qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
3065
3066        writel(0x5c, qphy->pcs + QSERDES_V3_DP_PHY_MODE);
3067        writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL);
3068        writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL);
3069
3070        switch (dp_opts->link_rate) {
3071        case 1620:
3072                phy_vco_div = 0x1;
3073                pixel_freq = 1620000000UL / 2;
3074                break;
3075        case 2700:
3076                phy_vco_div = 0x1;
3077                pixel_freq = 2700000000UL / 2;
3078                break;
3079        case 5400:
3080                phy_vco_div = 0x2;
3081                pixel_freq = 5400000000UL / 4;
3082                break;
3083        case 8100:
3084                phy_vco_div = 0x0;
3085                pixel_freq = 8100000000UL / 6;
3086                break;
3087        default:
3088                /* Other link rates aren't supported */
3089                return -EINVAL;
3090        }
3091        writel(phy_vco_div, qphy->pcs + QSERDES_V3_DP_PHY_VCO_DIV);
3092
3093        clk_set_rate(dp_clks->dp_link_hw.clk, dp_opts->link_rate * 100000);
3094        clk_set_rate(dp_clks->dp_pixel_hw.clk, pixel_freq);
3095
3096        writel(0x04, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG2);
3097        writel(0x01, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
3098        writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
3099        writel(0x01, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
3100        writel(0x09, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
3101
3102        writel(0x20, qphy->serdes + QSERDES_V3_COM_RESETSM_CNTRL);
3103
3104        if (readl_poll_timeout(qphy->serdes + QSERDES_V3_COM_C_READY_STATUS,
3105                        status,
3106                        ((status & BIT(0)) > 0),
3107                        500,
3108                        10000))
3109                return -ETIMEDOUT;
3110
3111        writel(0x19, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
3112
3113        if (readl_poll_timeout(qphy->pcs + QSERDES_V3_DP_PHY_STATUS,
3114                        status,
3115                        ((status & BIT(1)) > 0),
3116                        500,
3117                        10000))
3118                return -ETIMEDOUT;
3119
3120        writel(0x18, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
3121        udelay(2000);
3122        writel(0x19, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
3123
3124        return readl_poll_timeout(qphy->pcs + QSERDES_V3_DP_PHY_STATUS,
3125                        status,
3126                        ((status & BIT(1)) > 0),
3127                        500,
3128                        10000);
3129}
3130
3131/*
3132 * We need to calibrate the aux setting here as many times
3133 * as the caller tries
3134 */
3135static int qcom_qmp_dp_phy_calibrate(struct phy *phy)
3136{
3137        struct qmp_phy *qphy = phy_get_drvdata(phy);
3138        const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d };
3139        u8 val;
3140
3141        qphy->dp_aux_cfg++;
3142        qphy->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
3143        val = cfg1_settings[qphy->dp_aux_cfg];
3144
3145        writel(val, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG1);
3146
3147        return 0;
3148}
3149
3150static int qcom_qmp_phy_com_init(struct qmp_phy *qphy)
3151{
3152        struct qcom_qmp *qmp = qphy->qmp;
3153        const struct qmp_phy_cfg *cfg = qphy->cfg;
3154        void __iomem *serdes = qphy->serdes;
3155        void __iomem *pcs = qphy->pcs;
3156        void __iomem *dp_com = qmp->dp_com;
3157        int ret, i;
3158
3159        mutex_lock(&qmp->phy_mutex);
3160        if (qmp->init_count++) {
3161                mutex_unlock(&qmp->phy_mutex);
3162                return 0;
3163        }
3164
3165        /* turn on regulator supplies */
3166        ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
3167        if (ret) {
3168                dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
3169                goto err_reg_enable;
3170        }
3171
3172        for (i = 0; i < cfg->num_resets; i++) {
3173                ret = reset_control_assert(qmp->resets[i]);
3174                if (ret) {
3175                        dev_err(qmp->dev, "%s reset assert failed\n",
3176                                cfg->reset_list[i]);
3177                        goto err_rst_assert;
3178                }
3179        }
3180
3181        for (i = cfg->num_resets - 1; i >= 0; i--) {
3182                ret = reset_control_deassert(qmp->resets[i]);
3183                if (ret) {
3184                        dev_err(qmp->dev, "%s reset deassert failed\n",
3185                                qphy->cfg->reset_list[i]);
3186                        goto err_rst;
3187                }
3188        }
3189
3190        ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
3191        if (ret) {
3192                dev_err(qmp->dev, "failed to enable clks, err=%d\n", ret);
3193                goto err_rst;
3194        }
3195
3196        if (cfg->has_phy_dp_com_ctrl) {
3197                qphy_setbits(dp_com, QPHY_V3_DP_COM_POWER_DOWN_CTRL,
3198                             SW_PWRDN);
3199                /* override hardware control for reset of qmp phy */
3200                qphy_setbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
3201                             SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
3202                             SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
3203
3204                /* Default type-c orientation, i.e CC1 */
3205                qphy_setbits(dp_com, QPHY_V3_DP_COM_TYPEC_CTRL, 0x02);
3206
3207                qphy_setbits(dp_com, QPHY_V3_DP_COM_PHY_MODE_CTRL,
3208                             USB3_MODE | DP_MODE);
3209
3210                /* bring both QMP USB and QMP DP PHYs PCS block out of reset */
3211                qphy_clrbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
3212                             SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
3213                             SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
3214
3215                qphy_clrbits(dp_com, QPHY_V3_DP_COM_SWI_CTRL, 0x03);
3216                qphy_clrbits(dp_com, QPHY_V3_DP_COM_SW_RESET, SW_RESET);
3217        }
3218
3219        if (cfg->has_phy_com_ctrl) {
3220                qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
3221                             SW_PWRDN);
3222        } else {
3223                if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL])
3224                        qphy_setbits(pcs,
3225                                        cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
3226                                        cfg->pwrdn_ctrl);
3227                else
3228                        qphy_setbits(pcs, QPHY_POWER_DOWN_CONTROL,
3229                                        cfg->pwrdn_ctrl);
3230        }
3231
3232        mutex_unlock(&qmp->phy_mutex);
3233
3234        return 0;
3235
3236err_rst:
3237        while (++i < cfg->num_resets)
3238                reset_control_assert(qmp->resets[i]);
3239err_rst_assert:
3240        regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
3241err_reg_enable:
3242        mutex_unlock(&qmp->phy_mutex);
3243
3244        return ret;
3245}
3246
3247static int qcom_qmp_phy_com_exit(struct qmp_phy *qphy)
3248{
3249        struct qcom_qmp *qmp = qphy->qmp;
3250        const struct qmp_phy_cfg *cfg = qphy->cfg;
3251        void __iomem *serdes = qphy->serdes;
3252        int i = cfg->num_resets;
3253
3254        mutex_lock(&qmp->phy_mutex);
3255        if (--qmp->init_count) {
3256                mutex_unlock(&qmp->phy_mutex);
3257                return 0;
3258        }
3259
3260        reset_control_assert(qmp->ufs_reset);
3261        if (cfg->has_phy_com_ctrl) {
3262                qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
3263                             SERDES_START | PCS_START);
3264                qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET],
3265                             SW_RESET);
3266                qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
3267                             SW_PWRDN);
3268        }
3269
3270        while (--i >= 0)
3271                reset_control_assert(qmp->resets[i]);
3272
3273        clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
3274
3275        regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
3276
3277        mutex_unlock(&qmp->phy_mutex);
3278
3279        return 0;
3280}
3281
3282static int qcom_qmp_phy_init(struct phy *phy)
3283{
3284        struct qmp_phy *qphy = phy_get_drvdata(phy);
3285        struct qcom_qmp *qmp = qphy->qmp;
3286        const struct qmp_phy_cfg *cfg = qphy->cfg;
3287        int ret;
3288        dev_vdbg(qmp->dev, "Initializing QMP phy\n");
3289
3290        if (cfg->no_pcs_sw_reset) {
3291                /*
3292                 * Get UFS reset, which is delayed until now to avoid a
3293                 * circular dependency where UFS needs its PHY, but the PHY
3294                 * needs this UFS reset.
3295                 */
3296                if (!qmp->ufs_reset) {
3297                        qmp->ufs_reset =
3298                                devm_reset_control_get_exclusive(qmp->dev,
3299                                                                 "ufsphy");
3300
3301                        if (IS_ERR(qmp->ufs_reset)) {
3302                                ret = PTR_ERR(qmp->ufs_reset);
3303                                dev_err(qmp->dev,
3304                                        "failed to get UFS reset: %d\n",
3305                                        ret);
3306
3307                                qmp->ufs_reset = NULL;
3308                                return ret;
3309                        }
3310                }
3311
3312                ret = reset_control_assert(qmp->ufs_reset);
3313                if (ret)
3314                        return ret;
3315        }
3316
3317        ret = qcom_qmp_phy_com_init(qphy);
3318        if (ret)
3319                return ret;
3320
3321        if (cfg->type == PHY_TYPE_DP)
3322                qcom_qmp_phy_dp_aux_init(qphy);
3323
3324        return 0;
3325}
3326
3327static int qcom_qmp_phy_power_on(struct phy *phy)
3328{
3329        struct qmp_phy *qphy = phy_get_drvdata(phy);
3330        struct qcom_qmp *qmp = qphy->qmp;
3331        const struct qmp_phy_cfg *cfg = qphy->cfg;
3332        void __iomem *tx = qphy->tx;
3333        void __iomem *rx = qphy->rx;
3334        void __iomem *pcs = qphy->pcs;
3335        void __iomem *pcs_misc = qphy->pcs_misc;
3336        void __iomem *status;
3337        unsigned int mask, val, ready;
3338        int ret;
3339
3340        qcom_qmp_phy_serdes_init(qphy);
3341
3342        if (cfg->has_lane_rst) {
3343                ret = reset_control_deassert(qphy->lane_rst);
3344                if (ret) {
3345                        dev_err(qmp->dev, "lane%d reset deassert failed\n",
3346                                qphy->index);
3347                        goto err_lane_rst;
3348                }
3349        }
3350
3351        ret = clk_prepare_enable(qphy->pipe_clk);
3352        if (ret) {
3353                dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret);
3354                goto err_clk_enable;
3355        }
3356
3357        /* Tx, Rx, and PCS configurations */
3358        qcom_qmp_phy_configure_lane(tx, cfg->regs,
3359                                    cfg->tx_tbl, cfg->tx_tbl_num, 1);
3360        if (cfg->tx_tbl_sec)
3361                qcom_qmp_phy_configure_lane(tx, cfg->regs, cfg->tx_tbl_sec,
3362                                            cfg->tx_tbl_num_sec, 1);
3363
3364        /* Configuration for other LANE for USB-DP combo PHY */
3365        if (cfg->is_dual_lane_phy) {
3366                qcom_qmp_phy_configure_lane(qphy->tx2, cfg->regs,
3367                                            cfg->tx_tbl, cfg->tx_tbl_num, 2);
3368                if (cfg->tx_tbl_sec)
3369                        qcom_qmp_phy_configure_lane(qphy->tx2, cfg->regs,
3370                                                    cfg->tx_tbl_sec,
3371                                                    cfg->tx_tbl_num_sec, 2);
3372        }
3373
3374        /* Configure special DP tx tunings */
3375        if (cfg->type == PHY_TYPE_DP)
3376                qcom_qmp_phy_configure_dp_tx(qphy);
3377
3378        qcom_qmp_phy_configure_lane(rx, cfg->regs,
3379                                    cfg->rx_tbl, cfg->rx_tbl_num, 1);
3380        if (cfg->rx_tbl_sec)
3381                qcom_qmp_phy_configure_lane(rx, cfg->regs,
3382                                            cfg->rx_tbl_sec, cfg->rx_tbl_num_sec, 1);
3383
3384        if (cfg->is_dual_lane_phy) {
3385                qcom_qmp_phy_configure_lane(qphy->rx2, cfg->regs,
3386                                            cfg->rx_tbl, cfg->rx_tbl_num, 2);
3387                if (cfg->rx_tbl_sec)
3388                        qcom_qmp_phy_configure_lane(qphy->rx2, cfg->regs,
3389                                                    cfg->rx_tbl_sec,
3390                                                    cfg->rx_tbl_num_sec, 2);
3391        }
3392
3393        /* Configure link rate, swing, etc. */
3394        if (cfg->type == PHY_TYPE_DP) {
3395                qcom_qmp_phy_configure_dp_phy(qphy);
3396        } else {
3397                qcom_qmp_phy_configure(pcs, cfg->regs, cfg->pcs_tbl, cfg->pcs_tbl_num);
3398                if (cfg->pcs_tbl_sec)
3399                        qcom_qmp_phy_configure(pcs, cfg->regs, cfg->pcs_tbl_sec,
3400                                               cfg->pcs_tbl_num_sec);
3401        }
3402
3403        ret = reset_control_deassert(qmp->ufs_reset);
3404        if (ret)
3405                goto err_lane_rst;
3406
3407        qcom_qmp_phy_configure(pcs_misc, cfg->regs, cfg->pcs_misc_tbl,
3408                               cfg->pcs_misc_tbl_num);
3409        if (cfg->pcs_misc_tbl_sec)
3410                qcom_qmp_phy_configure(pcs_misc, cfg->regs, cfg->pcs_misc_tbl_sec,
3411                                       cfg->pcs_misc_tbl_num_sec);
3412
3413        /*
3414         * Pull out PHY from POWER DOWN state.
3415         * This is active low enable signal to power-down PHY.
3416         */
3417        if(cfg->type == PHY_TYPE_PCIE)
3418                qphy_setbits(pcs, QPHY_POWER_DOWN_CONTROL, cfg->pwrdn_ctrl);
3419
3420        if (cfg->has_pwrdn_delay)
3421                usleep_range(cfg->pwrdn_delay_min, cfg->pwrdn_delay_max);
3422
3423        if (cfg->type != PHY_TYPE_DP) {
3424                /* Pull PHY out of reset state */
3425                if (!cfg->no_pcs_sw_reset)
3426                        qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
3427                /* start SerDes and Phy-Coding-Sublayer */
3428                qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
3429
3430                if (cfg->type == PHY_TYPE_UFS) {
3431                        status = pcs + cfg->regs[QPHY_PCS_READY_STATUS];
3432                        mask = PCS_READY;
3433                        ready = PCS_READY;
3434                } else {
3435                        status = pcs + cfg->regs[QPHY_PCS_STATUS];
3436                        mask = PHYSTATUS;
3437                        ready = 0;
3438                }
3439
3440                ret = readl_poll_timeout(status, val, (val & mask) == ready, 10,
3441                                         PHY_INIT_COMPLETE_TIMEOUT);
3442                if (ret) {
3443                        dev_err(qmp->dev, "phy initialization timed-out\n");
3444                        goto err_pcs_ready;
3445                }
3446        }
3447        return 0;
3448
3449err_pcs_ready:
3450        clk_disable_unprepare(qphy->pipe_clk);
3451err_clk_enable:
3452        if (cfg->has_lane_rst)
3453                reset_control_assert(qphy->lane_rst);
3454err_lane_rst:
3455        return ret;
3456}
3457
3458static int qcom_qmp_phy_power_off(struct phy *phy)
3459{
3460        struct qmp_phy *qphy = phy_get_drvdata(phy);
3461        const struct qmp_phy_cfg *cfg = qphy->cfg;
3462
3463        clk_disable_unprepare(qphy->pipe_clk);
3464
3465        if (cfg->type == PHY_TYPE_DP) {
3466                /* Assert DP PHY power down */
3467                writel(DP_PHY_PD_CTL_PSR_PWRDN, qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
3468        } else {
3469                /* PHY reset */
3470                if (!cfg->no_pcs_sw_reset)
3471                        qphy_setbits(qphy->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
3472
3473                /* stop SerDes and Phy-Coding-Sublayer */
3474                qphy_clrbits(qphy->pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
3475
3476                /* Put PHY into POWER DOWN state: active low */
3477                if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL]) {
3478                        qphy_clrbits(qphy->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
3479                                     cfg->pwrdn_ctrl);
3480                } else {
3481                        qphy_clrbits(qphy->pcs, QPHY_POWER_DOWN_CONTROL,
3482                                        cfg->pwrdn_ctrl);
3483                }
3484        }
3485
3486        return 0;
3487}
3488
3489static int qcom_qmp_phy_exit(struct phy *phy)
3490{
3491        struct qmp_phy *qphy = phy_get_drvdata(phy);
3492        const struct qmp_phy_cfg *cfg = qphy->cfg;
3493
3494        if (cfg->has_lane_rst)
3495                reset_control_assert(qphy->lane_rst);
3496
3497        qcom_qmp_phy_com_exit(qphy);
3498
3499        return 0;
3500}
3501
3502static int qcom_qmp_phy_enable(struct phy *phy)
3503{
3504        int ret;
3505
3506        ret = qcom_qmp_phy_init(phy);
3507        if (ret)
3508                return ret;
3509
3510        ret = qcom_qmp_phy_power_on(phy);
3511        if (ret)
3512                qcom_qmp_phy_exit(phy);
3513
3514        return ret;
3515}
3516
3517static int qcom_qmp_phy_disable(struct phy *phy)
3518{
3519        int ret;
3520
3521        ret = qcom_qmp_phy_power_off(phy);
3522        if (ret)
3523                return ret;
3524        return qcom_qmp_phy_exit(phy);
3525}
3526
3527static int qcom_qmp_phy_set_mode(struct phy *phy,
3528                                 enum phy_mode mode, int submode)
3529{
3530        struct qmp_phy *qphy = phy_get_drvdata(phy);
3531
3532        qphy->mode = mode;
3533
3534        return 0;
3535}
3536
3537static void qcom_qmp_phy_enable_autonomous_mode(struct qmp_phy *qphy)
3538{
3539        const struct qmp_phy_cfg *cfg = qphy->cfg;
3540        void __iomem *pcs = qphy->pcs;
3541        void __iomem *pcs_misc = qphy->pcs_misc;
3542        u32 intr_mask;
3543
3544        if (qphy->mode == PHY_MODE_USB_HOST_SS ||
3545            qphy->mode == PHY_MODE_USB_DEVICE_SS)
3546                intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN;
3547        else
3548                intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL;
3549
3550        /* Clear any pending interrupts status */
3551        qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3552        /* Writing 1 followed by 0 clears the interrupt */
3553        qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3554
3555        qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
3556                     ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL);
3557
3558        /* Enable required PHY autonomous mode interrupts */
3559        qphy_setbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask);
3560
3561        /* Enable i/o clamp_n for autonomous mode */
3562        if (pcs_misc)
3563                qphy_clrbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
3564}
3565
3566static void qcom_qmp_phy_disable_autonomous_mode(struct qmp_phy *qphy)
3567{
3568        const struct qmp_phy_cfg *cfg = qphy->cfg;
3569        void __iomem *pcs = qphy->pcs;
3570        void __iomem *pcs_misc = qphy->pcs_misc;
3571
3572        /* Disable i/o clamp_n on resume for normal mode */
3573        if (pcs_misc)
3574                qphy_setbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
3575
3576        qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
3577                     ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN);
3578
3579        qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3580        /* Writing 1 followed by 0 clears the interrupt */
3581        qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3582}
3583
3584static int __maybe_unused qcom_qmp_phy_runtime_suspend(struct device *dev)
3585{
3586        struct qcom_qmp *qmp = dev_get_drvdata(dev);
3587        struct qmp_phy *qphy = qmp->phys[0];
3588        const struct qmp_phy_cfg *cfg = qphy->cfg;
3589
3590        dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qphy->mode);
3591
3592        /* Supported only for USB3 PHY and luckily USB3 is the first phy */
3593        if (cfg->type != PHY_TYPE_USB3)
3594                return 0;
3595
3596        if (!qmp->init_count) {
3597                dev_vdbg(dev, "PHY not initialized, bailing out\n");
3598                return 0;
3599        }
3600
3601        qcom_qmp_phy_enable_autonomous_mode(qphy);
3602
3603        clk_disable_unprepare(qphy->pipe_clk);
3604        clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
3605
3606        return 0;
3607}
3608
3609static int __maybe_unused qcom_qmp_phy_runtime_resume(struct device *dev)
3610{
3611        struct qcom_qmp *qmp = dev_get_drvdata(dev);
3612        struct qmp_phy *qphy = qmp->phys[0];
3613        const struct qmp_phy_cfg *cfg = qphy->cfg;
3614        int ret = 0;
3615
3616        dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qphy->mode);
3617
3618        /* Supported only for USB3 PHY and luckily USB3 is the first phy */
3619        if (cfg->type != PHY_TYPE_USB3)
3620                return 0;
3621
3622        if (!qmp->init_count) {
3623                dev_vdbg(dev, "PHY not initialized, bailing out\n");
3624                return 0;
3625        }
3626
3627        ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
3628        if (ret) {
3629                dev_err(qmp->dev, "failed to enable clks, err=%d\n", ret);
3630                return ret;
3631        }
3632
3633        ret = clk_prepare_enable(qphy->pipe_clk);
3634        if (ret) {
3635                dev_err(dev, "pipe_clk enable failed, err=%d\n", ret);
3636                clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
3637                return ret;
3638        }
3639
3640        qcom_qmp_phy_disable_autonomous_mode(qphy);
3641
3642        return 0;
3643}
3644
3645static int qcom_qmp_phy_vreg_init(struct device *dev, const struct qmp_phy_cfg *cfg)
3646{
3647        struct qcom_qmp *qmp = dev_get_drvdata(dev);
3648        int num = cfg->num_vregs;
3649        int i;
3650
3651        qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL);
3652        if (!qmp->vregs)
3653                return -ENOMEM;
3654
3655        for (i = 0; i < num; i++)
3656                qmp->vregs[i].supply = cfg->vreg_list[i];
3657
3658        return devm_regulator_bulk_get(dev, num, qmp->vregs);
3659}
3660
3661static int qcom_qmp_phy_reset_init(struct device *dev, const struct qmp_phy_cfg *cfg)
3662{
3663        struct qcom_qmp *qmp = dev_get_drvdata(dev);
3664        int i;
3665
3666        qmp->resets = devm_kcalloc(dev, cfg->num_resets,
3667                                   sizeof(*qmp->resets), GFP_KERNEL);
3668        if (!qmp->resets)
3669                return -ENOMEM;
3670
3671        for (i = 0; i < cfg->num_resets; i++) {
3672                struct reset_control *rst;
3673                const char *name = cfg->reset_list[i];
3674
3675                rst = devm_reset_control_get(dev, name);
3676                if (IS_ERR(rst)) {
3677                        dev_err(dev, "failed to get %s reset\n", name);
3678                        return PTR_ERR(rst);
3679                }
3680                qmp->resets[i] = rst;
3681        }
3682
3683        return 0;
3684}
3685
3686static int qcom_qmp_phy_clk_init(struct device *dev, const struct qmp_phy_cfg *cfg)
3687{
3688        struct qcom_qmp *qmp = dev_get_drvdata(dev);
3689        int num = cfg->num_clks;
3690        int i;
3691
3692        qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
3693        if (!qmp->clks)
3694                return -ENOMEM;
3695
3696        for (i = 0; i < num; i++)
3697                qmp->clks[i].id = cfg->clk_list[i];
3698
3699        return devm_clk_bulk_get(dev, num, qmp->clks);
3700}
3701
3702static void phy_clk_release_provider(void *res)
3703{
3704        of_clk_del_provider(res);
3705}
3706
3707/*
3708 * Register a fixed rate pipe clock.
3709 *
3710 * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
3711 * controls it. The <s>_pipe_clk coming out of the GCC is requested
3712 * by the PHY driver for its operations.
3713 * We register the <s>_pipe_clksrc here. The gcc driver takes care
3714 * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
3715 * Below picture shows this relationship.
3716 *
3717 *         +---------------+
3718 *         |   PHY block   |<<---------------------------------------+
3719 *         |               |                                         |
3720 *         |   +-------+   |                   +-----+               |
3721 *   I/P---^-->|  PLL  |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
3722 *    clk  |   +-------+   |                   +-----+
3723 *         +---------------+
3724 */
3725static int phy_pipe_clk_register(struct qcom_qmp *qmp, struct device_node *np)
3726{
3727        struct clk_fixed_rate *fixed;
3728        struct clk_init_data init = { };
3729        int ret;
3730
3731        ret = of_property_read_string(np, "clock-output-names", &init.name);
3732        if (ret) {
3733                dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np);
3734                return ret;
3735        }
3736
3737        fixed = devm_kzalloc(qmp->dev, sizeof(*fixed), GFP_KERNEL);
3738        if (!fixed)
3739                return -ENOMEM;
3740
3741        init.ops = &clk_fixed_rate_ops;
3742
3743        /* controllers using QMP phys use 125MHz pipe clock interface */
3744        fixed->fixed_rate = 125000000;
3745        fixed->hw.init = &init;
3746
3747        ret = devm_clk_hw_register(qmp->dev, &fixed->hw);
3748        if (ret)
3749                return ret;
3750
3751        ret = of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw);
3752        if (ret)
3753                return ret;
3754
3755        /*
3756         * Roll a devm action because the clock provider is the child node, but
3757         * the child node is not actually a device.
3758         */
3759        ret = devm_add_action(qmp->dev, phy_clk_release_provider, np);
3760        if (ret)
3761                phy_clk_release_provider(np);
3762
3763        return ret;
3764}
3765
3766/*
3767 * Display Port PLL driver block diagram for branch clocks
3768 *
3769 *              +------------------------------+
3770 *              |         DP_VCO_CLK           |
3771 *              |                              |
3772 *              |    +-------------------+     |
3773 *              |    |   (DP PLL/VCO)    |     |
3774 *              |    +---------+---------+     |
3775 *              |              v               |
3776 *              |   +----------+-----------+   |
3777 *              |   | hsclk_divsel_clk_src |   |
3778 *              |   +----------+-----------+   |
3779 *              +------------------------------+
3780 *                              |
3781 *          +---------<---------v------------>----------+
3782 *          |                                           |
3783 * +--------v----------------+                          |
3784 * |    dp_phy_pll_link_clk  |                          |
3785 * |     link_clk            |                          |
3786 * +--------+----------------+                          |
3787 *          |                                           |
3788 *          |                                           |
3789 *          v                                           v
3790 * Input to DISPCC block                                |
3791 * for link clk, crypto clk                             |
3792 * and interface clock                                  |
3793 *                                                      |
3794 *                                                      |
3795 *      +--------<------------+-----------------+---<---+
3796 *      |                     |                 |
3797 * +----v---------+  +--------v-----+  +--------v------+
3798 * | vco_divided  |  | vco_divided  |  | vco_divided   |
3799 * |    _clk_src  |  |    _clk_src  |  |    _clk_src   |
3800 * |              |  |              |  |               |
3801 * |divsel_six    |  |  divsel_two  |  |  divsel_four  |
3802 * +-------+------+  +-----+--------+  +--------+------+
3803 *         |                 |                  |
3804 *         v---->----------v-------------<------v
3805 *                         |
3806 *              +----------+-----------------+
3807 *              |   dp_phy_pll_vco_div_clk   |
3808 *              +---------+------------------+
3809 *                        |
3810 *                        v
3811 *              Input to DISPCC block
3812 *              for DP pixel clock
3813 *
3814 */
3815static int qcom_qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw,
3816                                                struct clk_rate_request *req)
3817{
3818        switch (req->rate) {
3819        case 1620000000UL / 2:
3820        case 2700000000UL / 2:
3821        /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */
3822                return 0;
3823        default:
3824                return -EINVAL;
3825        }
3826}
3827
3828static unsigned long
3829qcom_qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
3830{
3831        const struct qmp_phy_dp_clks *dp_clks;
3832        const struct qmp_phy *qphy;
3833        const struct phy_configure_opts_dp *dp_opts;
3834
3835        dp_clks = container_of(hw, struct qmp_phy_dp_clks, dp_pixel_hw);
3836        qphy = dp_clks->qphy;
3837        dp_opts = &qphy->dp_opts;
3838
3839        switch (dp_opts->link_rate) {
3840        case 1620:
3841                return 1620000000UL / 2;
3842        case 2700:
3843                return 2700000000UL / 2;
3844        case 5400:
3845                return 5400000000UL / 4;
3846        case 8100:
3847                return 8100000000UL / 6;
3848        default:
3849                return 0;
3850        }
3851}
3852
3853static const struct clk_ops qcom_qmp_dp_pixel_clk_ops = {
3854        .determine_rate = qcom_qmp_dp_pixel_clk_determine_rate,
3855        .recalc_rate = qcom_qmp_dp_pixel_clk_recalc_rate,
3856};
3857
3858static int qcom_qmp_dp_link_clk_determine_rate(struct clk_hw *hw,
3859                                               struct clk_rate_request *req)
3860{
3861        switch (req->rate) {
3862        case 162000000:
3863        case 270000000:
3864        case 540000000:
3865        case 810000000:
3866                return 0;
3867        default:
3868                return -EINVAL;
3869        }
3870}
3871
3872static unsigned long
3873qcom_qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
3874{
3875        const struct qmp_phy_dp_clks *dp_clks;
3876        const struct qmp_phy *qphy;
3877        const struct phy_configure_opts_dp *dp_opts;
3878
3879        dp_clks = container_of(hw, struct qmp_phy_dp_clks, dp_link_hw);
3880        qphy = dp_clks->qphy;
3881        dp_opts = &qphy->dp_opts;
3882
3883        switch (dp_opts->link_rate) {
3884        case 1620:
3885        case 2700:
3886        case 5400:
3887        case 8100:
3888                return dp_opts->link_rate * 100000;
3889        default:
3890                return 0;
3891        }
3892}
3893
3894static const struct clk_ops qcom_qmp_dp_link_clk_ops = {
3895        .determine_rate = qcom_qmp_dp_link_clk_determine_rate,
3896        .recalc_rate = qcom_qmp_dp_link_clk_recalc_rate,
3897};
3898
3899static struct clk_hw *
3900qcom_qmp_dp_clks_hw_get(struct of_phandle_args *clkspec, void *data)
3901{
3902        struct qmp_phy_dp_clks *dp_clks = data;
3903        unsigned int idx = clkspec->args[0];
3904
3905        if (idx >= 2) {
3906                pr_err("%s: invalid index %u\n", __func__, idx);
3907                return ERR_PTR(-EINVAL);
3908        }
3909
3910        if (idx == 0)
3911                return &dp_clks->dp_link_hw;
3912
3913        return &dp_clks->dp_pixel_hw;
3914}
3915
3916static int phy_dp_clks_register(struct qcom_qmp *qmp, struct qmp_phy *qphy,
3917                                struct device_node *np)
3918{
3919        struct clk_init_data init = { };
3920        struct qmp_phy_dp_clks *dp_clks;
3921        int ret;
3922
3923        dp_clks = devm_kzalloc(qmp->dev, sizeof(*dp_clks), GFP_KERNEL);
3924        if (!dp_clks)
3925                return -ENOMEM;
3926
3927        dp_clks->qphy = qphy;
3928        qphy->dp_clks = dp_clks;
3929
3930        init.ops = &qcom_qmp_dp_link_clk_ops;
3931        init.name = "qmp_dp_phy_pll_link_clk";
3932        dp_clks->dp_link_hw.init = &init;
3933        ret = devm_clk_hw_register(qmp->dev, &dp_clks->dp_link_hw);
3934        if (ret)
3935                return ret;
3936
3937        init.ops = &qcom_qmp_dp_pixel_clk_ops;
3938        init.name = "qmp_dp_phy_pll_vco_div_clk";
3939        dp_clks->dp_pixel_hw.init = &init;
3940        ret = devm_clk_hw_register(qmp->dev, &dp_clks->dp_pixel_hw);
3941        if (ret)
3942                return ret;
3943
3944        ret = of_clk_add_hw_provider(np, qcom_qmp_dp_clks_hw_get, dp_clks);
3945        if (ret)
3946                return ret;
3947
3948        /*
3949         * Roll a devm action because the clock provider is the child node, but
3950         * the child node is not actually a device.
3951         */
3952        ret = devm_add_action(qmp->dev, phy_clk_release_provider, np);
3953        if (ret)
3954                phy_clk_release_provider(np);
3955
3956        return ret;
3957}
3958
3959static const struct phy_ops qcom_qmp_phy_gen_ops = {
3960        .init           = qcom_qmp_phy_enable,
3961        .exit           = qcom_qmp_phy_disable,
3962        .set_mode       = qcom_qmp_phy_set_mode,
3963        .owner          = THIS_MODULE,
3964};
3965
3966static const struct phy_ops qcom_qmp_phy_dp_ops = {
3967        .init           = qcom_qmp_phy_init,
3968        .configure      = qcom_qmp_dp_phy_configure,
3969        .power_on       = qcom_qmp_phy_power_on,
3970        .calibrate      = qcom_qmp_dp_phy_calibrate,
3971        .power_off      = qcom_qmp_phy_power_off,
3972        .exit           = qcom_qmp_phy_exit,
3973        .set_mode       = qcom_qmp_phy_set_mode,
3974        .owner          = THIS_MODULE,
3975};
3976
3977static const struct phy_ops qcom_qmp_pcie_ufs_ops = {
3978        .power_on       = qcom_qmp_phy_enable,
3979        .power_off      = qcom_qmp_phy_disable,
3980        .set_mode       = qcom_qmp_phy_set_mode,
3981        .owner          = THIS_MODULE,
3982};
3983
3984static
3985int qcom_qmp_phy_create(struct device *dev, struct device_node *np, int id,
3986                        void __iomem *serdes, const struct qmp_phy_cfg *cfg)
3987{
3988        struct qcom_qmp *qmp = dev_get_drvdata(dev);
3989        struct phy *generic_phy;
3990        struct qmp_phy *qphy;
3991        const struct phy_ops *ops;
3992        char prop_name[MAX_PROP_NAME];
3993        int ret;
3994
3995        qphy = devm_kzalloc(dev, sizeof(*qphy), GFP_KERNEL);
3996        if (!qphy)
3997                return -ENOMEM;
3998
3999        qphy->cfg = cfg;
4000        qphy->serdes = serdes;
4001        /*
4002         * Get memory resources for each phy lane:
4003         * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2.
4004         * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5
4005         * For single lane PHYs: pcs_misc (optional) -> 3.
4006         */
4007        qphy->tx = of_iomap(np, 0);
4008        if (!qphy->tx)
4009                return -ENOMEM;
4010
4011        qphy->rx = of_iomap(np, 1);
4012        if (!qphy->rx)
4013                return -ENOMEM;
4014
4015        qphy->pcs = of_iomap(np, 2);
4016        if (!qphy->pcs)
4017                return -ENOMEM;
4018
4019        /*
4020         * If this is a dual-lane PHY, then there should be registers for the
4021         * second lane. Some old device trees did not specify this, so fall
4022         * back to old legacy behavior of assuming they can be reached at an
4023         * offset from the first lane.
4024         */
4025        if (cfg->is_dual_lane_phy) {
4026                qphy->tx2 = of_iomap(np, 3);
4027                qphy->rx2 = of_iomap(np, 4);
4028                if (!qphy->tx2 || !qphy->rx2) {
4029                        dev_warn(dev,
4030                                 "Underspecified device tree, falling back to legacy register regions\n");
4031
4032                        /* In the old version, pcs_misc is at index 3. */
4033                        qphy->pcs_misc = qphy->tx2;
4034                        qphy->tx2 = qphy->tx + QMP_PHY_LEGACY_LANE_STRIDE;
4035                        qphy->rx2 = qphy->rx + QMP_PHY_LEGACY_LANE_STRIDE;
4036
4037                } else {
4038                        qphy->pcs_misc = of_iomap(np, 5);
4039                }
4040
4041        } else {
4042                qphy->pcs_misc = of_iomap(np, 3);
4043        }
4044
4045        if (!qphy->pcs_misc)
4046                dev_vdbg(dev, "PHY pcs_misc-reg not used\n");
4047
4048        /*
4049         * Get PHY's Pipe clock, if any. USB3 and PCIe are PIPE3
4050         * based phys, so they essentially have pipe clock. So,
4051         * we return error in case phy is USB3 or PIPE type.
4052         * Otherwise, we initialize pipe clock to NULL for
4053         * all phys that don't need this.
4054         */
4055        snprintf(prop_name, sizeof(prop_name), "pipe%d", id);
4056        qphy->pipe_clk = of_clk_get_by_name(np, prop_name);
4057        if (IS_ERR(qphy->pipe_clk)) {
4058                if (cfg->type == PHY_TYPE_PCIE ||
4059                    cfg->type == PHY_TYPE_USB3) {
4060                        ret = PTR_ERR(qphy->pipe_clk);
4061                        if (ret != -EPROBE_DEFER)
4062                                dev_err(dev,
4063                                        "failed to get lane%d pipe_clk, %d\n",
4064                                        id, ret);
4065                        return ret;
4066                }
4067                qphy->pipe_clk = NULL;
4068        }
4069
4070        /* Get lane reset, if any */
4071        if (cfg->has_lane_rst) {
4072                snprintf(prop_name, sizeof(prop_name), "lane%d", id);
4073                qphy->lane_rst = of_reset_control_get(np, prop_name);
4074                if (IS_ERR(qphy->lane_rst)) {
4075                        dev_err(dev, "failed to get lane%d reset\n", id);
4076                        return PTR_ERR(qphy->lane_rst);
4077                }
4078        }
4079
4080        if (cfg->type == PHY_TYPE_UFS || cfg->type == PHY_TYPE_PCIE)
4081                ops = &qcom_qmp_pcie_ufs_ops;
4082        else if (cfg->type == PHY_TYPE_DP)
4083                ops = &qcom_qmp_phy_dp_ops;
4084        else
4085                ops = &qcom_qmp_phy_gen_ops;
4086
4087        generic_phy = devm_phy_create(dev, np, ops);
4088        if (IS_ERR(generic_phy)) {
4089                ret = PTR_ERR(generic_phy);
4090                dev_err(dev, "failed to create qphy %d\n", ret);
4091                return ret;
4092        }
4093
4094        qphy->phy = generic_phy;
4095        qphy->index = id;
4096        qphy->qmp = qmp;
4097        qmp->phys[id] = qphy;
4098        phy_set_drvdata(generic_phy, qphy);
4099
4100        return 0;
4101}
4102
4103static const struct of_device_id qcom_qmp_phy_of_match_table[] = {
4104        {
4105                .compatible = "qcom,ipq8074-qmp-usb3-phy",
4106                .data = &ipq8074_usb3phy_cfg,
4107        }, {
4108                .compatible = "qcom,msm8996-qmp-pcie-phy",
4109                .data = &msm8996_pciephy_cfg,
4110        }, {
4111                .compatible = "qcom,msm8996-qmp-ufs-phy",
4112                .data = &msm8996_ufs_cfg,
4113        }, {
4114                .compatible = "qcom,msm8996-qmp-usb3-phy",
4115                .data = &msm8996_usb3phy_cfg,
4116        }, {
4117                .compatible = "qcom,msm8998-qmp-pcie-phy",
4118                .data = &msm8998_pciephy_cfg,
4119        }, {
4120                .compatible = "qcom,msm8998-qmp-ufs-phy",
4121                .data = &sdm845_ufsphy_cfg,
4122        }, {
4123                .compatible = "qcom,ipq8074-qmp-pcie-phy",
4124                .data = &ipq8074_pciephy_cfg,
4125        }, {
4126                .compatible = "qcom,sc7180-qmp-usb3-phy",
4127                .data = &sc7180_usb3phy_cfg,
4128        }, {
4129                .compatible = "qcom,sc7180-qmp-usb3-dp-phy",
4130                /* It's a combo phy */
4131        }, {
4132                .compatible = "qcom,sdm845-qhp-pcie-phy",
4133                .data = &sdm845_qhp_pciephy_cfg,
4134        }, {
4135                .compatible = "qcom,sdm845-qmp-pcie-phy",
4136                .data = &sdm845_qmp_pciephy_cfg,
4137        }, {
4138                .compatible = "qcom,sdm845-qmp-usb3-phy",
4139                .data = &qmp_v3_usb3phy_cfg,
4140        }, {
4141                .compatible = "qcom,sdm845-qmp-usb3-uni-phy",
4142                .data = &qmp_v3_usb3_uniphy_cfg,
4143        }, {
4144                .compatible = "qcom,sdm845-qmp-ufs-phy",
4145                .data = &sdm845_ufsphy_cfg,
4146        }, {
4147                .compatible = "qcom,msm8998-qmp-usb3-phy",
4148                .data = &msm8998_usb3phy_cfg,
4149        }, {
4150                .compatible = "qcom,sm8150-qmp-ufs-phy",
4151                .data = &sm8150_ufsphy_cfg,
4152        }, {
4153                .compatible = "qcom,sm8250-qmp-ufs-phy",
4154                .data = &sm8150_ufsphy_cfg,
4155        }, {
4156                .compatible = "qcom,sm8150-qmp-usb3-phy",
4157                .data = &sm8150_usb3phy_cfg,
4158        }, {
4159                .compatible = "qcom,sm8150-qmp-usb3-uni-phy",
4160                .data = &sm8150_usb3_uniphy_cfg,
4161        }, {
4162                .compatible = "qcom,sm8250-qmp-usb3-phy",
4163                .data = &sm8250_usb3phy_cfg,
4164        }, {
4165                .compatible = "qcom,sm8250-qmp-usb3-uni-phy",
4166                .data = &sm8250_usb3_uniphy_cfg,
4167        }, {
4168                .compatible = "qcom,sm8250-qmp-gen3x1-pcie-phy",
4169                .data = &sm8250_qmp_gen3x1_pciephy_cfg,
4170        }, {
4171                .compatible = "qcom,sm8250-qmp-gen3x2-pcie-phy",
4172                .data = &sm8250_qmp_gen3x2_pciephy_cfg,
4173        }, {
4174                .compatible = "qcom,sm8250-qmp-modem-pcie-phy",
4175                .data = &sm8250_qmp_gen3x2_pciephy_cfg,
4176        },
4177        { },
4178};
4179MODULE_DEVICE_TABLE(of, qcom_qmp_phy_of_match_table);
4180
4181static const struct of_device_id qcom_qmp_combo_phy_of_match_table[] = {
4182        {
4183                .compatible = "qcom,sc7180-qmp-usb3-dp-phy",
4184                .data = &sc7180_usb3dpphy_cfg,
4185        },
4186        { }
4187};
4188
4189static const struct dev_pm_ops qcom_qmp_phy_pm_ops = {
4190        SET_RUNTIME_PM_OPS(qcom_qmp_phy_runtime_suspend,
4191                           qcom_qmp_phy_runtime_resume, NULL)
4192};
4193
4194static int qcom_qmp_phy_probe(struct platform_device *pdev)
4195{
4196        struct qcom_qmp *qmp;
4197        struct device *dev = &pdev->dev;
4198        struct device_node *child;
4199        struct phy_provider *phy_provider;
4200        void __iomem *serdes;
4201        void __iomem *usb_serdes;
4202        void __iomem *dp_serdes = NULL;
4203        const struct qmp_phy_combo_cfg *combo_cfg = NULL;
4204        const struct qmp_phy_cfg *cfg = NULL;
4205        const struct qmp_phy_cfg *usb_cfg = NULL;
4206        const struct qmp_phy_cfg *dp_cfg = NULL;
4207        int num, id, expected_phys;
4208        int ret;
4209
4210        qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
4211        if (!qmp)
4212                return -ENOMEM;
4213
4214        qmp->dev = dev;
4215        dev_set_drvdata(dev, qmp);
4216
4217        /* Get the specific init parameters of QMP phy */
4218        cfg = of_device_get_match_data(dev);
4219        if (!cfg) {
4220                const struct of_device_id *match;
4221
4222                match = of_match_device(qcom_qmp_combo_phy_of_match_table, dev);
4223                if (!match)
4224                        return -EINVAL;
4225
4226                combo_cfg = match->data;
4227                if (!combo_cfg)
4228                        return -EINVAL;
4229
4230                usb_cfg = combo_cfg->usb_cfg;
4231                cfg = usb_cfg; /* Setup clks and regulators */
4232        }
4233
4234        /* per PHY serdes; usually located at base address */
4235        usb_serdes = serdes = devm_platform_ioremap_resource(pdev, 0);
4236        if (IS_ERR(serdes))
4237                return PTR_ERR(serdes);
4238
4239        /* per PHY dp_com; if PHY has dp_com control block */
4240        if (combo_cfg || cfg->has_phy_dp_com_ctrl) {
4241                qmp->dp_com = devm_platform_ioremap_resource(pdev, 1);
4242                if (IS_ERR(qmp->dp_com))
4243                        return PTR_ERR(qmp->dp_com);
4244        }
4245
4246        if (combo_cfg) {
4247                /* Only two serdes for combo PHY */
4248                dp_serdes = devm_platform_ioremap_resource(pdev, 2);
4249                if (IS_ERR(dp_serdes))
4250                        return PTR_ERR(dp_serdes);
4251
4252                dp_cfg = combo_cfg->dp_cfg;
4253                expected_phys = 2;
4254        } else {
4255                expected_phys = cfg->nlanes;
4256        }
4257
4258        mutex_init(&qmp->phy_mutex);
4259
4260        ret = qcom_qmp_phy_clk_init(dev, cfg);
4261        if (ret)
4262                return ret;
4263
4264        ret = qcom_qmp_phy_reset_init(dev, cfg);
4265        if (ret)
4266                return ret;
4267
4268        ret = qcom_qmp_phy_vreg_init(dev, cfg);
4269        if (ret) {
4270                if (ret != -EPROBE_DEFER)
4271                        dev_err(dev, "failed to get regulator supplies: %d\n",
4272                                ret);
4273                return ret;
4274        }
4275
4276        num = of_get_available_child_count(dev->of_node);
4277        /* do we have a rogue child node ? */
4278        if (num > expected_phys)
4279                return -EINVAL;
4280
4281        qmp->phys = devm_kcalloc(dev, num, sizeof(*qmp->phys), GFP_KERNEL);
4282        if (!qmp->phys)
4283                return -ENOMEM;
4284
4285        pm_runtime_set_active(dev);
4286        pm_runtime_enable(dev);
4287        /*
4288         * Prevent runtime pm from being ON by default. Users can enable
4289         * it using power/control in sysfs.
4290         */
4291        pm_runtime_forbid(dev);
4292
4293        id = 0;
4294        for_each_available_child_of_node(dev->of_node, child) {
4295                if (of_node_name_eq(child, "dp-phy")) {
4296                        cfg = dp_cfg;
4297                        serdes = dp_serdes;
4298                } else if (of_node_name_eq(child, "usb3-phy")) {
4299                        cfg = usb_cfg;
4300                        serdes = usb_serdes;
4301                }
4302
4303                /* Create per-lane phy */
4304                ret = qcom_qmp_phy_create(dev, child, id, serdes, cfg);
4305                if (ret) {
4306                        dev_err(dev, "failed to create lane%d phy, %d\n",
4307                                id, ret);
4308                        goto err_node_put;
4309                }
4310
4311                /*
4312                 * Register the pipe clock provided by phy.
4313                 * See function description to see details of this pipe clock.
4314                 */
4315                if (cfg->type == PHY_TYPE_USB3 || cfg->type == PHY_TYPE_PCIE) {
4316                        ret = phy_pipe_clk_register(qmp, child);
4317                        if (ret) {
4318                                dev_err(qmp->dev,
4319                                        "failed to register pipe clock source\n");
4320                                goto err_node_put;
4321                        }
4322                } else if (cfg->type == PHY_TYPE_DP) {
4323                        ret = phy_dp_clks_register(qmp, qmp->phys[id], child);
4324                        if (ret) {
4325                                dev_err(qmp->dev,
4326                                        "failed to register DP clock source\n");
4327                                goto err_node_put;
4328                        }
4329                }
4330                id++;
4331        }
4332
4333        phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
4334        if (!IS_ERR(phy_provider))
4335                dev_info(dev, "Registered Qcom-QMP phy\n");
4336        else
4337                pm_runtime_disable(dev);
4338
4339        return PTR_ERR_OR_ZERO(phy_provider);
4340
4341err_node_put:
4342        pm_runtime_disable(dev);
4343        of_node_put(child);
4344        return ret;
4345}
4346
4347static struct platform_driver qcom_qmp_phy_driver = {
4348        .probe          = qcom_qmp_phy_probe,
4349        .driver = {
4350                .name   = "qcom-qmp-phy",
4351                .pm     = &qcom_qmp_phy_pm_ops,
4352                .of_match_table = qcom_qmp_phy_of_match_table,
4353        },
4354};
4355
4356module_platform_driver(qcom_qmp_phy_driver);
4357
4358MODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>");
4359MODULE_DESCRIPTION("Qualcomm QMP PHY driver");
4360MODULE_LICENSE("GPL v2");
4361