cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

phy-cadence-sierra.c (78961B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Cadence Sierra PHY Driver
      4 *
      5 * Copyright (c) 2018 Cadence Design Systems
      6 * Author: Alan Douglas <adouglas@cadence.com>
      7 *
      8 */
      9#include <linux/clk.h>
     10#include <linux/clk-provider.h>
     11#include <linux/delay.h>
     12#include <linux/err.h>
     13#include <linux/io.h>
     14#include <linux/module.h>
     15#include <linux/phy/phy.h>
     16#include <linux/platform_device.h>
     17#include <linux/pm_runtime.h>
     18#include <linux/regmap.h>
     19#include <linux/reset.h>
     20#include <linux/slab.h>
     21#include <linux/of.h>
     22#include <linux/of_platform.h>
     23#include <dt-bindings/phy/phy.h>
     24#include <dt-bindings/phy/phy-cadence.h>
     25
     26#define NUM_SSC_MODE		3
     27#define NUM_PHY_TYPE		4
     28
     29/* PHY register offsets */
     30#define SIERRA_COMMON_CDB_OFFSET			0x0
     31#define SIERRA_MACRO_ID_REG				0x0
     32#define SIERRA_CMN_PLLLC_GEN_PREG			0x42
     33#define SIERRA_CMN_PLLLC_MODE_PREG			0x48
     34#define SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG		0x49
     35#define SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG		0x4A
     36#define SIERRA_CMN_PLLLC_LOCK_CNTSTART_PREG		0x4B
     37#define SIERRA_CMN_PLLLC_CLK1_PREG			0x4D
     38#define SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG		0x4F
     39#define SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG		0x50
     40#define SIERRA_CMN_PLLLC_DSMCORR_PREG			0x51
     41#define SIERRA_CMN_PLLLC_SS_PREG			0x52
     42#define SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG		0x53
     43#define SIERRA_CMN_PLLLC_SSTWOPT_PREG			0x54
     44#define SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG	0x62
     45#define SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG		0x63
     46#define SIERRA_CMN_REFRCV_PREG				0x98
     47#define SIERRA_CMN_REFRCV1_PREG				0xB8
     48#define SIERRA_CMN_PLLLC1_GEN_PREG			0xC2
     49#define SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG		0xCA
     50#define SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG		0xD0
     51#define SIERRA_CMN_PLLLC1_SS_TIME_STEPSIZE_MODE_PREG	0xE2
     52
     53#define SIERRA_LANE_CDB_OFFSET(ln, block_offset, reg_offset)	\
     54				((0x4000 << (block_offset)) + \
     55				 (((ln) << 9) << (reg_offset)))
     56
     57#define SIERRA_DET_STANDEC_A_PREG			0x000
     58#define SIERRA_DET_STANDEC_B_PREG			0x001
     59#define SIERRA_DET_STANDEC_C_PREG			0x002
     60#define SIERRA_DET_STANDEC_D_PREG			0x003
     61#define SIERRA_DET_STANDEC_E_PREG			0x004
     62#define SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG		0x008
     63#define SIERRA_PSM_A0IN_TMR_PREG			0x009
     64#define SIERRA_PSM_A3IN_TMR_PREG			0x00C
     65#define SIERRA_PSM_DIAG_PREG				0x015
     66#define SIERRA_PSC_LN_A3_PREG				0x023
     67#define SIERRA_PSC_LN_A4_PREG				0x024
     68#define SIERRA_PSC_LN_IDLE_PREG				0x026
     69#define SIERRA_PSC_TX_A0_PREG				0x028
     70#define SIERRA_PSC_TX_A1_PREG				0x029
     71#define SIERRA_PSC_TX_A2_PREG				0x02A
     72#define SIERRA_PSC_TX_A3_PREG				0x02B
     73#define SIERRA_PSC_RX_A0_PREG				0x030
     74#define SIERRA_PSC_RX_A1_PREG				0x031
     75#define SIERRA_PSC_RX_A2_PREG				0x032
     76#define SIERRA_PSC_RX_A3_PREG				0x033
     77#define SIERRA_PLLCTRL_SUBRATE_PREG			0x03A
     78#define SIERRA_PLLCTRL_GEN_A_PREG			0x03B
     79#define SIERRA_PLLCTRL_GEN_D_PREG			0x03E
     80#define SIERRA_PLLCTRL_CPGAIN_MODE_PREG			0x03F
     81#define SIERRA_PLLCTRL_STATUS_PREG			0x044
     82#define SIERRA_CLKPATH_BIASTRIM_PREG			0x04B
     83#define SIERRA_DFE_BIASTRIM_PREG			0x04C
     84#define SIERRA_DRVCTRL_ATTEN_PREG			0x06A
     85#define SIERRA_DRVCTRL_BOOST_PREG			0x06F
     86#define SIERRA_TX_RCVDET_OVRD_PREG			0x072
     87#define SIERRA_CLKPATHCTRL_TMR_PREG			0x081
     88#define SIERRA_RX_CREQ_FLTR_A_MODE3_PREG		0x085
     89#define SIERRA_RX_CREQ_FLTR_A_MODE2_PREG		0x086
     90#define SIERRA_RX_CREQ_FLTR_A_MODE1_PREG		0x087
     91#define SIERRA_RX_CREQ_FLTR_A_MODE0_PREG		0x088
     92#define SIERRA_CREQ_DCBIASATTEN_OVR_PREG		0x08C
     93#define SIERRA_CREQ_CCLKDET_MODE01_PREG			0x08E
     94#define SIERRA_RX_CTLE_CAL_PREG				0x08F
     95#define SIERRA_RX_CTLE_MAINTENANCE_PREG			0x091
     96#define SIERRA_CREQ_FSMCLK_SEL_PREG			0x092
     97#define SIERRA_CREQ_EQ_CTRL_PREG			0x093
     98#define SIERRA_CREQ_SPARE_PREG				0x096
     99#define SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG		0x097
    100#define SIERRA_CTLELUT_CTRL_PREG			0x098
    101#define SIERRA_DFE_ECMP_RATESEL_PREG			0x0C0
    102#define SIERRA_DFE_SMP_RATESEL_PREG			0x0C1
    103#define SIERRA_DEQ_PHALIGN_CTRL				0x0C4
    104#define SIERRA_DEQ_CONCUR_CTRL1_PREG			0x0C8
    105#define SIERRA_DEQ_CONCUR_CTRL2_PREG			0x0C9
    106#define SIERRA_DEQ_EPIPWR_CTRL2_PREG			0x0CD
    107#define SIERRA_DEQ_FAST_MAINT_CYCLES_PREG		0x0CE
    108#define SIERRA_DEQ_ERRCMP_CTRL_PREG			0x0D0
    109#define SIERRA_DEQ_OFFSET_CTRL_PREG			0x0D8
    110#define SIERRA_DEQ_GAIN_CTRL_PREG			0x0E0
    111#define SIERRA_DEQ_VGATUNE_CTRL_PREG			0x0E1
    112#define SIERRA_DEQ_GLUT0				0x0E8
    113#define SIERRA_DEQ_GLUT1				0x0E9
    114#define SIERRA_DEQ_GLUT2				0x0EA
    115#define SIERRA_DEQ_GLUT3				0x0EB
    116#define SIERRA_DEQ_GLUT4				0x0EC
    117#define SIERRA_DEQ_GLUT5				0x0ED
    118#define SIERRA_DEQ_GLUT6				0x0EE
    119#define SIERRA_DEQ_GLUT7				0x0EF
    120#define SIERRA_DEQ_GLUT8				0x0F0
    121#define SIERRA_DEQ_GLUT9				0x0F1
    122#define SIERRA_DEQ_GLUT10				0x0F2
    123#define SIERRA_DEQ_GLUT11				0x0F3
    124#define SIERRA_DEQ_GLUT12				0x0F4
    125#define SIERRA_DEQ_GLUT13				0x0F5
    126#define SIERRA_DEQ_GLUT14				0x0F6
    127#define SIERRA_DEQ_GLUT15				0x0F7
    128#define SIERRA_DEQ_GLUT16				0x0F8
    129#define SIERRA_DEQ_ALUT0				0x108
    130#define SIERRA_DEQ_ALUT1				0x109
    131#define SIERRA_DEQ_ALUT2				0x10A
    132#define SIERRA_DEQ_ALUT3				0x10B
    133#define SIERRA_DEQ_ALUT4				0x10C
    134#define SIERRA_DEQ_ALUT5				0x10D
    135#define SIERRA_DEQ_ALUT6				0x10E
    136#define SIERRA_DEQ_ALUT7				0x10F
    137#define SIERRA_DEQ_ALUT8				0x110
    138#define SIERRA_DEQ_ALUT9				0x111
    139#define SIERRA_DEQ_ALUT10				0x112
    140#define SIERRA_DEQ_ALUT11				0x113
    141#define SIERRA_DEQ_ALUT12				0x114
    142#define SIERRA_DEQ_ALUT13				0x115
    143#define SIERRA_DEQ_DFETAP_CTRL_PREG			0x128
    144#define SIERRA_DEQ_DFETAP0				0x129
    145#define SIERRA_DEQ_DFETAP1				0x12B
    146#define SIERRA_DEQ_DFETAP2				0x12D
    147#define SIERRA_DEQ_DFETAP3				0x12F
    148#define SIERRA_DEQ_DFETAP4				0x131
    149#define SIERRA_DFE_EN_1010_IGNORE_PREG			0x134
    150#define SIERRA_DEQ_PRECUR_PREG				0x138
    151#define SIERRA_DEQ_POSTCUR_PREG				0x140
    152#define SIERRA_DEQ_POSTCUR_DECR_PREG			0x142
    153#define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG		0x150
    154#define SIERRA_DEQ_TAU_CTRL2_PREG			0x151
    155#define SIERRA_DEQ_TAU_CTRL3_PREG			0x152
    156#define SIERRA_DEQ_OPENEYE_CTRL_PREG			0x158
    157#define SIERRA_DEQ_PICTRL_PREG				0x161
    158#define SIERRA_CPICAL_TMRVAL_MODE1_PREG			0x170
    159#define SIERRA_CPICAL_TMRVAL_MODE0_PREG			0x171
    160#define SIERRA_CPICAL_PICNT_MODE1_PREG			0x174
    161#define SIERRA_CPI_OUTBUF_RATESEL_PREG			0x17C
    162#define SIERRA_CPI_RESBIAS_BIN_PREG			0x17E
    163#define SIERRA_CPI_TRIM_PREG				0x17F
    164#define SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG		0x183
    165#define SIERRA_EPI_CTRL_PREG				0x187
    166#define SIERRA_LFPSDET_SUPPORT_PREG			0x188
    167#define SIERRA_LFPSFILT_NS_PREG				0x18A
    168#define SIERRA_LFPSFILT_RD_PREG				0x18B
    169#define SIERRA_LFPSFILT_MP_PREG				0x18C
    170#define SIERRA_SIGDET_SUPPORT_PREG			0x190
    171#define SIERRA_SDFILT_H2L_A_PREG			0x191
    172#define SIERRA_SDFILT_L2H_PREG				0x193
    173#define SIERRA_RXBUFFER_CTLECTRL_PREG			0x19E
    174#define SIERRA_RXBUFFER_RCDFECTRL_PREG			0x19F
    175#define SIERRA_RXBUFFER_DFECTRL_PREG			0x1A0
    176#define SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG		0x14F
    177#define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG		0x150
    178
    179/* PHY PCS common registers */
    180#define SIERRA_PHY_PCS_COMMON_OFFSET(block_offset)	\
    181				     (0xc000 << (block_offset))
    182#define SIERRA_PHY_PIPE_CMN_CTRL1			0x0
    183#define SIERRA_PHY_PLL_CFG				0xe
    184
    185/* PHY PCS lane registers */
    186#define SIERRA_PHY_PCS_LANE_CDB_OFFSET(ln, block_offset, reg_offset)	\
    187				       ((0xD000 << (block_offset)) +	\
    188				       (((ln) << 8) << (reg_offset)))
    189
    190#define SIERRA_PHY_ISO_LINK_CTRL			0xB
    191
    192/* PHY PMA common registers */
    193#define SIERRA_PHY_PMA_COMMON_OFFSET(block_offset)	\
    194				     (0xE000 << (block_offset))
    195#define SIERRA_PHY_PMA_CMN_CTRL				0x000
    196
    197/* PHY PMA lane registers */
    198#define SIERRA_PHY_PMA_LANE_CDB_OFFSET(ln, block_offset, reg_offset)	\
    199				       ((0xF000 << (block_offset)) +	\
    200				       (((ln) << 8) << (reg_offset)))
    201
    202#define SIERRA_PHY_PMA_XCVR_CTRL			0x000
    203
    204#define SIERRA_MACRO_ID					0x00007364
    205#define SIERRA_MAX_LANES				16
    206#define PLL_LOCK_TIME					100000
    207
    208#define CDNS_SIERRA_OUTPUT_CLOCKS			3
    209#define CDNS_SIERRA_INPUT_CLOCKS			5
    210enum cdns_sierra_clock_input {
    211	PHY_CLK,
    212	CMN_REFCLK_DIG_DIV,
    213	CMN_REFCLK1_DIG_DIV,
    214	PLL0_REFCLK,
    215	PLL1_REFCLK,
    216};
    217
    218#define SIERRA_NUM_CMN_PLLC				2
    219#define SIERRA_NUM_CMN_PLLC_PARENTS			2
    220
    221static const struct reg_field macro_id_type =
    222				REG_FIELD(SIERRA_MACRO_ID_REG, 0, 15);
    223static const struct reg_field phy_pll_cfg_1 =
    224				REG_FIELD(SIERRA_PHY_PLL_CFG, 1, 1);
    225static const struct reg_field pma_cmn_ready =
    226				REG_FIELD(SIERRA_PHY_PMA_CMN_CTRL, 0, 0);
    227static const struct reg_field pllctrl_lock =
    228				REG_FIELD(SIERRA_PLLCTRL_STATUS_PREG, 0, 0);
    229static const struct reg_field phy_iso_link_ctrl_1 =
    230				REG_FIELD(SIERRA_PHY_ISO_LINK_CTRL, 1, 1);
    231static const struct reg_field cmn_plllc_clk1outdiv_preg =
    232				REG_FIELD(SIERRA_CMN_PLLLC_CLK1_PREG, 0, 6);
    233static const struct reg_field cmn_plllc_clk1_en_preg =
    234				REG_FIELD(SIERRA_CMN_PLLLC_CLK1_PREG, 12, 12);
    235
    236static const char * const clk_names[] = {
    237	[CDNS_SIERRA_PLL_CMNLC] = "pll_cmnlc",
    238	[CDNS_SIERRA_PLL_CMNLC1] = "pll_cmnlc1",
    239	[CDNS_SIERRA_DERIVED_REFCLK] = "refclk_der",
    240};
    241
    242enum cdns_sierra_cmn_plllc {
    243	CMN_PLLLC,
    244	CMN_PLLLC1,
    245};
    246
    247struct cdns_sierra_pll_mux_reg_fields {
    248	struct reg_field	pfdclk_sel_preg;
    249	struct reg_field	plllc1en_field;
    250	struct reg_field	termen_field;
    251};
    252
    253static const struct cdns_sierra_pll_mux_reg_fields cmn_plllc_pfdclk1_sel_preg[] = {
    254	[CMN_PLLLC] = {
    255		.pfdclk_sel_preg = REG_FIELD(SIERRA_CMN_PLLLC_GEN_PREG, 1, 1),
    256		.plllc1en_field = REG_FIELD(SIERRA_CMN_REFRCV1_PREG, 8, 8),
    257		.termen_field = REG_FIELD(SIERRA_CMN_REFRCV1_PREG, 0, 0),
    258	},
    259	[CMN_PLLLC1] = {
    260		.pfdclk_sel_preg = REG_FIELD(SIERRA_CMN_PLLLC1_GEN_PREG, 1, 1),
    261		.plllc1en_field = REG_FIELD(SIERRA_CMN_REFRCV_PREG, 8, 8),
    262		.termen_field = REG_FIELD(SIERRA_CMN_REFRCV_PREG, 0, 0),
    263	},
    264};
    265
    266struct cdns_sierra_pll_mux {
    267	struct clk_hw		hw;
    268	struct regmap_field	*pfdclk_sel_preg;
    269	struct regmap_field	*plllc1en_field;
    270	struct regmap_field	*termen_field;
    271	struct clk_init_data	clk_data;
    272};
    273
    274#define to_cdns_sierra_pll_mux(_hw)	\
    275			container_of(_hw, struct cdns_sierra_pll_mux, hw)
    276
    277static const int pll_mux_parent_index[][SIERRA_NUM_CMN_PLLC_PARENTS] = {
    278	[CMN_PLLLC] = { PLL0_REFCLK, PLL1_REFCLK },
    279	[CMN_PLLLC1] = { PLL1_REFCLK, PLL0_REFCLK },
    280};
    281
    282static u32 cdns_sierra_pll_mux_table[][SIERRA_NUM_CMN_PLLC_PARENTS] = {
    283	[CMN_PLLLC] = { 0, 1 },
    284	[CMN_PLLLC1] = { 1, 0 },
    285};
    286
    287struct cdns_sierra_derived_refclk {
    288	struct clk_hw           hw;
    289	struct regmap_field     *cmn_plllc_clk1outdiv_preg;
    290	struct regmap_field     *cmn_plllc_clk1_en_preg;
    291	struct clk_init_data	clk_data;
    292};
    293
    294#define to_cdns_sierra_derived_refclk(_hw)	\
    295			container_of(_hw, struct cdns_sierra_derived_refclk, hw)
    296
    297enum cdns_sierra_phy_type {
    298	TYPE_NONE,
    299	TYPE_PCIE,
    300	TYPE_USB,
    301	TYPE_QSGMII
    302};
    303
    304enum cdns_sierra_ssc_mode {
    305	NO_SSC,
    306	EXTERNAL_SSC,
    307	INTERNAL_SSC
    308};
    309
    310struct cdns_sierra_inst {
    311	struct phy *phy;
    312	enum cdns_sierra_phy_type phy_type;
    313	u32 num_lanes;
    314	u32 mlane;
    315	struct reset_control *lnk_rst;
    316	enum cdns_sierra_ssc_mode ssc_mode;
    317};
    318
    319struct cdns_reg_pairs {
    320	u16 val;
    321	u32 off;
    322};
    323
    324struct cdns_sierra_vals {
    325	const struct cdns_reg_pairs *reg_pairs;
    326	u32 num_regs;
    327};
    328
    329struct cdns_sierra_data {
    330	u32 id_value;
    331	u8 block_offset_shift;
    332	u8 reg_offset_shift;
    333	struct cdns_sierra_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
    334					     [NUM_SSC_MODE];
    335	struct cdns_sierra_vals *phy_pma_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
    336						[NUM_SSC_MODE];
    337	struct cdns_sierra_vals *pma_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
    338					     [NUM_SSC_MODE];
    339	struct cdns_sierra_vals *pma_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
    340					    [NUM_SSC_MODE];
    341};
    342
    343struct cdns_regmap_cdb_context {
    344	struct device *dev;
    345	void __iomem *base;
    346	u8 reg_offset_shift;
    347};
    348
    349struct cdns_sierra_phy {
    350	struct device *dev;
    351	struct regmap *regmap;
    352	const struct cdns_sierra_data *init_data;
    353	struct cdns_sierra_inst phys[SIERRA_MAX_LANES];
    354	struct reset_control *phy_rst;
    355	struct reset_control *apb_rst;
    356	struct regmap *regmap_lane_cdb[SIERRA_MAX_LANES];
    357	struct regmap *regmap_phy_pcs_common_cdb;
    358	struct regmap *regmap_phy_pcs_lane_cdb[SIERRA_MAX_LANES];
    359	struct regmap *regmap_phy_pma_common_cdb;
    360	struct regmap *regmap_phy_pma_lane_cdb[SIERRA_MAX_LANES];
    361	struct regmap *regmap_common_cdb;
    362	struct regmap_field *macro_id_type;
    363	struct regmap_field *phy_pll_cfg_1;
    364	struct regmap_field *pma_cmn_ready;
    365	struct regmap_field *pllctrl_lock[SIERRA_MAX_LANES];
    366	struct regmap_field *phy_iso_link_ctrl_1[SIERRA_MAX_LANES];
    367	struct regmap_field *cmn_refrcv_refclk_plllc1en_preg[SIERRA_NUM_CMN_PLLC];
    368	struct regmap_field *cmn_refrcv_refclk_termen_preg[SIERRA_NUM_CMN_PLLC];
    369	struct regmap_field *cmn_plllc_pfdclk1_sel_preg[SIERRA_NUM_CMN_PLLC];
    370	struct clk *input_clks[CDNS_SIERRA_INPUT_CLOCKS];
    371	int nsubnodes;
    372	u32 num_lanes;
    373	bool autoconf;
    374	int already_configured;
    375	struct clk_onecell_data clk_data;
    376	struct clk *output_clks[CDNS_SIERRA_OUTPUT_CLOCKS];
    377};
    378
    379static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val)
    380{
    381	struct cdns_regmap_cdb_context *ctx = context;
    382	u32 offset = reg << ctx->reg_offset_shift;
    383
    384	writew(val, ctx->base + offset);
    385
    386	return 0;
    387}
    388
    389static int cdns_regmap_read(void *context, unsigned int reg, unsigned int *val)
    390{
    391	struct cdns_regmap_cdb_context *ctx = context;
    392	u32 offset = reg << ctx->reg_offset_shift;
    393
    394	*val = readw(ctx->base + offset);
    395	return 0;
    396}
    397
    398#define SIERRA_LANE_CDB_REGMAP_CONF(n) \
    399{ \
    400	.name = "sierra_lane" n "_cdb", \
    401	.reg_stride = 1, \
    402	.fast_io = true, \
    403	.reg_write = cdns_regmap_write, \
    404	.reg_read = cdns_regmap_read, \
    405}
    406
    407static const struct regmap_config cdns_sierra_lane_cdb_config[] = {
    408	SIERRA_LANE_CDB_REGMAP_CONF("0"),
    409	SIERRA_LANE_CDB_REGMAP_CONF("1"),
    410	SIERRA_LANE_CDB_REGMAP_CONF("2"),
    411	SIERRA_LANE_CDB_REGMAP_CONF("3"),
    412	SIERRA_LANE_CDB_REGMAP_CONF("4"),
    413	SIERRA_LANE_CDB_REGMAP_CONF("5"),
    414	SIERRA_LANE_CDB_REGMAP_CONF("6"),
    415	SIERRA_LANE_CDB_REGMAP_CONF("7"),
    416	SIERRA_LANE_CDB_REGMAP_CONF("8"),
    417	SIERRA_LANE_CDB_REGMAP_CONF("9"),
    418	SIERRA_LANE_CDB_REGMAP_CONF("10"),
    419	SIERRA_LANE_CDB_REGMAP_CONF("11"),
    420	SIERRA_LANE_CDB_REGMAP_CONF("12"),
    421	SIERRA_LANE_CDB_REGMAP_CONF("13"),
    422	SIERRA_LANE_CDB_REGMAP_CONF("14"),
    423	SIERRA_LANE_CDB_REGMAP_CONF("15"),
    424};
    425
    426static const struct regmap_config cdns_sierra_common_cdb_config = {
    427	.name = "sierra_common_cdb",
    428	.reg_stride = 1,
    429	.fast_io = true,
    430	.reg_write = cdns_regmap_write,
    431	.reg_read = cdns_regmap_read,
    432};
    433
    434static const struct regmap_config cdns_sierra_phy_pcs_cmn_cdb_config = {
    435	.name = "sierra_phy_pcs_cmn_cdb",
    436	.reg_stride = 1,
    437	.fast_io = true,
    438	.reg_write = cdns_regmap_write,
    439	.reg_read = cdns_regmap_read,
    440};
    441
    442#define SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF(n) \
    443{ \
    444	.name = "sierra_phy_pcs_lane" n "_cdb", \
    445	.reg_stride = 1, \
    446	.fast_io = true, \
    447	.reg_write = cdns_regmap_write, \
    448	.reg_read = cdns_regmap_read, \
    449}
    450
    451static const struct regmap_config cdns_sierra_phy_pcs_lane_cdb_config[] = {
    452	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("0"),
    453	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("1"),
    454	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("2"),
    455	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("3"),
    456	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("4"),
    457	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("5"),
    458	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("6"),
    459	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("7"),
    460	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("8"),
    461	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("9"),
    462	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("10"),
    463	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("11"),
    464	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("12"),
    465	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("13"),
    466	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("14"),
    467	SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("15"),
    468};
    469
    470static const struct regmap_config cdns_sierra_phy_pma_cmn_cdb_config = {
    471	.name = "sierra_phy_pma_cmn_cdb",
    472	.reg_stride = 1,
    473	.fast_io = true,
    474	.reg_write = cdns_regmap_write,
    475	.reg_read = cdns_regmap_read,
    476};
    477
    478#define SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF(n) \
    479{ \
    480	.name = "sierra_phy_pma_lane" n "_cdb", \
    481	.reg_stride = 1, \
    482	.fast_io = true, \
    483	.reg_write = cdns_regmap_write, \
    484	.reg_read = cdns_regmap_read, \
    485}
    486
    487static const struct regmap_config cdns_sierra_phy_pma_lane_cdb_config[] = {
    488	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("0"),
    489	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("1"),
    490	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("2"),
    491	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("3"),
    492	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("4"),
    493	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("5"),
    494	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("6"),
    495	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("7"),
    496	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("8"),
    497	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("9"),
    498	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("10"),
    499	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("11"),
    500	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("12"),
    501	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("13"),
    502	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("14"),
    503	SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("15"),
    504};
    505
    506static int cdns_sierra_phy_init(struct phy *gphy)
    507{
    508	struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
    509	struct cdns_sierra_phy *phy = dev_get_drvdata(gphy->dev.parent);
    510	const struct cdns_sierra_data *init_data = phy->init_data;
    511	struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals;
    512	enum cdns_sierra_phy_type phy_type = ins->phy_type;
    513	enum cdns_sierra_ssc_mode ssc = ins->ssc_mode;
    514	struct cdns_sierra_vals *phy_pma_ln_vals;
    515	const struct cdns_reg_pairs *reg_pairs;
    516	struct cdns_sierra_vals *pcs_cmn_vals;
    517	struct regmap *regmap;
    518	u32 num_regs;
    519	int i, j;
    520
    521	/* Initialise the PHY registers, unless auto configured */
    522	if (phy->autoconf || phy->already_configured || phy->nsubnodes > 1)
    523		return 0;
    524
    525	clk_set_rate(phy->input_clks[CMN_REFCLK_DIG_DIV], 25000000);
    526	clk_set_rate(phy->input_clks[CMN_REFCLK1_DIG_DIV], 25000000);
    527
    528	/* PHY PCS common registers configurations */
    529	pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc];
    530	if (pcs_cmn_vals) {
    531		reg_pairs = pcs_cmn_vals->reg_pairs;
    532		num_regs = pcs_cmn_vals->num_regs;
    533		regmap = phy->regmap_phy_pcs_common_cdb;
    534		for (i = 0; i < num_regs; i++)
    535			regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
    536	}
    537
    538	/* PHY PMA lane registers configurations */
    539	phy_pma_ln_vals = init_data->phy_pma_ln_vals[phy_type][TYPE_NONE][ssc];
    540	if (phy_pma_ln_vals) {
    541		reg_pairs = phy_pma_ln_vals->reg_pairs;
    542		num_regs = phy_pma_ln_vals->num_regs;
    543		for (i = 0; i < ins->num_lanes; i++) {
    544			regmap = phy->regmap_phy_pma_lane_cdb[i + ins->mlane];
    545			for (j = 0; j < num_regs; j++)
    546				regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
    547		}
    548	}
    549
    550	/* PMA common registers configurations */
    551	pma_cmn_vals = init_data->pma_cmn_vals[phy_type][TYPE_NONE][ssc];
    552	if (pma_cmn_vals) {
    553		reg_pairs = pma_cmn_vals->reg_pairs;
    554		num_regs = pma_cmn_vals->num_regs;
    555		regmap = phy->regmap_common_cdb;
    556		for (i = 0; i < num_regs; i++)
    557			regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
    558	}
    559
    560	/* PMA lane registers configurations */
    561	pma_ln_vals = init_data->pma_ln_vals[phy_type][TYPE_NONE][ssc];
    562	if (pma_ln_vals) {
    563		reg_pairs = pma_ln_vals->reg_pairs;
    564		num_regs = pma_ln_vals->num_regs;
    565		for (i = 0; i < ins->num_lanes; i++) {
    566			regmap = phy->regmap_lane_cdb[i + ins->mlane];
    567			for (j = 0; j < num_regs; j++)
    568				regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
    569		}
    570	}
    571
    572	return 0;
    573}
    574
    575static int cdns_sierra_phy_on(struct phy *gphy)
    576{
    577	struct cdns_sierra_phy *sp = dev_get_drvdata(gphy->dev.parent);
    578	struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
    579	struct device *dev = sp->dev;
    580	u32 val;
    581	int ret;
    582
    583	if (sp->nsubnodes == 1) {
    584		/* Take the PHY out of reset */
    585		ret = reset_control_deassert(sp->phy_rst);
    586		if (ret) {
    587			dev_err(dev, "Failed to take the PHY out of reset\n");
    588			return ret;
    589		}
    590	}
    591
    592	/* Take the PHY lane group out of reset */
    593	ret = reset_control_deassert(ins->lnk_rst);
    594	if (ret) {
    595		dev_err(dev, "Failed to take the PHY lane out of reset\n");
    596		return ret;
    597	}
    598
    599	if (ins->phy_type == TYPE_PCIE || ins->phy_type == TYPE_USB) {
    600		ret = regmap_field_read_poll_timeout(sp->phy_iso_link_ctrl_1[ins->mlane],
    601						     val, !val, 1000, PLL_LOCK_TIME);
    602		if (ret) {
    603			dev_err(dev, "Timeout waiting for PHY status ready\n");
    604			return ret;
    605		}
    606	}
    607
    608	/*
    609	 * Wait for cmn_ready assertion
    610	 * PHY_PMA_CMN_CTRL[0] == 1
    611	 */
    612	ret = regmap_field_read_poll_timeout(sp->pma_cmn_ready, val, val,
    613					     1000, PLL_LOCK_TIME);
    614	if (ret) {
    615		dev_err(dev, "Timeout waiting for CMN ready\n");
    616		return ret;
    617	}
    618
    619	ret = regmap_field_read_poll_timeout(sp->pllctrl_lock[ins->mlane],
    620					     val, val, 1000, PLL_LOCK_TIME);
    621	if (ret < 0)
    622		dev_err(dev, "PLL lock of lane failed\n");
    623
    624	return ret;
    625}
    626
    627static int cdns_sierra_phy_off(struct phy *gphy)
    628{
    629	struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
    630
    631	return reset_control_assert(ins->lnk_rst);
    632}
    633
    634static int cdns_sierra_phy_reset(struct phy *gphy)
    635{
    636	struct cdns_sierra_phy *sp = dev_get_drvdata(gphy->dev.parent);
    637
    638	reset_control_assert(sp->phy_rst);
    639	reset_control_deassert(sp->phy_rst);
    640	return 0;
    641};
    642
    643static const struct phy_ops ops = {
    644	.init		= cdns_sierra_phy_init,
    645	.power_on	= cdns_sierra_phy_on,
    646	.power_off	= cdns_sierra_phy_off,
    647	.reset		= cdns_sierra_phy_reset,
    648	.owner		= THIS_MODULE,
    649};
    650
    651static int cdns_sierra_noop_phy_on(struct phy *gphy)
    652{
    653	usleep_range(5000, 10000);
    654
    655	return 0;
    656}
    657
    658static const struct phy_ops noop_ops = {
    659	.power_on	= cdns_sierra_noop_phy_on,
    660	.owner		= THIS_MODULE,
    661};
    662
    663static u8 cdns_sierra_pll_mux_get_parent(struct clk_hw *hw)
    664{
    665	struct cdns_sierra_pll_mux *mux = to_cdns_sierra_pll_mux(hw);
    666	struct regmap_field *plllc1en_field = mux->plllc1en_field;
    667	struct regmap_field *termen_field = mux->termen_field;
    668	struct regmap_field *field = mux->pfdclk_sel_preg;
    669	unsigned int val;
    670	int index;
    671
    672	regmap_field_read(field, &val);
    673
    674	if (strstr(clk_hw_get_name(hw), clk_names[CDNS_SIERRA_PLL_CMNLC1])) {
    675		index = clk_mux_val_to_index(hw, cdns_sierra_pll_mux_table[CMN_PLLLC1], 0, val);
    676		if (index == 1) {
    677			regmap_field_write(plllc1en_field, 1);
    678			regmap_field_write(termen_field, 1);
    679		}
    680	} else {
    681		index = clk_mux_val_to_index(hw, cdns_sierra_pll_mux_table[CMN_PLLLC], 0, val);
    682	}
    683
    684	return index;
    685}
    686
    687static int cdns_sierra_pll_mux_set_parent(struct clk_hw *hw, u8 index)
    688{
    689	struct cdns_sierra_pll_mux *mux = to_cdns_sierra_pll_mux(hw);
    690	struct regmap_field *plllc1en_field = mux->plllc1en_field;
    691	struct regmap_field *termen_field = mux->termen_field;
    692	struct regmap_field *field = mux->pfdclk_sel_preg;
    693	int val, ret;
    694
    695	ret = regmap_field_write(plllc1en_field, 0);
    696	ret |= regmap_field_write(termen_field, 0);
    697	if (index == 1) {
    698		ret |= regmap_field_write(plllc1en_field, 1);
    699		ret |= regmap_field_write(termen_field, 1);
    700	}
    701
    702	if (strstr(clk_hw_get_name(hw), clk_names[CDNS_SIERRA_PLL_CMNLC1]))
    703		val = cdns_sierra_pll_mux_table[CMN_PLLLC1][index];
    704	else
    705		val = cdns_sierra_pll_mux_table[CMN_PLLLC][index];
    706
    707	ret |= regmap_field_write(field, val);
    708
    709	return ret;
    710}
    711
    712static const struct clk_ops cdns_sierra_pll_mux_ops = {
    713	.set_parent = cdns_sierra_pll_mux_set_parent,
    714	.get_parent = cdns_sierra_pll_mux_get_parent,
    715};
    716
    717static int cdns_sierra_pll_mux_register(struct cdns_sierra_phy *sp,
    718					struct regmap_field *pfdclk1_sel_field,
    719					struct regmap_field *plllc1en_field,
    720					struct regmap_field *termen_field,
    721					int clk_index)
    722{
    723	struct cdns_sierra_pll_mux *mux;
    724	struct device *dev = sp->dev;
    725	struct clk_init_data *init;
    726	const char **parent_names;
    727	unsigned int num_parents;
    728	char clk_name[100];
    729	struct clk *clk;
    730	int i;
    731
    732	mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
    733	if (!mux)
    734		return -ENOMEM;
    735
    736	num_parents = SIERRA_NUM_CMN_PLLC_PARENTS;
    737	parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents), GFP_KERNEL);
    738	if (!parent_names)
    739		return -ENOMEM;
    740
    741	for (i = 0; i < num_parents; i++) {
    742		clk = sp->input_clks[pll_mux_parent_index[clk_index][i]];
    743		if (IS_ERR_OR_NULL(clk)) {
    744			dev_err(dev, "No parent clock for PLL mux clocks\n");
    745			return IS_ERR(clk) ? PTR_ERR(clk) : -ENOENT;
    746		}
    747		parent_names[i] = __clk_get_name(clk);
    748	}
    749
    750	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), clk_names[clk_index]);
    751
    752	init = &mux->clk_data;
    753
    754	init->ops = &cdns_sierra_pll_mux_ops;
    755	init->flags = CLK_SET_RATE_NO_REPARENT;
    756	init->parent_names = parent_names;
    757	init->num_parents = num_parents;
    758	init->name = clk_name;
    759
    760	mux->pfdclk_sel_preg = pfdclk1_sel_field;
    761	mux->plllc1en_field = plllc1en_field;
    762	mux->termen_field = termen_field;
    763	mux->hw.init = init;
    764
    765	clk = devm_clk_register(dev, &mux->hw);
    766	if (IS_ERR(clk))
    767		return PTR_ERR(clk);
    768
    769	sp->output_clks[clk_index] = clk;
    770
    771	return 0;
    772}
    773
    774static int cdns_sierra_phy_register_pll_mux(struct cdns_sierra_phy *sp)
    775{
    776	struct regmap_field *pfdclk1_sel_field;
    777	struct regmap_field *plllc1en_field;
    778	struct regmap_field *termen_field;
    779	struct device *dev = sp->dev;
    780	int ret = 0, i, clk_index;
    781
    782	clk_index = CDNS_SIERRA_PLL_CMNLC;
    783	for (i = 0; i < SIERRA_NUM_CMN_PLLC; i++, clk_index++) {
    784		pfdclk1_sel_field = sp->cmn_plllc_pfdclk1_sel_preg[i];
    785		plllc1en_field = sp->cmn_refrcv_refclk_plllc1en_preg[i];
    786		termen_field = sp->cmn_refrcv_refclk_termen_preg[i];
    787
    788		ret = cdns_sierra_pll_mux_register(sp, pfdclk1_sel_field, plllc1en_field,
    789						   termen_field, clk_index);
    790		if (ret) {
    791			dev_err(dev, "Fail to register cmn plllc mux\n");
    792			return ret;
    793		}
    794	}
    795
    796	return 0;
    797}
    798
    799static int cdns_sierra_derived_refclk_enable(struct clk_hw *hw)
    800{
    801	struct cdns_sierra_derived_refclk *derived_refclk = to_cdns_sierra_derived_refclk(hw);
    802
    803	regmap_field_write(derived_refclk->cmn_plllc_clk1_en_preg, 0x1);
    804
    805	/* Programming to get 100Mhz clock output in ref_der_clk_out 5GHz VCO/50 = 100MHz */
    806	regmap_field_write(derived_refclk->cmn_plllc_clk1outdiv_preg, 0x2E);
    807
    808	return 0;
    809}
    810
    811static void cdns_sierra_derived_refclk_disable(struct clk_hw *hw)
    812{
    813	struct cdns_sierra_derived_refclk *derived_refclk = to_cdns_sierra_derived_refclk(hw);
    814
    815	regmap_field_write(derived_refclk->cmn_plllc_clk1_en_preg, 0);
    816}
    817
    818static int cdns_sierra_derived_refclk_is_enabled(struct clk_hw *hw)
    819{
    820	struct cdns_sierra_derived_refclk *derived_refclk = to_cdns_sierra_derived_refclk(hw);
    821	int val;
    822
    823	regmap_field_read(derived_refclk->cmn_plllc_clk1_en_preg, &val);
    824
    825	return !!val;
    826}
    827
    828static const struct clk_ops cdns_sierra_derived_refclk_ops = {
    829	.enable = cdns_sierra_derived_refclk_enable,
    830	.disable = cdns_sierra_derived_refclk_disable,
    831	.is_enabled = cdns_sierra_derived_refclk_is_enabled,
    832};
    833
    834static int cdns_sierra_derived_refclk_register(struct cdns_sierra_phy *sp)
    835{
    836	struct cdns_sierra_derived_refclk *derived_refclk;
    837	struct device *dev = sp->dev;
    838	struct regmap_field *field;
    839	struct clk_init_data *init;
    840	struct regmap *regmap;
    841	char clk_name[100];
    842	struct clk *clk;
    843
    844	derived_refclk = devm_kzalloc(dev, sizeof(*derived_refclk), GFP_KERNEL);
    845	if (!derived_refclk)
    846		return -ENOMEM;
    847
    848	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
    849		 clk_names[CDNS_SIERRA_DERIVED_REFCLK]);
    850
    851	init = &derived_refclk->clk_data;
    852
    853	init->ops = &cdns_sierra_derived_refclk_ops;
    854	init->flags = 0;
    855	init->name = clk_name;
    856
    857	regmap = sp->regmap_common_cdb;
    858
    859	field = devm_regmap_field_alloc(dev, regmap, cmn_plllc_clk1outdiv_preg);
    860	if (IS_ERR(field)) {
    861		dev_err(dev, "cmn_plllc_clk1outdiv_preg reg field init failed\n");
    862		return PTR_ERR(field);
    863	}
    864	derived_refclk->cmn_plllc_clk1outdiv_preg = field;
    865
    866	field = devm_regmap_field_alloc(dev, regmap, cmn_plllc_clk1_en_preg);
    867	if (IS_ERR(field)) {
    868		dev_err(dev, "cmn_plllc_clk1_en_preg reg field init failed\n");
    869		return PTR_ERR(field);
    870	}
    871	derived_refclk->cmn_plllc_clk1_en_preg = field;
    872
    873	derived_refclk->hw.init = init;
    874
    875	clk = devm_clk_register(dev, &derived_refclk->hw);
    876	if (IS_ERR(clk))
    877		return PTR_ERR(clk);
    878
    879	sp->output_clks[CDNS_SIERRA_DERIVED_REFCLK] = clk;
    880
    881	return 0;
    882}
    883
    884static void cdns_sierra_clk_unregister(struct cdns_sierra_phy *sp)
    885{
    886	struct device *dev = sp->dev;
    887	struct device_node *node = dev->of_node;
    888
    889	of_clk_del_provider(node);
    890}
    891
    892static int cdns_sierra_clk_register(struct cdns_sierra_phy *sp)
    893{
    894	struct device *dev = sp->dev;
    895	struct device_node *node = dev->of_node;
    896	int ret;
    897
    898	ret = cdns_sierra_phy_register_pll_mux(sp);
    899	if (ret) {
    900		dev_err(dev, "Failed to pll mux clocks\n");
    901		return ret;
    902	}
    903
    904	ret = cdns_sierra_derived_refclk_register(sp);
    905	if (ret) {
    906		dev_err(dev, "Failed to register derived refclk\n");
    907		return ret;
    908	}
    909
    910	sp->clk_data.clks = sp->output_clks;
    911	sp->clk_data.clk_num = CDNS_SIERRA_OUTPUT_CLOCKS;
    912	ret = of_clk_add_provider(node, of_clk_src_onecell_get, &sp->clk_data);
    913	if (ret)
    914		dev_err(dev, "Failed to add clock provider: %s\n", node->name);
    915
    916	return ret;
    917}
    918
    919static int cdns_sierra_get_optional(struct cdns_sierra_inst *inst,
    920				    struct device_node *child)
    921{
    922	u32 phy_type;
    923
    924	if (of_property_read_u32(child, "reg", &inst->mlane))
    925		return -EINVAL;
    926
    927	if (of_property_read_u32(child, "cdns,num-lanes", &inst->num_lanes))
    928		return -EINVAL;
    929
    930	if (of_property_read_u32(child, "cdns,phy-type", &phy_type))
    931		return -EINVAL;
    932
    933	switch (phy_type) {
    934	case PHY_TYPE_PCIE:
    935		inst->phy_type = TYPE_PCIE;
    936		break;
    937	case PHY_TYPE_USB3:
    938		inst->phy_type = TYPE_USB;
    939		break;
    940	case PHY_TYPE_QSGMII:
    941		inst->phy_type = TYPE_QSGMII;
    942		break;
    943	default:
    944		return -EINVAL;
    945	}
    946
    947	inst->ssc_mode = EXTERNAL_SSC;
    948	of_property_read_u32(child, "cdns,ssc-mode", &inst->ssc_mode);
    949
    950	return 0;
    951}
    952
    953static struct regmap *cdns_regmap_init(struct device *dev, void __iomem *base,
    954				       u32 block_offset, u8 reg_offset_shift,
    955				       const struct regmap_config *config)
    956{
    957	struct cdns_regmap_cdb_context *ctx;
    958
    959	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
    960	if (!ctx)
    961		return ERR_PTR(-ENOMEM);
    962
    963	ctx->dev = dev;
    964	ctx->base = base + block_offset;
    965	ctx->reg_offset_shift = reg_offset_shift;
    966
    967	return devm_regmap_init(dev, NULL, ctx, config);
    968}
    969
    970static int cdns_regfield_init(struct cdns_sierra_phy *sp)
    971{
    972	struct device *dev = sp->dev;
    973	struct regmap_field *field;
    974	struct reg_field reg_field;
    975	struct regmap *regmap;
    976	int i;
    977
    978	regmap = sp->regmap_common_cdb;
    979	field = devm_regmap_field_alloc(dev, regmap, macro_id_type);
    980	if (IS_ERR(field)) {
    981		dev_err(dev, "MACRO_ID_TYPE reg field init failed\n");
    982		return PTR_ERR(field);
    983	}
    984	sp->macro_id_type = field;
    985
    986	for (i = 0; i < SIERRA_NUM_CMN_PLLC; i++) {
    987		reg_field = cmn_plllc_pfdclk1_sel_preg[i].pfdclk_sel_preg;
    988		field = devm_regmap_field_alloc(dev, regmap, reg_field);
    989		if (IS_ERR(field)) {
    990			dev_err(dev, "PLLLC%d_PFDCLK1_SEL failed\n", i);
    991			return PTR_ERR(field);
    992		}
    993		sp->cmn_plllc_pfdclk1_sel_preg[i] = field;
    994
    995		reg_field = cmn_plllc_pfdclk1_sel_preg[i].plllc1en_field;
    996		field = devm_regmap_field_alloc(dev, regmap, reg_field);
    997		if (IS_ERR(field)) {
    998			dev_err(dev, "REFRCV%d_REFCLK_PLLLC1EN failed\n", i);
    999			return PTR_ERR(field);
   1000		}
   1001		sp->cmn_refrcv_refclk_plllc1en_preg[i] = field;
   1002
   1003		reg_field = cmn_plllc_pfdclk1_sel_preg[i].termen_field;
   1004		field = devm_regmap_field_alloc(dev, regmap, reg_field);
   1005		if (IS_ERR(field)) {
   1006			dev_err(dev, "REFRCV%d_REFCLK_TERMEN failed\n", i);
   1007			return PTR_ERR(field);
   1008		}
   1009		sp->cmn_refrcv_refclk_termen_preg[i] = field;
   1010	}
   1011
   1012	regmap = sp->regmap_phy_pcs_common_cdb;
   1013	field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg_1);
   1014	if (IS_ERR(field)) {
   1015		dev_err(dev, "PHY_PLL_CFG_1 reg field init failed\n");
   1016		return PTR_ERR(field);
   1017	}
   1018	sp->phy_pll_cfg_1 = field;
   1019
   1020	regmap = sp->regmap_phy_pma_common_cdb;
   1021	field = devm_regmap_field_alloc(dev, regmap, pma_cmn_ready);
   1022	if (IS_ERR(field)) {
   1023		dev_err(dev, "PHY_PMA_CMN_CTRL reg field init failed\n");
   1024		return PTR_ERR(field);
   1025	}
   1026	sp->pma_cmn_ready = field;
   1027
   1028	for (i = 0; i < SIERRA_MAX_LANES; i++) {
   1029		regmap = sp->regmap_lane_cdb[i];
   1030		field = devm_regmap_field_alloc(dev, regmap, pllctrl_lock);
   1031		if (IS_ERR(field)) {
   1032			dev_err(dev, "P%d_ENABLE reg field init failed\n", i);
   1033			return PTR_ERR(field);
   1034		}
   1035		sp->pllctrl_lock[i] = field;
   1036	}
   1037
   1038	for (i = 0; i < SIERRA_MAX_LANES; i++) {
   1039		regmap = sp->regmap_phy_pcs_lane_cdb[i];
   1040		field = devm_regmap_field_alloc(dev, regmap, phy_iso_link_ctrl_1);
   1041		if (IS_ERR(field)) {
   1042			dev_err(dev, "PHY_ISO_LINK_CTRL reg field init for lane %d failed\n", i);
   1043			return PTR_ERR(field);
   1044		}
   1045		sp->phy_iso_link_ctrl_1[i] = field;
   1046	}
   1047
   1048	return 0;
   1049}
   1050
   1051static int cdns_regmap_init_blocks(struct cdns_sierra_phy *sp,
   1052				   void __iomem *base, u8 block_offset_shift,
   1053				   u8 reg_offset_shift)
   1054{
   1055	struct device *dev = sp->dev;
   1056	struct regmap *regmap;
   1057	u32 block_offset;
   1058	int i;
   1059
   1060	for (i = 0; i < SIERRA_MAX_LANES; i++) {
   1061		block_offset = SIERRA_LANE_CDB_OFFSET(i, block_offset_shift,
   1062						      reg_offset_shift);
   1063		regmap = cdns_regmap_init(dev, base, block_offset,
   1064					  reg_offset_shift,
   1065					  &cdns_sierra_lane_cdb_config[i]);
   1066		if (IS_ERR(regmap)) {
   1067			dev_err(dev, "Failed to init lane CDB regmap\n");
   1068			return PTR_ERR(regmap);
   1069		}
   1070		sp->regmap_lane_cdb[i] = regmap;
   1071	}
   1072
   1073	regmap = cdns_regmap_init(dev, base, SIERRA_COMMON_CDB_OFFSET,
   1074				  reg_offset_shift,
   1075				  &cdns_sierra_common_cdb_config);
   1076	if (IS_ERR(regmap)) {
   1077		dev_err(dev, "Failed to init common CDB regmap\n");
   1078		return PTR_ERR(regmap);
   1079	}
   1080	sp->regmap_common_cdb = regmap;
   1081
   1082	block_offset = SIERRA_PHY_PCS_COMMON_OFFSET(block_offset_shift);
   1083	regmap = cdns_regmap_init(dev, base, block_offset, reg_offset_shift,
   1084				  &cdns_sierra_phy_pcs_cmn_cdb_config);
   1085	if (IS_ERR(regmap)) {
   1086		dev_err(dev, "Failed to init PHY PCS common CDB regmap\n");
   1087		return PTR_ERR(regmap);
   1088	}
   1089	sp->regmap_phy_pcs_common_cdb = regmap;
   1090
   1091	for (i = 0; i < SIERRA_MAX_LANES; i++) {
   1092		block_offset = SIERRA_PHY_PCS_LANE_CDB_OFFSET(i, block_offset_shift,
   1093							      reg_offset_shift);
   1094		regmap = cdns_regmap_init(dev, base, block_offset,
   1095					  reg_offset_shift,
   1096					  &cdns_sierra_phy_pcs_lane_cdb_config[i]);
   1097		if (IS_ERR(regmap)) {
   1098			dev_err(dev, "Failed to init PHY PCS lane CDB regmap\n");
   1099			return PTR_ERR(regmap);
   1100		}
   1101		sp->regmap_phy_pcs_lane_cdb[i] = regmap;
   1102	}
   1103
   1104	block_offset = SIERRA_PHY_PMA_COMMON_OFFSET(block_offset_shift);
   1105	regmap = cdns_regmap_init(dev, base, block_offset, reg_offset_shift,
   1106				  &cdns_sierra_phy_pma_cmn_cdb_config);
   1107	if (IS_ERR(regmap)) {
   1108		dev_err(dev, "Failed to init PHY PMA common CDB regmap\n");
   1109		return PTR_ERR(regmap);
   1110	}
   1111	sp->regmap_phy_pma_common_cdb = regmap;
   1112
   1113	for (i = 0; i < SIERRA_MAX_LANES; i++) {
   1114		block_offset = SIERRA_PHY_PMA_LANE_CDB_OFFSET(i, block_offset_shift,
   1115							      reg_offset_shift);
   1116		regmap = cdns_regmap_init(dev, base, block_offset,
   1117					  reg_offset_shift,
   1118					  &cdns_sierra_phy_pma_lane_cdb_config[i]);
   1119		if (IS_ERR(regmap)) {
   1120			dev_err(dev, "Failed to init PHY PMA lane CDB regmap\n");
   1121			return PTR_ERR(regmap);
   1122		}
   1123		sp->regmap_phy_pma_lane_cdb[i] = regmap;
   1124	}
   1125
   1126	return 0;
   1127}
   1128
   1129static int cdns_sierra_phy_get_clocks(struct cdns_sierra_phy *sp,
   1130				      struct device *dev)
   1131{
   1132	struct clk *clk;
   1133	int ret;
   1134
   1135	clk = devm_clk_get_optional(dev, "cmn_refclk_dig_div");
   1136	if (IS_ERR(clk)) {
   1137		dev_err(dev, "cmn_refclk_dig_div clock not found\n");
   1138		ret = PTR_ERR(clk);
   1139		return ret;
   1140	}
   1141	sp->input_clks[CMN_REFCLK_DIG_DIV] = clk;
   1142
   1143	clk = devm_clk_get_optional(dev, "cmn_refclk1_dig_div");
   1144	if (IS_ERR(clk)) {
   1145		dev_err(dev, "cmn_refclk1_dig_div clock not found\n");
   1146		ret = PTR_ERR(clk);
   1147		return ret;
   1148	}
   1149	sp->input_clks[CMN_REFCLK1_DIG_DIV] = clk;
   1150
   1151	clk = devm_clk_get_optional(dev, "pll0_refclk");
   1152	if (IS_ERR(clk)) {
   1153		dev_err(dev, "pll0_refclk clock not found\n");
   1154		ret = PTR_ERR(clk);
   1155		return ret;
   1156	}
   1157	sp->input_clks[PLL0_REFCLK] = clk;
   1158
   1159	clk = devm_clk_get_optional(dev, "pll1_refclk");
   1160	if (IS_ERR(clk)) {
   1161		dev_err(dev, "pll1_refclk clock not found\n");
   1162		ret = PTR_ERR(clk);
   1163		return ret;
   1164	}
   1165	sp->input_clks[PLL1_REFCLK] = clk;
   1166
   1167	return 0;
   1168}
   1169
   1170static int cdns_sierra_phy_clk(struct cdns_sierra_phy *sp)
   1171{
   1172	struct device *dev = sp->dev;
   1173	struct clk *clk;
   1174	int ret;
   1175
   1176	clk = devm_clk_get_optional(dev, "phy_clk");
   1177	if (IS_ERR(clk)) {
   1178		dev_err(dev, "failed to get clock phy_clk\n");
   1179		return PTR_ERR(clk);
   1180	}
   1181	sp->input_clks[PHY_CLK] = clk;
   1182
   1183	ret = clk_prepare_enable(sp->input_clks[PHY_CLK]);
   1184	if (ret)
   1185		return ret;
   1186
   1187	return 0;
   1188}
   1189
   1190static int cdns_sierra_phy_enable_clocks(struct cdns_sierra_phy *sp)
   1191{
   1192	int ret;
   1193
   1194	ret = clk_prepare_enable(sp->output_clks[CDNS_SIERRA_PLL_CMNLC]);
   1195	if (ret)
   1196		return ret;
   1197
   1198	ret = clk_prepare_enable(sp->output_clks[CDNS_SIERRA_PLL_CMNLC1]);
   1199	if (ret)
   1200		goto err_pll_cmnlc1;
   1201
   1202	return 0;
   1203
   1204err_pll_cmnlc1:
   1205	clk_disable_unprepare(sp->output_clks[CDNS_SIERRA_PLL_CMNLC]);
   1206
   1207	return ret;
   1208}
   1209
   1210static void cdns_sierra_phy_disable_clocks(struct cdns_sierra_phy *sp)
   1211{
   1212	clk_disable_unprepare(sp->output_clks[CDNS_SIERRA_PLL_CMNLC1]);
   1213	clk_disable_unprepare(sp->output_clks[CDNS_SIERRA_PLL_CMNLC]);
   1214	if (!sp->already_configured)
   1215		clk_disable_unprepare(sp->input_clks[PHY_CLK]);
   1216}
   1217
   1218static int cdns_sierra_phy_get_resets(struct cdns_sierra_phy *sp,
   1219				      struct device *dev)
   1220{
   1221	struct reset_control *rst;
   1222
   1223	rst = devm_reset_control_get_exclusive(dev, "sierra_reset");
   1224	if (IS_ERR(rst)) {
   1225		dev_err(dev, "failed to get reset\n");
   1226		return PTR_ERR(rst);
   1227	}
   1228	sp->phy_rst = rst;
   1229
   1230	rst = devm_reset_control_get_optional_exclusive(dev, "sierra_apb");
   1231	if (IS_ERR(rst)) {
   1232		dev_err(dev, "failed to get apb reset\n");
   1233		return PTR_ERR(rst);
   1234	}
   1235	sp->apb_rst = rst;
   1236
   1237	return 0;
   1238}
   1239
   1240static int cdns_sierra_phy_configure_multilink(struct cdns_sierra_phy *sp)
   1241{
   1242	const struct cdns_sierra_data *init_data = sp->init_data;
   1243	struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals;
   1244	enum cdns_sierra_phy_type phy_t1, phy_t2;
   1245	struct cdns_sierra_vals *phy_pma_ln_vals;
   1246	const struct cdns_reg_pairs *reg_pairs;
   1247	struct cdns_sierra_vals *pcs_cmn_vals;
   1248	int i, j, node, mlane, num_lanes, ret;
   1249	enum cdns_sierra_ssc_mode ssc;
   1250	struct regmap *regmap;
   1251	u32 num_regs;
   1252
   1253	/* Maximum 2 links (subnodes) are supported */
   1254	if (sp->nsubnodes != 2)
   1255		return -EINVAL;
   1256
   1257	clk_set_rate(sp->input_clks[CMN_REFCLK_DIG_DIV], 25000000);
   1258	clk_set_rate(sp->input_clks[CMN_REFCLK1_DIG_DIV], 25000000);
   1259
   1260	/* PHY configured to use both PLL LC and LC1 */
   1261	regmap_field_write(sp->phy_pll_cfg_1, 0x1);
   1262
   1263	phy_t1 = sp->phys[0].phy_type;
   1264	phy_t2 = sp->phys[1].phy_type;
   1265
   1266	/*
   1267	 * PHY configuration for multi-link operation is done in two steps.
   1268	 * e.g. Consider a case for a 4 lane PHY with PCIe using 2 lanes and QSGMII other 2 lanes.
   1269	 * Sierra PHY has 2 PLLs, viz. PLLLC and PLLLC1. So in this case, PLLLC is used for PCIe
   1270	 * and PLLLC1 is used for QSGMII. PHY is configured in two steps as described below.
   1271	 *
   1272	 * [1] For first step, phy_t1 = TYPE_PCIE and phy_t2 = TYPE_QSGMII
   1273	 *     So the register values are selected as [TYPE_PCIE][TYPE_QSGMII][ssc].
   1274	 *     This will configure PHY registers associated for PCIe (i.e. first protocol)
   1275	 *     involving PLLLC registers and registers for first 2 lanes of PHY.
   1276	 * [2] In second step, the variables phy_t1 and phy_t2 are swapped. So now,
   1277	 *     phy_t1 = TYPE_QSGMII and phy_t2 = TYPE_PCIE. And the register values are selected as
   1278	 *     [TYPE_QSGMII][TYPE_PCIE][ssc].
   1279	 *     This will configure PHY registers associated for QSGMII (i.e. second protocol)
   1280	 *     involving PLLLC1 registers and registers for other 2 lanes of PHY.
   1281	 *
   1282	 * This completes the PHY configuration for multilink operation. This approach enables
   1283	 * dividing the large number of PHY register configurations into protocol specific
   1284	 * smaller groups.
   1285	 */
   1286	for (node = 0; node < sp->nsubnodes; node++) {
   1287		if (node == 1) {
   1288			/*
   1289			 * If first link with phy_t1 is configured, then configure the PHY for
   1290			 * second link with phy_t2. Get the array values as [phy_t2][phy_t1][ssc].
   1291			 */
   1292			swap(phy_t1, phy_t2);
   1293		}
   1294
   1295		mlane = sp->phys[node].mlane;
   1296		ssc = sp->phys[node].ssc_mode;
   1297		num_lanes = sp->phys[node].num_lanes;
   1298
   1299		/* PHY PCS common registers configurations */
   1300		pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc];
   1301		if (pcs_cmn_vals) {
   1302			reg_pairs = pcs_cmn_vals->reg_pairs;
   1303			num_regs = pcs_cmn_vals->num_regs;
   1304			regmap = sp->regmap_phy_pcs_common_cdb;
   1305			for (i = 0; i < num_regs; i++)
   1306				regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
   1307		}
   1308
   1309		/* PHY PMA lane registers configurations */
   1310		phy_pma_ln_vals = init_data->phy_pma_ln_vals[phy_t1][phy_t2][ssc];
   1311		if (phy_pma_ln_vals) {
   1312			reg_pairs = phy_pma_ln_vals->reg_pairs;
   1313			num_regs = phy_pma_ln_vals->num_regs;
   1314			for (i = 0; i < num_lanes; i++) {
   1315				regmap = sp->regmap_phy_pma_lane_cdb[i + mlane];
   1316				for (j = 0; j < num_regs; j++)
   1317					regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
   1318			}
   1319		}
   1320
   1321		/* PMA common registers configurations */
   1322		pma_cmn_vals = init_data->pma_cmn_vals[phy_t1][phy_t2][ssc];
   1323		if (pma_cmn_vals) {
   1324			reg_pairs = pma_cmn_vals->reg_pairs;
   1325			num_regs = pma_cmn_vals->num_regs;
   1326			regmap = sp->regmap_common_cdb;
   1327			for (i = 0; i < num_regs; i++)
   1328				regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
   1329		}
   1330
   1331		/* PMA lane registers configurations */
   1332		pma_ln_vals = init_data->pma_ln_vals[phy_t1][phy_t2][ssc];
   1333		if (pma_ln_vals) {
   1334			reg_pairs = pma_ln_vals->reg_pairs;
   1335			num_regs = pma_ln_vals->num_regs;
   1336			for (i = 0; i < num_lanes; i++) {
   1337				regmap = sp->regmap_lane_cdb[i + mlane];
   1338				for (j = 0; j < num_regs; j++)
   1339					regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
   1340			}
   1341		}
   1342
   1343		if (phy_t1 == TYPE_QSGMII)
   1344			reset_control_deassert(sp->phys[node].lnk_rst);
   1345	}
   1346
   1347	/* Take the PHY out of reset */
   1348	ret = reset_control_deassert(sp->phy_rst);
   1349	if (ret)
   1350		return ret;
   1351
   1352	return 0;
   1353}
   1354
   1355static int cdns_sierra_phy_probe(struct platform_device *pdev)
   1356{
   1357	struct cdns_sierra_phy *sp;
   1358	struct phy_provider *phy_provider;
   1359	struct device *dev = &pdev->dev;
   1360	const struct cdns_sierra_data *data;
   1361	unsigned int id_value;
   1362	int ret, node = 0;
   1363	void __iomem *base;
   1364	struct device_node *dn = dev->of_node, *child;
   1365
   1366	if (of_get_child_count(dn) == 0)
   1367		return -ENODEV;
   1368
   1369	/* Get init data for this PHY */
   1370	data = of_device_get_match_data(dev);
   1371	if (!data)
   1372		return -EINVAL;
   1373
   1374	sp = devm_kzalloc(dev, sizeof(*sp), GFP_KERNEL);
   1375	if (!sp)
   1376		return -ENOMEM;
   1377	dev_set_drvdata(dev, sp);
   1378	sp->dev = dev;
   1379	sp->init_data = data;
   1380
   1381	base = devm_platform_ioremap_resource(pdev, 0);
   1382	if (IS_ERR(base)) {
   1383		dev_err(dev, "missing \"reg\"\n");
   1384		return PTR_ERR(base);
   1385	}
   1386
   1387	ret = cdns_regmap_init_blocks(sp, base, data->block_offset_shift,
   1388				      data->reg_offset_shift);
   1389	if (ret)
   1390		return ret;
   1391
   1392	ret = cdns_regfield_init(sp);
   1393	if (ret)
   1394		return ret;
   1395
   1396	platform_set_drvdata(pdev, sp);
   1397
   1398	ret = cdns_sierra_phy_get_clocks(sp, dev);
   1399	if (ret)
   1400		return ret;
   1401
   1402	ret = cdns_sierra_clk_register(sp);
   1403	if (ret)
   1404		return ret;
   1405
   1406	ret = cdns_sierra_phy_enable_clocks(sp);
   1407	if (ret)
   1408		goto unregister_clk;
   1409
   1410	regmap_field_read(sp->pma_cmn_ready, &sp->already_configured);
   1411
   1412	if (!sp->already_configured) {
   1413		ret = cdns_sierra_phy_clk(sp);
   1414		if (ret)
   1415			goto clk_disable;
   1416
   1417		ret = cdns_sierra_phy_get_resets(sp, dev);
   1418		if (ret)
   1419			goto clk_disable;
   1420
   1421		/* Enable APB */
   1422		reset_control_deassert(sp->apb_rst);
   1423	}
   1424
   1425	/* Check that PHY is present */
   1426	regmap_field_read(sp->macro_id_type, &id_value);
   1427	if  (sp->init_data->id_value != id_value) {
   1428		ret = -EINVAL;
   1429		goto ctrl_assert;
   1430	}
   1431
   1432	sp->autoconf = of_property_read_bool(dn, "cdns,autoconf");
   1433
   1434	for_each_available_child_of_node(dn, child) {
   1435		struct phy *gphy;
   1436
   1437		if (!(of_node_name_eq(child, "phy") ||
   1438		      of_node_name_eq(child, "link")))
   1439			continue;
   1440
   1441		sp->phys[node].lnk_rst =
   1442			of_reset_control_array_get_exclusive(child);
   1443
   1444		if (IS_ERR(sp->phys[node].lnk_rst)) {
   1445			dev_err(dev, "failed to get reset %s\n",
   1446				child->full_name);
   1447			ret = PTR_ERR(sp->phys[node].lnk_rst);
   1448			of_node_put(child);
   1449			goto put_control;
   1450		}
   1451
   1452		if (!sp->autoconf) {
   1453			ret = cdns_sierra_get_optional(&sp->phys[node], child);
   1454			if (ret) {
   1455				dev_err(dev, "missing property in node %s\n",
   1456					child->name);
   1457				of_node_put(child);
   1458				reset_control_put(sp->phys[node].lnk_rst);
   1459				goto put_control;
   1460			}
   1461		}
   1462
   1463		sp->num_lanes += sp->phys[node].num_lanes;
   1464
   1465		if (!sp->already_configured)
   1466			gphy = devm_phy_create(dev, child, &ops);
   1467		else
   1468			gphy = devm_phy_create(dev, child, &noop_ops);
   1469		if (IS_ERR(gphy)) {
   1470			ret = PTR_ERR(gphy);
   1471			of_node_put(child);
   1472			reset_control_put(sp->phys[node].lnk_rst);
   1473			goto put_control;
   1474		}
   1475		sp->phys[node].phy = gphy;
   1476		phy_set_drvdata(gphy, &sp->phys[node]);
   1477
   1478		node++;
   1479	}
   1480	sp->nsubnodes = node;
   1481
   1482	if (sp->num_lanes > SIERRA_MAX_LANES) {
   1483		ret = -EINVAL;
   1484		dev_err(dev, "Invalid lane configuration\n");
   1485		goto put_control;
   1486	}
   1487
   1488	/* If more than one subnode, configure the PHY as multilink */
   1489	if (!sp->already_configured && !sp->autoconf && sp->nsubnodes > 1) {
   1490		ret = cdns_sierra_phy_configure_multilink(sp);
   1491		if (ret)
   1492			goto put_control;
   1493	}
   1494
   1495	pm_runtime_enable(dev);
   1496	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
   1497	if (IS_ERR(phy_provider)) {
   1498		ret = PTR_ERR(phy_provider);
   1499		goto put_control;
   1500	}
   1501
   1502	return 0;
   1503
   1504put_control:
   1505	while (--node >= 0)
   1506		reset_control_put(sp->phys[node].lnk_rst);
   1507ctrl_assert:
   1508	if (!sp->already_configured)
   1509		reset_control_assert(sp->apb_rst);
   1510clk_disable:
   1511	cdns_sierra_phy_disable_clocks(sp);
   1512unregister_clk:
   1513	cdns_sierra_clk_unregister(sp);
   1514	return ret;
   1515}
   1516
   1517static int cdns_sierra_phy_remove(struct platform_device *pdev)
   1518{
   1519	struct cdns_sierra_phy *phy = platform_get_drvdata(pdev);
   1520	int i;
   1521
   1522	reset_control_assert(phy->phy_rst);
   1523	reset_control_assert(phy->apb_rst);
   1524	pm_runtime_disable(&pdev->dev);
   1525
   1526	cdns_sierra_phy_disable_clocks(phy);
   1527	/*
   1528	 * The device level resets will be put automatically.
   1529	 * Need to put the subnode resets here though.
   1530	 */
   1531	for (i = 0; i < phy->nsubnodes; i++) {
   1532		reset_control_assert(phy->phys[i].lnk_rst);
   1533		reset_control_put(phy->phys[i].lnk_rst);
   1534	}
   1535
   1536	cdns_sierra_clk_unregister(phy);
   1537
   1538	return 0;
   1539}
   1540
   1541/* QSGMII PHY PMA lane configuration */
   1542static struct cdns_reg_pairs qsgmii_phy_pma_ln_regs[] = {
   1543	{0x9010, SIERRA_PHY_PMA_XCVR_CTRL}
   1544};
   1545
   1546static struct cdns_sierra_vals qsgmii_phy_pma_ln_vals = {
   1547	.reg_pairs = qsgmii_phy_pma_ln_regs,
   1548	.num_regs = ARRAY_SIZE(qsgmii_phy_pma_ln_regs),
   1549};
   1550
   1551/* QSGMII refclk 100MHz, 20b, opt1, No BW cal, no ssc, PLL LC1 */
   1552static const struct cdns_reg_pairs qsgmii_100_no_ssc_plllc1_cmn_regs[] = {
   1553	{0x2085, SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG},
   1554	{0x0000, SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG},
   1555	{0x0000, SIERRA_CMN_PLLLC1_SS_TIME_STEPSIZE_MODE_PREG}
   1556};
   1557
   1558static const struct cdns_reg_pairs qsgmii_100_no_ssc_plllc1_ln_regs[] = {
   1559	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   1560	{0x0252, SIERRA_DET_STANDEC_E_PREG},
   1561	{0x0004, SIERRA_PSC_LN_IDLE_PREG},
   1562	{0x0FFE, SIERRA_PSC_RX_A0_PREG},
   1563	{0x0011, SIERRA_PLLCTRL_SUBRATE_PREG},
   1564	{0x0001, SIERRA_PLLCTRL_GEN_A_PREG},
   1565	{0x5233, SIERRA_PLLCTRL_CPGAIN_MODE_PREG},
   1566	{0x0000, SIERRA_DRVCTRL_ATTEN_PREG},
   1567	{0x0089, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   1568	{0x3C3C, SIERRA_CREQ_CCLKDET_MODE01_PREG},
   1569	{0x3222, SIERRA_CREQ_FSMCLK_SEL_PREG},
   1570	{0x0000, SIERRA_CREQ_EQ_CTRL_PREG},
   1571	{0x8422, SIERRA_CTLELUT_CTRL_PREG},
   1572	{0x4111, SIERRA_DFE_ECMP_RATESEL_PREG},
   1573	{0x4111, SIERRA_DFE_SMP_RATESEL_PREG},
   1574	{0x0002, SIERRA_DEQ_PHALIGN_CTRL},
   1575	{0x9595, SIERRA_DEQ_VGATUNE_CTRL_PREG},
   1576	{0x0186, SIERRA_DEQ_GLUT0},
   1577	{0x0186, SIERRA_DEQ_GLUT1},
   1578	{0x0186, SIERRA_DEQ_GLUT2},
   1579	{0x0186, SIERRA_DEQ_GLUT3},
   1580	{0x0186, SIERRA_DEQ_GLUT4},
   1581	{0x0861, SIERRA_DEQ_ALUT0},
   1582	{0x07E0, SIERRA_DEQ_ALUT1},
   1583	{0x079E, SIERRA_DEQ_ALUT2},
   1584	{0x071D, SIERRA_DEQ_ALUT3},
   1585	{0x03F5, SIERRA_DEQ_DFETAP_CTRL_PREG},
   1586	{0x0C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG},
   1587	{0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   1588	{0x1C04, SIERRA_DEQ_TAU_CTRL2_PREG},
   1589	{0x0033, SIERRA_DEQ_PICTRL_PREG},
   1590	{0x0660, SIERRA_CPICAL_TMRVAL_MODE0_PREG},
   1591	{0x00D5, SIERRA_CPI_OUTBUF_RATESEL_PREG},
   1592	{0x0B6D, SIERRA_CPI_RESBIAS_BIN_PREG},
   1593	{0x0102, SIERRA_RXBUFFER_CTLECTRL_PREG},
   1594	{0x0002, SIERRA_RXBUFFER_RCDFECTRL_PREG}
   1595};
   1596
   1597static struct cdns_sierra_vals qsgmii_100_no_ssc_plllc1_cmn_vals = {
   1598	.reg_pairs = qsgmii_100_no_ssc_plllc1_cmn_regs,
   1599	.num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_plllc1_cmn_regs),
   1600};
   1601
   1602static struct cdns_sierra_vals qsgmii_100_no_ssc_plllc1_ln_vals = {
   1603	.reg_pairs = qsgmii_100_no_ssc_plllc1_ln_regs,
   1604	.num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_plllc1_ln_regs),
   1605};
   1606
   1607/* PCIE PHY PCS common configuration */
   1608static struct cdns_reg_pairs pcie_phy_pcs_cmn_regs[] = {
   1609	{0x0430, SIERRA_PHY_PIPE_CMN_CTRL1}
   1610};
   1611
   1612static struct cdns_sierra_vals pcie_phy_pcs_cmn_vals = {
   1613	.reg_pairs = pcie_phy_pcs_cmn_regs,
   1614	.num_regs = ARRAY_SIZE(pcie_phy_pcs_cmn_regs),
   1615};
   1616
   1617/* refclk100MHz_32b_PCIe_cmn_pll_no_ssc, pcie_links_using_plllc, pipe_bw_3 */
   1618static const struct cdns_reg_pairs pcie_100_no_ssc_plllc_cmn_regs[] = {
   1619	{0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
   1620	{0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
   1621	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
   1622	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}
   1623};
   1624
   1625/*
   1626 * refclk100MHz_32b_PCIe_ln_no_ssc, multilink, using_plllc,
   1627 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
   1628 */
   1629static const struct cdns_reg_pairs ml_pcie_100_no_ssc_ln_regs[] = {
   1630	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   1631	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   1632	{0x0004, SIERRA_PSC_LN_A3_PREG},
   1633	{0x0004, SIERRA_PSC_LN_A4_PREG},
   1634	{0x0004, SIERRA_PSC_LN_IDLE_PREG},
   1635	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   1636	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   1637	{0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   1638	{0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   1639	{0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   1640	{0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   1641	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   1642	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   1643	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   1644	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   1645	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   1646	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   1647	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   1648	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   1649	{0x0041, SIERRA_DEQ_GLUT0},
   1650	{0x0082, SIERRA_DEQ_GLUT1},
   1651	{0x00C3, SIERRA_DEQ_GLUT2},
   1652	{0x0145, SIERRA_DEQ_GLUT3},
   1653	{0x0186, SIERRA_DEQ_GLUT4},
   1654	{0x09E7, SIERRA_DEQ_ALUT0},
   1655	{0x09A6, SIERRA_DEQ_ALUT1},
   1656	{0x0965, SIERRA_DEQ_ALUT2},
   1657	{0x08E3, SIERRA_DEQ_ALUT3},
   1658	{0x00FA, SIERRA_DEQ_DFETAP0},
   1659	{0x00FA, SIERRA_DEQ_DFETAP1},
   1660	{0x00FA, SIERRA_DEQ_DFETAP2},
   1661	{0x00FA, SIERRA_DEQ_DFETAP3},
   1662	{0x00FA, SIERRA_DEQ_DFETAP4},
   1663	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   1664	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   1665	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   1666	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   1667	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   1668	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   1669	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   1670	{0x002B, SIERRA_CPI_TRIM_PREG},
   1671	{0x0003, SIERRA_EPI_CTRL_PREG},
   1672	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   1673	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   1674	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   1675	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
   1676};
   1677
   1678static struct cdns_sierra_vals pcie_100_no_ssc_plllc_cmn_vals = {
   1679	.reg_pairs = pcie_100_no_ssc_plllc_cmn_regs,
   1680	.num_regs = ARRAY_SIZE(pcie_100_no_ssc_plllc_cmn_regs),
   1681};
   1682
   1683static struct cdns_sierra_vals ml_pcie_100_no_ssc_ln_vals = {
   1684	.reg_pairs = ml_pcie_100_no_ssc_ln_regs,
   1685	.num_regs = ARRAY_SIZE(ml_pcie_100_no_ssc_ln_regs),
   1686};
   1687
   1688/*
   1689 * TI J721E:
   1690 * refclk100MHz_32b_PCIe_ln_no_ssc, multilink, using_plllc,
   1691 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
   1692 */
   1693static const struct cdns_reg_pairs ti_ml_pcie_100_no_ssc_ln_regs[] = {
   1694	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   1695	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   1696	{0x0004, SIERRA_PSC_LN_A3_PREG},
   1697	{0x0004, SIERRA_PSC_LN_A4_PREG},
   1698	{0x0004, SIERRA_PSC_LN_IDLE_PREG},
   1699	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   1700	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   1701	{0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   1702	{0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   1703	{0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   1704	{0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   1705	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   1706	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   1707	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   1708	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   1709	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   1710	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   1711	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   1712	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   1713	{0x0041, SIERRA_DEQ_GLUT0},
   1714	{0x0082, SIERRA_DEQ_GLUT1},
   1715	{0x00C3, SIERRA_DEQ_GLUT2},
   1716	{0x0145, SIERRA_DEQ_GLUT3},
   1717	{0x0186, SIERRA_DEQ_GLUT4},
   1718	{0x09E7, SIERRA_DEQ_ALUT0},
   1719	{0x09A6, SIERRA_DEQ_ALUT1},
   1720	{0x0965, SIERRA_DEQ_ALUT2},
   1721	{0x08E3, SIERRA_DEQ_ALUT3},
   1722	{0x00FA, SIERRA_DEQ_DFETAP0},
   1723	{0x00FA, SIERRA_DEQ_DFETAP1},
   1724	{0x00FA, SIERRA_DEQ_DFETAP2},
   1725	{0x00FA, SIERRA_DEQ_DFETAP3},
   1726	{0x00FA, SIERRA_DEQ_DFETAP4},
   1727	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   1728	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   1729	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   1730	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   1731	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   1732	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   1733	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   1734	{0x002B, SIERRA_CPI_TRIM_PREG},
   1735	{0x0003, SIERRA_EPI_CTRL_PREG},
   1736	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   1737	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   1738	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   1739	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG},
   1740	{0x0002, SIERRA_TX_RCVDET_OVRD_PREG}
   1741};
   1742
   1743static struct cdns_sierra_vals ti_ml_pcie_100_no_ssc_ln_vals = {
   1744	.reg_pairs = ti_ml_pcie_100_no_ssc_ln_regs,
   1745	.num_regs = ARRAY_SIZE(ti_ml_pcie_100_no_ssc_ln_regs),
   1746};
   1747
   1748/* refclk100MHz_32b_PCIe_cmn_pll_int_ssc, pcie_links_using_plllc, pipe_bw_3 */
   1749static const struct cdns_reg_pairs pcie_100_int_ssc_plllc_cmn_regs[] = {
   1750	{0x000E, SIERRA_CMN_PLLLC_MODE_PREG},
   1751	{0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
   1752	{0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
   1753	{0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
   1754	{0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
   1755	{0x0581, SIERRA_CMN_PLLLC_DSMCORR_PREG},
   1756	{0x7F80, SIERRA_CMN_PLLLC_SS_PREG},
   1757	{0x0041, SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG},
   1758	{0x0464, SIERRA_CMN_PLLLC_SSTWOPT_PREG},
   1759	{0x0D0D, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG},
   1760	{0x0060, SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG}
   1761};
   1762
   1763/*
   1764 * refclk100MHz_32b_PCIe_ln_int_ssc, multilink, using_plllc,
   1765 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
   1766 */
   1767static const struct cdns_reg_pairs ml_pcie_100_int_ssc_ln_regs[] = {
   1768	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   1769	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   1770	{0x0004, SIERRA_PSC_LN_A3_PREG},
   1771	{0x0004, SIERRA_PSC_LN_A4_PREG},
   1772	{0x0004, SIERRA_PSC_LN_IDLE_PREG},
   1773	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   1774	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   1775	{0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
   1776	{0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   1777	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   1778	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   1779	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   1780	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   1781	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   1782	{0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
   1783	{0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
   1784	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   1785	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   1786	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   1787	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   1788	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   1789	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   1790	{0x0041, SIERRA_DEQ_GLUT0},
   1791	{0x0082, SIERRA_DEQ_GLUT1},
   1792	{0x00C3, SIERRA_DEQ_GLUT2},
   1793	{0x0145, SIERRA_DEQ_GLUT3},
   1794	{0x0186, SIERRA_DEQ_GLUT4},
   1795	{0x09E7, SIERRA_DEQ_ALUT0},
   1796	{0x09A6, SIERRA_DEQ_ALUT1},
   1797	{0x0965, SIERRA_DEQ_ALUT2},
   1798	{0x08E3, SIERRA_DEQ_ALUT3},
   1799	{0x00FA, SIERRA_DEQ_DFETAP0},
   1800	{0x00FA, SIERRA_DEQ_DFETAP1},
   1801	{0x00FA, SIERRA_DEQ_DFETAP2},
   1802	{0x00FA, SIERRA_DEQ_DFETAP3},
   1803	{0x00FA, SIERRA_DEQ_DFETAP4},
   1804	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   1805	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   1806	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   1807	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   1808	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   1809	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   1810	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   1811	{0x002B, SIERRA_CPI_TRIM_PREG},
   1812	{0x0003, SIERRA_EPI_CTRL_PREG},
   1813	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   1814	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   1815	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   1816	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
   1817};
   1818
   1819static struct cdns_sierra_vals pcie_100_int_ssc_plllc_cmn_vals = {
   1820	.reg_pairs = pcie_100_int_ssc_plllc_cmn_regs,
   1821	.num_regs = ARRAY_SIZE(pcie_100_int_ssc_plllc_cmn_regs),
   1822};
   1823
   1824static struct cdns_sierra_vals ml_pcie_100_int_ssc_ln_vals = {
   1825	.reg_pairs = ml_pcie_100_int_ssc_ln_regs,
   1826	.num_regs = ARRAY_SIZE(ml_pcie_100_int_ssc_ln_regs),
   1827};
   1828
   1829/*
   1830 * TI J721E:
   1831 * refclk100MHz_32b_PCIe_ln_int_ssc, multilink, using_plllc,
   1832 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
   1833 */
   1834static const struct cdns_reg_pairs ti_ml_pcie_100_int_ssc_ln_regs[] = {
   1835	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   1836	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   1837	{0x0004, SIERRA_PSC_LN_A3_PREG},
   1838	{0x0004, SIERRA_PSC_LN_A4_PREG},
   1839	{0x0004, SIERRA_PSC_LN_IDLE_PREG},
   1840	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   1841	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   1842	{0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
   1843	{0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   1844	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   1845	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   1846	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   1847	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   1848	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   1849	{0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
   1850	{0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
   1851	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   1852	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   1853	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   1854	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   1855	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   1856	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   1857	{0x0041, SIERRA_DEQ_GLUT0},
   1858	{0x0082, SIERRA_DEQ_GLUT1},
   1859	{0x00C3, SIERRA_DEQ_GLUT2},
   1860	{0x0145, SIERRA_DEQ_GLUT3},
   1861	{0x0186, SIERRA_DEQ_GLUT4},
   1862	{0x09E7, SIERRA_DEQ_ALUT0},
   1863	{0x09A6, SIERRA_DEQ_ALUT1},
   1864	{0x0965, SIERRA_DEQ_ALUT2},
   1865	{0x08E3, SIERRA_DEQ_ALUT3},
   1866	{0x00FA, SIERRA_DEQ_DFETAP0},
   1867	{0x00FA, SIERRA_DEQ_DFETAP1},
   1868	{0x00FA, SIERRA_DEQ_DFETAP2},
   1869	{0x00FA, SIERRA_DEQ_DFETAP3},
   1870	{0x00FA, SIERRA_DEQ_DFETAP4},
   1871	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   1872	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   1873	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   1874	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   1875	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   1876	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   1877	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   1878	{0x002B, SIERRA_CPI_TRIM_PREG},
   1879	{0x0003, SIERRA_EPI_CTRL_PREG},
   1880	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   1881	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   1882	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   1883	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG},
   1884	{0x0002, SIERRA_TX_RCVDET_OVRD_PREG}
   1885};
   1886
   1887static struct cdns_sierra_vals ti_ml_pcie_100_int_ssc_ln_vals = {
   1888	.reg_pairs = ti_ml_pcie_100_int_ssc_ln_regs,
   1889	.num_regs = ARRAY_SIZE(ti_ml_pcie_100_int_ssc_ln_regs),
   1890};
   1891
   1892/* refclk100MHz_32b_PCIe_cmn_pll_ext_ssc, pcie_links_using_plllc, pipe_bw_3 */
   1893static const struct cdns_reg_pairs pcie_100_ext_ssc_plllc_cmn_regs[] = {
   1894	{0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
   1895	{0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
   1896	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
   1897	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
   1898	{0x1B1B, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
   1899};
   1900
   1901/*
   1902 * refclk100MHz_32b_PCIe_ln_ext_ssc, multilink, using_plllc,
   1903 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
   1904 */
   1905static const struct cdns_reg_pairs ml_pcie_100_ext_ssc_ln_regs[] = {
   1906	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   1907	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   1908	{0x0004, SIERRA_PSC_LN_A3_PREG},
   1909	{0x0004, SIERRA_PSC_LN_A4_PREG},
   1910	{0x0004, SIERRA_PSC_LN_IDLE_PREG},
   1911	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   1912	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   1913	{0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
   1914	{0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   1915	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   1916	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   1917	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   1918	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   1919	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   1920	{0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
   1921	{0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
   1922	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   1923	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   1924	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   1925	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   1926	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   1927	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   1928	{0x0041, SIERRA_DEQ_GLUT0},
   1929	{0x0082, SIERRA_DEQ_GLUT1},
   1930	{0x00C3, SIERRA_DEQ_GLUT2},
   1931	{0x0145, SIERRA_DEQ_GLUT3},
   1932	{0x0186, SIERRA_DEQ_GLUT4},
   1933	{0x09E7, SIERRA_DEQ_ALUT0},
   1934	{0x09A6, SIERRA_DEQ_ALUT1},
   1935	{0x0965, SIERRA_DEQ_ALUT2},
   1936	{0x08E3, SIERRA_DEQ_ALUT3},
   1937	{0x00FA, SIERRA_DEQ_DFETAP0},
   1938	{0x00FA, SIERRA_DEQ_DFETAP1},
   1939	{0x00FA, SIERRA_DEQ_DFETAP2},
   1940	{0x00FA, SIERRA_DEQ_DFETAP3},
   1941	{0x00FA, SIERRA_DEQ_DFETAP4},
   1942	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   1943	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   1944	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   1945	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   1946	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   1947	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   1948	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   1949	{0x002B, SIERRA_CPI_TRIM_PREG},
   1950	{0x0003, SIERRA_EPI_CTRL_PREG},
   1951	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   1952	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   1953	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   1954	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
   1955};
   1956
   1957static struct cdns_sierra_vals pcie_100_ext_ssc_plllc_cmn_vals = {
   1958	.reg_pairs = pcie_100_ext_ssc_plllc_cmn_regs,
   1959	.num_regs = ARRAY_SIZE(pcie_100_ext_ssc_plllc_cmn_regs),
   1960};
   1961
   1962static struct cdns_sierra_vals ml_pcie_100_ext_ssc_ln_vals = {
   1963	.reg_pairs = ml_pcie_100_ext_ssc_ln_regs,
   1964	.num_regs = ARRAY_SIZE(ml_pcie_100_ext_ssc_ln_regs),
   1965};
   1966
   1967/*
   1968 * TI J721E:
   1969 * refclk100MHz_32b_PCIe_ln_ext_ssc, multilink, using_plllc,
   1970 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
   1971 */
   1972static const struct cdns_reg_pairs ti_ml_pcie_100_ext_ssc_ln_regs[] = {
   1973	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   1974	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   1975	{0x0004, SIERRA_PSC_LN_A3_PREG},
   1976	{0x0004, SIERRA_PSC_LN_A4_PREG},
   1977	{0x0004, SIERRA_PSC_LN_IDLE_PREG},
   1978	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   1979	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   1980	{0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
   1981	{0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   1982	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   1983	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   1984	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   1985	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   1986	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   1987	{0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
   1988	{0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
   1989	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   1990	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   1991	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   1992	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   1993	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   1994	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   1995	{0x0041, SIERRA_DEQ_GLUT0},
   1996	{0x0082, SIERRA_DEQ_GLUT1},
   1997	{0x00C3, SIERRA_DEQ_GLUT2},
   1998	{0x0145, SIERRA_DEQ_GLUT3},
   1999	{0x0186, SIERRA_DEQ_GLUT4},
   2000	{0x09E7, SIERRA_DEQ_ALUT0},
   2001	{0x09A6, SIERRA_DEQ_ALUT1},
   2002	{0x0965, SIERRA_DEQ_ALUT2},
   2003	{0x08E3, SIERRA_DEQ_ALUT3},
   2004	{0x00FA, SIERRA_DEQ_DFETAP0},
   2005	{0x00FA, SIERRA_DEQ_DFETAP1},
   2006	{0x00FA, SIERRA_DEQ_DFETAP2},
   2007	{0x00FA, SIERRA_DEQ_DFETAP3},
   2008	{0x00FA, SIERRA_DEQ_DFETAP4},
   2009	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   2010	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   2011	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   2012	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   2013	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   2014	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   2015	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   2016	{0x002B, SIERRA_CPI_TRIM_PREG},
   2017	{0x0003, SIERRA_EPI_CTRL_PREG},
   2018	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   2019	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   2020	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   2021	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG},
   2022	{0x0002, SIERRA_TX_RCVDET_OVRD_PREG}
   2023};
   2024
   2025static struct cdns_sierra_vals ti_ml_pcie_100_ext_ssc_ln_vals = {
   2026	.reg_pairs = ti_ml_pcie_100_ext_ssc_ln_regs,
   2027	.num_regs = ARRAY_SIZE(ti_ml_pcie_100_ext_ssc_ln_regs),
   2028};
   2029
   2030/* refclk100MHz_32b_PCIe_cmn_pll_no_ssc */
   2031static const struct cdns_reg_pairs cdns_pcie_cmn_regs_no_ssc[] = {
   2032	{0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
   2033	{0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
   2034	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
   2035	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}
   2036};
   2037
   2038/* refclk100MHz_32b_PCIe_ln_no_ssc */
   2039static const struct cdns_reg_pairs cdns_pcie_ln_regs_no_ssc[] = {
   2040	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   2041	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   2042	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   2043	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   2044	{0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   2045	{0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   2046	{0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   2047	{0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   2048	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   2049	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   2050	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   2051	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   2052	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   2053	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   2054	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   2055	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   2056	{0x0041, SIERRA_DEQ_GLUT0},
   2057	{0x0082, SIERRA_DEQ_GLUT1},
   2058	{0x00C3, SIERRA_DEQ_GLUT2},
   2059	{0x0145, SIERRA_DEQ_GLUT3},
   2060	{0x0186, SIERRA_DEQ_GLUT4},
   2061	{0x09E7, SIERRA_DEQ_ALUT0},
   2062	{0x09A6, SIERRA_DEQ_ALUT1},
   2063	{0x0965, SIERRA_DEQ_ALUT2},
   2064	{0x08E3, SIERRA_DEQ_ALUT3},
   2065	{0x00FA, SIERRA_DEQ_DFETAP0},
   2066	{0x00FA, SIERRA_DEQ_DFETAP1},
   2067	{0x00FA, SIERRA_DEQ_DFETAP2},
   2068	{0x00FA, SIERRA_DEQ_DFETAP3},
   2069	{0x00FA, SIERRA_DEQ_DFETAP4},
   2070	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   2071	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   2072	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   2073	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   2074	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   2075	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   2076	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   2077	{0x002B, SIERRA_CPI_TRIM_PREG},
   2078	{0x0003, SIERRA_EPI_CTRL_PREG},
   2079	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   2080	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   2081	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   2082	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
   2083};
   2084
   2085static struct cdns_sierra_vals pcie_100_no_ssc_cmn_vals = {
   2086	.reg_pairs = cdns_pcie_cmn_regs_no_ssc,
   2087	.num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_no_ssc),
   2088};
   2089
   2090static struct cdns_sierra_vals pcie_100_no_ssc_ln_vals = {
   2091	.reg_pairs = cdns_pcie_ln_regs_no_ssc,
   2092	.num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_no_ssc),
   2093};
   2094
   2095/* refclk100MHz_32b_PCIe_cmn_pll_int_ssc */
   2096static const struct cdns_reg_pairs cdns_pcie_cmn_regs_int_ssc[] = {
   2097	{0x000E, SIERRA_CMN_PLLLC_MODE_PREG},
   2098	{0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
   2099	{0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
   2100	{0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
   2101	{0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
   2102	{0x0581, SIERRA_CMN_PLLLC_DSMCORR_PREG},
   2103	{0x7F80, SIERRA_CMN_PLLLC_SS_PREG},
   2104	{0x0041, SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG},
   2105	{0x0464, SIERRA_CMN_PLLLC_SSTWOPT_PREG},
   2106	{0x0D0D, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG},
   2107	{0x0060, SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG}
   2108};
   2109
   2110/* refclk100MHz_32b_PCIe_ln_int_ssc */
   2111static const struct cdns_reg_pairs cdns_pcie_ln_regs_int_ssc[] = {
   2112	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   2113	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   2114	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   2115	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   2116	{0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
   2117	{0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   2118	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   2119	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   2120	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   2121	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   2122	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   2123	{0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
   2124	{0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
   2125	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   2126	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   2127	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   2128	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   2129	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   2130	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   2131	{0x0041, SIERRA_DEQ_GLUT0},
   2132	{0x0082, SIERRA_DEQ_GLUT1},
   2133	{0x00C3, SIERRA_DEQ_GLUT2},
   2134	{0x0145, SIERRA_DEQ_GLUT3},
   2135	{0x0186, SIERRA_DEQ_GLUT4},
   2136	{0x09E7, SIERRA_DEQ_ALUT0},
   2137	{0x09A6, SIERRA_DEQ_ALUT1},
   2138	{0x0965, SIERRA_DEQ_ALUT2},
   2139	{0x08E3, SIERRA_DEQ_ALUT3},
   2140	{0x00FA, SIERRA_DEQ_DFETAP0},
   2141	{0x00FA, SIERRA_DEQ_DFETAP1},
   2142	{0x00FA, SIERRA_DEQ_DFETAP2},
   2143	{0x00FA, SIERRA_DEQ_DFETAP3},
   2144	{0x00FA, SIERRA_DEQ_DFETAP4},
   2145	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   2146	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   2147	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   2148	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   2149	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   2150	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   2151	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   2152	{0x002B, SIERRA_CPI_TRIM_PREG},
   2153	{0x0003, SIERRA_EPI_CTRL_PREG},
   2154	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   2155	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   2156	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   2157	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
   2158};
   2159
   2160static struct cdns_sierra_vals pcie_100_int_ssc_cmn_vals = {
   2161	.reg_pairs = cdns_pcie_cmn_regs_int_ssc,
   2162	.num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_int_ssc),
   2163};
   2164
   2165static struct cdns_sierra_vals pcie_100_int_ssc_ln_vals = {
   2166	.reg_pairs = cdns_pcie_ln_regs_int_ssc,
   2167	.num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_int_ssc),
   2168};
   2169
   2170/* refclk100MHz_32b_PCIe_cmn_pll_ext_ssc */
   2171static const struct cdns_reg_pairs cdns_pcie_cmn_regs_ext_ssc[] = {
   2172	{0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
   2173	{0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
   2174	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
   2175	{0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
   2176	{0x1B1B, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
   2177};
   2178
   2179/* refclk100MHz_32b_PCIe_ln_ext_ssc */
   2180static const struct cdns_reg_pairs cdns_pcie_ln_regs_ext_ssc[] = {
   2181	{0xFC08, SIERRA_DET_STANDEC_A_PREG},
   2182	{0x001D, SIERRA_PSM_A3IN_TMR_PREG},
   2183	{0x1555, SIERRA_DFE_BIASTRIM_PREG},
   2184	{0x9703, SIERRA_DRVCTRL_BOOST_PREG},
   2185	{0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
   2186	{0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
   2187	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
   2188	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   2189	{0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   2190	{0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
   2191	{0x9800, SIERRA_RX_CTLE_CAL_PREG},
   2192	{0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
   2193	{0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
   2194	{0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   2195	{0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   2196	{0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   2197	{0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   2198	{0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
   2199	{0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
   2200	{0x0041, SIERRA_DEQ_GLUT0},
   2201	{0x0082, SIERRA_DEQ_GLUT1},
   2202	{0x00C3, SIERRA_DEQ_GLUT2},
   2203	{0x0145, SIERRA_DEQ_GLUT3},
   2204	{0x0186, SIERRA_DEQ_GLUT4},
   2205	{0x09E7, SIERRA_DEQ_ALUT0},
   2206	{0x09A6, SIERRA_DEQ_ALUT1},
   2207	{0x0965, SIERRA_DEQ_ALUT2},
   2208	{0x08E3, SIERRA_DEQ_ALUT3},
   2209	{0x00FA, SIERRA_DEQ_DFETAP0},
   2210	{0x00FA, SIERRA_DEQ_DFETAP1},
   2211	{0x00FA, SIERRA_DEQ_DFETAP2},
   2212	{0x00FA, SIERRA_DEQ_DFETAP3},
   2213	{0x00FA, SIERRA_DEQ_DFETAP4},
   2214	{0x000F, SIERRA_DEQ_PRECUR_PREG},
   2215	{0x0280, SIERRA_DEQ_POSTCUR_PREG},
   2216	{0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
   2217	{0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   2218	{0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
   2219	{0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
   2220	{0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
   2221	{0x002B, SIERRA_CPI_TRIM_PREG},
   2222	{0x0003, SIERRA_EPI_CTRL_PREG},
   2223	{0x803F, SIERRA_SDFILT_H2L_A_PREG},
   2224	{0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
   2225	{0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   2226	{0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
   2227};
   2228
   2229static struct cdns_sierra_vals pcie_100_ext_ssc_cmn_vals = {
   2230	.reg_pairs = cdns_pcie_cmn_regs_ext_ssc,
   2231	.num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_ext_ssc),
   2232};
   2233
   2234static struct cdns_sierra_vals pcie_100_ext_ssc_ln_vals = {
   2235	.reg_pairs = cdns_pcie_ln_regs_ext_ssc,
   2236	.num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_ext_ssc),
   2237};
   2238
   2239/* refclk100MHz_20b_USB_cmn_pll_ext_ssc */
   2240static const struct cdns_reg_pairs cdns_usb_cmn_regs_ext_ssc[] = {
   2241	{0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
   2242	{0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
   2243	{0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
   2244	{0x0000, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
   2245};
   2246
   2247/* refclk100MHz_20b_USB_ln_ext_ssc */
   2248static const struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
   2249	{0xFE0A, SIERRA_DET_STANDEC_A_PREG},
   2250	{0x000F, SIERRA_DET_STANDEC_B_PREG},
   2251	{0x55A5, SIERRA_DET_STANDEC_C_PREG},
   2252	{0x69ad, SIERRA_DET_STANDEC_D_PREG},
   2253	{0x0241, SIERRA_DET_STANDEC_E_PREG},
   2254	{0x0110, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG},
   2255	{0x0014, SIERRA_PSM_A0IN_TMR_PREG},
   2256	{0xCF00, SIERRA_PSM_DIAG_PREG},
   2257	{0x001F, SIERRA_PSC_TX_A0_PREG},
   2258	{0x0007, SIERRA_PSC_TX_A1_PREG},
   2259	{0x0003, SIERRA_PSC_TX_A2_PREG},
   2260	{0x0003, SIERRA_PSC_TX_A3_PREG},
   2261	{0x0FFF, SIERRA_PSC_RX_A0_PREG},
   2262	{0x0003, SIERRA_PSC_RX_A1_PREG},
   2263	{0x0003, SIERRA_PSC_RX_A2_PREG},
   2264	{0x0001, SIERRA_PSC_RX_A3_PREG},
   2265	{0x0001, SIERRA_PLLCTRL_SUBRATE_PREG},
   2266	{0x0406, SIERRA_PLLCTRL_GEN_D_PREG},
   2267	{0x5233, SIERRA_PLLCTRL_CPGAIN_MODE_PREG},
   2268	{0x00CA, SIERRA_CLKPATH_BIASTRIM_PREG},
   2269	{0x2512, SIERRA_DFE_BIASTRIM_PREG},
   2270	{0x0000, SIERRA_DRVCTRL_ATTEN_PREG},
   2271	{0x823E, SIERRA_CLKPATHCTRL_TMR_PREG},
   2272	{0x078F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
   2273	{0x078F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
   2274	{0x7B3C, SIERRA_CREQ_CCLKDET_MODE01_PREG},
   2275	{0x023C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
   2276	{0x3232, SIERRA_CREQ_FSMCLK_SEL_PREG},
   2277	{0x0000, SIERRA_CREQ_EQ_CTRL_PREG},
   2278	{0x0000, SIERRA_CREQ_SPARE_PREG},
   2279	{0xCC44, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
   2280	{0x8452, SIERRA_CTLELUT_CTRL_PREG},
   2281	{0x4121, SIERRA_DFE_ECMP_RATESEL_PREG},
   2282	{0x4121, SIERRA_DFE_SMP_RATESEL_PREG},
   2283	{0x0003, SIERRA_DEQ_PHALIGN_CTRL},
   2284	{0x3200, SIERRA_DEQ_CONCUR_CTRL1_PREG},
   2285	{0x5064, SIERRA_DEQ_CONCUR_CTRL2_PREG},
   2286	{0x0030, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
   2287	{0x0048, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
   2288	{0x5A5A, SIERRA_DEQ_ERRCMP_CTRL_PREG},
   2289	{0x02F5, SIERRA_DEQ_OFFSET_CTRL_PREG},
   2290	{0x02F5, SIERRA_DEQ_GAIN_CTRL_PREG},
   2291	{0x9999, SIERRA_DEQ_VGATUNE_CTRL_PREG},
   2292	{0x0014, SIERRA_DEQ_GLUT0},
   2293	{0x0014, SIERRA_DEQ_GLUT1},
   2294	{0x0014, SIERRA_DEQ_GLUT2},
   2295	{0x0014, SIERRA_DEQ_GLUT3},
   2296	{0x0014, SIERRA_DEQ_GLUT4},
   2297	{0x0014, SIERRA_DEQ_GLUT5},
   2298	{0x0014, SIERRA_DEQ_GLUT6},
   2299	{0x0014, SIERRA_DEQ_GLUT7},
   2300	{0x0014, SIERRA_DEQ_GLUT8},
   2301	{0x0014, SIERRA_DEQ_GLUT9},
   2302	{0x0014, SIERRA_DEQ_GLUT10},
   2303	{0x0014, SIERRA_DEQ_GLUT11},
   2304	{0x0014, SIERRA_DEQ_GLUT12},
   2305	{0x0014, SIERRA_DEQ_GLUT13},
   2306	{0x0014, SIERRA_DEQ_GLUT14},
   2307	{0x0014, SIERRA_DEQ_GLUT15},
   2308	{0x0014, SIERRA_DEQ_GLUT16},
   2309	{0x0BAE, SIERRA_DEQ_ALUT0},
   2310	{0x0AEB, SIERRA_DEQ_ALUT1},
   2311	{0x0A28, SIERRA_DEQ_ALUT2},
   2312	{0x0965, SIERRA_DEQ_ALUT3},
   2313	{0x08A2, SIERRA_DEQ_ALUT4},
   2314	{0x07DF, SIERRA_DEQ_ALUT5},
   2315	{0x071C, SIERRA_DEQ_ALUT6},
   2316	{0x0659, SIERRA_DEQ_ALUT7},
   2317	{0x0596, SIERRA_DEQ_ALUT8},
   2318	{0x0514, SIERRA_DEQ_ALUT9},
   2319	{0x0492, SIERRA_DEQ_ALUT10},
   2320	{0x0410, SIERRA_DEQ_ALUT11},
   2321	{0x038E, SIERRA_DEQ_ALUT12},
   2322	{0x030C, SIERRA_DEQ_ALUT13},
   2323	{0x03F4, SIERRA_DEQ_DFETAP_CTRL_PREG},
   2324	{0x0001, SIERRA_DFE_EN_1010_IGNORE_PREG},
   2325	{0x3C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG},
   2326	{0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
   2327	{0x1C08, SIERRA_DEQ_TAU_CTRL2_PREG},
   2328	{0x0033, SIERRA_DEQ_PICTRL_PREG},
   2329	{0x0400, SIERRA_CPICAL_TMRVAL_MODE1_PREG},
   2330	{0x0330, SIERRA_CPICAL_TMRVAL_MODE0_PREG},
   2331	{0x01FF, SIERRA_CPICAL_PICNT_MODE1_PREG},
   2332	{0x0009, SIERRA_CPI_OUTBUF_RATESEL_PREG},
   2333	{0x3232, SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG},
   2334	{0x0005, SIERRA_LFPSDET_SUPPORT_PREG},
   2335	{0x000F, SIERRA_LFPSFILT_NS_PREG},
   2336	{0x0009, SIERRA_LFPSFILT_RD_PREG},
   2337	{0x0001, SIERRA_LFPSFILT_MP_PREG},
   2338	{0x6013, SIERRA_SIGDET_SUPPORT_PREG},
   2339	{0x8013, SIERRA_SDFILT_H2L_A_PREG},
   2340	{0x8009, SIERRA_SDFILT_L2H_PREG},
   2341	{0x0024, SIERRA_RXBUFFER_CTLECTRL_PREG},
   2342	{0x0020, SIERRA_RXBUFFER_RCDFECTRL_PREG},
   2343	{0x4243, SIERRA_RXBUFFER_DFECTRL_PREG}
   2344};
   2345
   2346static struct cdns_sierra_vals usb_100_ext_ssc_cmn_vals = {
   2347	.reg_pairs = cdns_usb_cmn_regs_ext_ssc,
   2348	.num_regs = ARRAY_SIZE(cdns_usb_cmn_regs_ext_ssc),
   2349};
   2350
   2351static struct cdns_sierra_vals usb_100_ext_ssc_ln_vals = {
   2352	.reg_pairs = cdns_usb_ln_regs_ext_ssc,
   2353	.num_regs = ARRAY_SIZE(cdns_usb_ln_regs_ext_ssc),
   2354};
   2355
   2356static const struct cdns_sierra_data cdns_map_sierra = {
   2357	.id_value = SIERRA_MACRO_ID,
   2358	.block_offset_shift = 0x2,
   2359	.reg_offset_shift = 0x2,
   2360	.pcs_cmn_vals = {
   2361		[TYPE_PCIE] = {
   2362			[TYPE_NONE] = {
   2363				[NO_SSC] = &pcie_phy_pcs_cmn_vals,
   2364				[EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2365				[INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2366			},
   2367			[TYPE_QSGMII] = {
   2368				[NO_SSC] = &pcie_phy_pcs_cmn_vals,
   2369				[EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2370				[INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2371			},
   2372		},
   2373	},
   2374	.pma_cmn_vals = {
   2375		[TYPE_PCIE] = {
   2376			[TYPE_NONE] = {
   2377				[NO_SSC] = &pcie_100_no_ssc_cmn_vals,
   2378				[EXTERNAL_SSC] = &pcie_100_ext_ssc_cmn_vals,
   2379				[INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
   2380			},
   2381			[TYPE_QSGMII] = {
   2382				[NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals,
   2383				[EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals,
   2384				[INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals,
   2385			},
   2386		},
   2387		[TYPE_USB] = {
   2388			[TYPE_NONE] = {
   2389				[EXTERNAL_SSC] = &usb_100_ext_ssc_cmn_vals,
   2390			},
   2391		},
   2392		[TYPE_QSGMII] = {
   2393			[TYPE_PCIE] = {
   2394				[NO_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
   2395				[EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
   2396				[INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
   2397			},
   2398		},
   2399	},
   2400	.pma_ln_vals = {
   2401		[TYPE_PCIE] = {
   2402			[TYPE_NONE] = {
   2403				[NO_SSC] = &pcie_100_no_ssc_ln_vals,
   2404				[EXTERNAL_SSC] = &pcie_100_ext_ssc_ln_vals,
   2405				[INTERNAL_SSC] = &pcie_100_int_ssc_ln_vals,
   2406			},
   2407			[TYPE_QSGMII] = {
   2408				[NO_SSC] = &ml_pcie_100_no_ssc_ln_vals,
   2409				[EXTERNAL_SSC] = &ml_pcie_100_ext_ssc_ln_vals,
   2410				[INTERNAL_SSC] = &ml_pcie_100_int_ssc_ln_vals,
   2411			},
   2412		},
   2413		[TYPE_USB] = {
   2414			[TYPE_NONE] = {
   2415				[EXTERNAL_SSC] = &usb_100_ext_ssc_ln_vals,
   2416			},
   2417		},
   2418		[TYPE_QSGMII] = {
   2419			[TYPE_PCIE] = {
   2420				[NO_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
   2421				[EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
   2422				[INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
   2423			},
   2424		},
   2425	},
   2426};
   2427
   2428static const struct cdns_sierra_data cdns_ti_map_sierra = {
   2429	.id_value = SIERRA_MACRO_ID,
   2430	.block_offset_shift = 0x0,
   2431	.reg_offset_shift = 0x1,
   2432	.pcs_cmn_vals = {
   2433		[TYPE_PCIE] = {
   2434			[TYPE_NONE] = {
   2435				[NO_SSC] = &pcie_phy_pcs_cmn_vals,
   2436				[EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2437				[INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2438			},
   2439			[TYPE_QSGMII] = {
   2440				[NO_SSC] = &pcie_phy_pcs_cmn_vals,
   2441				[EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2442				[INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
   2443			},
   2444		},
   2445	},
   2446	.phy_pma_ln_vals = {
   2447		[TYPE_QSGMII] = {
   2448			[TYPE_PCIE] = {
   2449				[NO_SSC] = &qsgmii_phy_pma_ln_vals,
   2450				[EXTERNAL_SSC] = &qsgmii_phy_pma_ln_vals,
   2451				[INTERNAL_SSC] = &qsgmii_phy_pma_ln_vals,
   2452			},
   2453		},
   2454	},
   2455	.pma_cmn_vals = {
   2456		[TYPE_PCIE] = {
   2457			[TYPE_NONE] = {
   2458				[NO_SSC] = &pcie_100_no_ssc_cmn_vals,
   2459				[EXTERNAL_SSC] = &pcie_100_ext_ssc_cmn_vals,
   2460				[INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
   2461			},
   2462			[TYPE_QSGMII] = {
   2463				[NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals,
   2464				[EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals,
   2465				[INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals,
   2466			},
   2467		},
   2468		[TYPE_USB] = {
   2469			[TYPE_NONE] = {
   2470				[EXTERNAL_SSC] = &usb_100_ext_ssc_cmn_vals,
   2471			},
   2472		},
   2473		[TYPE_QSGMII] = {
   2474			[TYPE_PCIE] = {
   2475				[NO_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
   2476				[EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
   2477				[INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
   2478			},
   2479		},
   2480	},
   2481	.pma_ln_vals = {
   2482		[TYPE_PCIE] = {
   2483			[TYPE_NONE] = {
   2484				[NO_SSC] = &pcie_100_no_ssc_ln_vals,
   2485				[EXTERNAL_SSC] = &pcie_100_ext_ssc_ln_vals,
   2486				[INTERNAL_SSC] = &pcie_100_int_ssc_ln_vals,
   2487			},
   2488			[TYPE_QSGMII] = {
   2489				[NO_SSC] = &ti_ml_pcie_100_no_ssc_ln_vals,
   2490				[EXTERNAL_SSC] = &ti_ml_pcie_100_ext_ssc_ln_vals,
   2491				[INTERNAL_SSC] = &ti_ml_pcie_100_int_ssc_ln_vals,
   2492			},
   2493		},
   2494		[TYPE_USB] = {
   2495			[TYPE_NONE] = {
   2496				[EXTERNAL_SSC] = &usb_100_ext_ssc_ln_vals,
   2497			},
   2498		},
   2499		[TYPE_QSGMII] = {
   2500			[TYPE_PCIE] = {
   2501				[NO_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
   2502				[EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
   2503				[INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
   2504			},
   2505		},
   2506	},
   2507};
   2508
   2509static const struct of_device_id cdns_sierra_id_table[] = {
   2510	{
   2511		.compatible = "cdns,sierra-phy-t0",
   2512		.data = &cdns_map_sierra,
   2513	},
   2514	{
   2515		.compatible = "ti,sierra-phy-t0",
   2516		.data = &cdns_ti_map_sierra,
   2517	},
   2518	{}
   2519};
   2520MODULE_DEVICE_TABLE(of, cdns_sierra_id_table);
   2521
   2522static struct platform_driver cdns_sierra_driver = {
   2523	.probe		= cdns_sierra_phy_probe,
   2524	.remove		= cdns_sierra_phy_remove,
   2525	.driver		= {
   2526		.name	= "cdns-sierra-phy",
   2527		.of_match_table = cdns_sierra_id_table,
   2528	},
   2529};
   2530module_platform_driver(cdns_sierra_driver);
   2531
   2532MODULE_ALIAS("platform:cdns_sierra");
   2533MODULE_AUTHOR("Cadence Design Systems");
   2534MODULE_DESCRIPTION("CDNS sierra phy driver");
   2535MODULE_LICENSE("GPL v2");