1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Cadence Torrent SD0801 PHY driver.
4 *
5 * Copyright 2018 Cadence Design Systems, Inc.
6 *
7 */
8
9#include <dt-bindings/phy/phy.h>
10#include <dt-bindings/phy/phy-cadence.h>
11#include <linux/clk.h>
12#include <linux/clk-provider.h>
13#include <linux/delay.h>
14#include <linux/err.h>
15#include <linux/io.h>
16#include <linux/iopoll.h>
17#include <linux/kernel.h>
18#include <linux/module.h>
19#include <linux/of.h>
20#include <linux/phy/phy.h>
21#include <linux/platform_device.h>
22#include <linux/reset.h>
23#include <linux/regmap.h>
24
25#define REF_CLK_19_2MHZ		19200000
26#define REF_CLK_25MHZ		25000000
27#define REF_CLK_100MHZ		100000000
28#define REF_CLK_156_25MHZ	156250000
29
30#define MAX_NUM_LANES		4
31#define DEFAULT_MAX_BIT_RATE	8100 /* in Mbps */
32
33#define POLL_TIMEOUT_US		5000
34#define PLL_LOCK_TIMEOUT	100000
35
36#define DP_PLL0			BIT(0)
37#define DP_PLL1			BIT(1)
38
39#define TORRENT_COMMON_CDB_OFFSET	0x0
40
41#define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset)	\
42				((0x4000 << (block_offset)) +		\
43				(((ln) << 9) << (reg_offset)))
44
45#define TORRENT_RX_LANE_CDB_OFFSET(ln, block_offset, reg_offset)	\
46				((0x8000 << (block_offset)) +		\
47				(((ln) << 9) << (reg_offset)))
48
49#define TORRENT_PHY_PCS_COMMON_OFFSET(block_offset)	\
50				(0xC000 << (block_offset))
51
52#define TORRENT_PHY_PCS_LANE_CDB_OFFSET(ln, block_offset, reg_offset)	\
53				((0xD000 << (block_offset)) +		\
54				(((ln) << 8) << (reg_offset)))
55
56#define TORRENT_PHY_PMA_COMMON_OFFSET(block_offset)	\
57				(0xE000 << (block_offset))
58
59#define TORRENT_DPTX_PHY_OFFSET		0x0
60
61/*
62 * register offsets from DPTX PHY register block base (i.e MHDP
63 * register base + 0x30a00)
64 */
65#define PHY_AUX_CTRL			0x04
66#define PHY_RESET			0x20
67#define PMA_TX_ELEC_IDLE_SHIFT		4
68#define PHY_PMA_XCVR_PLLCLK_EN		0x24
69#define PHY_PMA_XCVR_PLLCLK_EN_ACK	0x28
70#define PHY_PMA_XCVR_POWER_STATE_REQ	0x2c
71#define PHY_POWER_STATE_LN(ln)		((ln) * 8)
72#define PMA_XCVR_POWER_STATE_REQ_LN_MASK	0x3FU
73#define PHY_PMA_XCVR_POWER_STATE_ACK	0x30
74#define PHY_PMA_CMN_READY		0x34
75
76/*
77 * register offsets from SD0801 PHY register block base (i.e MHDP
78 * register base + 0x500000)
79 */
80#define CMN_SSM_BANDGAP_TMR		0x0021U
81#define CMN_SSM_BIAS_TMR		0x0022U
82#define CMN_PLLSM0_PLLPRE_TMR		0x002AU
83#define CMN_PLLSM0_PLLLOCK_TMR		0x002CU
84#define CMN_PLLSM1_PLLPRE_TMR		0x0032U
85#define CMN_PLLSM1_PLLLOCK_TMR		0x0034U
86#define CMN_CDIAG_CDB_PWRI_OVRD		0x0041U
87#define CMN_CDIAG_XCVRC_PWRI_OVRD	0x0047U
88#define CMN_CDIAG_REFCLK_OVRD		0x004CU
89#define CMN_CDIAG_REFCLK_DRV0_CTRL	0x0050U
90#define CMN_BGCAL_INIT_TMR		0x0064U
91#define CMN_BGCAL_ITER_TMR		0x0065U
92#define CMN_IBCAL_INIT_TMR		0x0074U
93#define CMN_PLL0_VCOCAL_TCTRL		0x0082U
94#define CMN_PLL0_VCOCAL_INIT_TMR	0x0084U
95#define CMN_PLL0_VCOCAL_ITER_TMR	0x0085U
96#define CMN_PLL0_VCOCAL_REFTIM_START	0x0086U
97#define CMN_PLL0_VCOCAL_PLLCNT_START	0x0088U
98#define CMN_PLL0_INTDIV_M0		0x0090U
99#define CMN_PLL0_FRACDIVL_M0		0x0091U
100#define CMN_PLL0_FRACDIVH_M0		0x0092U
101#define CMN_PLL0_HIGH_THR_M0		0x0093U
102#define CMN_PLL0_DSM_DIAG_M0		0x0094U
103#define CMN_PLL0_DSM_FBH_OVRD_M0	0x0095U
104#define CMN_PLL0_DSM_FBL_OVRD_M0	0x0096U
105#define CMN_PLL0_SS_CTRL1_M0		0x0098U
106#define CMN_PLL0_SS_CTRL2_M0            0x0099U
107#define CMN_PLL0_SS_CTRL3_M0            0x009AU
108#define CMN_PLL0_SS_CTRL4_M0            0x009BU
109#define CMN_PLL0_LOCK_REFCNT_START      0x009CU
110#define CMN_PLL0_LOCK_PLLCNT_START	0x009EU
111#define CMN_PLL0_LOCK_PLLCNT_THR        0x009FU
112#define CMN_PLL0_INTDIV_M1		0x00A0U
113#define CMN_PLL0_FRACDIVH_M1		0x00A2U
114#define CMN_PLL0_HIGH_THR_M1		0x00A3U
115#define CMN_PLL0_DSM_DIAG_M1		0x00A4U
116#define CMN_PLL0_SS_CTRL1_M1		0x00A8U
117#define CMN_PLL0_SS_CTRL2_M1		0x00A9U
118#define CMN_PLL0_SS_CTRL3_M1		0x00AAU
119#define CMN_PLL0_SS_CTRL4_M1		0x00ABU
120#define CMN_PLL1_VCOCAL_TCTRL		0x00C2U
121#define CMN_PLL1_VCOCAL_INIT_TMR	0x00C4U
122#define CMN_PLL1_VCOCAL_ITER_TMR	0x00C5U
123#define CMN_PLL1_VCOCAL_REFTIM_START	0x00C6U
124#define CMN_PLL1_VCOCAL_PLLCNT_START	0x00C8U
125#define CMN_PLL1_INTDIV_M0		0x00D0U
126#define CMN_PLL1_FRACDIVL_M0		0x00D1U
127#define CMN_PLL1_FRACDIVH_M0		0x00D2U
128#define CMN_PLL1_HIGH_THR_M0		0x00D3U
129#define CMN_PLL1_DSM_DIAG_M0		0x00D4U
130#define CMN_PLL1_DSM_FBH_OVRD_M0	0x00D5U
131#define CMN_PLL1_DSM_FBL_OVRD_M0	0x00D6U
132#define CMN_PLL1_SS_CTRL1_M0		0x00D8U
133#define CMN_PLL1_SS_CTRL2_M0            0x00D9U
134#define CMN_PLL1_SS_CTRL3_M0            0x00DAU
135#define CMN_PLL1_SS_CTRL4_M0            0x00DBU
136#define CMN_PLL1_LOCK_REFCNT_START      0x00DCU
137#define CMN_PLL1_LOCK_PLLCNT_START	0x00DEU
138#define CMN_PLL1_LOCK_PLLCNT_THR        0x00DFU
139#define CMN_TXPUCAL_TUNE		0x0103U
140#define CMN_TXPUCAL_INIT_TMR		0x0104U
141#define CMN_TXPUCAL_ITER_TMR		0x0105U
142#define CMN_TXPDCAL_TUNE		0x010BU
143#define CMN_TXPDCAL_INIT_TMR		0x010CU
144#define CMN_TXPDCAL_ITER_TMR		0x010DU
145#define CMN_RXCAL_INIT_TMR		0x0114U
146#define CMN_RXCAL_ITER_TMR		0x0115U
147#define CMN_SD_CAL_INIT_TMR		0x0124U
148#define CMN_SD_CAL_ITER_TMR		0x0125U
149#define CMN_SD_CAL_REFTIM_START		0x0126U
150#define CMN_SD_CAL_PLLCNT_START		0x0128U
151#define CMN_PDIAG_PLL0_CTRL_M0		0x01A0U
152#define CMN_PDIAG_PLL0_CLK_SEL_M0	0x01A1U
153#define CMN_PDIAG_PLL0_CP_PADJ_M0	0x01A4U
154#define CMN_PDIAG_PLL0_CP_IADJ_M0	0x01A5U
155#define CMN_PDIAG_PLL0_FILT_PADJ_M0	0x01A6U
156#define CMN_PDIAG_PLL0_CTRL_M1		0x01B0U
157#define CMN_PDIAG_PLL0_CLK_SEL_M1	0x01B1U
158#define CMN_PDIAG_PLL0_CP_PADJ_M1	0x01B4U
159#define CMN_PDIAG_PLL0_CP_IADJ_M1	0x01B5U
160#define CMN_PDIAG_PLL0_FILT_PADJ_M1	0x01B6U
161#define CMN_PDIAG_PLL1_CTRL_M0		0x01C0U
162#define CMN_PDIAG_PLL1_CLK_SEL_M0	0x01C1U
163#define CMN_PDIAG_PLL1_CP_PADJ_M0	0x01C4U
164#define CMN_PDIAG_PLL1_CP_IADJ_M0	0x01C5U
165#define CMN_PDIAG_PLL1_FILT_PADJ_M0	0x01C6U
166#define CMN_DIAG_BIAS_OVRD1		0x01E1U
167
168/* PMA TX Lane registers */
169#define TX_TXCC_CTRL			0x0040U
170#define TX_TXCC_CPOST_MULT_00		0x004CU
171#define TX_TXCC_CPOST_MULT_01		0x004DU
172#define TX_TXCC_MGNFS_MULT_000		0x0050U
173#define TX_TXCC_MGNFS_MULT_100		0x0054U
174#define DRV_DIAG_TX_DRV			0x00C6U
175#define XCVR_DIAG_PLLDRC_CTRL		0x00E5U
176#define XCVR_DIAG_HSCLK_SEL		0x00E6U
177#define XCVR_DIAG_HSCLK_DIV		0x00E7U
178#define XCVR_DIAG_RXCLK_CTRL		0x00E9U
179#define XCVR_DIAG_BIDI_CTRL		0x00EAU
180#define XCVR_DIAG_PSC_OVRD		0x00EBU
181#define TX_PSC_A0			0x0100U
182#define TX_PSC_A1			0x0101U
183#define TX_PSC_A2			0x0102U
184#define TX_PSC_A3			0x0103U
185#define TX_RCVDET_ST_TMR		0x0123U
186#define TX_DIAG_ACYA			0x01E7U
187#define TX_DIAG_ACYA_HBDC_MASK		0x0001U
188
189/* PMA RX Lane registers */
190#define RX_PSC_A0			0x0000U
191#define RX_PSC_A1			0x0001U
192#define RX_PSC_A2			0x0002U
193#define RX_PSC_A3			0x0003U
194#define RX_PSC_CAL			0x0006U
195#define RX_SDCAL0_INIT_TMR		0x0044U
196#define RX_SDCAL0_ITER_TMR		0x0045U
197#define RX_SDCAL1_INIT_TMR		0x004CU
198#define RX_SDCAL1_ITER_TMR		0x004DU
199#define RX_CDRLF_CNFG			0x0080U
200#define RX_CDRLF_CNFG3			0x0082U
201#define RX_SIGDET_HL_FILT_TMR		0x0090U
202#define RX_REE_GCSM1_CTRL		0x0108U
203#define RX_REE_GCSM1_EQENM_PH1		0x0109U
204#define RX_REE_GCSM1_EQENM_PH2		0x010AU
205#define RX_REE_GCSM2_CTRL		0x0110U
206#define RX_REE_PERGCSM_CTRL		0x0118U
207#define RX_REE_ATTEN_THR		0x0149U
208#define RX_REE_TAP1_CLIP		0x0171U
209#define RX_REE_TAP2TON_CLIP		0x0172U
210#define RX_REE_SMGM_CTRL1		0x0177U
211#define RX_REE_SMGM_CTRL2		0x0178U
212#define RX_DIAG_DFE_CTRL		0x01E0U
213#define RX_DIAG_DFE_AMP_TUNE_2		0x01E2U
214#define RX_DIAG_DFE_AMP_TUNE_3		0x01E3U
215#define RX_DIAG_NQST_CTRL		0x01E5U
216#define RX_DIAG_SIGDET_TUNE		0x01E8U
217#define RX_DIAG_PI_RATE			0x01F4U
218#define RX_DIAG_PI_CAP			0x01F5U
219#define RX_DIAG_ACYA			0x01FFU
220
221/* PHY PCS common registers */
222#define PHY_PIPE_CMN_CTRL1		0x0000U
223#define PHY_PLL_CFG			0x000EU
224#define PHY_PIPE_USB3_GEN2_PRE_CFG0	0x0020U
225#define PHY_PIPE_USB3_GEN2_POST_CFG0	0x0022U
226#define PHY_PIPE_USB3_GEN2_POST_CFG1	0x0023U
227
228/* PHY PCS lane registers */
229#define PHY_PCS_ISO_LINK_CTRL		0x000BU
230
231/* PHY PMA common registers */
232#define PHY_PMA_CMN_CTRL1		0x0000U
233#define PHY_PMA_CMN_CTRL2		0x0001U
234#define PHY_PMA_PLL_RAW_CTRL		0x0003U
235
236#define CDNS_TORRENT_OUTPUT_CLOCKS	3
237
238static const char * const clk_names[] = {
239	[CDNS_TORRENT_REFCLK_DRIVER] = "refclk-driver",
240	[CDNS_TORRENT_DERIVED_REFCLK] = "refclk-der",
241	[CDNS_TORRENT_RECEIVED_REFCLK] = "refclk-rec",
242};
243
244static const struct reg_field phy_pll_cfg =
245				REG_FIELD(PHY_PLL_CFG, 0, 1);
246
247static const struct reg_field phy_pma_cmn_ctrl_1 =
248				REG_FIELD(PHY_PMA_CMN_CTRL1, 0, 0);
249
250static const struct reg_field phy_pma_cmn_ctrl_2 =
251				REG_FIELD(PHY_PMA_CMN_CTRL2, 0, 7);
252
253static const struct reg_field phy_pma_pll_raw_ctrl =
254				REG_FIELD(PHY_PMA_PLL_RAW_CTRL, 0, 1);
255
256static const struct reg_field phy_reset_ctrl =
257				REG_FIELD(PHY_RESET, 8, 8);
258
259static const struct reg_field phy_pcs_iso_link_ctrl_1 =
260				REG_FIELD(PHY_PCS_ISO_LINK_CTRL, 1, 1);
261
262static const struct reg_field phy_pipe_cmn_ctrl1_0 = REG_FIELD(PHY_PIPE_CMN_CTRL1, 0, 0);
263
264static const struct reg_field cmn_cdiag_refclk_ovrd_4 =
265				REG_FIELD(CMN_CDIAG_REFCLK_OVRD, 4, 4);
266
267#define REFCLK_OUT_NUM_CMN_CONFIG	4
268
269enum cdns_torrent_refclk_out_cmn {
270	CMN_CDIAG_REFCLK_DRV0_CTRL_1,
271	CMN_CDIAG_REFCLK_DRV0_CTRL_4,
272	CMN_CDIAG_REFCLK_DRV0_CTRL_5,
273	CMN_CDIAG_REFCLK_DRV0_CTRL_6,
274};
275
276static const struct reg_field refclk_out_cmn_cfg[] = {
277	[CMN_CDIAG_REFCLK_DRV0_CTRL_1]	= REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 1, 1),
278	[CMN_CDIAG_REFCLK_DRV0_CTRL_4]	= REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 4, 4),
279	[CMN_CDIAG_REFCLK_DRV0_CTRL_5]  = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 5, 5),
280	[CMN_CDIAG_REFCLK_DRV0_CTRL_6]	= REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 6, 6),
281};
282
283static const int refclk_driver_parent_index[] = {
284	CDNS_TORRENT_DERIVED_REFCLK,
285	CDNS_TORRENT_RECEIVED_REFCLK
286};
287
288static u32 cdns_torrent_refclk_driver_mux_table[] = { 1, 0 };
289
290enum cdns_torrent_phy_type {
291	TYPE_NONE,
292	TYPE_DP,
293	TYPE_PCIE,
294	TYPE_SGMII,
295	TYPE_QSGMII,
296	TYPE_USB,
297	TYPE_USXGMII,
298};
299
300enum cdns_torrent_ref_clk {
301	CLK_19_2_MHZ,
302	CLK_25_MHZ,
303	CLK_100_MHZ,
304	CLK_156_25_MHZ,
305	CLK_ANY,
306};
307
308enum cdns_torrent_ssc_mode {
309	NO_SSC,
310	EXTERNAL_SSC,
311	INTERNAL_SSC,
312	ANY_SSC,
313};
314
315/* Unique key id for vals table entry
316 * REFCLK0_RATE | REFCLK1_RATE | LINK0_TYPE | LINK1_TYPE | SSC_TYPE
317 */
318#define REFCLK0_SHIFT	12
319#define REFCLK0_MASK	GENMASK(14, 12)
320#define REFCLK1_SHIFT	9
321#define REFCLK1_MASK	GENMASK(11, 9)
322#define LINK0_SHIFT	6
323#define LINK0_MASK	GENMASK(8, 6)
324#define LINK1_SHIFT	3
325#define LINK1_MASK	GENMASK(5, 3)
326#define SSC_SHIFT	0
327#define SSC_MASK	GENMASK(2, 0)
328
329#define CDNS_TORRENT_KEY(refclk0, refclk1, link0, link1, ssc) \
330			((((refclk0) << REFCLK0_SHIFT) & REFCLK0_MASK) | \
331			(((refclk1) << REFCLK1_SHIFT) & REFCLK1_MASK) | \
332			(((link0) << LINK0_SHIFT) & LINK0_MASK) | \
333			(((link1) << LINK1_SHIFT) & LINK1_MASK) | \
334			(((ssc) << SSC_SHIFT) & SSC_MASK))
335
336#define CDNS_TORRENT_KEY_ANYCLK(link0, link1) \
337			CDNS_TORRENT_KEY(CLK_ANY, CLK_ANY, \
338					 (link0), (link1), ANY_SSC)
339
340struct cdns_torrent_inst {
341	struct phy *phy;
342	u32 mlane;
343	enum cdns_torrent_phy_type phy_type;
344	u32 num_lanes;
345	struct reset_control *lnk_rst;
346	enum cdns_torrent_ssc_mode ssc_mode;
347};
348
349struct cdns_torrent_phy {
350	void __iomem *base;	/* DPTX registers base */
351	void __iomem *sd_base; /* SD0801 registers base */
352	u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */
353	u32 dp_pll;
354	struct reset_control *phy_rst;
355	struct reset_control *apb_rst;
356	struct device *dev;
357	struct clk *clk;
358	struct clk *clk1;
359	enum cdns_torrent_ref_clk ref_clk_rate;
360	enum cdns_torrent_ref_clk ref_clk1_rate;
361	struct cdns_torrent_inst phys[MAX_NUM_LANES];
362	int nsubnodes;
363	const struct cdns_torrent_data *init_data;
364	struct regmap *regmap_common_cdb;
365	struct regmap *regmap_phy_pcs_common_cdb;
366	struct regmap *regmap_phy_pma_common_cdb;
367	struct regmap *regmap_tx_lane_cdb[MAX_NUM_LANES];
368	struct regmap *regmap_rx_lane_cdb[MAX_NUM_LANES];
369	struct regmap *regmap_phy_pcs_lane_cdb[MAX_NUM_LANES];
370	struct regmap *regmap_dptx_phy_reg;
371	struct regmap_field *phy_pll_cfg;
372	struct regmap_field *phy_pipe_cmn_ctrl1_0;
373	struct regmap_field *cmn_cdiag_refclk_ovrd_4;
374	struct regmap_field *phy_pma_cmn_ctrl_1;
375	struct regmap_field *phy_pma_cmn_ctrl_2;
376	struct regmap_field *phy_pma_pll_raw_ctrl;
377	struct regmap_field *phy_reset_ctrl;
378	struct regmap_field *phy_pcs_iso_link_ctrl_1[MAX_NUM_LANES];
379	struct clk_hw_onecell_data *clk_hw_data;
380};
381
382enum phy_powerstate {
383	POWERSTATE_A0 = 0,
384	/* Powerstate A1 is unused */
385	POWERSTATE_A2 = 2,
386	POWERSTATE_A3 = 3,
387};
388
389struct cdns_torrent_refclk_driver {
390	struct clk_hw		hw;
391	struct regmap_field	*cmn_fields[REFCLK_OUT_NUM_CMN_CONFIG];
392	struct clk_init_data	clk_data;
393};
394
395#define to_cdns_torrent_refclk_driver(_hw)	\
396			container_of(_hw, struct cdns_torrent_refclk_driver, hw)
397
398struct cdns_torrent_derived_refclk {
399	struct clk_hw		hw;
400	struct regmap_field	*phy_pipe_cmn_ctrl1_0;
401	struct regmap_field	*cmn_cdiag_refclk_ovrd_4;
402	struct clk_init_data	clk_data;
403};
404
405#define to_cdns_torrent_derived_refclk(_hw)	\
406			container_of(_hw, struct cdns_torrent_derived_refclk, hw)
407
408struct cdns_torrent_received_refclk {
409	struct clk_hw		hw;
410	struct regmap_field	*phy_pipe_cmn_ctrl1_0;
411	struct regmap_field	*cmn_cdiag_refclk_ovrd_4;
412	struct clk_init_data	clk_data;
413};
414
415#define to_cdns_torrent_received_refclk(_hw)	\
416			container_of(_hw, struct cdns_torrent_received_refclk, hw)
417
418struct cdns_reg_pairs {
419	u32 val;
420	u32 off;
421};
422
423struct cdns_torrent_vals {
424	struct cdns_reg_pairs *reg_pairs;
425	u32 num_regs;
426};
427
428struct cdns_torrent_vals_entry {
429	u32 key;
430	struct cdns_torrent_vals *vals;
431};
432
433struct cdns_torrent_vals_table {
434	struct cdns_torrent_vals_entry *entries;
435	u32 num_entries;
436};
437
438struct cdns_torrent_data {
439	u8 block_offset_shift;
440	u8 reg_offset_shift;
441	struct cdns_torrent_vals_table link_cmn_vals_tbl;
442	struct cdns_torrent_vals_table xcvr_diag_vals_tbl;
443	struct cdns_torrent_vals_table pcs_cmn_vals_tbl;
444	struct cdns_torrent_vals_table phy_pma_cmn_vals_tbl;
445	struct cdns_torrent_vals_table cmn_vals_tbl;
446	struct cdns_torrent_vals_table tx_ln_vals_tbl;
447	struct cdns_torrent_vals_table rx_ln_vals_tbl;
448};
449
450struct cdns_regmap_cdb_context {
451	struct device *dev;
452	void __iomem *base;
453	u8 reg_offset_shift;
454};
455
456static struct cdns_torrent_vals *cdns_torrent_get_tbl_vals(const struct cdns_torrent_vals_table *tbl,
457							   enum cdns_torrent_ref_clk refclk0,
458							   enum cdns_torrent_ref_clk refclk1,
459							   enum cdns_torrent_phy_type link0,
460							   enum cdns_torrent_phy_type link1,
461							   enum cdns_torrent_ssc_mode ssc)
462{
463	int i;
464	u32 key = CDNS_TORRENT_KEY(refclk0, refclk1, link0, link1, ssc);
465
466	for (i = 0; i < tbl->num_entries; i++) {
467		if (tbl->entries[i].key == key)
468			return tbl->entries[i].vals;
469	}
470
471	return NULL;
472}
473
474static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val)
475{
476	struct cdns_regmap_cdb_context *ctx = context;
477	u32 offset = reg << ctx->reg_offset_shift;
478
479	writew(val, ctx->base + offset);
480
481	return 0;
482}
483
484static int cdns_regmap_read(void *context, unsigned int reg, unsigned int *val)
485{
486	struct cdns_regmap_cdb_context *ctx = context;
487	u32 offset = reg << ctx->reg_offset_shift;
488
489	*val = readw(ctx->base + offset);
490	return 0;
491}
492
493static int cdns_regmap_dptx_write(void *context, unsigned int reg,
494				  unsigned int val)
495{
496	struct cdns_regmap_cdb_context *ctx = context;
497	u32 offset = reg;
498
499	writel(val, ctx->base + offset);
500
501	return 0;
502}
503
504static int cdns_regmap_dptx_read(void *context, unsigned int reg,
505				 unsigned int *val)
506{
507	struct cdns_regmap_cdb_context *ctx = context;
508	u32 offset = reg;
509
510	*val = readl(ctx->base + offset);
511	return 0;
512}
513
514#define TORRENT_TX_LANE_CDB_REGMAP_CONF(n) \
515{ \
516	.name = "torrent_tx_lane" n "_cdb", \
517	.reg_stride = 1, \
518	.fast_io = true, \
519	.reg_write = cdns_regmap_write, \
520	.reg_read = cdns_regmap_read, \
521}
522
523#define TORRENT_RX_LANE_CDB_REGMAP_CONF(n) \
524{ \
525	.name = "torrent_rx_lane" n "_cdb", \
526	.reg_stride = 1, \
527	.fast_io = true, \
528	.reg_write = cdns_regmap_write, \
529	.reg_read = cdns_regmap_read, \
530}
531
532static const struct regmap_config cdns_torrent_tx_lane_cdb_config[] = {
533	TORRENT_TX_LANE_CDB_REGMAP_CONF("0"),
534	TORRENT_TX_LANE_CDB_REGMAP_CONF("1"),
535	TORRENT_TX_LANE_CDB_REGMAP_CONF("2"),
536	TORRENT_TX_LANE_CDB_REGMAP_CONF("3"),
537};
538
539static const struct regmap_config cdns_torrent_rx_lane_cdb_config[] = {
540	TORRENT_RX_LANE_CDB_REGMAP_CONF("0"),
541	TORRENT_RX_LANE_CDB_REGMAP_CONF("1"),
542	TORRENT_RX_LANE_CDB_REGMAP_CONF("2"),
543	TORRENT_RX_LANE_CDB_REGMAP_CONF("3"),
544};
545
546static const struct regmap_config cdns_torrent_common_cdb_config = {
547	.name = "torrent_common_cdb",
548	.reg_stride = 1,
549	.fast_io = true,
550	.reg_write = cdns_regmap_write,
551	.reg_read = cdns_regmap_read,
552};
553
554#define TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF(n) \
555{ \
556	.name = "torrent_phy_pcs_lane" n "_cdb", \
557	.reg_stride = 1, \
558	.fast_io = true, \
559	.reg_write = cdns_regmap_write, \
560	.reg_read = cdns_regmap_read, \
561}
562
563static const struct regmap_config cdns_torrent_phy_pcs_lane_cdb_config[] = {
564	TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("0"),
565	TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("1"),
566	TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("2"),
567	TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("3"),
568};
569
570static const struct regmap_config cdns_torrent_phy_pcs_cmn_cdb_config = {
571	.name = "torrent_phy_pcs_cmn_cdb",
572	.reg_stride = 1,
573	.fast_io = true,
574	.reg_write = cdns_regmap_write,
575	.reg_read = cdns_regmap_read,
576};
577
578static const struct regmap_config cdns_torrent_phy_pma_cmn_cdb_config = {
579	.name = "torrent_phy_pma_cmn_cdb",
580	.reg_stride = 1,
581	.fast_io = true,
582	.reg_write = cdns_regmap_write,
583	.reg_read = cdns_regmap_read,
584};
585
586static const struct regmap_config cdns_torrent_dptx_phy_config = {
587	.name = "torrent_dptx_phy",
588	.reg_stride = 1,
589	.fast_io = true,
590	.reg_write = cdns_regmap_dptx_write,
591	.reg_read = cdns_regmap_dptx_read,
592};
593
594/* PHY mmr access functions */
595
596static void cdns_torrent_phy_write(struct regmap *regmap, u32 offset, u32 val)
597{
598	regmap_write(regmap, offset, val);
599}
600
601static u32 cdns_torrent_phy_read(struct regmap *regmap, u32 offset)
602{
603	unsigned int val;
604
605	regmap_read(regmap, offset, &val);
606	return val;
607}
608
609/* DPTX mmr access functions */
610
611static void cdns_torrent_dp_write(struct regmap *regmap, u32 offset, u32 val)
612{
613	regmap_write(regmap, offset, val);
614}
615
616static u32 cdns_torrent_dp_read(struct regmap *regmap, u32 offset)
617{
618	u32 val;
619
620	regmap_read(regmap, offset, &val);
621	return val;
622}
623
624/*
625 * Structure used to store values of PHY registers for voltage-related
626 * coefficients, for particular voltage swing and pre-emphasis level. Values
627 * are shared across all physical lanes.
628 */
629struct coefficients {
630	/* Value of DRV_DIAG_TX_DRV register to use */
631	u16 diag_tx_drv;
632	/* Value of TX_TXCC_MGNFS_MULT_000 register to use */
633	u16 mgnfs_mult;
634	/* Value of TX_TXCC_CPOST_MULT_00 register to use */
635	u16 cpost_mult;
636};
637
638/*
639 * Array consists of values of voltage-related registers for sd0801 PHY. A value
640 * of 0xFFFF is a placeholder for invalid combination, and will never be used.
641 */
642static const struct coefficients vltg_coeff[4][4] = {
643	/* voltage swing 0, pre-emphasis 0->3 */
644	{	{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x002A,
645		 .cpost_mult = 0x0000},
646		{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
647		 .cpost_mult = 0x0014},
648		{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0012,
649		 .cpost_mult = 0x0020},
650		{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
651		 .cpost_mult = 0x002A}
652	},
653
654	/* voltage swing 1, pre-emphasis 0->3 */
655	{	{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
656		 .cpost_mult = 0x0000},
657		{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
658		 .cpost_mult = 0x0012},
659		{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
660		 .cpost_mult = 0x001F},
661		{.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
662		 .cpost_mult = 0xFFFF}
663	},
664
665	/* voltage swing 2, pre-emphasis 0->3 */
666	{	{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
667		 .cpost_mult = 0x0000},
668		{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
669		 .cpost_mult = 0x0013},
670		{.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
671		 .cpost_mult = 0xFFFF},
672		{.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
673		 .cpost_mult = 0xFFFF}
674	},
675
676	/* voltage swing 3, pre-emphasis 0->3 */
677	{	{.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
678		 .cpost_mult = 0x0000},
679		{.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
680		 .cpost_mult = 0xFFFF},
681		{.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
682		 .cpost_mult = 0xFFFF},
683		{.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
684		 .cpost_mult = 0xFFFF}
685	}
686};
687
688static const char *cdns_torrent_get_phy_type(enum cdns_torrent_phy_type phy_type)
689{
690	switch (phy_type) {
691	case TYPE_DP:
692		return "DisplayPort";
693	case TYPE_PCIE:
694		return "PCIe";
695	case TYPE_SGMII:
696		return "SGMII";
697	case TYPE_QSGMII:
698		return "QSGMII";
699	case TYPE_USB:
700		return "USB";
701	case TYPE_USXGMII:
702		return "USXGMII";
703	default:
704		return "None";
705	}
706}
707
708/*
709 * Set registers responsible for enabling and configuring SSC, with second and
710 * third register values provided by parameters.
711 */
712static
713void cdns_torrent_dp_enable_ssc_19_2mhz(struct cdns_torrent_phy *cdns_phy,
714					u32 ctrl2_val, u32 ctrl3_val)
715{
716	struct regmap *regmap = cdns_phy->regmap_common_cdb;
717
718	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
719	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
720	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl3_val);
721	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
722	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
723	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
724	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl3_val);
725	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
726}
727
728static
729void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy,
730					     u32 rate, bool ssc)
731{
732	struct regmap *regmap = cdns_phy->regmap_common_cdb;
733
734	/* Assumes 19.2 MHz refclock */
735	switch (rate) {
736	/* Setting VCO for 10.8GHz */
737	case 2700:
738	case 5400:
739		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0119);
740		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000);
741		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
742		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00BC);
743		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0012);
744		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0119);
745		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000);
746		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
747		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00BC);
748		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0012);
749		if (ssc)
750			cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x033A, 0x006A);
751		break;
752	/* Setting VCO for 9.72GHz */
753	case 1620:
754	case 2430:
755	case 3240:
756		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01FA);
757		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000);
758		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
759		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0152);
760		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
761		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01FA);
762		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000);
763		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
764		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0152);
765		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
766		if (ssc)
767			cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x05DD, 0x0069);
768		break;
769	/* Setting VCO for 8.64GHz */
770	case 2160:
771	case 4320:
772		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01C2);
773		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
774		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
775		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x012C);
776		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
777		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01C2);
778		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
779		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
780		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x012C);
781		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
782		if (ssc)
783			cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x0536, 0x0069);
784		break;
785	/* Setting VCO for 8.1GHz */
786	case 8100:
787		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01A5);
788		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xE000);
789		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
790		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x011A);
791		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
792		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01A5);
793		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xE000);
794		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
795		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x011A);
796		cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
797		if (ssc)
798			cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x04D7, 0x006A);
799		break;
800	}
801
802	if (ssc) {
803		cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x025E);
804		cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
805		cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x025E);
806		cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
807	} else {
808		cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x0260);
809		cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x0260);
810		/* Set reset register values to disable SSC */
811		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002);
812		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000);
813		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000);
814		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000);
815		cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
816		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002);
817		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000);
818		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000);
819		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000);
820		cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
821	}
822
823	cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x0099);
824	cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x0099);
825	cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x0099);
826	cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x0099);
827}
828
829/*
830 * Set registers responsible for enabling and configuring SSC, with second
831 * register value provided by a parameter.
832 */
833static void cdns_torrent_dp_enable_ssc_25mhz(struct cdns_torrent_phy *cdns_phy,
834					     u32 ctrl2_val)
835{
836	struct regmap *regmap = cdns_phy->regmap_common_cdb;
837
838	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
839	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
840	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x007F);
841	cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
842	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
843	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
844	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x007F);
845	cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
846}
847
848static
849void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy *cdns_phy,
850					   u32 rate, bool ssc)
851{
852	struct regmap *regmap = cdns_phy->regmap_common_cdb;
853
854	/* Assumes 25 MHz refclock */
855	switch (rate) {
856	/* Setting VCO for 10.8GHz */
857	case 2700:
858	case 5400:
859		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01B0);
860		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
861		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
862		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0120);
863		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01B0);
864		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
865		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
866		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0120);
867		if (ssc)
868			cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x0423);
869		break;
870	/* Setting VCO for 9.72GHz */
871	case 1620:
872	case 2430:
873	case 3240:
874		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0184);
875		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xCCCD);
876		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
877		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0104);
878		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0184);
879		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xCCCD);
880		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
881		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0104);
882		if (ssc)
883			cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x03B9);
884		break;
885	/* Setting VCO for 8.64GHz */
886	case 2160:
887	case 4320:
888		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0159);
889		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x999A);
890		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
891		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00E7);
892		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0159);
893		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x999A);
894		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
895		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00E7);
896		if (ssc)
897			cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x034F);
898		break;
899	/* Setting VCO for 8.1GHz */
900	case 8100:
901		cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0144);
902		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
903		cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
904		cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00D8);
905		cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0144);
906		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
907		cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
908		cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00D8);
909		if (ssc)
910			cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x031A);
911		break;
912	}
913
914	cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
915	cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
916
917	if (ssc) {
918		cdns_torrent_phy_write(regmap,
919				       CMN_PLL0_VCOCAL_PLLCNT_START, 0x0315);
920		cdns_torrent_phy_write(regmap,
921				       CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
922		cdns_torrent_phy_write(regmap,
923				       CMN_PLL1_VCOCAL_PLLCNT_START, 0x0315);
924		cdns_torrent_phy_write(regmap,
925				       CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
926	} else {
927		cdns_torrent_phy_write(regmap,
928				       CMN_PLL0_VCOCAL_PLLCNT_START, 0x0317);
929		cdns_torrent_phy_write(regmap,
930				       CMN_PLL1_VCOCAL_PLLCNT_START, 0x0317);
931		/* Set reset register values to disable SSC */
932		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002);
933		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000);
934		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000);
935		cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000);
936		cdns_torrent_phy_write(regmap,
937				       CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
938		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002);
939		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000);
940		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000);
941		cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000);
942		cdns_torrent_phy_write(regmap,
943				       CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
944	}
945
946	cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x00C7);
947	cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x00C7);
948	cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x00C7);
949	cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x00C7);
950}
951
952static
953void cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(struct cdns_torrent_phy *cdns_phy,
954					    u32 rate, bool ssc)
955{
956	struct regmap *regmap = cdns_phy->regmap_common_cdb;
957
958	/* Assumes 100 MHz refclock */
959	switch (rate) {
960	/* Setting VCO for 10.8GHz */
961	case 2700:
962	case 5400:
963		if (cdns_phy->dp_pll & DP_PLL0)
964			cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_FBH_OVRD_M0, 0x0022);
965
966		if (cdns_phy->dp_pll & DP_PLL1) {
967			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0028);
968			cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBH_OVRD_M0, 0x0022);
969			cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBL_OVRD_M0, 0x000C);
970		}
971		break;
972	/* Setting VCO for 9.72GHz */
973	case 1620:
974	case 2430:
975	case 3240:
976		if (cdns_phy->dp_pll & DP_PLL0) {
977			cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
978			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
979			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
980			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
981			cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0061);
982			cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x3333);
983			cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
984			cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0042);
985			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
986		}
987		if (cdns_phy->dp_pll & DP_PLL1) {
988			cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
989			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
990			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
991			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
992			cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0061);
993			cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x3333);
994			cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
995			cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0042);
996			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
997		}
998		break;
999	/* Setting VCO for 8.64GHz */
1000	case 2160:
1001	case 4320:
1002		if (cdns_phy->dp_pll & DP_PLL0) {
1003			cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
1004			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
1005			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
1006			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
1007			cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0056);
1008			cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x6666);
1009			cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
1010			cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x003A);
1011			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
1012		}
1013		if (cdns_phy->dp_pll & DP_PLL1) {
1014			cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
1015			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
1016			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
1017			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
1018			cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0056);
1019			cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x6666);
1020			cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
1021			cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x003A);
1022			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
1023		}
1024		break;
1025	/* Setting VCO for 8.1GHz */
1026	case 8100:
1027		if (cdns_phy->dp_pll & DP_PLL0) {
1028			cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
1029			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
1030			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
1031			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
1032			cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0051);
1033			cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
1034			cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0036);
1035			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
1036		}
1037		if (cdns_phy->dp_pll & DP_PLL1) {
1038			cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
1039			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
1040			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
1041			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
1042			cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0051);
1043			cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
1044			cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0036);
1045			cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
1046		}
1047		break;
1048	}
1049}
1050
1051/* Set PLL used for DP configuration */
1052static int cdns_torrent_dp_get_pll(struct cdns_torrent_phy *cdns_phy,
1053				   enum cdns_torrent_phy_type phy_t2)
1054{
1055	switch (phy_t2) {
1056	case TYPE_PCIE:
1057	case TYPE_USB:
1058		cdns_phy->dp_pll = DP_PLL1;
1059		break;
1060	case TYPE_SGMII:
1061	case TYPE_QSGMII:
1062		cdns_phy->dp_pll = DP_PLL0;
1063		break;
1064	case TYPE_NONE:
1065		cdns_phy->dp_pll = DP_PLL0 | DP_PLL1;
1066		break;
1067	default:
1068		dev_err(cdns_phy->dev, "Unsupported PHY configuration\n");
1069		return -EINVAL;
1070	}
1071
1072	return 0;
1073}
1074
1075/*
1076 * Enable or disable PLL for selected lanes.
1077 */
1078static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy,
1079				      struct cdns_torrent_inst *inst,
1080				      struct phy_configure_opts_dp *dp,
1081				      bool enable)
1082{
1083	struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1084	u32 rd_val, pll_ack_val;
1085	int ret;
1086
1087	/*
1088	 * Used to determine, which bits to check for or enable in
1089	 * PHY_PMA_XCVR_PLLCLK_EN register.
1090	 */
1091	u32 pll_bits;
1092	/* Used to enable or disable lanes. */
1093	u32 pll_val;
1094
1095	/* Select values of registers and mask, depending on enabled lane count. */
1096	pll_val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
1097
1098	if (enable) {
1099		pll_bits = ((1 << dp->lanes) - 1);
1100		pll_val |= pll_bits;
1101		pll_ack_val = pll_bits;
1102	} else {
1103		pll_bits = ((1 << inst->num_lanes) - 1);
1104		pll_val &= (~pll_bits);
1105		pll_ack_val = 0;
1106	}
1107
1108	cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_val);
1109
1110	/* Wait for acknowledgment from PHY. */
1111	ret = regmap_read_poll_timeout(regmap,
1112				       PHY_PMA_XCVR_PLLCLK_EN_ACK,
1113				       rd_val,
1114				       (rd_val & pll_bits) == pll_ack_val,
1115				       0, POLL_TIMEOUT_US);
1116	ndelay(100);
1117	return ret;
1118}
1119
1120static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
1121					   struct cdns_torrent_inst *inst,
1122					   u32 num_lanes,
1123					   enum phy_powerstate powerstate)
1124{
1125	/* Register value for power state for a single byte. */
1126	u32 value_part, i;
1127	u32 value = 0;
1128	u32 mask = 0;
1129	u32 read_val;
1130	int ret;
1131	struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1132
1133	switch (powerstate) {
1134	case (POWERSTATE_A0):
1135		value_part = 0x01U;
1136		break;
1137	case (POWERSTATE_A2):
1138		value_part = 0x04U;
1139		break;
1140	default:
1141		/* Powerstate A3 */
1142		value_part = 0x08U;
1143		break;
1144	}
1145
1146	/* Select values of registers and mask, depending on enabled lane count. */
1147
1148	for (i = 0; i < num_lanes; i++) {
1149		value |= (value_part << PHY_POWER_STATE_LN(i));
1150		mask |= (PMA_XCVR_POWER_STATE_REQ_LN_MASK << PHY_POWER_STATE_LN(i));
1151	}
1152
1153	/* Set power state A<n>. */
1154	cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, value);
1155	/* Wait, until PHY acknowledges power state completion. */
1156	ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_POWER_STATE_ACK,
1157				       read_val, (read_val & mask) == value, 0,
1158				       POLL_TIMEOUT_US);
1159	cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, 0x00000000);
1160	ndelay(100);
1161
1162	return ret;
1163}
1164
1165static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy,
1166			       struct cdns_torrent_inst *inst, u32 num_lanes)
1167{
1168	unsigned int read_val;
1169	int ret;
1170	struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1171
1172	/*
1173	 * waiting for ACK of pma_xcvr_pllclk_en_ln_*, only for the
1174	 * master lane
1175	 */
1176	ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_PLLCLK_EN_ACK,
1177				       read_val, read_val & 1,
1178				       0, POLL_TIMEOUT_US);
1179	if (ret == -ETIMEDOUT) {
1180		dev_err(cdns_phy->dev,
1181			"timeout waiting for link PLL clock enable ack\n");
1182		return ret;
1183	}
1184
1185	ndelay(100);
1186
1187	ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes,
1188					      POWERSTATE_A2);
1189	if (ret)
1190		return ret;
1191
1192	ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes,
1193					      POWERSTATE_A0);
1194
1195	return ret;
1196}
1197
1198static int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy *cdns_phy)
1199{
1200	unsigned int reg;
1201	int ret;
1202	struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1203
1204	ret = regmap_read_poll_timeout(regmap, PHY_PMA_CMN_READY, reg,
1205				       reg & 1, 0, POLL_TIMEOUT_US);
1206	if (ret == -ETIMEDOUT) {
1207		dev_err(cdns_phy->dev,
1208			"timeout waiting for PMA common ready\n");
1209		return -ETIMEDOUT;
1210	}
1211
1212	return 0;
1213}
1214
1215static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
1216					 struct cdns_torrent_inst *inst,
1217					 u32 rate, u32 num_lanes)
1218{
1219	unsigned int clk_sel_val = 0;
1220	unsigned int hsclk_div_val = 0;
1221	unsigned int i;
1222
1223	switch (rate) {
1224	case 1620:
1225		clk_sel_val = 0x0f01;
1226		hsclk_div_val = 2;
1227		break;
1228	case 2160:
1229	case 2430:
1230	case 2700:
1231		clk_sel_val = 0x0701;
1232		hsclk_div_val = 1;
1233		break;
1234	case 3240:
1235		clk_sel_val = 0x0b00;
1236		hsclk_div_val = 2;
1237		break;
1238	case 4320:
1239	case 5400:
1240		clk_sel_val = 0x0301;
1241		hsclk_div_val = 0;
1242		break;
1243	case 8100:
1244		clk_sel_val = 0x0200;
1245		hsclk_div_val = 0;
1246		break;
1247	}
1248
1249	if (cdns_phy->dp_pll & DP_PLL0)
1250		cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
1251				       CMN_PDIAG_PLL0_CLK_SEL_M0, clk_sel_val);
1252
1253	if (cdns_phy->dp_pll & DP_PLL1)
1254		cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
1255				       CMN_PDIAG_PLL1_CLK_SEL_M0, clk_sel_val);
1256
1257	/* PMA lane configuration to deal with multi-link operation */
1258	for (i = 0; i < num_lanes; i++)
1259		cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + i],
1260				       XCVR_DIAG_HSCLK_DIV, hsclk_div_val);
1261}
1262
1263/*
1264 * Perform register operations related to setting link rate, once powerstate is
1265 * set and PLL disable request was processed.
1266 */
1267static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy *cdns_phy,
1268					  struct cdns_torrent_inst *inst,
1269					  struct phy_configure_opts_dp *dp)
1270{
1271	u32 read_val, field_val;
1272	int ret;
1273
1274	/*
1275	 * Disable the associated PLL (cmn_pll0_en or cmn_pll1_en) before
1276	 * re-programming the new data rate.
1277	 */
1278	ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val);
1279	if (ret)
1280		return ret;
1281	field_val &= ~(cdns_phy->dp_pll);
1282	regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val);
1283
1284	/*
1285	 * Wait for PLL ready de-assertion.
1286	 * For PLL0 - PHY_PMA_CMN_CTRL2[2] == 1
1287	 * For PLL1 - PHY_PMA_CMN_CTRL2[3] == 1
1288	 */
1289	if (cdns_phy->dp_pll & DP_PLL0) {
1290		ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
1291						     read_val,
1292						     ((read_val >> 2) & 0x01) != 0,
1293						     0, POLL_TIMEOUT_US);
1294		if (ret)
1295			return ret;
1296	}
1297
1298	if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1) {
1299		ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
1300						     read_val,
1301						     ((read_val >> 3) & 0x01) != 0,
1302						     0, POLL_TIMEOUT_US);
1303		if (ret)
1304			return ret;
1305	}
1306	ndelay(200);
1307
1308	/* DP Rate Change - VCO Output settings. */
1309	if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ)
1310		/* PMA common configuration 19.2MHz */
1311		cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy, dp->link_rate, dp->ssc);
1312	else if (cdns_phy->ref_clk_rate == CLK_25_MHZ)
1313		/* PMA common configuration 25MHz */
1314		cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy, dp->link_rate, dp->ssc);
1315	else if (cdns_phy->ref_clk_rate == CLK_100_MHZ)
1316		/* PMA common configuration 100MHz */
1317		cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy, dp->link_rate, dp->ssc);
1318
1319	cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, dp->link_rate, dp->lanes);
1320
1321	/* Enable the associated PLL (cmn_pll0_en or cmn_pll1_en) */
1322	ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val);
1323	if (ret)
1324		return ret;
1325	field_val |= cdns_phy->dp_pll;
1326	regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val);
1327
1328	/*
1329	 * Wait for PLL ready assertion.
1330	 * For PLL0 - PHY_PMA_CMN_CTRL2[0] == 1
1331	 * For PLL1 - PHY_PMA_CMN_CTRL2[1] == 1
1332	 */
1333	if (cdns_phy->dp_pll & DP_PLL0) {
1334		ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
1335						     read_val,
1336						     (read_val & 0x01) != 0,
1337						     0, POLL_TIMEOUT_US);
1338		if (ret)
1339			return ret;
1340	}
1341
1342	if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1)
1343		ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
1344						     read_val,
1345						     ((read_val >> 1) & 0x01) != 0,
1346						     0, POLL_TIMEOUT_US);
1347
1348	return ret;
1349}
1350
1351/*
1352 * Verify, that parameters to configure PHY with are correct.
1353 */
1354static int cdns_torrent_dp_verify_config(struct cdns_torrent_inst *inst,
1355					 struct phy_configure_opts_dp *dp)
1356{
1357	u8 i;
1358
1359	/* If changing link rate was required, verify it's supported. */
1360	if (dp->set_rate) {
1361		switch (dp->link_rate) {
1362		case 1620:
1363		case 2160:
1364		case 2430:
1365		case 2700:
1366		case 3240:
1367		case 4320:
1368		case 5400:
1369		case 8100:
1370			/* valid bit rate */
1371			break;
1372		default:
1373			return -EINVAL;
1374		}
1375	}
1376
1377	/* Verify lane count. */
1378	switch (dp->lanes) {
1379	case 1:
1380	case 2:
1381	case 4:
1382		/* valid lane count. */
1383		break;
1384	default:
1385		return -EINVAL;
1386	}
1387
1388	/* Check against actual number of PHY's lanes. */
1389	if (dp->lanes > inst->num_lanes)
1390		return -EINVAL;
1391
1392	/*
1393	 * If changing voltages is required, check swing and pre-emphasis
1394	 * levels, per-lane.
1395	 */
1396	if (dp->set_voltages) {
1397		/* Lane count verified previously. */
1398		for (i = 0; i < dp->lanes; i++) {
1399			if (dp->voltage[i] > 3 || dp->pre[i] > 3)
1400				return -EINVAL;
1401
1402			/* Sum of voltage swing and pre-emphasis levels cannot
1403			 * exceed 3.
1404			 */
1405			if (dp->voltage[i] + dp->pre[i] > 3)
1406				return -EINVAL;
1407		}
1408	}
1409
1410	return 0;
1411}
1412
1413/* Set power state A0 and PLL clock enable to 0 on enabled lanes. */
1414static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy,
1415				       struct cdns_torrent_inst *inst,
1416				       u32 num_lanes)
1417{
1418	struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1419	u32 pwr_state = cdns_torrent_dp_read(regmap,
1420					     PHY_PMA_XCVR_POWER_STATE_REQ);
1421	u32 pll_clk_en = cdns_torrent_dp_read(regmap,
1422					      PHY_PMA_XCVR_PLLCLK_EN);
1423	u32 i;
1424
1425	for (i = 0; i < num_lanes; i++) {
1426		pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK
1427			     << PHY_POWER_STATE_LN(inst->mlane + i));
1428
1429		pll_clk_en &= ~(0x01U << (inst->mlane + i));
1430	}
1431
1432	cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, pwr_state);
1433	cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_clk_en);
1434}
1435
1436/* Configure lane count as required. */
1437static int cdns_torrent_dp_set_lanes(struct cdns_torrent_phy *cdns_phy,
1438				     struct cdns_torrent_inst *inst,
1439				     struct phy_configure_opts_dp *dp)
1440{
1441	u32 value, i;
1442	int ret;
1443	struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1444	u8 lane_mask = (1 << dp->lanes) - 1;
1445	u8 pma_tx_elec_idle_mask = 0;
1446	u32 clane = inst->mlane;
1447
1448	lane_mask <<= clane;
1449
1450	value = cdns_torrent_dp_read(regmap, PHY_RESET);
1451	/* clear pma_tx_elec_idle_ln_* bits. */
1452	pma_tx_elec_idle_mask = ((1 << inst->num_lanes) - 1) << clane;
1453
1454	pma_tx_elec_idle_mask <<= PMA_TX_ELEC_IDLE_SHIFT;
1455
1456	value &= ~pma_tx_elec_idle_mask;
1457
1458	/* Assert pma_tx_elec_idle_ln_* for disabled lanes. */
1459	value |= ((~lane_mask) << PMA_TX_ELEC_IDLE_SHIFT) &
1460		 pma_tx_elec_idle_mask;
1461
1462	cdns_torrent_dp_write(regmap, PHY_RESET, value);
1463
1464	/* reset the link by asserting master lane phy_l0*_reset_n low */
1465	cdns_torrent_dp_write(regmap, PHY_RESET,
1466			      value & (~(1 << clane)));
1467
1468	/*
1469	 * Assert lane reset on unused lanes and master lane so they remain in reset
1470	 * and powered down when re-enabling the link
1471	 */
1472	for (i = 0; i < inst->num_lanes; i++)
1473		value &= (~(1 << (clane + i)));
1474
1475	for (i = 1; i < inst->num_lanes; i++)
1476		value |= ((1 << (clane + i)) & lane_mask);
1477
1478	cdns_torrent_dp_write(regmap, PHY_RESET, value);
1479
1480	cdns_torrent_dp_set_a0_pll(cdns_phy, inst, dp->lanes);
1481
1482	/* release phy_l0*_reset_n based on used laneCount */
1483	for (i = 0; i < inst->num_lanes; i++)
1484		value &= (~(1 << (clane + i)));
1485
1486	for (i = 0; i < inst->num_lanes; i++)
1487		value |= ((1 << (clane + i)) & lane_mask);
1488
1489	cdns_torrent_dp_write(regmap, PHY_RESET, value);
1490
1491	/* Wait, until PHY gets ready after releasing PHY reset signal. */
1492	ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
1493	if (ret)
1494		return ret;
1495
1496	ndelay(100);
1497
1498	/* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
1499	value = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
1500	value |= (1 << clane);
1501	cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, value);
1502
1503	ret = cdns_torrent_dp_run(cdns_phy, inst, dp->lanes);
1504
1505	return ret;
1506}
1507
1508/* Configure link rate as required. */
1509static int cdns_torrent_dp_set_rate(struct cdns_torrent_phy *cdns_phy,
1510				    struct cdns_torrent_inst *inst,
1511				    struct phy_configure_opts_dp *dp)
1512{
1513	int ret;
1514
1515	ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
1516					      POWERSTATE_A3);
1517	if (ret)
1518		return ret;
1519	ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, false);
1520	if (ret)
1521		return ret;
1522	ndelay(200);
1523
1524	ret = cdns_torrent_dp_configure_rate(cdns_phy, inst, dp);
1525	if (ret)
1526		return ret;
1527	ndelay(200);
1528
1529	ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, true);
1530	if (ret)
1531		return ret;
1532	ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
1533					      POWERSTATE_A2);
1534	if (ret)
1535		return ret;
1536	ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
1537					      POWERSTATE_A0);
1538	if (ret)
1539		return ret;
1540	ndelay(900);
1541
1542	return ret;
1543}
1544
1545/* Configure voltage swing and pre-emphasis for all enabled lanes. */
1546static void cdns_torrent_dp_set_voltages(struct cdns_torrent_phy *cdns_phy,
1547					 struct cdns_torrent_inst *inst,
1548					 struct phy_configure_opts_dp *dp)
1549{
1550	u8 lane;
1551	u16 val;
1552
1553	for (lane = 0; lane < dp->lanes; lane++) {
1554		val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1555					    TX_DIAG_ACYA);
1556		/*
1557		 * Write 1 to register bit TX_DIAG_ACYA[0] to freeze the
1558		 * current state of the analog TX driver.
1559		 */
1560		val |= TX_DIAG_ACYA_HBDC_MASK;
1561		cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1562				       TX_DIAG_ACYA, val);
1563
1564		cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1565				       TX_TXCC_CTRL, 0x08A4);
1566		val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].diag_tx_drv;
1567		cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1568				       DRV_DIAG_TX_DRV, val);
1569		val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].mgnfs_mult;
1570		cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1571				       TX_TXCC_MGNFS_MULT_000,
1572				       val);
1573		val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].cpost_mult;
1574		cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1575				       TX_TXCC_CPOST_MULT_00,
1576				       val);
1577
1578		val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1579					    TX_DIAG_ACYA);
1580		/*
1581		 * Write 0 to register bit TX_DIAG_ACYA[0] to allow the state of
1582		 * analog TX driver to reflect the new programmed one.
1583		 */
1584		val &= ~TX_DIAG_ACYA_HBDC_MASK;
1585		cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
1586				       TX_DIAG_ACYA, val);
1587	}
1588};
1589
1590static int cdns_torrent_dp_configure(struct phy *phy,
1591				     union phy_configure_opts *opts)
1592{
1593	struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1594	struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1595	int ret;
1596
1597	ret = cdns_torrent_dp_verify_config(inst, &opts->dp);
1598	if (ret) {
1599		dev_err(&phy->dev, "invalid params for phy configure\n");
1600		return ret;
1601	}
1602
1603	if (opts->dp.set_lanes) {
1604		ret = cdns_torrent_dp_set_lanes(cdns_phy, inst, &opts->dp);
1605		if (ret) {
1606			dev_err(&phy->dev, "cdns_torrent_dp_set_lanes failed\n");
1607			return ret;
1608		}
1609	}
1610
1611	if (opts->dp.set_rate) {
1612		ret = cdns_torrent_dp_set_rate(cdns_phy, inst, &opts->dp);
1613		if (ret) {
1614			dev_err(&phy->dev, "cdns_torrent_dp_set_rate failed\n");
1615			return ret;
1616		}
1617	}
1618
1619	if (opts->dp.set_voltages)
1620		cdns_torrent_dp_set_voltages(cdns_phy, inst, &opts->dp);
1621
1622	return ret;
1623}
1624
1625static int cdns_torrent_phy_on(struct phy *phy)
1626{
1627	struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1628	struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1629	u32 read_val;
1630	int ret;
1631
1632	if (cdns_phy->nsubnodes == 1) {
1633		/* Take the PHY lane group out of reset */
1634		reset_control_deassert(inst->lnk_rst);
1635
1636		/* Take the PHY out of reset */
1637		ret = reset_control_deassert(cdns_phy->phy_rst);
1638		if (ret)
1639			return ret;
1640	}
1641
1642	/*
1643	 * Wait for cmn_ready assertion
1644	 * PHY_PMA_CMN_CTRL1[0] == 1
1645	 */
1646	ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_1,
1647					     read_val, read_val, 1000,
1648					     PLL_LOCK_TIMEOUT);
1649	if (ret) {
1650		dev_err(cdns_phy->dev, "Timeout waiting for CMN ready\n");
1651		return ret;
1652	}
1653
1654	if (inst->phy_type == TYPE_PCIE || inst->phy_type == TYPE_USB) {
1655		ret = regmap_field_read_poll_timeout(cdns_phy->phy_pcs_iso_link_ctrl_1[inst->mlane],
1656						     read_val, !read_val, 1000,
1657						     PLL_LOCK_TIMEOUT);
1658		if (ret == -ETIMEDOUT) {
1659			dev_err(cdns_phy->dev, "Timeout waiting for PHY status ready\n");
1660			return ret;
1661		}
1662	}
1663
1664	return 0;
1665}
1666
1667static int cdns_torrent_phy_off(struct phy *phy)
1668{
1669	struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1670	struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1671	int ret;
1672
1673	if (cdns_phy->nsubnodes != 1)
1674		return 0;
1675
1676	ret = reset_control_assert(cdns_phy->phy_rst);
1677	if (ret)
1678		return ret;
1679
1680	return reset_control_assert(inst->lnk_rst);
1681}
1682
1683static void cdns_torrent_dp_common_init(struct cdns_torrent_phy *cdns_phy,
1684					struct cdns_torrent_inst *inst)
1685{
1686	struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1687	unsigned char lane_bits;
1688	u32 val;
1689
1690	cdns_torrent_dp_write(regmap, PHY_AUX_CTRL, 0x0003); /* enable AUX */
1691
1692	/*
1693	 * Set lines power state to A0
1694	 * Set lines pll clk enable to 0
1695	 */
1696	cdns_torrent_dp_set_a0_pll(cdns_phy, inst, inst->num_lanes);
1697
1698	/*
1699	 * release phy_l0*_reset_n and pma_tx_elec_idle_ln_* based on
1700	 * used lanes
1701	 */
1702	lane_bits = (1 << inst->num_lanes) - 1;
1703
1704	val = cdns_torrent_dp_read(regmap, PHY_RESET);
1705	val |= (0xF & lane_bits);
1706	val &= ~(lane_bits << 4);
1707	cdns_torrent_dp_write(regmap, PHY_RESET, val);
1708
1709	/* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
1710	val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
1711	val |= 1;
1712	cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, val);
1713
1714	/*
1715	 * PHY PMA registers configuration functions
1716	 * Initialize PHY with max supported link rate, without SSC.
1717	 */
1718	if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ)
1719		cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy,
1720							cdns_phy->max_bit_rate,
1721							false);
1722	else if (cdns_phy->ref_clk_rate == CLK_25_MHZ)
1723		cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy,
1724						      cdns_phy->max_bit_rate,
1725						      false);
1726	else if (cdns_phy->ref_clk_rate == CLK_100_MHZ)
1727		cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy,
1728						       cdns_phy->max_bit_rate,
1729						       false);
1730
1731	cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, cdns_phy->max_bit_rate,
1732				     inst->num_lanes);
1733
1734	/* take out of reset */
1735	regmap_field_write(cdns_phy->phy_reset_ctrl, 0x1);
1736}
1737
1738static int cdns_torrent_dp_start(struct cdns_torrent_phy *cdns_phy,
1739				 struct cdns_torrent_inst *inst,
1740				 struct phy *phy)
1741{
1742	int ret;
1743
1744	ret = cdns_torrent_phy_on(phy);
1745	if (ret)
1746		return ret;
1747
1748	ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
1749	if (ret)
1750		return ret;
1751
1752	ret = cdns_torrent_dp_run(cdns_phy, inst, inst->num_lanes);
1753
1754	return ret;
1755}
1756
1757static int cdns_torrent_dp_init(struct phy *phy)
1758{
1759	struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1760	struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1761	int ret;
1762
1763	switch (cdns_phy->ref_clk_rate) {
1764	case CLK_19_2_MHZ:
1765	case CLK_25_MHZ:
1766	case CLK_100_MHZ:
1767		/* Valid Ref Clock Rate */
1768		break;
1769	default:
1770		dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n");
1771		return -EINVAL;
1772	}
1773
1774	ret = cdns_torrent_dp_get_pll(cdns_phy, TYPE_NONE);
1775	if (ret)
1776		return ret;
1777
1778	cdns_torrent_dp_common_init(cdns_phy, inst);
1779
1780	return cdns_torrent_dp_start(cdns_phy, inst, phy);
1781}
1782
1783static int cdns_torrent_dp_multilink_init(struct cdns_torrent_phy *cdns_phy,
1784					  struct cdns_torrent_inst *inst,
1785					  struct phy *phy)
1786{
1787	if (cdns_phy->ref_clk_rate != CLK_100_MHZ) {
1788		dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n");
1789		return -EINVAL;
1790	}
1791
1792	cdns_torrent_dp_common_init(cdns_phy, inst);
1793
1794	return cdns_torrent_dp_start(cdns_phy, inst, phy);
1795}
1796
1797static int cdns_torrent_derived_refclk_enable(struct clk_hw *hw)
1798{
1799	struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
1800
1801	regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 1);
1802	regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 1);
1803
1804	return 0;
1805}
1806
1807static void cdns_torrent_derived_refclk_disable(struct clk_hw *hw)
1808{
1809	struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
1810
1811	regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 0);
1812	regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 0);
1813}
1814
1815static int cdns_torrent_derived_refclk_is_enabled(struct clk_hw *hw)
1816{
1817	struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
1818	int val;
1819
1820	regmap_field_read(derived_refclk->cmn_cdiag_refclk_ovrd_4, &val);
1821
1822	return !!val;
1823}
1824
1825static const struct clk_ops cdns_torrent_derived_refclk_ops = {
1826	.enable = cdns_torrent_derived_refclk_enable,
1827	.disable = cdns_torrent_derived_refclk_disable,
1828	.is_enabled = cdns_torrent_derived_refclk_is_enabled,
1829};
1830
1831static int cdns_torrent_derived_refclk_register(struct cdns_torrent_phy *cdns_phy)
1832{
1833	struct cdns_torrent_derived_refclk *derived_refclk;
1834	struct device *dev = cdns_phy->dev;
1835	struct clk_init_data *init;
1836	const char *parent_name;
1837	char clk_name[100];
1838	struct clk_hw *hw;
1839	struct clk *clk;
1840	int ret;
1841
1842	derived_refclk = devm_kzalloc(dev, sizeof(*derived_refclk), GFP_KERNEL);
1843	if (!derived_refclk)
1844		return -ENOMEM;
1845
1846	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
1847		 clk_names[CDNS_TORRENT_DERIVED_REFCLK]);
1848
1849	clk = devm_clk_get_optional(dev, "phy_en_refclk");
1850	if (IS_ERR(clk)) {
1851		dev_err(dev, "No parent clock for derived_refclk\n");
1852		return PTR_ERR(clk);
1853	}
1854
1855	init = &derived_refclk->clk_data;
1856
1857	if (clk) {
1858		parent_name = __clk_get_name(clk);
1859		init->parent_names = &parent_name;
1860		init->num_parents = 1;
1861	}
1862	init->ops = &cdns_torrent_derived_refclk_ops;
1863	init->flags = 0;
1864	init->name = clk_name;
1865
1866	derived_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0;
1867	derived_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4;
1868
1869	derived_refclk->hw.init = init;
1870
1871	hw = &derived_refclk->hw;
1872	ret = devm_clk_hw_register(dev, hw);
1873	if (ret)
1874		return ret;
1875
1876	cdns_phy->clk_hw_data->hws[CDNS_TORRENT_DERIVED_REFCLK] = hw;
1877
1878	return 0;
1879}
1880
1881static int cdns_torrent_received_refclk_enable(struct clk_hw *hw)
1882{
1883	struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
1884
1885	regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 1);
1886
1887	return 0;
1888}
1889
1890static void cdns_torrent_received_refclk_disable(struct clk_hw *hw)
1891{
1892	struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
1893
1894	regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 0);
1895}
1896
1897static int cdns_torrent_received_refclk_is_enabled(struct clk_hw *hw)
1898{
1899	struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
1900	int val, cmn_val;
1901
1902	regmap_field_read(received_refclk->phy_pipe_cmn_ctrl1_0, &val);
1903	regmap_field_read(received_refclk->cmn_cdiag_refclk_ovrd_4, &cmn_val);
1904
1905	return val && !cmn_val;
1906}
1907
1908static const struct clk_ops cdns_torrent_received_refclk_ops = {
1909	.enable = cdns_torrent_received_refclk_enable,
1910	.disable = cdns_torrent_received_refclk_disable,
1911	.is_enabled = cdns_torrent_received_refclk_is_enabled,
1912};
1913
1914static int cdns_torrent_received_refclk_register(struct cdns_torrent_phy *cdns_phy)
1915{
1916	struct cdns_torrent_received_refclk *received_refclk;
1917	struct device *dev = cdns_phy->dev;
1918	struct clk_init_data *init;
1919	const char *parent_name;
1920	char clk_name[100];
1921	struct clk_hw *hw;
1922	struct clk *clk;
1923	int ret;
1924
1925	received_refclk = devm_kzalloc(dev, sizeof(*received_refclk), GFP_KERNEL);
1926	if (!received_refclk)
1927		return -ENOMEM;
1928
1929	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
1930		 clk_names[CDNS_TORRENT_RECEIVED_REFCLK]);
1931
1932	clk = devm_clk_get_optional(dev, "phy_en_refclk");
1933	if (IS_ERR(clk)) {
1934		dev_err(dev, "No parent clock for received_refclk\n");
1935		return PTR_ERR(clk);
1936	}
1937
1938	init = &received_refclk->clk_data;
1939
1940	if (clk) {
1941		parent_name = __clk_get_name(clk);
1942		init->parent_names = &parent_name;
1943		init->num_parents = 1;
1944	}
1945	init->ops = &cdns_torrent_received_refclk_ops;
1946	init->flags = 0;
1947	init->name = clk_name;
1948
1949	received_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0;
1950	received_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4;
1951
1952	received_refclk->hw.init = init;
1953
1954	hw = &received_refclk->hw;
1955	ret = devm_clk_hw_register(dev, hw);
1956	if (ret)
1957		return ret;
1958
1959	cdns_phy->clk_hw_data->hws[CDNS_TORRENT_RECEIVED_REFCLK] = hw;
1960
1961	return 0;
1962}
1963
1964static int cdns_torrent_refclk_driver_enable(struct clk_hw *hw)
1965{
1966	struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1967
1968	regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_6], 0);
1969	regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_5], 1);
1970	regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 0);
1971
1972	return 0;
1973}
1974
1975static void cdns_torrent_refclk_driver_disable(struct clk_hw *hw)
1976{
1977	struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1978
1979	regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 1);
1980}
1981
1982static int cdns_torrent_refclk_driver_is_enabled(struct clk_hw *hw)
1983{
1984	struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1985	int val;
1986
1987	regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], &val);
1988
1989	return !val;
1990}
1991
1992static u8 cdns_torrent_refclk_driver_get_parent(struct clk_hw *hw)
1993{
1994	struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1995	unsigned int val;
1996
1997	regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], &val);
1998	return clk_mux_val_to_index(hw, cdns_torrent_refclk_driver_mux_table, 0, val);
1999}
2000
2001static int cdns_torrent_refclk_driver_set_parent(struct clk_hw *hw, u8 index)
2002{
2003	struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
2004	unsigned int val;
2005
2006	val = cdns_torrent_refclk_driver_mux_table[index];
2007	return regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], val);
2008}
2009
2010static const struct clk_ops cdns_torrent_refclk_driver_ops = {
2011	.enable = cdns_torrent_refclk_driver_enable,
2012	.disable = cdns_torrent_refclk_driver_disable,
2013	.is_enabled = cdns_torrent_refclk_driver_is_enabled,
2014	.determine_rate = __clk_mux_determine_rate,
2015	.set_parent = cdns_torrent_refclk_driver_set_parent,
2016	.get_parent = cdns_torrent_refclk_driver_get_parent,
2017};
2018
2019static int cdns_torrent_refclk_driver_register(struct cdns_torrent_phy *cdns_phy)
2020{
2021	struct cdns_torrent_refclk_driver *refclk_driver;
2022	struct device *dev = cdns_phy->dev;
2023	struct regmap_field *field;
2024	struct clk_init_data *init;
2025	const char **parent_names;
2026	unsigned int num_parents;
2027	struct regmap *regmap;
2028	char clk_name[100];
2029	struct clk_hw *hw;
2030	int i, ret;
2031
2032	refclk_driver = devm_kzalloc(dev, sizeof(*refclk_driver), GFP_KERNEL);
2033	if (!refclk_driver)
2034		return -ENOMEM;
2035
2036	num_parents = ARRAY_SIZE(refclk_driver_parent_index);
2037	parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents), GFP_KERNEL);
2038	if (!parent_names)
2039		return -ENOMEM;
2040
2041	for (i = 0; i < num_parents; i++) {
2042		hw = cdns_phy->clk_hw_data->hws[refclk_driver_parent_index[i]];
2043		if (IS_ERR_OR_NULL(hw)) {
2044			dev_err(dev, "No parent clock for refclk driver clock\n");
2045			return IS_ERR(hw) ? PTR_ERR(hw) : -ENOENT;
2046		}
2047		parent_names[i] = clk_hw_get_name(hw);
2048	}
2049
2050	snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
2051		 clk_names[CDNS_TORRENT_REFCLK_DRIVER]);
2052
2053	init = &refclk_driver->clk_data;
2054
2055	init->ops = &cdns_torrent_refclk_driver_ops;
2056	init->flags = CLK_SET_RATE_NO_REPARENT;
2057	init->parent_names = parent_names;
2058	init->num_parents = num_parents;
2059	init->name = clk_name;
2060
2061	regmap = cdns_phy->regmap_common_cdb;
2062
2063	for (i = 0; i < REFCLK_OUT_NUM_CMN_CONFIG; i++) {
2064		field = devm_regmap_field_alloc(dev, regmap, refclk_out_cmn_cfg[i]);
2065		if (IS_ERR(field)) {
2066			dev_err(dev, "Refclk driver CMN reg field init failed\n");
2067			return PTR_ERR(field);
2068		}
2069		refclk_driver->cmn_fields[i] = field;
2070	}
2071
2072	/* Enable Derived reference clock as default */
2073	regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], 1);
2074
2075	refclk_driver->hw.init = init;
2076
2077	hw = &refclk_driver->hw;
2078	ret = devm_clk_hw_register(dev, hw);
2079	if (ret)
2080		return ret;
2081
2082	cdns_phy->clk_hw_data->hws[CDNS_TORRENT_REFCLK_DRIVER] = hw;
2083
2084	return 0;
2085}
2086
2087static struct regmap *cdns_regmap_init(struct device *dev, void __iomem *base,
2088				       u32 block_offset,
2089				       u8 reg_offset_shift,
2090				       const struct regmap_config *config)
2091{
2092	struct cdns_regmap_cdb_context *ctx;
2093
2094	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
2095	if (!ctx)
2096		return ERR_PTR(-ENOMEM);
2097
2098	ctx->dev = dev;
2099	ctx->base = base + block_offset;
2100	ctx->reg_offset_shift = reg_offset_shift;
2101
2102	return devm_regmap_init(dev, NULL, ctx, config);
2103}
2104
2105static int cdns_torrent_dp_regfield_init(struct cdns_torrent_phy *cdns_phy)
2106{
2107	struct device *dev = cdns_phy->dev;
2108	struct regmap_field *field;
2109	struct regmap *regmap;
2110
2111	regmap = cdns_phy->regmap_dptx_phy_reg;
2112	field = devm_regmap_field_alloc(dev, regmap, phy_reset_ctrl);
2113	if (IS_ERR(field)) {
2114		dev_err(dev, "PHY_RESET reg field init failed\n");
2115		return PTR_ERR(field);
2116	}
2117	cdns_phy->phy_reset_ctrl = field;
2118
2119	return 0;
2120}
2121
2122static int cdns_torrent_regfield_init(struct cdns_torrent_phy *cdns_phy)
2123{
2124	struct device *dev = cdns_phy->dev;
2125	struct regmap_field *field;
2126	struct regmap *regmap;
2127	int i;
2128
2129	regmap = cdns_phy->regmap_phy_pcs_common_cdb;
2130	field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg);
2131	if (IS_ERR(field)) {
2132		dev_err(dev, "PHY_PLL_CFG reg field init failed\n");
2133		return PTR_ERR(field);
2134	}
2135	cdns_phy->phy_pll_cfg = field;
2136
2137	regmap = cdns_phy->regmap_phy_pcs_common_cdb;
2138	field = devm_regmap_field_alloc(dev, regmap, phy_pipe_cmn_ctrl1_0);
2139	if (IS_ERR(field)) {
2140		dev_err(dev, "phy_pipe_cmn_ctrl1_0 reg field init failed\n");
2141		return PTR_ERR(field);
2142	}
2143	cdns_phy->phy_pipe_cmn_ctrl1_0 = field;
2144
2145	regmap = cdns_phy->regmap_common_cdb;
2146	field = devm_regmap_field_alloc(dev, regmap, cmn_cdiag_refclk_ovrd_4);
2147	if (IS_ERR(field)) {
2148		dev_err(dev, "cmn_cdiag_refclk_ovrd_4 reg field init failed\n");
2149		return PTR_ERR(field);
2150	}
2151	cdns_phy->cmn_cdiag_refclk_ovrd_4 = field;
2152
2153	regmap = cdns_phy->regmap_phy_pma_common_cdb;
2154	field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_1);
2155	if (IS_ERR(field)) {
2156		dev_err(dev, "PHY_PMA_CMN_CTRL1 reg field init failed\n");
2157		return PTR_ERR(field);
2158	}
2159	cdns_phy->phy_pma_cmn_ctrl_1 = field;
2160
2161	regmap = cdns_phy->regmap_phy_pma_common_cdb;
2162	field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_2);
2163	if (IS_ERR(field)) {
2164		dev_err(dev, "PHY_PMA_CMN_CTRL2 reg field init failed\n");
2165		return PTR_ERR(field);
2166	}
2167	cdns_phy->phy_pma_cmn_ctrl_2 = field;
2168
2169	regmap = cdns_phy->regmap_phy_pma_common_cdb;
2170	field = devm_regmap_field_alloc(dev, regmap, phy_pma_pll_raw_ctrl);
2171	if (IS_ERR(field)) {
2172		dev_err(dev, "PHY_PMA_PLL_RAW_CTRL reg field init failed\n");
2173		return PTR_ERR(field);
2174	}
2175	cdns_phy->phy_pma_pll_raw_ctrl = field;
2176
2177	for (i = 0; i < MAX_NUM_LANES; i++) {
2178		regmap = cdns_phy->regmap_phy_pcs_lane_cdb[i];
2179		field = devm_regmap_field_alloc(dev, regmap, phy_pcs_iso_link_ctrl_1);
2180		if (IS_ERR(field)) {
2181			dev_err(dev, "PHY_PCS_ISO_LINK_CTRL reg field init for ln %d failed\n", i);
2182			return PTR_ERR(field);
2183		}
2184		cdns_phy->phy_pcs_iso_link_ctrl_1[i] = field;
2185	}
2186
2187	return 0;
2188}
2189
2190static int cdns_torrent_dp_regmap_init(struct cdns_torrent_phy *cdns_phy)
2191{
2192	void __iomem *base = cdns_phy->base;
2193	struct device *dev = cdns_phy->dev;
2194	struct regmap *regmap;
2195	u8 reg_offset_shift;
2196	u32 block_offset;
2197
2198	reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
2199
2200	block_offset = TORRENT_DPTX_PHY_OFFSET;
2201	regmap = cdns_regmap_init(dev, base, block_offset,
2202				  reg_offset_shift,
2203				  &cdns_torrent_dptx_phy_config);
2204	if (IS_ERR(regmap)) {
2205		dev_err(dev, "Failed to init DPTX PHY regmap\n");
2206		return PTR_ERR(regmap);
2207	}
2208	cdns_phy->regmap_dptx_phy_reg = regmap;
2209
2210	return 0;
2211}
2212
2213static int cdns_torrent_regmap_init(struct cdns_torrent_phy *cdns_phy)
2214{
2215	void __iomem *sd_base = cdns_phy->sd_base;
2216	u8 block_offset_shift, reg_offset_shift;
2217	struct device *dev = cdns_phy->dev;
2218	struct regmap *regmap;
2219	u32 block_offset;
2220	int i;
2221
2222	block_offset_shift = cdns_phy->init_data->block_offset_shift;
2223	reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
2224
2225	for (i = 0; i < MAX_NUM_LANES; i++) {
2226		block_offset = TORRENT_TX_LANE_CDB_OFFSET(i, block_offset_shift,
2227							  reg_offset_shift);
2228		regmap = cdns_regmap_init(dev, sd_base, block_offset,
2229					  reg_offset_shift,
2230					  &cdns_torrent_tx_lane_cdb_config[i]);
2231		if (IS_ERR(regmap)) {
2232			dev_err(dev, "Failed to init tx lane CDB regmap\n");
2233			return PTR_ERR(regmap);
2234		}
2235		cdns_phy->regmap_tx_lane_cdb[i] = regmap;
2236
2237		block_offset = TORRENT_RX_LANE_CDB_OFFSET(i, block_offset_shift,
2238							  reg_offset_shift);
2239		regmap = cdns_regmap_init(dev, sd_base, block_offset,
2240					  reg_offset_shift,
2241					  &cdns_torrent_rx_lane_cdb_config[i]);
2242		if (IS_ERR(regmap)) {
2243			dev_err(dev, "Failed to init rx lane CDB regmap\n");
2244			return PTR_ERR(regmap);
2245		}
2246		cdns_phy->regmap_rx_lane_cdb[i] = regmap;
2247
2248		block_offset = TORRENT_PHY_PCS_LANE_CDB_OFFSET(i, block_offset_shift,
2249							       reg_offset_shift);
2250		regmap = cdns_regmap_init(dev, sd_base, block_offset,
2251					  reg_offset_shift,
2252					  &cdns_torrent_phy_pcs_lane_cdb_config[i]);
2253		if (IS_ERR(regmap)) {
2254			dev_err(dev, "Failed to init PHY PCS lane CDB regmap\n");
2255			return PTR_ERR(regmap);
2256		}
2257		cdns_phy->regmap_phy_pcs_lane_cdb[i] = regmap;
2258	}
2259
2260	block_offset = TORRENT_COMMON_CDB_OFFSET;
2261	regmap = cdns_regmap_init(dev, sd_base, block_offset,
2262				  reg_offset_shift,
2263				  &cdns_torrent_common_cdb_config);
2264	if (IS_ERR(regmap)) {
2265		dev_err(dev, "Failed to init common CDB regmap\n");
2266		return PTR_ERR(regmap);
2267	}
2268	cdns_phy->regmap_common_cdb = regmap;
2269
2270	block_offset = TORRENT_PHY_PCS_COMMON_OFFSET(block_offset_shift);
2271	regmap = cdns_regmap_init(dev, sd_base, block_offset,
2272				  reg_offset_shift,
2273				  &cdns_torrent_phy_pcs_cmn_cdb_config);
2274	if (IS_ERR(regmap)) {
2275		dev_err(dev, "Failed to init PHY PCS common CDB regmap\n");
2276		return PTR_ERR(regmap);
2277	}
2278	cdns_phy->regmap_phy_pcs_common_cdb = regmap;
2279
2280	block_offset = TORRENT_PHY_PMA_COMMON_OFFSET(block_offset_shift);
2281	regmap = cdns_regmap_init(dev, sd_base, block_offset,
2282				  reg_offset_shift,
2283				  &cdns_torrent_phy_pma_cmn_cdb_config);
2284	if (IS_ERR(regmap)) {
2285		dev_err(dev, "Failed to init PHY PMA common CDB regmap\n");
2286		return PTR_ERR(regmap);
2287	}
2288	cdns_phy->regmap_phy_pma_common_cdb = regmap;
2289
2290	return 0;
2291}
2292
2293static int cdns_torrent_phy_init(struct phy *phy)
2294{
2295	struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
2296	const struct cdns_torrent_data *init_data = cdns_phy->init_data;
2297	struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
2298	enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate;
2299	struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
2300	struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
2301	enum cdns_torrent_phy_type phy_type = inst->phy_type;
2302	enum cdns_torrent_ssc_mode ssc = inst->ssc_mode;
2303	struct cdns_torrent_vals *phy_pma_cmn_vals;
2304	struct cdns_torrent_vals *pcs_cmn_vals;
2305	struct cdns_reg_pairs *reg_pairs;
2306	struct regmap *regmap;
2307	u32 num_regs;
2308	int i, j;
2309
2310	if (cdns_phy->nsubnodes > 1) {
2311		if (phy_type == TYPE_DP)
2312			return cdns_torrent_dp_multilink_init(cdns_phy, inst, phy);
2313		return 0;
2314	}
2315
2316	/**
2317	 * Spread spectrum generation is not required or supported
2318	 * for SGMII/QSGMII/USXGMII
2319	 */
2320	if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII || phy_type == TYPE_USXGMII)
2321		ssc = NO_SSC;
2322
2323	/* PHY configuration specific registers for single link */
2324	link_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->link_cmn_vals_tbl,
2325						  CLK_ANY, CLK_ANY,
2326						  phy_type, TYPE_NONE,
2327						  ANY_SSC);
2328	if (link_cmn_vals) {
2329		reg_pairs = link_cmn_vals->reg_pairs;
2330		num_regs = link_cmn_vals->num_regs;
2331		regmap = cdns_phy->regmap_common_cdb;
2332
2333		/**
2334		 * First array value in link_cmn_vals must be of
2335		 * PHY_PLL_CFG register
2336		 */
2337		regmap_field_write(cdns_phy->phy_pll_cfg, reg_pairs[0].val);
2338
2339		for (i = 1; i < num_regs; i++)
2340			regmap_write(regmap, reg_pairs[i].off,
2341				     reg_pairs[i].val);
2342	}
2343
2344	xcvr_diag_vals = cdns_torrent_get_tbl_vals(&init_data->xcvr_diag_vals_tbl,
2345						   CLK_ANY, CLK_ANY,
2346						   phy_type, TYPE_NONE,
2347						   ANY_SSC);
2348	if (xcvr_diag_vals) {
2349		reg_pairs = xcvr_diag_vals->reg_pairs;
2350		num_regs = xcvr_diag_vals->num_regs;
2351		for (i = 0; i < inst->num_lanes; i++) {
2352			regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
2353			for (j = 0; j < num_regs; j++)
2354				regmap_write(regmap, reg_pairs[j].off,
2355					     reg_pairs[j].val);
2356		}
2357	}
2358
2359	/* PHY PCS common registers configurations */
2360	pcs_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->pcs_cmn_vals_tbl,
2361						 CLK_ANY, CLK_ANY,
2362						 phy_type, TYPE_NONE,
2363						 ANY_SSC);
2364	if (pcs_cmn_vals) {
2365		reg_pairs = pcs_cmn_vals->reg_pairs;
2366		num_regs = pcs_cmn_vals->num_regs;
2367		regmap = cdns_phy->regmap_phy_pcs_common_cdb;
2368		for (i = 0; i < num_regs; i++)
2369			regmap_write(regmap, reg_pairs[i].off,
2370				     reg_pairs[i].val);
2371	}
2372
2373	/* PHY PMA common registers configurations */
2374	phy_pma_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->phy_pma_cmn_vals_tbl,
2375						     CLK_ANY, CLK_ANY,
2376						     phy_type, TYPE_NONE,
2377						     ANY_SSC);
2378	if (phy_pma_cmn_vals) {
2379		reg_pairs = phy_pma_cmn_vals->reg_pairs;
2380		num_regs = phy_pma_cmn_vals->num_regs;
2381		regmap = cdns_phy->regmap_phy_pma_common_cdb;
2382		for (i = 0; i < num_regs; i++)
2383			regmap_write(regmap, reg_pairs[i].off,
2384				     reg_pairs[i].val);
2385	}
2386
2387	/* PMA common registers configurations */
2388	cmn_vals = cdns_torrent_get_tbl_vals(&init_data->cmn_vals_tbl,
2389					     ref_clk, ref_clk,
2390					     phy_type, TYPE_NONE,
2391					     ssc);
2392	if (cmn_vals) {
2393		reg_pairs = cmn_vals->reg_pairs;
2394		num_regs = cmn_vals->num_regs;
2395		regmap = cdns_phy->regmap_common_cdb;
2396		for (i = 0; i < num_regs; i++)
2397			regmap_write(regmap, reg_pairs[i].off,
2398				     reg_pairs[i].val);
2399	}
2400
2401	/* PMA TX lane registers configurations */
2402	tx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->tx_ln_vals_tbl,
2403					       ref_clk, ref_clk,
2404					       phy_type, TYPE_NONE,
2405					       ssc);
2406	if (tx_ln_vals) {
2407		reg_pairs = tx_ln_vals->reg_pairs;
2408		num_regs = tx_ln_vals->num_regs;
2409		for (i = 0; i < inst->num_lanes; i++) {
2410			regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
2411			for (j = 0; j < num_regs; j++)
2412				regmap_write(regmap, reg_pairs[j].off,
2413					     reg_pairs[j].val);
2414		}
2415	}
2416
2417	/* PMA RX lane registers configurations */
2418	rx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->rx_ln_vals_tbl,
2419					       ref_clk, ref_clk,
2420					       phy_type, TYPE_NONE,
2421					       ssc);
2422	if (rx_ln_vals) {
2423		reg_pairs = rx_ln_vals->reg_pairs;
2424		num_regs = rx_ln_vals->num_regs;
2425		for (i = 0; i < inst->num_lanes; i++) {
2426			regmap = cdns_phy->regmap_rx_lane_cdb[i + inst->mlane];
2427			for (j = 0; j < num_regs; j++)
2428				regmap_write(regmap, reg_pairs[j].off,
2429					     reg_pairs[j].val);
2430		}
2431	}
2432
2433	if (phy_type == TYPE_DP)
2434		return cdns_torrent_dp_init(phy);
2435
2436	return 0;
2437}
2438
2439static const struct phy_ops cdns_torrent_phy_ops = {
2440	.init		= cdns_torrent_phy_init,
2441	.configure	= cdns_torrent_dp_configure,
2442	.power_on	= cdns_torrent_phy_on,
2443	.power_off	= cdns_torrent_phy_off,
2444	.owner		= THIS_MODULE,
2445};
2446
2447static int cdns_torrent_noop_phy_on(struct phy *phy)
2448{
2449	/* Give 5ms to 10ms delay for the PIPE clock to be stable */
2450	usleep_range(5000, 10000);
2451
2452	return 0;
2453}
2454
2455static const struct phy_ops noop_ops = {
2456	.power_on	= cdns_torrent_noop_phy_on,
2457	.owner		= THIS_MODULE,
2458};
2459
2460static
2461int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy *cdns_phy)
2462{
2463	const struct cdns_torrent_data *init_data = cdns_phy->init_data;
2464	struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
2465	enum cdns_torrent_ref_clk ref_clk1 = cdns_phy->ref_clk1_rate;
2466	enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate;
2467	struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
2468	enum cdns_torrent_phy_type phy_t1, phy_t2;
2469	struct cdns_torrent_vals *phy_pma_cmn_vals;
2470	struct cdns_torrent_vals *pcs_cmn_vals;
2471	int i, j, node, mlane, num_lanes, ret;
2472	struct cdns_reg_pairs *reg_pairs;
2473	enum cdns_torrent_ssc_mode ssc;
2474	struct regmap *regmap;
2475	u32 num_regs;
2476
2477	/* Maximum 2 links (subnodes) are supported */
2478	if (cdns_phy->nsubnodes != 2)
2479		return -EINVAL;
2480
2481	phy_t1 = cdns_phy->phys[0].phy_type;
2482	phy_t2 = cdns_phy->phys[1].phy_type;
2483
2484	/**
2485	 * First configure the PHY for first link with phy_t1. Get the array
2486	 * values as [phy_t1][phy_t2][ssc].
2487	 */
2488	for (node = 0; node < cdns_phy->nsubnodes; node++) {
2489		if (node == 1) {
2490			/**
2491			 * If first link with phy_t1 is configured, then
2492			 * configure the PHY for second link with phy_t2.
2493			 * Get the array values as [phy_t2][phy_t1][ssc].
2494			 */
2495			swap(phy_t1, phy_t2);
2496			swap(ref_clk, ref_clk1);
2497		}
2498
2499		mlane = cdns_phy->phys[node].mlane;
2500		ssc = cdns_phy->phys[node].ssc_mode;
2501		num_lanes = cdns_phy->phys[node].num_lanes;
2502
2503		/**
2504		 * PHY configuration specific registers:
2505		 * link_cmn_vals depend on combination of PHY types being
2506		 * configured and are common for both PHY types, so array
2507		 * values should be same for [phy_t1][phy_t2][ssc] and
2508		 * [phy_t2][phy_t1][ssc].
2509		 * xcvr_diag_vals also depend on combination of PHY types
2510		 * being configured, but these can be different for particular
2511		 * PHY type and are per lane.
2512		 */
2513		link_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->link_cmn_vals_tbl,
2514							  CLK_ANY, CLK_ANY,
2515							  phy_t1, phy_t2, ANY_SSC);
2516		if (link_cmn_vals) {
2517			reg_pairs = link_cmn_vals->reg_pairs;
2518			num_regs = link_cmn_vals->num_regs;
2519			regmap = cdns_phy->regmap_common_cdb;
2520
2521			/**
2522			 * First array value in link_cmn_vals must be of
2523			 * PHY_PLL_CFG register
2524			 */
2525			regmap_field_write(cdns_phy->phy_pll_cfg,
2526					   reg_pairs[0].val);
2527
2528			for (i = 1; i < num_regs; i++)
2529				regmap_write(regmap, reg_pairs[i].off,
2530					     reg_pairs[i].val);
2531		}
2532
2533		xcvr_diag_vals = cdns_torrent_get_tbl_vals(&init_data->xcvr_diag_vals_tbl,
2534							   CLK_ANY, CLK_ANY,
2535							   phy_t1, phy_t2, ANY_SSC);
2536		if (xcvr_diag_vals) {
2537			reg_pairs = xcvr_diag_vals->reg_pairs;
2538			num_regs = xcvr_diag_vals->num_regs;
2539			for (i = 0; i < num_lanes; i++) {
2540				regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
2541				for (j = 0; j < num_regs; j++)
2542					regmap_write(regmap, reg_pairs[j].off,
2543						     reg_pairs[j].val);
2544			}
2545		}
2546
2547		/* PHY PCS common registers configurations */
2548		pcs_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->pcs_cmn_vals_tbl,
2549							 CLK_ANY, CLK_ANY,
2550							 phy_t1, phy_t2, ANY_SSC);
2551		if (pcs_cmn_vals) {
2552			reg_pairs = pcs_cmn_vals->reg_pairs;
2553			num_regs = pcs_cmn_vals->num_regs;
2554			regmap = cdns_phy->regmap_phy_pcs_common_cdb;
2555			for (i = 0; i < num_regs; i++)
2556				regmap_write(regmap, reg_pairs[i].off,
2557					     reg_pairs[i].val);
2558		}
2559
2560		/* PHY PMA common registers configurations */
2561		phy_pma_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->phy_pma_cmn_vals_tbl,
2562							     CLK_ANY, CLK_ANY,
2563							     phy_t1, phy_t2, ANY_SSC);
2564		if (phy_pma_cmn_vals) {
2565			reg_pairs = phy_pma_cmn_vals->reg_pairs;
2566			num_regs = phy_pma_cmn_vals->num_regs;
2567			regmap = cdns_phy->regmap_phy_pma_common_cdb;
2568			for (i = 0; i < num_regs; i++)
2569				regmap_write(regmap, reg_pairs[i].off,
2570					     reg_pairs[i].val);
2571		}
2572
2573		/* PMA common registers configurations */
2574		cmn_vals = cdns_torrent_get_tbl_vals(&init_data->cmn_vals_tbl,
2575						     ref_clk, ref_clk1,
2576						     phy_t1, phy_t2, ssc);
2577		if (cmn_vals) {
2578			reg_pairs = cmn_vals->reg_pairs;
2579			num_regs = cmn_vals->num_regs;
2580			regmap = cdns_phy->regmap_common_cdb;
2581			for (i = 0; i < num_regs; i++)
2582				regmap_write(regmap, reg_pairs[i].off,
2583					     reg_pairs[i].val);
2584		}
2585
2586		/* PMA TX lane registers configurations */
2587		tx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->tx_ln_vals_tbl,
2588						       ref_clk, ref_clk1,
2589						       phy_t1, phy_t2, ssc);
2590		if (tx_ln_vals) {
2591			reg_pairs = tx_ln_vals->reg_pairs;
2592			num_regs = tx_ln_vals->num_regs;
2593			for (i = 0; i < num_lanes; i++) {
2594				regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
2595				for (j = 0; j < num_regs; j++)
2596					regmap_write(regmap, reg_pairs[j].off,
2597						     reg_pairs[j].val);
2598			}
2599		}
2600
2601		/* PMA RX lane registers configurations */
2602		rx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->rx_ln_vals_tbl,
2603						       ref_clk, ref_clk1,
2604						       phy_t1, phy_t2, ssc);
2605		if (rx_ln_vals) {
2606			reg_pairs = rx_ln_vals->reg_pairs;
2607			num_regs = rx_ln_vals->num_regs;
2608			for (i = 0; i < num_lanes; i++) {
2609				regmap = cdns_phy->regmap_rx_lane_cdb[i + mlane];
2610				for (j = 0; j < num_regs; j++)
2611					regmap_write(regmap, reg_pairs[j].off,
2612						     reg_pairs[j].val);
2613			}
2614		}
2615
2616		if (phy_t1 == TYPE_DP) {
2617			ret = cdns_torrent_dp_get_pll(cdns_phy, phy_t2);
2618			if (ret)
2619				return ret;
2620		}
2621
2622		reset_control_deassert(cdns_phy->phys[node].lnk_rst);
2623	}
2624
2625	/* Take the PHY out of reset */
2626	ret = reset_control_deassert(cdns_phy->phy_rst);
2627	if (ret)
2628		return ret;
2629
2630	return 0;
2631}
2632
2633static void cdns_torrent_clk_cleanup(struct cdns_torrent_phy *cdns_phy)
2634{
2635	struct device *dev = cdns_phy->dev;
2636
2637	of_clk_del_provider(dev->of_node);
2638}
2639
2640static int cdns_torrent_clk_register(struct cdns_torrent_phy *cdns_phy)
2641{
2642	struct device *dev = cdns_phy->dev;
2643	struct device_node *node = dev->of_node;
2644	struct clk_hw_onecell_data *data;
2645	int ret;
2646
2647	data = devm_kzalloc(dev, struct_size(data, hws, CDNS_TORRENT_OUTPUT_CLOCKS), GFP_KERNEL);
2648	if (!data)
2649		return -ENOMEM;
2650
2651	data->num = CDNS_TORRENT_OUTPUT_CLOCKS;
2652	cdns_phy->clk_hw_data = data;
2653
2654	ret = cdns_torrent_derived_refclk_register(cdns_phy);
2655	if (ret) {
2656		dev_err(dev, "failed to register derived refclk\n");
2657		return ret;
2658	}
2659
2660	ret = cdns_torrent_received_refclk_register(cdns_phy);
2661	if (ret) {
2662		dev_err(dev, "failed to register received refclk\n");
2663		return ret;
2664	}
2665
2666	ret = cdns_torrent_refclk_driver_register(cdns_phy);
2667	if (ret) {
2668		dev_err(dev, "failed to register refclk driver\n");
2669		return ret;
2670	}
2671
2672	ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, data);
2673	if (ret) {
2674		dev_err(dev, "Failed to add clock provider: %s\n", node->name);
2675		return ret;
2676	}
2677
2678	return 0;
2679}
2680
2681static int cdns_torrent_reset(struct cdns_torrent_phy *cdns_phy)
2682{
2683	struct device *dev = cdns_phy->dev;
2684
2685	cdns_phy->phy_rst = devm_reset_control_get_exclusive_by_index(dev, 0);
2686	if (IS_ERR(cdns_phy->phy_rst)) {
2687		dev_err(dev, "%s: failed to get reset\n",
2688			dev->of_node->full_name);
2689		return PTR_ERR(cdns_phy->phy_rst);
2690	}
2691
2692	cdns_phy->apb_rst = devm_reset_control_get_optional_exclusive(dev, "torrent_apb");
2693	if (IS_ERR(cdns_phy->apb_rst)) {
2694		dev_err(dev, "%s: failed to get apb reset\n",
2695			dev->of_node->full_name);
2696		return PTR_ERR(cdns_phy->apb_rst);
2697	}
2698
2699	return 0;
2700}
2701
2702static int cdns_torrent_clk(struct cdns_torrent_phy *cdns_phy)
2703{
2704	struct device *dev = cdns_phy->dev;
2705	unsigned long ref_clk1_rate;
2706	unsigned long ref_clk_rate;
2707	int ret;
2708
2709	/* refclk: Input reference clock for PLL0 */
2710	cdns_phy->clk = devm_clk_get(dev, "refclk");
2711	if (IS_ERR(cdns_phy->clk)) {
2712		dev_err(dev, "phy ref clock not found\n");
2713		return PTR_ERR(cdns_phy->clk);
2714	}
2715
2716	ret = clk_prepare_enable(cdns_phy->clk);
2717	if (ret) {
2718		dev_err(cdns_phy->dev, "Failed to prepare ref clock: %d\n", ret);
2719		return ret;
2720	}
2721
2722	ref_clk_rate = clk_get_rate(cdns_phy->clk);
2723	if (!ref_clk_rate) {
2724		dev_err(cdns_phy->dev, "Failed to get ref clock rate\n");
2725		ret = -EINVAL;
2726		goto disable_clk;
2727	}
2728
2729	switch (ref_clk_rate) {
2730	case REF_CLK_19_2MHZ:
2731		cdns_phy->ref_clk_rate = CLK_19_2_MHZ;
2732		break;
2733	case REF_CLK_25MHZ:
2734		cdns_phy->ref_clk_rate = CLK_25_MHZ;
2735		break;
2736	case REF_CLK_100MHZ:
2737		cdns_phy->ref_clk_rate = CLK_100_MHZ;
2738		break;
2739	case REF_CLK_156_25MHZ:
2740		cdns_phy->ref_clk_rate = CLK_156_25_MHZ;
2741		break;
2742	default:
2743		dev_err(cdns_phy->dev, "Invalid ref clock rate\n");
2744		ret = -EINVAL;
2745		goto disable_clk;
2746	}
2747
2748	/* refclk1: Input reference clock for PLL1 */
2749	cdns_phy->clk1 = devm_clk_get_optional(dev, "pll1_refclk");
2750	if (IS_ERR(cdns_phy->clk1)) {
2751		dev_err(dev, "phy PLL1 ref clock not found\n");
2752		ret = PTR_ERR(cdns_phy->clk1);
2753		goto disable_clk;
2754	}
2755
2756	if (cdns_phy->clk1) {
2757		ret = clk_prepare_enable(cdns_phy->clk1);
2758		if (ret) {
2759			dev_err(cdns_phy->dev, "Failed to prepare PLL1 ref clock: %d\n", ret);
2760			goto disable_clk;
2761		}
2762
2763		ref_clk1_rate = clk_get_rate(cdns_phy->clk1);
2764		if (!ref_clk1_rate) {
2765			dev_err(cdns_phy->dev, "Failed to get PLL1 ref clock rate\n");
2766			ret = -EINVAL;
2767			goto disable_clk1;
2768		}
2769
2770		switch (ref_clk1_rate) {
2771		case REF_CLK_19_2MHZ:
2772			cdns_phy->ref_clk1_rate = CLK_19_2_MHZ;
2773			break;
2774		case REF_CLK_25MHZ:
2775			cdns_phy->ref_clk1_rate = CLK_25_MHZ;
2776			break;
2777		case REF_CLK_100MHZ:
2778			cdns_phy->ref_clk1_rate = CLK_100_MHZ;
2779			break;
2780		case REF_CLK_156_25MHZ:
2781			cdns_phy->ref_clk1_rate = CLK_156_25_MHZ;
2782			break;
2783		default:
2784			dev_err(cdns_phy->dev, "Invalid PLL1 ref clock rate\n");
2785			ret = -EINVAL;
2786			goto disable_clk1;
2787		}
2788	} else {
2789		cdns_phy->ref_clk1_rate = cdns_phy->ref_clk_rate;
2790	}
2791
2792	return 0;
2793
2794disable_clk1:
2795	clk_disable_unprepare(cdns_phy->clk1);
2796disable_clk:
2797	clk_disable_unprepare(cdns_phy->clk);
2798	return ret;
2799}
2800
2801static int cdns_torrent_phy_probe(struct platform_device *pdev)
2802{
2803	struct cdns_torrent_phy *cdns_phy;
2804	struct device *dev = &pdev->dev;
2805	struct phy_provider *phy_provider;
2806	const struct cdns_torrent_data *data;
2807	struct device_node *child;
2808	int ret, subnodes, node = 0, i;
2809	u32 total_num_lanes = 0;
2810	int already_configured;
2811	u8 init_dp_regmap = 0;
2812	u32 phy_type;
2813
2814	/* Get init data for this PHY */
2815	data = of_device_get_match_data(dev);
2816	if (!data)
2817		return -EINVAL;
2818
2819	cdns_phy = devm_kzalloc(dev, sizeof(*cdns_phy), GFP_KERNEL);
2820	if (!cdns_phy)
2821		return -ENOMEM;
2822
2823	dev_set_drvdata(dev, cdns_phy);
2824	cdns_phy->dev = dev;
2825	cdns_phy->init_data = data;
2826
2827	cdns_phy->sd_base = devm_platform_ioremap_resource(pdev, 0);
2828	if (IS_ERR(cdns_phy->sd_base))
2829		return PTR_ERR(cdns_phy->sd_base);
2830
2831	subnodes = of_get_available_child_count(dev->of_node);
2832	if (subnodes == 0) {
2833		dev_err(dev, "No available link subnodes found\n");
2834		return -EINVAL;
2835	}
2836
2837	ret = cdns_torrent_regmap_init(cdns_phy);
2838	if (ret)
2839		return ret;
2840
2841	ret = cdns_torrent_regfield_init(cdns_phy);
2842	if (ret)
2843		return ret;
2844
2845	ret = cdns_torrent_clk_register(cdns_phy);
2846	if (ret)
2847		return ret;
2848
2849	regmap_field_read(cdns_phy->phy_pma_cmn_ctrl_1, &already_configured);
2850
2851	if (!already_configured) {
2852		ret = cdns_torrent_reset(cdns_phy);
2853		if (ret)
2854			goto clk_cleanup;
2855
2856		ret = cdns_torrent_clk(cdns_phy);
2857		if (ret)
2858			goto clk_cleanup;
2859
2860		/* Enable APB */
2861		reset_control_deassert(cdns_phy->apb_rst);
2862	}
2863
2864	for_each_available_child_of_node(dev->of_node, child) {
2865		struct phy *gphy;
2866
2867		/* PHY subnode name must be 'phy'. */
2868		if (!(of_node_name_eq(child, "phy")))
2869			continue;
2870
2871		cdns_phy->phys[node].lnk_rst =
2872				of_reset_control_array_get_exclusive(child);
2873		if (IS_ERR(cdns_phy->phys[node].lnk_rst)) {
2874			dev_err(dev, "%s: failed to get reset\n",
2875				child->full_name);
2876			ret = PTR_ERR(cdns_phy->phys[node].lnk_rst);
2877			goto put_lnk_rst;
2878		}
2879
2880		if (of_property_read_u32(child, "reg",
2881					 &cdns_phy->phys[node].mlane)) {
2882			dev_err(dev, "%s: No \"reg\"-property.\n",
2883				child->full_name);
2884			ret = -EINVAL;
2885			goto put_child;
2886		}
2887
2888		if (of_property_read_u32(child, "cdns,phy-type", &phy_type)) {
2889			dev_err(dev, "%s: No \"cdns,phy-type\"-property.\n",
2890				child->full_name);
2891			ret = -EINVAL;
2892			goto put_child;
2893		}
2894
2895		switch (phy_type) {
2896		case PHY_TYPE_PCIE:
2897			cdns_phy->phys[node].phy_type = TYPE_PCIE;
2898			break;
2899		case PHY_TYPE_DP:
2900			cdns_phy->phys[node].phy_type = TYPE_DP;
2901			break;
2902		case PHY_TYPE_SGMII:
2903			cdns_phy->phys[node].phy_type = TYPE_SGMII;
2904			break;
2905		case PHY_TYPE_QSGMII:
2906			cdns_phy->phys[node].phy_type = TYPE_QSGMII;
2907			break;
2908		case PHY_TYPE_USB3:
2909			cdns_phy->phys[node].phy_type = TYPE_USB;
2910			break;
2911		case PHY_TYPE_USXGMII:
2912			cdns_phy->phys[node].phy_type = TYPE_USXGMII;
2913			break;
2914		default:
2915			dev_err(dev, "Unsupported protocol\n");
2916			ret = -EINVAL;
2917			goto put_child;
2918		}
2919
2920		if (of_property_read_u32(child, "cdns,num-lanes",
2921					 &cdns_phy->phys[node].num_lanes)) {
2922			dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n",
2923				child->full_name);
2924			ret = -EINVAL;
2925			goto put_child;
2926		}
2927
2928		total_num_lanes += cdns_phy->phys[node].num_lanes;
2929
2930		/* Get SSC mode */
2931		cdns_phy->phys[node].ssc_mode = NO_SSC;
2932		of_property_read_u32(child, "cdns,ssc-mode",
2933				     &cdns_phy->phys[node].ssc_mode);
2934
2935		if (!already_configured)
2936			gphy = devm_phy_create(dev, child, &cdns_torrent_phy_ops);
2937		else
2938			gphy = devm_phy_create(dev, child, &noop_ops);
2939		if (IS_ERR(gphy)) {
2940			ret = PTR_ERR(gphy);
2941			goto put_child;
2942		}
2943
2944		if (cdns_phy->phys[node].phy_type == TYPE_DP) {
2945			switch (cdns_phy->phys[node].num_lanes) {
2946			case 1:
2947			case 2:
2948			case 4:
2949			/* valid number of lanes */
2950				break;
2951			default:
2952				dev_err(dev, "unsupported number of lanes: %d\n",
2953					cdns_phy->phys[node].num_lanes);
2954				ret = -EINVAL;
2955				goto put_child;
2956			}
2957
2958			cdns_phy->max_bit_rate = DEFAULT_MAX_BIT_RATE;
2959			of_property_read_u32(child, "cdns,max-bit-rate",
2960					     &cdns_phy->max_bit_rate);
2961
2962			switch (cdns_phy->max_bit_rate) {
2963			case 1620:
2964			case 2160:
2965			case 2430:
2966			case 2700:
2967			case 3240:
2968			case 4320:
2969			case 5400:
2970			case 8100:
2971			/* valid bit rate */
2972				break;
2973			default:
2974				dev_err(dev, "unsupported max bit rate: %dMbps\n",
2975					cdns_phy->max_bit_rate);
2976				ret = -EINVAL;
2977				goto put_child;
2978			}
2979
2980			/* DPTX registers */
2981			cdns_phy->base = devm_platform_ioremap_resource(pdev, 1);
2982			if (IS_ERR(cdns_phy->base)) {
2983				ret = PTR_ERR(cdns_phy->base);
2984				goto put_child;
2985			}
2986
2987			if (!init_dp_regmap) {
2988				ret = cdns_torrent_dp_regmap_init(cdns_phy);
2989				if (ret)
2990					goto put_child;
2991
2992				ret = cdns_torrent_dp_regfield_init(cdns_phy);
2993				if (ret)
2994					goto put_child;
2995
2996				init_dp_regmap++;
2997			}
2998
2999			dev_dbg(dev, "DP max bit rate %d.%03d Gbps\n",
3000				cdns_phy->max_bit_rate / 1000,
3001				cdns_phy->max_bit_rate % 1000);
3002
3003			gphy->attrs.bus_width = cdns_phy->phys[node].num_lanes;
3004			gphy->attrs.max_link_rate = cdns_phy->max_bit_rate;
3005			gphy->attrs.mode = PHY_MODE_DP;
3006		}
3007
3008		cdns_phy->phys[node].phy = gphy;
3009		phy_set_drvdata(gphy, &cdns_phy->phys[node]);
3010
3011		node++;
3012	}
3013	cdns_phy->nsubnodes = node;
3014
3015	if (total_num_lanes > MAX_NUM_LANES) {
3016		dev_err(dev, "Invalid lane configuration\n");
3017		ret = -EINVAL;
3018		goto put_lnk_rst;
3019	}
3020
3021	if (cdns_phy->nsubnodes > 1 && !already_configured) {
3022		ret = cdns_torrent_phy_configure_multilink(cdns_phy);
3023		if (ret)
3024			goto put_lnk_rst;
3025	}
3026
3027	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
3028	if (IS_ERR(phy_provider)) {
3029		ret = PTR_ERR(phy_provider);
3030		goto put_lnk_rst;
3031	}
3032
3033	if (cdns_phy->nsubnodes > 1)
3034		dev_dbg(dev, "Multi-link: %s (%d lanes) & %s (%d lanes)",
3035			cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type),
3036			cdns_phy->phys[0].num_lanes,
3037			cdns_torrent_get_phy_type(cdns_phy->phys[1].phy_type),
3038			cdns_phy->phys[1].num_lanes);
3039	else
3040		dev_dbg(dev, "Single link: %s (%d lanes)",
3041			cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type),
3042			cdns_phy->phys[0].num_lanes);
3043
3044	return 0;
3045
3046put_child:
3047	node++;
3048put_lnk_rst:
3049	for (i = 0; i < node; i++)
3050		reset_control_put(cdns_phy->phys[i].lnk_rst);
3051	of_node_put(child);
3052	reset_control_assert(cdns_phy->apb_rst);
3053	clk_disable_unprepare(cdns_phy->clk1);
3054	clk_disable_unprepare(cdns_phy->clk);
3055clk_cleanup:
3056	cdns_torrent_clk_cleanup(cdns_phy);
3057	return ret;
3058}
3059
3060static void cdns_torrent_phy_remove(struct platform_device *pdev)
3061{
3062	struct cdns_torrent_phy *cdns_phy = platform_get_drvdata(pdev);
3063	int i;
3064
3065	reset_control_assert(cdns_phy->phy_rst);
3066	reset_control_assert(cdns_phy->apb_rst);
3067	for (i = 0; i < cdns_phy->nsubnodes; i++) {
3068		reset_control_assert(cdns_phy->phys[i].lnk_rst);
3069		reset_control_put(cdns_phy->phys[i].lnk_rst);
3070	}
3071
3072	clk_disable_unprepare(cdns_phy->clk1);
3073	clk_disable_unprepare(cdns_phy->clk);
3074	cdns_torrent_clk_cleanup(cdns_phy);
3075}
3076
3077/* USB and DP link configuration */
3078static struct cdns_reg_pairs usb_dp_link_cmn_regs[] = {
3079	{0x0002, PHY_PLL_CFG},
3080	{0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
3081};
3082
3083static struct cdns_reg_pairs usb_dp_xcvr_diag_ln_regs[] = {
3084	{0x0000, XCVR_DIAG_HSCLK_SEL},
3085	{0x0001, XCVR_DIAG_HSCLK_DIV},
3086	{0x0041, XCVR_DIAG_PLLDRC_CTRL}
3087};
3088
3089static struct cdns_reg_pairs dp_usb_xcvr_diag_ln_regs[] = {
3090	{0x0001, XCVR_DIAG_HSCLK_SEL},
3091	{0x0009, XCVR_DIAG_PLLDRC_CTRL}
3092};
3093
3094static struct cdns_torrent_vals usb_dp_link_cmn_vals = {
3095	.reg_pairs = usb_dp_link_cmn_regs,
3096	.num_regs = ARRAY_SIZE(usb_dp_link_cmn_regs),
3097};
3098
3099static struct cdns_torrent_vals usb_dp_xcvr_diag_ln_vals = {
3100	.reg_pairs = usb_dp_xcvr_diag_ln_regs,
3101	.num_regs = ARRAY_SIZE(usb_dp_xcvr_diag_ln_regs),
3102};
3103
3104static struct cdns_torrent_vals dp_usb_xcvr_diag_ln_vals = {
3105	.reg_pairs = dp_usb_xcvr_diag_ln_regs,
3106	.num_regs = ARRAY_SIZE(dp_usb_xcvr_diag_ln_regs),
3107};
3108
3109/* USXGMII and SGMII/QSGMII link configuration */
3110static struct cdns_reg_pairs usxgmii_sgmii_link_cmn_regs[] = {
3111	{0x0002, PHY_PLL_CFG},
3112	{0x0400, CMN_PDIAG_PLL0_CLK_SEL_M0},
3113	{0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
3114};
3115
3116static struct cdns_reg_pairs usxgmii_sgmii_xcvr_diag_ln_regs[] = {
3117	{0x0000, XCVR_DIAG_HSCLK_SEL},
3118	{0x0001, XCVR_DIAG_HSCLK_DIV},
3119	{0x0001, XCVR_DIAG_PLLDRC_CTRL}
3120};
3121
3122static struct cdns_reg_pairs sgmii_usxgmii_xcvr_diag_ln_regs[] = {
3123	{0x0111, XCVR_DIAG_HSCLK_SEL},
3124	{0x0103, XCVR_DIAG_HSCLK_DIV},
3125	{0x0A9B, XCVR_DIAG_PLLDRC_CTRL}
3126};
3127
3128static struct cdns_torrent_vals usxgmii_sgmii_link_cmn_vals = {
3129	.reg_pairs = usxgmii_sgmii_link_cmn_regs,
3130	.num_regs = ARRAY_SIZE(usxgmii_sgmii_link_cmn_regs),
3131};
3132
3133static struct cdns_torrent_vals usxgmii_sgmii_xcvr_diag_ln_vals = {
3134	.reg_pairs = usxgmii_sgmii_xcvr_diag_ln_regs,
3135	.num_regs = ARRAY_SIZE(usxgmii_sgmii_xcvr_diag_ln_regs),
3136};
3137
3138static struct cdns_torrent_vals sgmii_usxgmii_xcvr_diag_ln_vals = {
3139	.reg_pairs = sgmii_usxgmii_xcvr_diag_ln_regs,
3140	.num_regs = ARRAY_SIZE(sgmii_usxgmii_xcvr_diag_ln_regs),
3141};
3142
3143/* Multilink USXGMII, using PLL0, 156.25 MHz Ref clk, no SSC */
3144static struct cdns_reg_pairs ml_usxgmii_pll0_156_25_no_ssc_cmn_regs[] = {
3145	{0x0014, CMN_PLL0_DSM_FBH_OVRD_M0},
3146	{0x0005, CMN_PLL0_DSM_FBL_OVRD_M0},
3147	{0x061B, CMN_PLL0_VCOCAL_INIT_TMR},
3148	{0x0019, CMN_PLL0_VCOCAL_ITER_TMR},
3149	{0x1354, CMN_PLL0_VCOCAL_REFTIM_START},
3150	{0x1354, CMN_PLL0_VCOCAL_PLLCNT_START},
3151	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3152	{0x0138, CMN_PLL0_LOCK_REFCNT_START},
3153	{0x0138, CMN_PLL0_LOCK_PLLCNT_START}
3154};
3155
3156static struct cdns_torrent_vals ml_usxgmii_pll0_156_25_no_ssc_cmn_vals = {
3157	.reg_pairs = ml_usxgmii_pll0_156_25_no_ssc_cmn_regs,
3158	.num_regs = ARRAY_SIZE(ml_usxgmii_pll0_156_25_no_ssc_cmn_regs),
3159};
3160
3161/* Multilink SGMII/QSGMII, using PLL1, 100 MHz Ref clk, no SSC */
3162static struct cdns_reg_pairs ml_sgmii_pll1_100_no_ssc_cmn_regs[] = {
3163	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3164	{0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
3165	{0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
3166	{0x0003, CMN_PLL1_VCOCAL_TCTRL},
3167	{0x007F, CMN_TXPUCAL_TUNE},
3168	{0x007F, CMN_TXPDCAL_TUNE}
3169};
3170
3171static struct cdns_torrent_vals ml_sgmii_pll1_100_no_ssc_cmn_vals = {
3172	.reg_pairs = ml_sgmii_pll1_100_no_ssc_cmn_regs,
3173	.num_regs = ARRAY_SIZE(ml_sgmii_pll1_100_no_ssc_cmn_regs),
3174};
3175
3176/* TI J7200, Multilink USXGMII, using PLL0, 156.25 MHz Ref clk, no SSC */
3177static struct cdns_reg_pairs j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_regs[] = {
3178	{0x0014, CMN_SSM_BIAS_TMR},
3179	{0x0028, CMN_PLLSM0_PLLPRE_TMR},
3180	{0x00A4, CMN_PLLSM0_PLLLOCK_TMR},
3181	{0x0062, CMN_BGCAL_INIT_TMR},
3182	{0x0062, CMN_BGCAL_ITER_TMR},
3183	{0x0014, CMN_IBCAL_INIT_TMR},
3184	{0x0018, CMN_TXPUCAL_INIT_TMR},
3185	{0x0005, CMN_TXPUCAL_ITER_TMR},
3186	{0x0018, CMN_TXPDCAL_INIT_TMR},
3187	{0x0005, CMN_TXPDCAL_ITER_TMR},
3188	{0x024A, CMN_RXCAL_INIT_TMR},
3189	{0x0005, CMN_RXCAL_ITER_TMR},
3190	{0x000B, CMN_SD_CAL_REFTIM_START},
3191	{0x0132, CMN_SD_CAL_PLLCNT_START},
3192	{0x0014, CMN_PLL0_DSM_FBH_OVRD_M0},
3193	{0x0005, CMN_PLL0_DSM_FBL_OVRD_M0},
3194	{0x061B, CMN_PLL0_VCOCAL_INIT_TMR},
3195	{0x0019, CMN_PLL0_VCOCAL_ITER_TMR},
3196	{0x1354, CMN_PLL0_VCOCAL_REFTIM_START},
3197	{0x1354, CMN_PLL0_VCOCAL_PLLCNT_START},
3198	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3199	{0x0138, CMN_PLL0_LOCK_REFCNT_START},
3200	{0x0138, CMN_PLL0_LOCK_PLLCNT_START}
3201};
3202
3203static struct cdns_torrent_vals j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_vals = {
3204	.reg_pairs = j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_regs,
3205	.num_regs = ARRAY_SIZE(j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_regs),
3206};
3207
3208/* TI J7200, Multilink SGMII/QSGMII, using PLL1, 100 MHz Ref clk, no SSC */
3209static struct cdns_reg_pairs j7200_ml_sgmii_pll1_100_no_ssc_cmn_regs[] = {
3210	{0x0028, CMN_PLLSM1_PLLPRE_TMR},
3211	{0x00A4, CMN_PLLSM1_PLLLOCK_TMR},
3212	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3213	{0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
3214	{0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
3215	{0x0003, CMN_PLL1_VCOCAL_TCTRL},
3216	{0x007F, CMN_TXPUCAL_TUNE},
3217	{0x007F, CMN_TXPDCAL_TUNE}
3218};
3219
3220static struct cdns_torrent_vals j7200_ml_sgmii_pll1_100_no_ssc_cmn_vals = {
3221	.reg_pairs = j7200_ml_sgmii_pll1_100_no_ssc_cmn_regs,
3222	.num_regs = ARRAY_SIZE(j7200_ml_sgmii_pll1_100_no_ssc_cmn_regs),
3223};
3224
3225/* PCIe and USXGMII link configuration */
3226static struct cdns_reg_pairs pcie_usxgmii_link_cmn_regs[] = {
3227	{0x0003, PHY_PLL_CFG},
3228	{0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
3229	{0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
3230	{0x0400, CMN_PDIAG_PLL1_CLK_SEL_M0}
3231};
3232
3233static struct cdns_reg_pairs pcie_usxgmii_xcvr_diag_ln_regs[] = {
3234	{0x0000, XCVR_DIAG_HSCLK_SEL},
3235	{0x0001, XCVR_DIAG_HSCLK_DIV},
3236	{0x0012, XCVR_DIAG_PLLDRC_CTRL}
3237};
3238
3239static struct cdns_reg_pairs usxgmii_pcie_xcvr_diag_ln_regs[] = {
3240	{0x0011, XCVR_DIAG_HSCLK_SEL},
3241	{0x0001, XCVR_DIAG_HSCLK_DIV},
3242	{0x0089, XCVR_DIAG_PLLDRC_CTRL}
3243};
3244
3245static struct cdns_torrent_vals pcie_usxgmii_link_cmn_vals = {
3246	.reg_pairs = pcie_usxgmii_link_cmn_regs,
3247	.num_regs = ARRAY_SIZE(pcie_usxgmii_link_cmn_regs),
3248};
3249
3250static struct cdns_torrent_vals pcie_usxgmii_xcvr_diag_ln_vals = {
3251	.reg_pairs = pcie_usxgmii_xcvr_diag_ln_regs,
3252	.num_regs = ARRAY_SIZE(pcie_usxgmii_xcvr_diag_ln_regs),
3253};
3254
3255static struct cdns_torrent_vals usxgmii_pcie_xcvr_diag_ln_vals = {
3256	.reg_pairs = usxgmii_pcie_xcvr_diag_ln_regs,
3257	.num_regs = ARRAY_SIZE(usxgmii_pcie_xcvr_diag_ln_regs),
3258};
3259
3260/*
3261 * Multilink USXGMII, using PLL1, 156.25 MHz Ref clk, no SSC
3262 */
3263static struct cdns_reg_pairs ml_usxgmii_pll1_156_25_no_ssc_cmn_regs[] = {
3264	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3265	{0x0014, CMN_PLL1_DSM_FBH_OVRD_M0},
3266	{0x0005, CMN_PLL1_DSM_FBL_OVRD_M0},
3267	{0x061B, CMN_PLL1_VCOCAL_INIT_TMR},
3268	{0x0019, CMN_PLL1_VCOCAL_ITER_TMR},
3269	{0x1354, CMN_PLL1_VCOCAL_REFTIM_START},
3270	{0x1354, CMN_PLL1_VCOCAL_PLLCNT_START},
3271	{0x0003, CMN_PLL1_VCOCAL_TCTRL},
3272	{0x0138, CMN_PLL1_LOCK_REFCNT_START},
3273	{0x0138, CMN_PLL1_LOCK_PLLCNT_START},
3274	{0x007F, CMN_TXPUCAL_TUNE},
3275	{0x007F, CMN_TXPDCAL_TUNE}
3276};
3277
3278static struct cdns_reg_pairs ml_usxgmii_156_25_no_ssc_tx_ln_regs[] = {
3279	{0x00F3, TX_PSC_A0},
3280	{0x04A2, TX_PSC_A2},
3281	{0x04A2, TX_PSC_A3 },
3282	{0x0000, TX_TXCC_CPOST_MULT_00},
3283	{0x0000, XCVR_DIAG_PSC_OVRD}
3284};
3285
3286static struct cdns_reg_pairs ml_usxgmii_156_25_no_ssc_rx_ln_regs[] = {
3287	{0x091D, RX_PSC_A0},
3288	{0x0900, RX_PSC_A2},
3289	{0x0100, RX_PSC_A3},
3290	{0x0030, RX_REE_SMGM_CTRL1},
3291	{0x03C7, RX_REE_GCSM1_EQENM_PH1},
3292	{0x01C7, RX_REE_GCSM1_EQENM_PH2},
3293	{0x0000, RX_DIAG_DFE_CTRL},
3294	{0x0019, RX_REE_TAP1_CLIP},
3295	{0x0019, RX_REE_TAP2TON_CLIP},
3296	{0x00B9, RX_DIAG_NQST_CTRL},
3297	{0x0C21, RX_DIAG_DFE_AMP_TUNE_2},
3298	{0x0002, RX_DIAG_DFE_AMP_TUNE_3},
3299	{0x0033, RX_DIAG_PI_RATE},
3300	{0x0001, RX_DIAG_ACYA},
3301	{0x018C, RX_CDRLF_CNFG}
3302};
3303
3304static struct cdns_torrent_vals ml_usxgmii_pll1_156_25_no_ssc_cmn_vals = {
3305	.reg_pairs = ml_usxgmii_pll1_156_25_no_ssc_cmn_regs,
3306	.num_regs = ARRAY_SIZE(ml_usxgmii_pll1_156_25_no_ssc_cmn_regs),
3307};
3308
3309static struct cdns_torrent_vals ml_usxgmii_156_25_no_ssc_tx_ln_vals = {
3310	.reg_pairs = ml_usxgmii_156_25_no_ssc_tx_ln_regs,
3311	.num_regs = ARRAY_SIZE(ml_usxgmii_156_25_no_ssc_tx_ln_regs),
3312};
3313
3314static struct cdns_torrent_vals ml_usxgmii_156_25_no_ssc_rx_ln_vals = {
3315	.reg_pairs = ml_usxgmii_156_25_no_ssc_rx_ln_regs,
3316	.num_regs = ARRAY_SIZE(ml_usxgmii_156_25_no_ssc_rx_ln_regs),
3317};
3318
3319/* TI USXGMII configuration: Enable cmn_refclk_rcv_out_en */
3320static struct cdns_reg_pairs ti_usxgmii_phy_pma_cmn_regs[] = {
3321	{0x0040, PHY_PMA_CMN_CTRL1},
3322};
3323
3324static struct cdns_torrent_vals ti_usxgmii_phy_pma_cmn_vals = {
3325	.reg_pairs = ti_usxgmii_phy_pma_cmn_regs,
3326	.num_regs = ARRAY_SIZE(ti_usxgmii_phy_pma_cmn_regs),
3327};
3328
3329/* Single USXGMII link configuration */
3330static struct cdns_reg_pairs sl_usxgmii_link_cmn_regs[] = {
3331	{0x0000, PHY_PLL_CFG},
3332	{0x0400, CMN_PDIAG_PLL0_CLK_SEL_M0}
3333};
3334
3335static struct cdns_reg_pairs sl_usxgmii_xcvr_diag_ln_regs[] = {
3336	{0x0000, XCVR_DIAG_HSCLK_SEL},
3337	{0x0001, XCVR_DIAG_HSCLK_DIV},
3338	{0x0001, XCVR_DIAG_PLLDRC_CTRL}
3339};
3340
3341static struct cdns_torrent_vals sl_usxgmii_link_cmn_vals = {
3342	.reg_pairs = sl_usxgmii_link_cmn_regs,
3343	.num_regs = ARRAY_SIZE(sl_usxgmii_link_cmn_regs),
3344};
3345
3346static struct cdns_torrent_vals sl_usxgmii_xcvr_diag_ln_vals = {
3347	.reg_pairs = sl_usxgmii_xcvr_diag_ln_regs,
3348	.num_regs = ARRAY_SIZE(sl_usxgmii_xcvr_diag_ln_regs),
3349};
3350
3351/* Single link USXGMII, 156.25 MHz Ref clk, no SSC */
3352static struct cdns_reg_pairs sl_usxgmii_156_25_no_ssc_cmn_regs[] = {
3353	{0x0014, CMN_SSM_BIAS_TMR},
3354	{0x0028, CMN_PLLSM0_PLLPRE_TMR},
3355	{0x00A4, CMN_PLLSM0_PLLLOCK_TMR},
3356	{0x0028, CMN_PLLSM1_PLLPRE_TMR},
3357	{0x00A4, CMN_PLLSM1_PLLLOCK_TMR},
3358	{0x0062, CMN_BGCAL_INIT_TMR},
3359	{0x0062, CMN_BGCAL_ITER_TMR},
3360	{0x0014, CMN_IBCAL_INIT_TMR},
3361	{0x0018, CMN_TXPUCAL_INIT_TMR},
3362	{0x0005, CMN_TXPUCAL_ITER_TMR},
3363	{0x0018, CMN_TXPDCAL_INIT_TMR},
3364	{0x0005, CMN_TXPDCAL_ITER_TMR},
3365	{0x024A, CMN_RXCAL_INIT_TMR},
3366	{0x0005, CMN_RXCAL_ITER_TMR},
3367	{0x000B, CMN_SD_CAL_REFTIM_START},
3368	{0x0132, CMN_SD_CAL_PLLCNT_START},
3369	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3370	{0x0014, CMN_PLL0_DSM_FBH_OVRD_M0},
3371	{0x0014, CMN_PLL1_DSM_FBH_OVRD_M0},
3372	{0x0005, CMN_PLL0_DSM_FBL_OVRD_M0},
3373	{0x0005, CMN_PLL1_DSM_FBL_OVRD_M0},
3374	{0x061B, CMN_PLL0_VCOCAL_INIT_TMR},
3375	{0x061B, CMN_PLL1_VCOCAL_INIT_TMR},
3376	{0x0019, CMN_PLL0_VCOCAL_ITER_TMR},
3377	{0x0019, CMN_PLL1_VCOCAL_ITER_TMR},
3378	{0x1354, CMN_PLL0_VCOCAL_REFTIM_START},
3379	{0x1354, CMN_PLL1_VCOCAL_REFTIM_START},
3380	{0x1354, CMN_PLL0_VCOCAL_PLLCNT_START},
3381	{0x1354, CMN_PLL1_VCOCAL_PLLCNT_START},
3382	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3383	{0x0003, CMN_PLL1_VCOCAL_TCTRL},
3384	{0x0138, CMN_PLL0_LOCK_REFCNT_START},
3385	{0x0138, CMN_PLL1_LOCK_REFCNT_START},
3386	{0x0138, CMN_PLL0_LOCK_PLLCNT_START},
3387	{0x0138, CMN_PLL1_LOCK_PLLCNT_START}
3388};
3389
3390static struct cdns_reg_pairs usxgmii_156_25_no_ssc_tx_ln_regs[] = {
3391	{0x07A2, TX_RCVDET_ST_TMR},
3392	{0x00F3, TX_PSC_A0},
3393	{0x04A2, TX_PSC_A2},
3394	{0x04A2, TX_PSC_A3},
3395	{0x0000, TX_TXCC_CPOST_MULT_00},
3396	{0x0000, XCVR_DIAG_PSC_OVRD}
3397};
3398
3399static struct cdns_reg_pairs usxgmii_156_25_no_ssc_rx_ln_regs[] = {
3400	{0x0014, RX_SDCAL0_INIT_TMR},
3401	{0x0062, RX_SDCAL0_ITER_TMR},
3402	{0x0014, RX_SDCAL1_INIT_TMR},
3403	{0x0062, RX_SDCAL1_ITER_TMR},
3404	{0x091D, RX_PSC_A0},
3405	{0x0900, RX_PSC_A2},
3406	{0x0100, RX_PSC_A3},
3407	{0x0030, RX_REE_SMGM_CTRL1},
3408	{0x03C7, RX_REE_GCSM1_EQENM_PH1},
3409	{0x01C7, RX_REE_GCSM1_EQENM_PH2},
3410	{0x0000, RX_DIAG_DFE_CTRL},
3411	{0x0019, RX_REE_TAP1_CLIP},
3412	{0x0019, RX_REE_TAP2TON_CLIP},
3413	{0x00B9, RX_DIAG_NQST_CTRL},
3414	{0x0C21, RX_DIAG_DFE_AMP_TUNE_2},
3415	{0x0002, RX_DIAG_DFE_AMP_TUNE_3},
3416	{0x0033, RX_DIAG_PI_RATE},
3417	{0x0001, RX_DIAG_ACYA},
3418	{0x018C, RX_CDRLF_CNFG}
3419};
3420
3421static struct cdns_torrent_vals sl_usxgmii_156_25_no_ssc_cmn_vals = {
3422	.reg_pairs = sl_usxgmii_156_25_no_ssc_cmn_regs,
3423	.num_regs = ARRAY_SIZE(sl_usxgmii_156_25_no_ssc_cmn_regs),
3424};
3425
3426static struct cdns_torrent_vals usxgmii_156_25_no_ssc_tx_ln_vals = {
3427	.reg_pairs = usxgmii_156_25_no_ssc_tx_ln_regs,
3428	.num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_tx_ln_regs),
3429};
3430
3431static struct cdns_torrent_vals usxgmii_156_25_no_ssc_rx_ln_vals = {
3432	.reg_pairs = usxgmii_156_25_no_ssc_rx_ln_regs,
3433	.num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_rx_ln_regs),
3434};
3435
3436/* PCIe and DP link configuration */
3437static struct cdns_reg_pairs pcie_dp_link_cmn_regs[] = {
3438	{0x0003, PHY_PLL_CFG},
3439	{0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
3440	{0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1}
3441};
3442
3443static struct cdns_reg_pairs pcie_dp_xcvr_diag_ln_regs[] = {
3444	{0x0000, XCVR_DIAG_HSCLK_SEL},
3445	{0x0001, XCVR_DIAG_HSCLK_DIV},
3446	{0x0012, XCVR_DIAG_PLLDRC_CTRL}
3447};
3448
3449static struct cdns_reg_pairs dp_pcie_xcvr_diag_ln_regs[] = {
3450	{0x0001, XCVR_DIAG_HSCLK_SEL},
3451	{0x0009, XCVR_DIAG_PLLDRC_CTRL}
3452};
3453
3454static struct cdns_torrent_vals pcie_dp_link_cmn_vals = {
3455	.reg_pairs = pcie_dp_link_cmn_regs,
3456	.num_regs = ARRAY_SIZE(pcie_dp_link_cmn_regs),
3457};
3458
3459static struct cdns_torrent_vals pcie_dp_xcvr_diag_ln_vals = {
3460	.reg_pairs = pcie_dp_xcvr_diag_ln_regs,
3461	.num_regs = ARRAY_SIZE(pcie_dp_xcvr_diag_ln_regs),
3462};
3463
3464static struct cdns_torrent_vals dp_pcie_xcvr_diag_ln_vals = {
3465	.reg_pairs = dp_pcie_xcvr_diag_ln_regs,
3466	.num_regs = ARRAY_SIZE(dp_pcie_xcvr_diag_ln_regs),
3467};
3468
3469/* DP Multilink, 100 MHz Ref clk, no SSC */
3470static struct cdns_reg_pairs dp_100_no_ssc_cmn_regs[] = {
3471	{0x007F, CMN_TXPUCAL_TUNE},
3472	{0x007F, CMN_TXPDCAL_TUNE}
3473};
3474
3475static struct cdns_reg_pairs dp_100_no_ssc_tx_ln_regs[] = {
3476	{0x00FB, TX_PSC_A0},
3477	{0x04AA, TX_PSC_A2},
3478	{0x04AA, TX_PSC_A3},
3479	{0x000F, XCVR_DIAG_BIDI_CTRL}
3480};
3481
3482static struct cdns_reg_pairs dp_100_no_ssc_rx_ln_regs[] = {
3483	{0x0000, RX_PSC_A0},
3484	{0x0000, RX_PSC_A2},
3485	{0x0000, RX_PSC_A3},
3486	{0x0000, RX_PSC_CAL},
3487	{0x0000, RX_REE_GCSM1_CTRL},
3488	{0x0000, RX_REE_GCSM2_CTRL},
3489	{0x0000, RX_REE_PERGCSM_CTRL}
3490};
3491
3492static struct cdns_torrent_vals dp_100_no_ssc_cmn_vals = {
3493	.reg_pairs = dp_100_no_ssc_cmn_regs,
3494	.num_regs = ARRAY_SIZE(dp_100_no_ssc_cmn_regs),
3495};
3496
3497static struct cdns_torrent_vals dp_100_no_ssc_tx_ln_vals = {
3498	.reg_pairs = dp_100_no_ssc_tx_ln_regs,
3499	.num_regs = ARRAY_SIZE(dp_100_no_ssc_tx_ln_regs),
3500};
3501
3502static struct cdns_torrent_vals dp_100_no_ssc_rx_ln_vals = {
3503	.reg_pairs = dp_100_no_ssc_rx_ln_regs,
3504	.num_regs = ARRAY_SIZE(dp_100_no_ssc_rx_ln_regs),
3505};
3506
3507/* Single DisplayPort(DP) link configuration */
3508static struct cdns_reg_pairs sl_dp_link_cmn_regs[] = {
3509	{0x0000, PHY_PLL_CFG},
3510};
3511
3512static struct cdns_reg_pairs sl_dp_xcvr_diag_ln_regs[] = {
3513	{0x0000, XCVR_DIAG_HSCLK_SEL},
3514	{0x0001, XCVR_DIAG_PLLDRC_CTRL}
3515};
3516
3517static struct cdns_torrent_vals sl_dp_link_cmn_vals = {
3518	.reg_pairs = sl_dp_link_cmn_regs,
3519	.num_regs = ARRAY_SIZE(sl_dp_link_cmn_regs),
3520};
3521
3522static struct cdns_torrent_vals sl_dp_xcvr_diag_ln_vals = {
3523	.reg_pairs = sl_dp_xcvr_diag_ln_regs,
3524	.num_regs = ARRAY_SIZE(sl_dp_xcvr_diag_ln_regs),
3525};
3526
3527/* Single DP, 19.2 MHz Ref clk, no SSC */
3528static struct cdns_reg_pairs sl_dp_19_2_no_ssc_cmn_regs[] = {
3529	{0x0014, CMN_SSM_BIAS_TMR},
3530	{0x0027, CMN_PLLSM0_PLLPRE_TMR},
3531	{0x00A1, CMN_PLLSM0_PLLLOCK_TMR},
3532	{0x0027, CMN_PLLSM1_PLLPRE_TMR},
3533	{0x00A1, CMN_PLLSM1_PLLLOCK_TMR},
3534	{0x0060, CMN_BGCAL_INIT_TMR},
3535	{0x0060, CMN_BGCAL_ITER_TMR},
3536	{0x0014, CMN_IBCAL_INIT_TMR},
3537	{0x0018, CMN_TXPUCAL_INIT_TMR},
3538	{0x0005, CMN_TXPUCAL_ITER_TMR},
3539	{0x0018, CMN_TXPDCAL_INIT_TMR},
3540	{0x0005, CMN_TXPDCAL_ITER_TMR},
3541	{0x0240, CMN_RXCAL_INIT_TMR},
3542	{0x0005, CMN_RXCAL_ITER_TMR},
3543	{0x0002, CMN_SD_CAL_INIT_TMR},
3544	{0x0002, CMN_SD_CAL_ITER_TMR},
3545	{0x000B, CMN_SD_CAL_REFTIM_START},
3546	{0x0137, CMN_SD_CAL_PLLCNT_START},
3547	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3548	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3549	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3550	{0x0004, CMN_PLL0_DSM_DIAG_M0},
3551	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3552	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3553	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3554	{0x0004, CMN_PLL1_DSM_DIAG_M0},
3555	{0x00C0, CMN_PLL0_VCOCAL_INIT_TMR},
3556	{0x0004, CMN_PLL0_VCOCAL_ITER_TMR},
3557	{0x00C0, CMN_PLL1_VCOCAL_INIT_TMR},
3558	{0x0004, CMN_PLL1_VCOCAL_ITER_TMR},
3559	{0x0260, CMN_PLL0_VCOCAL_REFTIM_START},
3560	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3561	{0x0260, CMN_PLL1_VCOCAL_REFTIM_START},
3562	{0x0003, CMN_PLL1_VCOCAL_TCTRL}
3563};
3564
3565static struct cdns_reg_pairs sl_dp_19_2_no_ssc_tx_ln_regs[] = {
3566	{0x0780, TX_RCVDET_ST_TMR},
3567	{0x00FB, TX_PSC_A0},
3568	{0x04AA, TX_PSC_A2},
3569	{0x04AA, TX_PSC_A3},
3570	{0x000F, XCVR_DIAG_BIDI_CTRL}
3571};
3572
3573static struct cdns_reg_pairs sl_dp_19_2_no_ssc_rx_ln_regs[] = {
3574	{0x0000, RX_PSC_A0},
3575	{0x0000, RX_PSC_A2},
3576	{0x0000, RX_PSC_A3},
3577	{0x0000, RX_PSC_CAL},
3578	{0x0000, RX_REE_GCSM1_CTRL},
3579	{0x0000, RX_REE_GCSM2_CTRL},
3580	{0x0000, RX_REE_PERGCSM_CTRL}
3581};
3582
3583static struct cdns_torrent_vals sl_dp_19_2_no_ssc_cmn_vals = {
3584	.reg_pairs = sl_dp_19_2_no_ssc_cmn_regs,
3585	.num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_cmn_regs),
3586};
3587
3588static struct cdns_torrent_vals sl_dp_19_2_no_ssc_tx_ln_vals = {
3589	.reg_pairs = sl_dp_19_2_no_ssc_tx_ln_regs,
3590	.num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_tx_ln_regs),
3591};
3592
3593static struct cdns_torrent_vals sl_dp_19_2_no_ssc_rx_ln_vals = {
3594	.reg_pairs = sl_dp_19_2_no_ssc_rx_ln_regs,
3595	.num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_rx_ln_regs),
3596};
3597
3598/* Single DP, 25 MHz Ref clk, no SSC */
3599static struct cdns_reg_pairs sl_dp_25_no_ssc_cmn_regs[] = {
3600	{0x0019, CMN_SSM_BIAS_TMR},
3601	{0x0032, CMN_PLLSM0_PLLPRE_TMR},
3602	{0x00D1, CMN_PLLSM0_PLLLOCK_TMR},
3603	{0x0032, CMN_PLLSM1_PLLPRE_TMR},
3604	{0x00D1, CMN_PLLSM1_PLLLOCK_TMR},
3605	{0x007D, CMN_BGCAL_INIT_TMR},
3606	{0x007D, CMN_BGCAL_ITER_TMR},
3607	{0x0019, CMN_IBCAL_INIT_TMR},
3608	{0x001E, CMN_TXPUCAL_INIT_TMR},
3609	{0x0006, CMN_TXPUCAL_ITER_TMR},
3610	{0x001E, CMN_TXPDCAL_INIT_TMR},
3611	{0x0006, CMN_TXPDCAL_ITER_TMR},
3612	{0x02EE, CMN_RXCAL_INIT_TMR},
3613	{0x0006, CMN_RXCAL_ITER_TMR},
3614	{0x0002, CMN_SD_CAL_INIT_TMR},
3615	{0x0002, CMN_SD_CAL_ITER_TMR},
3616	{0x000E, CMN_SD_CAL_REFTIM_START},
3617	{0x012B, CMN_SD_CAL_PLLCNT_START},
3618	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3619	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3620	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3621	{0x0004, CMN_PLL0_DSM_DIAG_M0},
3622	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3623	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3624	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3625	{0x0004, CMN_PLL1_DSM_DIAG_M0},
3626	{0x00FA, CMN_PLL0_VCOCAL_INIT_TMR},
3627	{0x0004, CMN_PLL0_VCOCAL_ITER_TMR},
3628	{0x00FA, CMN_PLL1_VCOCAL_INIT_TMR},
3629	{0x0004, CMN_PLL1_VCOCAL_ITER_TMR},
3630	{0x0317, CMN_PLL0_VCOCAL_REFTIM_START},
3631	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3632	{0x0317, CMN_PLL1_VCOCAL_REFTIM_START},
3633	{0x0003, CMN_PLL1_VCOCAL_TCTRL}
3634};
3635
3636static struct cdns_reg_pairs sl_dp_25_no_ssc_tx_ln_regs[] = {
3637	{0x09C4, TX_RCVDET_ST_TMR},
3638	{0x00FB, TX_PSC_A0},
3639	{0x04AA, TX_PSC_A2},
3640	{0x04AA, TX_PSC_A3},
3641	{0x000F, XCVR_DIAG_BIDI_CTRL}
3642};
3643
3644static struct cdns_reg_pairs sl_dp_25_no_ssc_rx_ln_regs[] = {
3645	{0x0000, RX_PSC_A0},
3646	{0x0000, RX_PSC_A2},
3647	{0x0000, RX_PSC_A3},
3648	{0x0000, RX_PSC_CAL},
3649	{0x0000, RX_REE_GCSM1_CTRL},
3650	{0x0000, RX_REE_GCSM2_CTRL},
3651	{0x0000, RX_REE_PERGCSM_CTRL}
3652};
3653
3654static struct cdns_torrent_vals sl_dp_25_no_ssc_cmn_vals = {
3655	.reg_pairs = sl_dp_25_no_ssc_cmn_regs,
3656	.num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_cmn_regs),
3657};
3658
3659static struct cdns_torrent_vals sl_dp_25_no_ssc_tx_ln_vals = {
3660	.reg_pairs = sl_dp_25_no_ssc_tx_ln_regs,
3661	.num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_tx_ln_regs),
3662};
3663
3664static struct cdns_torrent_vals sl_dp_25_no_ssc_rx_ln_vals = {
3665	.reg_pairs = sl_dp_25_no_ssc_rx_ln_regs,
3666	.num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_rx_ln_regs),
3667};
3668
3669/* Single DP, 100 MHz Ref clk, no SSC */
3670static struct cdns_reg_pairs sl_dp_100_no_ssc_cmn_regs[] = {
3671	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3672	{0x0003, CMN_PLL1_VCOCAL_TCTRL}
3673};
3674
3675static struct cdns_reg_pairs sl_dp_100_no_ssc_tx_ln_regs[] = {
3676	{0x00FB, TX_PSC_A0},
3677	{0x04AA, TX_PSC_A2},
3678	{0x04AA, TX_PSC_A3},
3679	{0x000F, XCVR_DIAG_BIDI_CTRL}
3680};
3681
3682static struct cdns_reg_pairs sl_dp_100_no_ssc_rx_ln_regs[] = {
3683	{0x0000, RX_PSC_A0},
3684	{0x0000, RX_PSC_A2},
3685	{0x0000, RX_PSC_A3},
3686	{0x0000, RX_PSC_CAL},
3687	{0x0000, RX_REE_GCSM1_CTRL},
3688	{0x0000, RX_REE_GCSM2_CTRL},
3689	{0x0000, RX_REE_PERGCSM_CTRL}
3690};
3691
3692static struct cdns_torrent_vals sl_dp_100_no_ssc_cmn_vals = {
3693	.reg_pairs = sl_dp_100_no_ssc_cmn_regs,
3694	.num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_cmn_regs),
3695};
3696
3697static struct cdns_torrent_vals sl_dp_100_no_ssc_tx_ln_vals = {
3698	.reg_pairs = sl_dp_100_no_ssc_tx_ln_regs,
3699	.num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_tx_ln_regs),
3700};
3701
3702static struct cdns_torrent_vals sl_dp_100_no_ssc_rx_ln_vals = {
3703	.reg_pairs = sl_dp_100_no_ssc_rx_ln_regs,
3704	.num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_rx_ln_regs),
3705};
3706
3707/* USB and SGMII/QSGMII link configuration */
3708static struct cdns_reg_pairs usb_sgmii_link_cmn_regs[] = {
3709	{0x0002, PHY_PLL_CFG},
3710	{0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0},
3711	{0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
3712};
3713
3714static struct cdns_reg_pairs usb_sgmii_xcvr_diag_ln_regs[] = {
3715	{0x0000, XCVR_DIAG_HSCLK_SEL},
3716	{0x0001, XCVR_DIAG_HSCLK_DIV},
3717	{0x0041, XCVR_DIAG_PLLDRC_CTRL}
3718};
3719
3720static struct cdns_reg_pairs sgmii_usb_xcvr_diag_ln_regs[] = {
3721	{0x0011, XCVR_DIAG_HSCLK_SEL},
3722	{0x0003, XCVR_DIAG_HSCLK_DIV},
3723	{0x009B, XCVR_DIAG_PLLDRC_CTRL}
3724};
3725
3726static struct cdns_torrent_vals usb_sgmii_link_cmn_vals = {
3727	.reg_pairs = usb_sgmii_link_cmn_regs,
3728	.num_regs = ARRAY_SIZE(usb_sgmii_link_cmn_regs),
3729};
3730
3731static struct cdns_torrent_vals usb_sgmii_xcvr_diag_ln_vals = {
3732	.reg_pairs = usb_sgmii_xcvr_diag_ln_regs,
3733	.num_regs = ARRAY_SIZE(usb_sgmii_xcvr_diag_ln_regs),
3734};
3735
3736static struct cdns_torrent_vals sgmii_usb_xcvr_diag_ln_vals = {
3737	.reg_pairs = sgmii_usb_xcvr_diag_ln_regs,
3738	.num_regs = ARRAY_SIZE(sgmii_usb_xcvr_diag_ln_regs),
3739};
3740
3741/* PCIe and USB Unique SSC link configuration */
3742static struct cdns_reg_pairs pcie_usb_link_cmn_regs[] = {
3743	{0x0003, PHY_PLL_CFG},
3744	{0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
3745	{0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
3746	{0x8600, CMN_PDIAG_PLL1_CLK_SEL_M0}
3747};
3748
3749static struct cdns_reg_pairs pcie_usb_xcvr_diag_ln_regs[] = {
3750	{0x0000, XCVR_DIAG_HSCLK_SEL},
3751	{0x0001, XCVR_DIAG_HSCLK_DIV},
3752	{0x0012, XCVR_DIAG_PLLDRC_CTRL}
3753};
3754
3755static struct cdns_reg_pairs usb_pcie_xcvr_diag_ln_regs[] = {
3756	{0x0011, XCVR_DIAG_HSCLK_SEL},
3757	{0x0001, XCVR_DIAG_HSCLK_DIV},
3758	{0x00C9, XCVR_DIAG_PLLDRC_CTRL}
3759};
3760
3761static struct cdns_torrent_vals pcie_usb_link_cmn_vals = {
3762	.reg_pairs = pcie_usb_link_cmn_regs,
3763	.num_regs = ARRAY_SIZE(pcie_usb_link_cmn_regs),
3764};
3765
3766static struct cdns_torrent_vals pcie_usb_xcvr_diag_ln_vals = {
3767	.reg_pairs = pcie_usb_xcvr_diag_ln_regs,
3768	.num_regs = ARRAY_SIZE(pcie_usb_xcvr_diag_ln_regs),
3769};
3770
3771static struct cdns_torrent_vals usb_pcie_xcvr_diag_ln_vals = {
3772	.reg_pairs = usb_pcie_xcvr_diag_ln_regs,
3773	.num_regs = ARRAY_SIZE(usb_pcie_xcvr_diag_ln_regs),
3774};
3775
3776/* USB 100 MHz Ref clk, internal SSC */
3777static struct cdns_reg_pairs usb_100_int_ssc_cmn_regs[] = {
3778	{0x0004, CMN_PLL0_DSM_DIAG_M0},
3779	{0x0004, CMN_PLL0_DSM_DIAG_M1},
3780	{0x0004, CMN_PLL1_DSM_DIAG_M0},
3781	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3782	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
3783	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3784	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3785	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
3786	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3787	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3788	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
3789	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3790	{0x0064, CMN_PLL0_INTDIV_M0},
3791	{0x0050, CMN_PLL0_INTDIV_M1},
3792	{0x0064, CMN_PLL1_INTDIV_M0},
3793	{0x0002, CMN_PLL0_FRACDIVH_M0},
3794	{0x0002, CMN_PLL0_FRACDIVH_M1},
3795	{0x0002, CMN_PLL1_FRACDIVH_M0},
3796	{0x0044, CMN_PLL0_HIGH_THR_M0},
3797	{0x0036, CMN_PLL0_HIGH_THR_M1},
3798	{0x0044, CMN_PLL1_HIGH_THR_M0},
3799	{0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3800	{0x0002, CMN_PDIAG_PLL0_CTRL_M1},
3801	{0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3802	{0x0001, CMN_PLL0_SS_CTRL1_M0},
3803	{0x0001, CMN_PLL0_SS_CTRL1_M1},
3804	{0x0001, CMN_PLL1_SS_CTRL1_M0},
3805	{0x011B, CMN_PLL0_SS_CTRL2_M0},
3806	{0x011B, CMN_PLL0_SS_CTRL2_M1},
3807	{0x011B, CMN_PLL1_SS_CTRL2_M0},
3808	{0x006E, CMN_PLL0_SS_CTRL3_M0},
3809	{0x0058, CMN_PLL0_SS_CTRL3_M1},
3810	{0x006E, CMN_PLL1_SS_CTRL3_M0},
3811	{0x000E, CMN_PLL0_SS_CTRL4_M0},
3812	{0x0012, CMN_PLL0_SS_CTRL4_M1},
3813	{0x000E, CMN_PLL1_SS_CTRL4_M0},
3814	{0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3815	{0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3816	{0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3817	{0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3818	{0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3819	{0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3820	{0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3821	{0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3822	{0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3823	{0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
3824	{0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3825	{0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
3826	{0x007F, CMN_TXPUCAL_TUNE},
3827	{0x007F, CMN_TXPDCAL_TUNE}
3828};
3829
3830static struct cdns_torrent_vals usb_100_int_ssc_cmn_vals = {
3831	.reg_pairs = usb_100_int_ssc_cmn_regs,
3832	.num_regs = ARRAY_SIZE(usb_100_int_ssc_cmn_regs),
3833};
3834
3835/* Single USB link configuration */
3836static struct cdns_reg_pairs sl_usb_link_cmn_regs[] = {
3837	{0x0000, PHY_PLL_CFG},
3838	{0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
3839};
3840
3841static struct cdns_reg_pairs sl_usb_xcvr_diag_ln_regs[] = {
3842	{0x0000, XCVR_DIAG_HSCLK_SEL},
3843	{0x0001, XCVR_DIAG_HSCLK_DIV},
3844	{0x0041, XCVR_DIAG_PLLDRC_CTRL}
3845};
3846
3847static struct cdns_torrent_vals sl_usb_link_cmn_vals = {
3848	.reg_pairs = sl_usb_link_cmn_regs,
3849	.num_regs = ARRAY_SIZE(sl_usb_link_cmn_regs),
3850};
3851
3852static struct cdns_torrent_vals sl_usb_xcvr_diag_ln_vals = {
3853	.reg_pairs = sl_usb_xcvr_diag_ln_regs,
3854	.num_regs = ARRAY_SIZE(sl_usb_xcvr_diag_ln_regs),
3855};
3856
3857/* USB PHY PCS common configuration */
3858static struct cdns_reg_pairs usb_phy_pcs_cmn_regs[] = {
3859	{0x0A0A, PHY_PIPE_USB3_GEN2_PRE_CFG0},
3860	{0x1000, PHY_PIPE_USB3_GEN2_POST_CFG0},
3861	{0x0010, PHY_PIPE_USB3_GEN2_POST_CFG1}
3862};
3863
3864static struct cdns_torrent_vals usb_phy_pcs_cmn_vals = {
3865	.reg_pairs = usb_phy_pcs_cmn_regs,
3866	.num_regs = ARRAY_SIZE(usb_phy_pcs_cmn_regs),
3867};
3868
3869/* USB 100 MHz Ref clk, no SSC */
3870static struct cdns_reg_pairs sl_usb_100_no_ssc_cmn_regs[] = {
3871	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3872	{0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
3873	{0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
3874	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3875	{0x0003, CMN_PLL1_VCOCAL_TCTRL},
3876	{0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3877	{0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
3878};
3879
3880static struct cdns_torrent_vals sl_usb_100_no_ssc_cmn_vals = {
3881	.reg_pairs = sl_usb_100_no_ssc_cmn_regs,
3882	.num_regs = ARRAY_SIZE(sl_usb_100_no_ssc_cmn_regs),
3883};
3884
3885static struct cdns_reg_pairs usb_100_no_ssc_cmn_regs[] = {
3886	{0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3887	{0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
3888	{0x007F, CMN_TXPUCAL_TUNE},
3889	{0x007F, CMN_TXPDCAL_TUNE}
3890};
3891
3892static struct cdns_reg_pairs usb_100_no_ssc_tx_ln_regs[] = {
3893	{0x02FF, TX_PSC_A0},
3894	{0x06AF, TX_PSC_A1},
3895	{0x06AE, TX_PSC_A2},
3896	{0x06AE, TX_PSC_A3},
3897	{0x2A82, TX_TXCC_CTRL},
3898	{0x0014, TX_TXCC_CPOST_MULT_01},
3899	{0x0003, XCVR_DIAG_PSC_OVRD}
3900};
3901
3902static struct cdns_reg_pairs usb_100_no_ssc_rx_ln_regs[] = {
3903	{0x0D1D, RX_PSC_A0},
3904	{0x0D1D, RX_PSC_A1},
3905	{0x0D00, RX_PSC_A2},
3906	{0x0500, RX_PSC_A3},
3907	{0x0013, RX_SIGDET_HL_FILT_TMR},
3908	{0x0000, RX_REE_GCSM1_CTRL},
3909	{0x0C02, RX_REE_ATTEN_THR},
3910	{0x0330, RX_REE_SMGM_CTRL1},
3911	{0x0300, RX_REE_SMGM_CTRL2},
3912	{0x0019, RX_REE_TAP1_CLIP},
3913	{0x0019, RX_REE_TAP2TON_CLIP},
3914	{0x1004, RX_DIAG_SIGDET_TUNE},
3915	{0x00F9, RX_DIAG_NQST_CTRL},
3916	{0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
3917	{0x0002, RX_DIAG_DFE_AMP_TUNE_3},
3918	{0x0000, RX_DIAG_PI_CAP},
3919	{0x0031, RX_DIAG_PI_RATE},
3920	{0x0001, RX_DIAG_ACYA},
3921	{0x018C, RX_CDRLF_CNFG},
3922	{0x0003, RX_CDRLF_CNFG3}
3923};
3924
3925static struct cdns_torrent_vals usb_100_no_ssc_cmn_vals = {
3926	.reg_pairs = usb_100_no_ssc_cmn_regs,
3927	.num_regs = ARRAY_SIZE(usb_100_no_ssc_cmn_regs),
3928};
3929
3930static struct cdns_torrent_vals usb_100_no_ssc_tx_ln_vals = {
3931	.reg_pairs = usb_100_no_ssc_tx_ln_regs,
3932	.num_regs = ARRAY_SIZE(usb_100_no_ssc_tx_ln_regs),
3933};
3934
3935static struct cdns_torrent_vals usb_100_no_ssc_rx_ln_vals = {
3936	.reg_pairs = usb_100_no_ssc_rx_ln_regs,
3937	.num_regs = ARRAY_SIZE(usb_100_no_ssc_rx_ln_regs),
3938};
3939
3940/* Single link USB, 100 MHz Ref clk, internal SSC */
3941static struct cdns_reg_pairs sl_usb_100_int_ssc_cmn_regs[] = {
3942	{0x0004, CMN_PLL0_DSM_DIAG_M0},
3943	{0x0004, CMN_PLL1_DSM_DIAG_M0},
3944	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3945	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3946	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3947	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3948	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3949	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3950	{0x0064, CMN_PLL0_INTDIV_M0},
3951	{0x0064, CMN_PLL1_INTDIV_M0},
3952	{0x0002, CMN_PLL0_FRACDIVH_M0},
3953	{0x0002, CMN_PLL1_FRACDIVH_M0},
3954	{0x0044, CMN_PLL0_HIGH_THR_M0},
3955	{0x0044, CMN_PLL1_HIGH_THR_M0},
3956	{0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3957	{0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3958	{0x0001, CMN_PLL0_SS_CTRL1_M0},
3959	{0x0001, CMN_PLL1_SS_CTRL1_M0},
3960	{0x011B, CMN_PLL0_SS_CTRL2_M0},
3961	{0x011B, CMN_PLL1_SS_CTRL2_M0},
3962	{0x006E, CMN_PLL0_SS_CTRL3_M0},
3963	{0x006E, CMN_PLL1_SS_CTRL3_M0},
3964	{0x000E, CMN_PLL0_SS_CTRL4_M0},
3965	{0x000E, CMN_PLL1_SS_CTRL4_M0},
3966	{0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3967	{0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3968	{0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3969	{0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3970	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
3971	{0x0003, CMN_PLL1_VCOCAL_TCTRL},
3972	{0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3973	{0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3974	{0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3975	{0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3976	{0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3977	{0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
3978	{0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3979	{0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
3980};
3981
3982static struct cdns_torrent_vals sl_usb_100_int_ssc_cmn_vals = {
3983	.reg_pairs = sl_usb_100_int_ssc_cmn_regs,
3984	.num_regs = ARRAY_SIZE(sl_usb_100_int_ssc_cmn_regs),
3985};
3986
3987/* PCIe and SGMII/QSGMII Unique SSC link configuration */
3988static struct cdns_reg_pairs pcie_sgmii_link_cmn_regs[] = {
3989	{0x0003, PHY_PLL_CFG},
3990	{0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
3991	{0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
3992	{0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
3993};
3994
3995static struct cdns_reg_pairs pcie_sgmii_xcvr_diag_ln_regs[] = {
3996	{0x0000, XCVR_DIAG_HSCLK_SEL},
3997	{0x0001, XCVR_DIAG_HSCLK_DIV},
3998	{0x0012, XCVR_DIAG_PLLDRC_CTRL}
3999};
4000
4001static struct cdns_reg_pairs sgmii_pcie_xcvr_diag_ln_regs[] = {
4002	{0x0011, XCVR_DIAG_HSCLK_SEL},
4003	{0x0003, XCVR_DIAG_HSCLK_DIV},
4004	{0x009B, XCVR_DIAG_PLLDRC_CTRL}
4005};
4006
4007static struct cdns_torrent_vals pcie_sgmii_link_cmn_vals = {
4008	.reg_pairs = pcie_sgmii_link_cmn_regs,
4009	.num_regs = ARRAY_SIZE(pcie_sgmii_link_cmn_regs),
4010};
4011
4012static struct cdns_torrent_vals pcie_sgmii_xcvr_diag_ln_vals = {
4013	.reg_pairs = pcie_sgmii_xcvr_diag_ln_regs,
4014	.num_regs = ARRAY_SIZE(pcie_sgmii_xcvr_diag_ln_regs),
4015};
4016
4017static struct cdns_torrent_vals sgmii_pcie_xcvr_diag_ln_vals = {
4018	.reg_pairs = sgmii_pcie_xcvr_diag_ln_regs,
4019	.num_regs = ARRAY_SIZE(sgmii_pcie_xcvr_diag_ln_regs),
4020};
4021
4022/* SGMII 100 MHz Ref clk, no SSC */
4023static struct cdns_reg_pairs sl_sgmii_100_no_ssc_cmn_regs[] = {
4024	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
4025	{0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
4026	{0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
4027	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
4028	{0x0003, CMN_PLL1_VCOCAL_TCTRL}
4029};
4030
4031static struct cdns_torrent_vals sl_sgmii_100_no_ssc_cmn_vals = {
4032	.reg_pairs = sl_sgmii_100_no_ssc_cmn_regs,
4033	.num_regs = ARRAY_SIZE(sl_sgmii_100_no_ssc_cmn_regs),
4034};
4035
4036static struct cdns_reg_pairs sgmii_100_no_ssc_cmn_regs[] = {
4037	{0x007F, CMN_TXPUCAL_TUNE},
4038	{0x007F, CMN_TXPDCAL_TUNE}
4039};
4040
4041static struct cdns_reg_pairs sgmii_100_no_ssc_tx_ln_regs[] = {
4042	{0x00F3, TX_PSC_A0},
4043	{0x04A2, TX_PSC_A2},
4044	{0x04A2, TX_PSC_A3},
4045	{0x0000, TX_TXCC_CPOST_MULT_00},
4046	{0x00B3, DRV_DIAG_TX_DRV}
4047};
4048
4049static struct cdns_reg_pairs ti_sgmii_100_no_ssc_tx_ln_regs[] = {
4050	{0x00F3, TX_PSC_A0},
4051	{0x04A2, TX_PSC_A2},
4052	{0x04A2, TX_PSC_A3},
4053	{0x0000, TX_TXCC_CPOST_MULT_00},
4054	{0x00B3, DRV_DIAG_TX_DRV},
4055	{0x4000, XCVR_DIAG_RXCLK_CTRL},
4056};
4057
4058static struct cdns_reg_pairs sgmii_100_no_ssc_rx_ln_regs[] = {
4059	{0x091D, RX_PSC_A0},
4060	{0x0900, RX_PSC_A2},
4061	{0x0100, RX_PSC_A3},
4062	{0x03C7, RX_REE_GCSM1_EQENM_PH1},
4063	{0x01C7, RX_REE_GCSM1_EQENM_PH2},
4064	{0x0000, RX_DIAG_DFE_CTRL},
4065	{0x0019, RX_REE_TAP1_CLIP},
4066	{0x0019, RX_REE_TAP2TON_CLIP},
4067	{0x0098, RX_DIAG_NQST_CTRL},
4068	{0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
4069	{0x0000, RX_DIAG_DFE_AMP_TUNE_3},
4070	{0x0000, RX_DIAG_PI_CAP},
4071	{0x0010, RX_DIAG_PI_RATE},
4072	{0x0001, RX_DIAG_ACYA},
4073	{0x018C, RX_CDRLF_CNFG},
4074};
4075
4076static struct cdns_torrent_vals sgmii_100_no_ssc_cmn_vals = {
4077	.reg_pairs = sgmii_100_no_ssc_cmn_regs,
4078	.num_regs = ARRAY_SIZE(sgmii_100_no_ssc_cmn_regs),
4079};
4080
4081static struct cdns_torrent_vals sgmii_100_no_ssc_tx_ln_vals = {
4082	.reg_pairs = sgmii_100_no_ssc_tx_ln_regs,
4083	.num_regs = ARRAY_SIZE(sgmii_100_no_ssc_tx_ln_regs),
4084};
4085
4086static struct cdns_torrent_vals ti_sgmii_100_no_ssc_tx_ln_vals = {
4087	.reg_pairs = ti_sgmii_100_no_ssc_tx_ln_regs,
4088	.num_regs = ARRAY_SIZE(ti_sgmii_100_no_ssc_tx_ln_regs),
4089};
4090
4091static struct cdns_torrent_vals sgmii_100_no_ssc_rx_ln_vals = {
4092	.reg_pairs = sgmii_100_no_ssc_rx_ln_regs,
4093	.num_regs = ARRAY_SIZE(sgmii_100_no_ssc_rx_ln_regs),
4094};
4095
4096/* TI J7200, multilink SGMII */
4097static struct cdns_reg_pairs j7200_sgmii_100_no_ssc_tx_ln_regs[] = {
4098	{0x07A2, TX_RCVDET_ST_TMR},
4099	{0x00F3, TX_PSC_A0},
4100	{0x04A2, TX_PSC_A2},
4101	{0x04A2, TX_PSC_A3 },
4102	{0x0000, TX_TXCC_CPOST_MULT_00},
4103	{0x00B3, DRV_DIAG_TX_DRV},
4104	{0x0002, XCVR_DIAG_PSC_OVRD},
4105	{0x4000, XCVR_DIAG_RXCLK_CTRL}
4106};
4107
4108static struct cdns_torrent_vals j7200_sgmii_100_no_ssc_tx_ln_vals = {
4109	.reg_pairs = j7200_sgmii_100_no_ssc_tx_ln_regs,
4110	.num_regs = ARRAY_SIZE(j7200_sgmii_100_no_ssc_tx_ln_regs),
4111};
4112
4113static struct cdns_reg_pairs j7200_sgmii_100_no_ssc_rx_ln_regs[] = {
4114	{0x0014, RX_SDCAL0_INIT_TMR},
4115	{0x0062, RX_SDCAL0_ITER_TMR},
4116	{0x0014, RX_SDCAL1_INIT_TMR},
4117	{0x0062, RX_SDCAL1_ITER_TMR},
4118	{0x091D, RX_PSC_A0},
4119	{0x0900, RX_PSC_A2},
4120	{0x0100, RX_PSC_A3},
4121	{0x03C7, RX_REE_GCSM1_EQENM_PH1},
4122	{0x01C7, RX_REE_GCSM1_EQENM_PH2},
4123	{0x0000, RX_DIAG_DFE_CTRL},
4124	{0x0019, RX_REE_TAP1_CLIP},
4125	{0x0019, RX_REE_TAP2TON_CLIP},
4126	{0x0098, RX_DIAG_NQST_CTRL},
4127	{0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
4128	{0x0000, RX_DIAG_DFE_AMP_TUNE_3},
4129	{0x0000, RX_DIAG_PI_CAP},
4130	{0x0010, RX_DIAG_PI_RATE},
4131	{0x0001, RX_DIAG_ACYA},
4132	{0x018C, RX_CDRLF_CNFG}
4133};
4134
4135static struct cdns_torrent_vals j7200_sgmii_100_no_ssc_rx_ln_vals = {
4136	.reg_pairs = j7200_sgmii_100_no_ssc_rx_ln_regs,
4137	.num_regs = ARRAY_SIZE(j7200_sgmii_100_no_ssc_rx_ln_regs),
4138};
4139
4140/* SGMII 100 MHz Ref clk, internal SSC */
4141static struct cdns_reg_pairs sgmii_100_int_ssc_cmn_regs[] = {
4142	{0x0004, CMN_PLL0_DSM_DIAG_M0},
4143	{0x0004, CMN_PLL0_DSM_DIAG_M1},
4144	{0x0004, CMN_PLL1_DSM_DIAG_M0},
4145	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
4146	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
4147	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
4148	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
4149	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
4150	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
4151	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
4152	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
4153	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
4154	{0x0064, CMN_PLL0_INTDIV_M0},
4155	{0x0050, CMN_PLL0_INTDIV_M1},
4156	{0x0064, CMN_PLL1_INTDIV_M0},
4157	{0x0002, CMN_PLL0_FRACDIVH_M0},
4158	{0x0002, CMN_PLL0_FRACDIVH_M1},
4159	{0x0002, CMN_PLL1_FRACDIVH_M0},
4160	{0x0044, CMN_PLL0_HIGH_THR_M0},
4161	{0x0036, CMN_PLL0_HIGH_THR_M1},
4162	{0x0044, CMN_PLL1_HIGH_THR_M0},
4163	{0x0002, CMN_PDIAG_PLL0_CTRL_M0},
4164	{0x0002, CMN_PDIAG_PLL0_CTRL_M1},
4165	{0x0002, CMN_PDIAG_PLL1_CTRL_M0},
4166	{0x0001, CMN_PLL0_SS_CTRL1_M0},
4167	{0x0001, CMN_PLL0_SS_CTRL1_M1},
4168	{0x0001, CMN_PLL1_SS_CTRL1_M0},
4169	{0x011B, CMN_PLL0_SS_CTRL2_M0},
4170	{0x011B, CMN_PLL0_SS_CTRL2_M1},
4171	{0x011B, CMN_PLL1_SS_CTRL2_M0},
4172	{0x006E, CMN_PLL0_SS_CTRL3_M0},
4173	{0x0058, CMN_PLL0_SS_CTRL3_M1},
4174	{0x006E, CMN_PLL1_SS_CTRL3_M0},
4175	{0x000E, CMN_PLL0_SS_CTRL4_M0},
4176	{0x0012, CMN_PLL0_SS_CTRL4_M1},
4177	{0x000E, CMN_PLL1_SS_CTRL4_M0},
4178	{0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
4179	{0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
4180	{0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
4181	{0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
4182	{0x00C7, CMN_PLL0_LOCK_REFCNT_START},
4183	{0x00C7, CMN_PLL1_LOCK_REFCNT_START},
4184	{0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
4185	{0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
4186	{0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
4187	{0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
4188	{0x007F, CMN_TXPUCAL_TUNE},
4189	{0x007F, CMN_TXPDCAL_TUNE}
4190};
4191
4192static struct cdns_torrent_vals sgmii_100_int_ssc_cmn_vals = {
4193	.reg_pairs = sgmii_100_int_ssc_cmn_regs,
4194	.num_regs = ARRAY_SIZE(sgmii_100_int_ssc_cmn_regs),
4195};
4196
4197/* QSGMII 100 MHz Ref clk, no SSC */
4198static struct cdns_reg_pairs sl_qsgmii_100_no_ssc_cmn_regs[] = {
4199	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
4200	{0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
4201	{0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
4202	{0x0003, CMN_PLL0_VCOCAL_TCTRL},
4203	{0x0003, CMN_PLL1_VCOCAL_TCTRL}
4204};
4205
4206static struct cdns_torrent_vals sl_qsgmii_100_no_ssc_cmn_vals = {
4207	.reg_pairs = sl_qsgmii_100_no_ssc_cmn_regs,
4208	.num_regs = ARRAY_SIZE(sl_qsgmii_100_no_ssc_cmn_regs),
4209};
4210
4211static struct cdns_reg_pairs qsgmii_100_no_ssc_cmn_regs[] = {
4212	{0x007F, CMN_TXPUCAL_TUNE},
4213	{0x007F, CMN_TXPDCAL_TUNE}
4214};
4215
4216static struct cdns_reg_pairs qsgmii_100_no_ssc_tx_ln_regs[] = {
4217	{0x00F3, TX_PSC_A0},
4218	{0x04A2, TX_PSC_A2},
4219	{0x04A2, TX_PSC_A3},
4220	{0x0000, TX_TXCC_CPOST_MULT_00},
4221	{0x0011, TX_TXCC_MGNFS_MULT_100},
4222	{0x0003, DRV_DIAG_TX_DRV}
4223};
4224
4225static struct cdns_reg_pairs ti_qsgmii_100_no_ssc_tx_ln_regs[] = {
4226	{0x00F3, TX_PSC_A0},
4227	{0x04A2, TX_PSC_A2},
4228	{0x04A2, TX_PSC_A3},
4229	{0x0000, TX_TXCC_CPOST_MULT_00},
4230	{0x0011, TX_TXCC_MGNFS_MULT_100},
4231	{0x0003, DRV_DIAG_TX_DRV},
4232	{0x4000, XCVR_DIAG_RXCLK_CTRL},
4233};
4234
4235static struct cdns_reg_pairs qsgmii_100_no_ssc_rx_ln_regs[] = {
4236	{0x091D, RX_PSC_A0},
4237	{0x0900, RX_PSC_A2},
4238	{0x0100, RX_PSC_A3},
4239	{0x03C7, RX_REE_GCSM1_EQENM_PH1},
4240	{0x01C7, RX_REE_GCSM1_EQENM_PH2},
4241	{0x0000, RX_DIAG_DFE_CTRL},
4242	{0x0019, RX_REE_TAP1_CLIP},
4243	{0x0019, RX_REE_TAP2TON_CLIP},
4244	{0x0098, RX_DIAG_NQST_CTRL},
4245	{0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
4246	{0x0000, RX_DIAG_DFE_AMP_TUNE_3},
4247	{0x0000, RX_DIAG_PI_CAP},
4248	{0x0010, RX_DIAG_PI_RATE},
4249	{0x0001, RX_DIAG_ACYA},
4250	{0x018C, RX_CDRLF_CNFG},
4251};
4252
4253static struct cdns_torrent_vals qsgmii_100_no_ssc_cmn_vals = {
4254	.reg_pairs = qsgmii_100_no_ssc_cmn_regs,
4255	.num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_cmn_regs),
4256};
4257
4258static struct cdns_torrent_vals qsgmii_100_no_ssc_tx_ln_vals = {
4259	.reg_pairs = qsgmii_100_no_ssc_tx_ln_regs,
4260	.num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_tx_ln_regs),
4261};
4262
4263static struct cdns_torrent_vals ti_qsgmii_100_no_ssc_tx_ln_vals = {
4264	.reg_pairs = ti_qsgmii_100_no_ssc_tx_ln_regs,
4265	.num_regs = ARRAY_SIZE(ti_qsgmii_100_no_ssc_tx_ln_regs),
4266};
4267
4268static struct cdns_torrent_vals qsgmii_100_no_ssc_rx_ln_vals = {
4269	.reg_pairs = qsgmii_100_no_ssc_rx_ln_regs,
4270	.num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_rx_ln_regs),
4271};
4272
4273/* TI J7200, multilink QSGMII */
4274static struct cdns_reg_pairs j7200_qsgmii_100_no_ssc_tx_ln_regs[] = {
4275	{0x07A2, TX_RCVDET_ST_TMR},
4276	{0x00F3, TX_PSC_A0},
4277	{0x04A2, TX_PSC_A2},
4278	{0x04A2, TX_PSC_A3 },
4279	{0x0000, TX_TXCC_CPOST_MULT_00},
4280	{0x0011, TX_TXCC_MGNFS_MULT_100},
4281	{0x0003, DRV_DIAG_TX_DRV},
4282	{0x0002, XCVR_DIAG_PSC_OVRD},
4283	{0x4000, XCVR_DIAG_RXCLK_CTRL}
4284};
4285
4286static struct cdns_torrent_vals j7200_qsgmii_100_no_ssc_tx_ln_vals = {
4287	.reg_pairs = j7200_qsgmii_100_no_ssc_tx_ln_regs,
4288	.num_regs = ARRAY_SIZE(j7200_qsgmii_100_no_ssc_tx_ln_regs),
4289};
4290
4291static struct cdns_reg_pairs j7200_qsgmii_100_no_ssc_rx_ln_regs[] = {
4292	{0x0014, RX_SDCAL0_INIT_TMR},
4293	{0x0062, RX_SDCAL0_ITER_TMR},
4294	{0x0014, RX_SDCAL1_INIT_TMR},
4295	{0x0062, RX_SDCAL1_ITER_TMR},
4296	{0x091D, RX_PSC_A0},
4297	{0x0900, RX_PSC_A2},
4298	{0x0100, RX_PSC_A3},
4299	{0x03C7, RX_REE_GCSM1_EQENM_PH1},
4300	{0x01C7, RX_REE_GCSM1_EQENM_PH2},
4301	{0x0000, RX_DIAG_DFE_CTRL},
4302	{0x0019, RX_REE_TAP1_CLIP},
4303	{0x0019, RX_REE_TAP2TON_CLIP},
4304	{0x0098, RX_DIAG_NQST_CTRL},
4305	{0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
4306	{0x0000, RX_DIAG_DFE_AMP_TUNE_3},
4307	{0x0000, RX_DIAG_PI_CAP},
4308	{0x0010, RX_DIAG_PI_RATE},
4309	{0x0001, RX_DIAG_ACYA},
4310	{0x018C, RX_CDRLF_CNFG}
4311};
4312
4313static struct cdns_torrent_vals j7200_qsgmii_100_no_ssc_rx_ln_vals = {
4314	.reg_pairs = j7200_qsgmii_100_no_ssc_rx_ln_regs,
4315	.num_regs = ARRAY_SIZE(j7200_qsgmii_100_no_ssc_rx_ln_regs),
4316};
4317
4318/* QSGMII 100 MHz Ref clk, internal SSC */
4319static struct cdns_reg_pairs qsgmii_100_int_ssc_cmn_regs[] = {
4320	{0x0004, CMN_PLL0_DSM_DIAG_M0},
4321	{0x0004, CMN_PLL0_DSM_DIAG_M1},
4322	{0x0004, CMN_PLL1_DSM_DIAG_M0},
4323	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
4324	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
4325	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
4326	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
4327	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
4328	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
4329	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
4330	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
4331	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
4332	{0x0064, CMN_PLL0_INTDIV_M0},
4333	{0x0050, CMN_PLL0_INTDIV_M1},
4334	{0x0064, CMN_PLL1_INTDIV_M0},
4335	{0x0002, CMN_PLL0_FRACDIVH_M0},
4336	{0x0002, CMN_PLL0_FRACDIVH_M1},
4337	{0x0002, CMN_PLL1_FRACDIVH_M0},
4338	{0x0044, CMN_PLL0_HIGH_THR_M0},
4339	{0x0036, CMN_PLL0_HIGH_THR_M1},
4340	{0x0044, CMN_PLL1_HIGH_THR_M0},
4341	{0x0002, CMN_PDIAG_PLL0_CTRL_M0},
4342	{0x0002, CMN_PDIAG_PLL0_CTRL_M1},
4343	{0x0002, CMN_PDIAG_PLL1_CTRL_M0},
4344	{0x0001, CMN_PLL0_SS_CTRL1_M0},
4345	{0x0001, CMN_PLL0_SS_CTRL1_M1},
4346	{0x0001, CMN_PLL1_SS_CTRL1_M0},
4347	{0x011B, CMN_PLL0_SS_CTRL2_M0},
4348	{0x011B, CMN_PLL0_SS_CTRL2_M1},
4349	{0x011B, CMN_PLL1_SS_CTRL2_M0},
4350	{0x006E, CMN_PLL0_SS_CTRL3_M0},
4351	{0x0058, CMN_PLL0_SS_CTRL3_M1},
4352	{0x006E, CMN_PLL1_SS_CTRL3_M0},
4353	{0x000E, CMN_PLL0_SS_CTRL4_M0},
4354	{0x0012, CMN_PLL0_SS_CTRL4_M1},
4355	{0x000E, CMN_PLL1_SS_CTRL4_M0},
4356	{0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
4357	{0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
4358	{0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
4359	{0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
4360	{0x00C7, CMN_PLL0_LOCK_REFCNT_START},
4361	{0x00C7, CMN_PLL1_LOCK_REFCNT_START},
4362	{0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
4363	{0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
4364	{0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
4365	{0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
4366	{0x007F, CMN_TXPUCAL_TUNE},
4367	{0x007F, CMN_TXPDCAL_TUNE}
4368};
4369
4370static struct cdns_torrent_vals qsgmii_100_int_ssc_cmn_vals = {
4371	.reg_pairs = qsgmii_100_int_ssc_cmn_regs,
4372	.num_regs = ARRAY_SIZE(qsgmii_100_int_ssc_cmn_regs),
4373};
4374
4375/* Single SGMII/QSGMII link configuration */
4376static struct cdns_reg_pairs sl_sgmii_link_cmn_regs[] = {
4377	{0x0000, PHY_PLL_CFG},
4378	{0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}
4379};
4380
4381static struct cdns_reg_pairs sl_sgmii_xcvr_diag_ln_regs[] = {
4382	{0x0000, XCVR_DIAG_HSCLK_SEL},
4383	{0x0003, XCVR_DIAG_HSCLK_DIV},
4384	{0x0013, XCVR_DIAG_PLLDRC_CTRL}
4385};
4386
4387static struct cdns_torrent_vals sl_sgmii_link_cmn_vals = {
4388	.reg_pairs = sl_sgmii_link_cmn_regs,
4389	.num_regs = ARRAY_SIZE(sl_sgmii_link_cmn_regs),
4390};
4391
4392static struct cdns_torrent_vals sl_sgmii_xcvr_diag_ln_vals = {
4393	.reg_pairs = sl_sgmii_xcvr_diag_ln_regs,
4394	.num_regs = ARRAY_SIZE(sl_sgmii_xcvr_diag_ln_regs),
4395};
4396
4397/* Multi link PCIe, 100 MHz Ref clk, internal SSC */
4398static struct cdns_reg_pairs pcie_100_int_ssc_cmn_regs[] = {
4399	{0x0004, CMN_PLL0_DSM_DIAG_M0},
4400	{0x0004, CMN_PLL0_DSM_DIAG_M1},
4401	{0x0004, CMN_PLL1_DSM_DIAG_M0},
4402	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
4403	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
4404	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
4405	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
4406	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
4407	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
4408	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
4409	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
4410	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
4411	{0x0064, CMN_PLL0_INTDIV_M0},
4412	{0x0050, CMN_PLL0_INTDIV_M1},
4413	{0x0064, CMN_PLL1_INTDIV_M0},
4414	{0x0002, CMN_PLL0_FRACDIVH_M0},
4415	{0x0002, CMN_PLL0_FRACDIVH_M1},
4416	{0x0002, CMN_PLL1_FRACDIVH_M0},
4417	{0x0044, CMN_PLL0_HIGH_THR_M0},
4418	{0x0036, CMN_PLL0_HIGH_THR_M1},
4419	{0x0044, CMN_PLL1_HIGH_THR_M0},
4420	{0x0002, CMN_PDIAG_PLL0_CTRL_M0},
4421	{0x0002, CMN_PDIAG_PLL0_CTRL_M1},
4422	{0x0002, CMN_PDIAG_PLL1_CTRL_M0},
4423	{0x0001, CMN_PLL0_SS_CTRL1_M0},
4424	{0x0001, CMN_PLL0_SS_CTRL1_M1},
4425	{0x0001, CMN_PLL1_SS_CTRL1_M0},
4426	{0x011B, CMN_PLL0_SS_CTRL2_M0},
4427	{0x011B, CMN_PLL0_SS_CTRL2_M1},
4428	{0x011B, CMN_PLL1_SS_CTRL2_M0},
4429	{0x006E, CMN_PLL0_SS_CTRL3_M0},
4430	{0x0058, CMN_PLL0_SS_CTRL3_M1},
4431	{0x006E, CMN_PLL1_SS_CTRL3_M0},
4432	{0x000E, CMN_PLL0_SS_CTRL4_M0},
4433	{0x0012, CMN_PLL0_SS_CTRL4_M1},
4434	{0x000E, CMN_PLL1_SS_CTRL4_M0},
4435	{0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
4436	{0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
4437	{0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
4438	{0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
4439	{0x00C7, CMN_PLL0_LOCK_REFCNT_START},
4440	{0x00C7, CMN_PLL1_LOCK_REFCNT_START},
4441	{0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
4442	{0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
4443	{0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
4444	{0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
4445};
4446
4447static struct cdns_torrent_vals pcie_100_int_ssc_cmn_vals = {
4448	.reg_pairs = pcie_100_int_ssc_cmn_regs,
4449	.num_regs = ARRAY_SIZE(pcie_100_int_ssc_cmn_regs),
4450};
4451
4452/* Single link PCIe, 100 MHz Ref clk, internal SSC */
4453static struct cdns_reg_pairs sl_pcie_100_int_ssc_cmn_regs[] = {
4454	{0x0004, CMN_PLL0_DSM_DIAG_M0},
4455	{0x0004, CMN_PLL0_DSM_DIAG_M1},
4456	{0x0004, CMN_PLL1_DSM_DIAG_M0},
4457	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
4458	{0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
4459	{0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
4460	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
4461	{0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
4462	{0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
4463	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
4464	{0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
4465	{0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
4466	{0x0064, CMN_PLL0_INTDIV_M0},
4467	{0x0050, CMN_PLL0_INTDIV_M1},
4468	{0x0050, CMN_PLL1_INTDIV_M0},
4469	{0x0002, CMN_PLL0_FRACDIVH_M0},
4470	{0x0002, CMN_PLL0_FRACDIVH_M1},
4471	{0x0002, CMN_PLL1_FRACDIVH_M0},
4472	{0x0044, CMN_PLL0_HIGH_THR_M0},
4473	{0x0036, CMN_PLL0_HIGH_THR_M1},
4474	{0x0036, CMN_PLL1_HIGH_THR_M0},
4475	{0x0002, CMN_PDIAG_PLL0_CTRL_M0},
4476	{0x0002, CMN_PDIAG_PLL0_CTRL_M1},
4477	{0x0002, CMN_PDIAG_PLL1_CTRL_M0},
4478	{0x0001, CMN_PLL0_SS_CTRL1_M0},
4479	{0x0001, CMN_PLL0_SS_CTRL1_M1},
4480	{0x0001, CMN_PLL1_SS_CTRL1_M0},
4481	{0x011B, CMN_PLL0_SS_CTRL2_M0},
4482	{0x011B, CMN_PLL0_SS_CTRL2_M1},
4483	{0x011B, CMN_PLL1_SS_CTRL2_M0},
4484	{0x006E, CMN_PLL0_SS_CTRL3_M0},
4485	{0x0058, CMN_PLL0_SS_CTRL3_M1},
4486	{0x0058, CMN_PLL1_SS_CTRL3_M0},
4487	{0x000E, CMN_PLL0_SS_CTRL4_M0},
4488	{0x0012, CMN_PLL0_SS_CTRL4_M1},
4489	{0x0012, CMN_PLL1_SS_CTRL4_M0},
4490	{0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
4491	{0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
4492	{0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
4493	{0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
4494	{0x00C7, CMN_PLL0_LOCK_REFCNT_START},
4495	{0x00C7, CMN_PLL1_LOCK_REFCNT_START},
4496	{0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
4497	{0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
4498	{0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
4499	{0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
4500};
4501
4502static struct cdns_torrent_vals sl_pcie_100_int_ssc_cmn_vals = {
4503	.reg_pairs = sl_pcie_100_int_ssc_cmn_regs,
4504	.num_regs = ARRAY_SIZE(sl_pcie_100_int_ssc_cmn_regs),
4505};
4506
4507/* PCIe, 100 MHz Ref clk, no SSC & external SSC */
4508static struct cdns_reg_pairs pcie_100_ext_no_ssc_cmn_regs[] = {
4509	{0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
4510	{0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
4511	{0x000C, CMN_PLL1_DSM_FBL_OVRD_M0}
4512};
4513
4514static struct cdns_reg_pairs pcie_100_ext_no_ssc_rx_ln_regs[] = {
4515	{0x0019, RX_REE_TAP1_CLIP},
4516	{0x0019, RX_REE_TAP2TON_CLIP},
4517	{0x0001, RX_DIAG_ACYA}
4518};
4519
4520static struct cdns_torrent_vals pcie_100_no_ssc_cmn_vals = {
4521	.reg_pairs = pcie_100_ext_no_ssc_cmn_regs,
4522	.num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_cmn_regs),
4523};
4524
4525static struct cdns_torrent_vals pcie_100_no_ssc_rx_ln_vals = {
4526	.reg_pairs = pcie_100_ext_no_ssc_rx_ln_regs,
4527	.num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs),
4528};
4529
4530static struct cdns_torrent_vals_entry link_cmn_vals_entries[] = {
4531	{CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_NONE), &sl_dp_link_cmn_vals},
4532	{CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_PCIE), &pcie_dp_link_cmn_vals},
4533	{CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_USB), &usb_dp_link_cmn_vals},
4534
4535	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_NONE), NULL},
4536	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_SGMII), &pcie_sgmii_link_cmn_vals},
4537	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_QSGMII), &pcie_sgmii_link_cmn_vals},
4538	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USB), &pcie_usb_link_cmn_vals},
4539	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_DP), &pcie_dp_link_cmn_vals},
4540	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USXGMII), &pcie_usxgmii_link_cmn_vals},
4541
4542	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_NONE), &sl_sgmii_link_cmn_vals},
4543	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_PCIE), &pcie_sgmii_link_cmn_vals},
4544	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USB), &usb_sgmii_link_cmn_vals},
4545	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USXGMII), &usxgmii_sgmii_link_cmn_vals},
4546
4547	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_NONE), &sl_sgmii_link_cmn_vals},
4548	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_PCIE), &pcie_sgmii_link_cmn_vals},
4549	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USB), &usb_sgmii_link_cmn_vals},
4550	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USXGMII), &usxgmii_sgmii_link_cmn_vals},
4551
4552	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &sl_usb_link_cmn_vals},
4553	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &pcie_usb_link_cmn_vals},
4554	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_sgmii_link_cmn_vals},
4555	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_sgmii_link_cmn_vals},
4556	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_dp_link_cmn_vals},
4557
4558	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &sl_usxgmii_link_cmn_vals},
4559	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_PCIE), &pcie_usxgmii_link_cmn_vals},
4560	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_SGMII), &usxgmii_sgmii_link_cmn_vals},
4561	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_QSGMII), &usxgmii_sgmii_link_cmn_vals},
4562};
4563
4564static struct cdns_torrent_vals_entry xcvr_diag_vals_entries[] = {
4565	{CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_NONE), &sl_dp_xcvr_diag_ln_vals},
4566	{CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_PCIE), &dp_pcie_xcvr_diag_ln_vals},
4567	{CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_USB), &dp_usb_xcvr_diag_ln_vals},
4568
4569	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_NONE), NULL},
4570	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_SGMII), &pcie_sgmii_xcvr_diag_ln_vals},
4571	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_QSGMII), &pcie_sgmii_xcvr_diag_ln_vals},
4572	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USB), &pcie_usb_xcvr_diag_ln_vals},
4573	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_DP), &pcie_dp_xcvr_diag_ln_vals},
4574	{CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USXGMII), &pcie_usxgmii_xcvr_diag_ln_vals},
4575
4576	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_NONE), &sl_sgmii_xcvr_diag_ln_vals},
4577	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_PCIE), &sgmii_pcie_xcvr_diag_ln_vals},
4578	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USB), &sgmii_usb_xcvr_diag_ln_vals},
4579	{CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USXGMII), &sgmii_usxgmii_xcvr_diag_ln_vals},
4580
4581	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_NONE), &sl_sgmii_xcvr_diag_ln_vals},
4582	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_PCIE), &sgmii_pcie_xcvr_diag_ln_vals},
4583	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USB), &sgmii_usb_xcvr_diag_ln_vals},
4584	{CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USXGMII), &sgmii_usxgmii_xcvr_diag_ln_vals},
4585
4586	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &sl_usb_xcvr_diag_ln_vals},
4587	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &usb_pcie_xcvr_diag_ln_vals},
4588	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_sgmii_xcvr_diag_ln_vals},
4589	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_sgmii_xcvr_diag_ln_vals},
4590	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_dp_xcvr_diag_ln_vals},
4591
4592	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &sl_usxgmii_xcvr_diag_ln_vals},
4593	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_PCIE), &usxgmii_pcie_xcvr_diag_ln_vals},
4594	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_SGMII), &usxgmii_sgmii_xcvr_diag_ln_vals},
4595	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_QSGMII), &usxgmii_sgmii_xcvr_diag_ln_vals},
4596};
4597
4598static struct cdns_torrent_vals_entry pcs_cmn_vals_entries[] = {
4599	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &usb_phy_pcs_cmn_vals},
4600	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &usb_phy_pcs_cmn_vals},
4601	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_phy_pcs_cmn_vals},
4602	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_phy_pcs_cmn_vals},
4603	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_phy_pcs_cmn_vals},
4604};
4605
4606static struct cdns_torrent_vals_entry cmn_vals_entries[] = {
4607	{CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_cmn_vals},
4608	{CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_cmn_vals},
4609
4610	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
4611	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_cmn_vals},
4612	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
4613
4614	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
4615	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
4616	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &sl_pcie_100_int_ssc_cmn_vals},
4617
4618	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
4619	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
4620	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
4621
4622	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
4623	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
4624	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
4625
4626	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_cmn_vals},
4627	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
4628	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
4629
4630	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
4631
4632	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sl_sgmii_100_no_ssc_cmn_vals},
4633
4634	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
4635	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
4636	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_int_ssc_cmn_vals},
4637
4638	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
4639	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
4640	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
4641
4642	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &sl_qsgmii_100_no_ssc_cmn_vals},
4643
4644	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
4645	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
4646	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_int_ssc_cmn_vals},
4647
4648	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
4649	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
4650	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
4651
4652	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
4653	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
4654	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
4655
4656	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_cmn_vals},
4657	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_cmn_vals},
4658	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_int_ssc_cmn_vals},
4659
4660	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
4661	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
4662	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
4663
4664	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
4665	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
4666	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
4667
4668	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_cmn_vals},
4669
4670	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &sl_usxgmii_156_25_no_ssc_cmn_vals},
4671
4672	/* Dual refclk */
4673	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
4674
4675	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &ml_sgmii_pll1_100_no_ssc_cmn_vals},
4676
4677	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &ml_sgmii_pll1_100_no_ssc_cmn_vals},
4678
4679	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_pll1_156_25_no_ssc_cmn_vals},
4680	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
4681	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
4682};
4683
4684static struct cdns_torrent_vals_entry cdns_tx_ln_vals_entries[] = {
4685	{CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals},
4686	{CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals},
4687
4688	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals},
4689	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
4690	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
4691
4692	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
4693	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
4694	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL},
4695
4696	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL},
4697	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL},
4698	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL},
4699
4700	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL},
4701	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL},
4702	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL},
4703
4704	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL},
4705	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL},
4706	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL},
4707
4708	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
4709
4710	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4711
4712	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4713	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4714	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4715
4716	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4717	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4718	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4719
4720	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4721
4722	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4723	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4724	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4725
4726	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4727	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4728	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4729
4730	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4731	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4732	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4733
4734	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4735	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4736	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4737
4738	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4739	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4740	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4741
4742	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4743	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4744	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4745
4746	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4747
4748	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
4749
4750	/* Dual refclk */
4751	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
4752
4753	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
4754
4755	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
4756
4757	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
4758	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
4759	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
4760};
4761
4762static struct cdns_torrent_vals_entry cdns_rx_ln_vals_entries[] = {
4763	{CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_rx_ln_vals},
4764	{CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_rx_ln_vals},
4765
4766	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_rx_ln_vals},
4767	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
4768	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
4769
4770	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
4771	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4772	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4773
4774	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
4775	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4776	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4777
4778	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
4779	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4780	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4781
4782	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
4783	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4784	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
4785
4786	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
4787
4788	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4789
4790	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4791	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4792	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4793
4794	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4795	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4796	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4797
4798	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4799
4800	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4801	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4802	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4803
4804	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4805	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4806	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4807
4808	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
4809	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4810	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4811
4812	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
4813	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4814	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4815
4816	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
4817	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4818	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4819
4820	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
4821	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4822	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
4823
4824	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
4825
4826	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
4827
4828	/* Dual refclk */
4829	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
4830
4831	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
4832
4833	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
4834
4835	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
4836	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
4837	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
4838};
4839
4840static const struct cdns_torrent_data cdns_map_torrent = {
4841	.block_offset_shift = 0x2,
4842	.reg_offset_shift = 0x2,
4843	.link_cmn_vals_tbl = {
4844		.entries = link_cmn_vals_entries,
4845		.num_entries = ARRAY_SIZE(link_cmn_vals_entries),
4846	},
4847	.xcvr_diag_vals_tbl = {
4848		.entries = xcvr_diag_vals_entries,
4849		.num_entries = ARRAY_SIZE(xcvr_diag_vals_entries),
4850	},
4851	.pcs_cmn_vals_tbl = {
4852		.entries = pcs_cmn_vals_entries,
4853		.num_entries = ARRAY_SIZE(pcs_cmn_vals_entries),
4854	},
4855	.cmn_vals_tbl = {
4856		.entries = cmn_vals_entries,
4857		.num_entries = ARRAY_SIZE(cmn_vals_entries),
4858	},
4859	.tx_ln_vals_tbl = {
4860		.entries = cdns_tx_ln_vals_entries,
4861		.num_entries = ARRAY_SIZE(cdns_tx_ln_vals_entries),
4862	},
4863	.rx_ln_vals_tbl = {
4864		.entries = cdns_rx_ln_vals_entries,
4865		.num_entries = ARRAY_SIZE(cdns_rx_ln_vals_entries),
4866	},
4867};
4868
4869static struct cdns_torrent_vals_entry j721e_phy_pma_cmn_vals_entries[] = {
4870	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &ti_usxgmii_phy_pma_cmn_vals},
4871	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_PCIE), &ti_usxgmii_phy_pma_cmn_vals},
4872	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_SGMII), &ti_usxgmii_phy_pma_cmn_vals},
4873	{CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_QSGMII), &ti_usxgmii_phy_pma_cmn_vals},
4874};
4875
4876static struct cdns_torrent_vals_entry ti_tx_ln_vals_entries[] = {
4877	{CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals},
4878	{CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals},
4879
4880	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals},
4881	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
4882	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
4883
4884	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
4885	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
4886	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL},
4887
4888	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL},
4889	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL},
4890	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL},
4891
4892	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL},
4893	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL},
4894	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL},
4895
4896	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL},
4897	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL},
4898	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL},
4899
4900	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
4901
4902	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4903
4904	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4905	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4906	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4907
4908	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4909	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4910	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4911
4912	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4913
4914	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4915	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4916	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4917
4918	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4919	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4920	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4921
4922	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4923	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4924	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4925
4926	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4927	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4928	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4929
4930	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4931	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4932	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4933
4934	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4935	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4936	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
4937
4938	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
4939
4940	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
4941
4942	/* Dual refclk */
4943	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
4944
4945	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
4946
4947	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
4948
4949	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
4950	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
4951	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
4952};
4953
4954static const struct cdns_torrent_data ti_j721e_map_torrent = {
4955	.block_offset_shift = 0x0,
4956	.reg_offset_shift = 0x1,
4957	.link_cmn_vals_tbl = {
4958		.entries = link_cmn_vals_entries,
4959		.num_entries = ARRAY_SIZE(link_cmn_vals_entries),
4960	},
4961	.xcvr_diag_vals_tbl = {
4962		.entries = xcvr_diag_vals_entries,
4963		.num_entries = ARRAY_SIZE(xcvr_diag_vals_entries),
4964	},
4965	.pcs_cmn_vals_tbl = {
4966		.entries = pcs_cmn_vals_entries,
4967		.num_entries = ARRAY_SIZE(pcs_cmn_vals_entries),
4968	},
4969	.phy_pma_cmn_vals_tbl = {
4970		.entries = j721e_phy_pma_cmn_vals_entries,
4971		.num_entries = ARRAY_SIZE(j721e_phy_pma_cmn_vals_entries),
4972	},
4973	.cmn_vals_tbl = {
4974		.entries = cmn_vals_entries,
4975		.num_entries = ARRAY_SIZE(cmn_vals_entries),
4976	},
4977	.tx_ln_vals_tbl = {
4978		.entries = ti_tx_ln_vals_entries,
4979		.num_entries = ARRAY_SIZE(ti_tx_ln_vals_entries),
4980	},
4981	.rx_ln_vals_tbl = {
4982		.entries = cdns_rx_ln_vals_entries,
4983		.num_entries = ARRAY_SIZE(cdns_rx_ln_vals_entries),
4984	},
4985};
4986
4987/* TI J7200 (Torrent SD0805) */
4988static struct cdns_torrent_vals_entry ti_j7200_cmn_vals_entries[] = {
4989	{CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_cmn_vals},
4990	{CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_cmn_vals},
4991
4992	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
4993	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_cmn_vals},
4994	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
4995
4996	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
4997	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
4998	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &sl_pcie_100_int_ssc_cmn_vals},
4999
5000	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
5001	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
5002	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
5003
5004	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
5005	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
5006	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
5007
5008	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_cmn_vals},
5009	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
5010	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
5011
5012	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
5013
5014	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sl_sgmii_100_no_ssc_cmn_vals},
5015
5016	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
5017	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
5018	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_int_ssc_cmn_vals},
5019
5020	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
5021	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
5022	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
5023
5024	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &sl_qsgmii_100_no_ssc_cmn_vals},
5025
5026	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
5027	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
5028	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_int_ssc_cmn_vals},
5029
5030	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
5031	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
5032	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
5033
5034	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
5035	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
5036	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
5037
5038	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_cmn_vals},
5039	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_cmn_vals},
5040	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_int_ssc_cmn_vals},
5041
5042	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
5043	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
5044	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
5045
5046	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
5047	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
5048	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
5049
5050	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_cmn_vals},
5051
5052	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &sl_usxgmii_156_25_no_ssc_cmn_vals},
5053
5054	/* Dual refclk */
5055	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
5056
5057	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &j7200_ml_sgmii_pll1_100_no_ssc_cmn_vals},
5058
5059	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &j7200_ml_sgmii_pll1_100_no_ssc_cmn_vals},
5060
5061	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_pll1_156_25_no_ssc_cmn_vals},
5062	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
5063	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
5064};
5065
5066static struct cdns_torrent_vals_entry ti_j7200_tx_ln_vals_entries[] = {
5067	{CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals},
5068	{CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals},
5069
5070	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals},
5071	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
5072	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
5073
5074	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
5075	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
5076	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL},
5077
5078	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL},
5079	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL},
5080	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL},
5081
5082	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL},
5083	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL},
5084	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL},
5085
5086	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL},
5087	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL},
5088	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL},
5089
5090	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
5091
5092	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
5093
5094	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
5095	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
5096	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
5097
5098	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
5099	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
5100	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
5101
5102	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
5103
5104	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
5105	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
5106	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
5107
5108	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
5109	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
5110	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
5111
5112	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
5113	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5114	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5115
5116	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
5117	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5118	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5119
5120	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
5121	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5122	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5123
5124	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
5125	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5126	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
5127
5128	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
5129
5130	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
5131
5132	/* Dual refclk */
5133	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
5134
5135	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &j7200_sgmii_100_no_ssc_tx_ln_vals},
5136
5137	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &j7200_qsgmii_100_no_ssc_tx_ln_vals},
5138
5139	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
5140	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
5141	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
5142};
5143
5144static struct cdns_torrent_vals_entry ti_j7200_rx_ln_vals_entries[] = {
5145	{CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_rx_ln_vals},
5146	{CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_rx_ln_vals},
5147
5148	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_rx_ln_vals},
5149	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
5150	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
5151
5152	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
5153	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5154	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5155
5156	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
5157	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5158	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5159
5160	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
5161	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5162	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5163
5164	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
5165	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5166	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
5167
5168	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
5169
5170	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
5171
5172	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
5173	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
5174	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
5175
5176	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
5177	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
5178	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
5179
5180	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
5181
5182	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
5183	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
5184	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
5185
5186	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
5187	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
5188	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
5189
5190	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
5191	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5192	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5193
5194	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
5195	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5196	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5197
5198	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
5199	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5200	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5201
5202	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
5203	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5204	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
5205
5206	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
5207
5208	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
5209
5210	/* Dual refclk */
5211	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
5212
5213	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &j7200_sgmii_100_no_ssc_rx_ln_vals},
5214
5215	{CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &j7200_qsgmii_100_no_ssc_rx_ln_vals},
5216
5217	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
5218	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
5219	{CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
5220};
5221
5222static const struct cdns_torrent_data ti_j7200_map_torrent = {
5223	.block_offset_shift = 0x0,
5224	.reg_offset_shift = 0x1,
5225	.link_cmn_vals_tbl = {
5226		.entries = link_cmn_vals_entries,
5227		.num_entries = ARRAY_SIZE(link_cmn_vals_entries),
5228	},
5229	.xcvr_diag_vals_tbl = {
5230		.entries = xcvr_diag_vals_entries,
5231		.num_entries = ARRAY_SIZE(xcvr_diag_vals_entries),
5232	},
5233	.pcs_cmn_vals_tbl = {
5234		.entries = pcs_cmn_vals_entries,
5235		.num_entries = ARRAY_SIZE(pcs_cmn_vals_entries),
5236	},
5237	.phy_pma_cmn_vals_tbl = {
5238		.entries = j721e_phy_pma_cmn_vals_entries,
5239		.num_entries = ARRAY_SIZE(j721e_phy_pma_cmn_vals_entries),
5240	},
5241	.cmn_vals_tbl = {
5242		.entries = ti_j7200_cmn_vals_entries,
5243		.num_entries = ARRAY_SIZE(ti_j7200_cmn_vals_entries),
5244	},
5245	.tx_ln_vals_tbl = {
5246		.entries = ti_j7200_tx_ln_vals_entries,
5247		.num_entries = ARRAY_SIZE(ti_j7200_tx_ln_vals_entries),
5248	},
5249	.rx_ln_vals_tbl = {
5250		.entries = ti_j7200_rx_ln_vals_entries,
5251		.num_entries = ARRAY_SIZE(ti_j7200_rx_ln_vals_entries),
5252	},
5253};
5254
5255static const struct of_device_id cdns_torrent_phy_of_match[] = {
5256	{
5257		.compatible = "cdns,torrent-phy",
5258		.data = &cdns_map_torrent,
5259	},
5260	{
5261		.compatible = "ti,j721e-serdes-10g",
5262		.data = &ti_j721e_map_torrent,
5263	},
5264	{
5265		.compatible = "ti,j7200-serdes-10g",
5266		.data = &ti_j7200_map_torrent,
5267	},
5268	{}
5269};
5270MODULE_DEVICE_TABLE(of, cdns_torrent_phy_of_match);
5271
5272static struct platform_driver cdns_torrent_phy_driver = {
5273	.probe	= cdns_torrent_phy_probe,
5274	.remove_new = cdns_torrent_phy_remove,
5275	.driver = {
5276		.name	= "cdns-torrent-phy",
5277		.of_match_table	= cdns_torrent_phy_of_match,
5278	}
5279};
5280module_platform_driver(cdns_torrent_phy_driver);
5281
5282MODULE_AUTHOR("Cadence Design Systems, Inc.");
5283MODULE_DESCRIPTION("Cadence Torrent PHY driver");
5284MODULE_LICENSE("GPL v2");
5285