Linux Audio

Check our new training course

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