]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/phy/cadence/phy-cadence-torrent.c
Merge tag 'gvt-next-fixes-2021-04-21' of https://github.com/intel/gvt-linux into...
[mirror_ubuntu-jammy-kernel.git] / drivers / phy / cadence / phy-cadence-torrent.c
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 <linux/clk.h>
11 #include <linux/delay.h>
12 #include <linux/err.h>
13 #include <linux/io.h>
14 #include <linux/iopoll.h>
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/of.h>
18 #include <linux/of_address.h>
19 #include <linux/of_device.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
28 #define MAX_NUM_LANES 4
29 #define DEFAULT_MAX_BIT_RATE 8100 /* in Mbps */
30
31 #define NUM_SSC_MODE 3
32 #define NUM_PHY_TYPE 6
33
34 #define POLL_TIMEOUT_US 5000
35 #define PLL_LOCK_TIMEOUT 100000
36
37 #define TORRENT_COMMON_CDB_OFFSET 0x0
38
39 #define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \
40 ((0x4000 << (block_offset)) + \
41 (((ln) << 9) << (reg_offset)))
42
43 #define TORRENT_RX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \
44 ((0x8000 << (block_offset)) + \
45 (((ln) << 9) << (reg_offset)))
46
47 #define TORRENT_PHY_PCS_COMMON_OFFSET(block_offset) \
48 (0xC000 << (block_offset))
49
50 #define TORRENT_PHY_PMA_COMMON_OFFSET(block_offset) \
51 (0xE000 << (block_offset))
52
53 #define TORRENT_DPTX_PHY_OFFSET 0x0
54
55 /*
56 * register offsets from DPTX PHY register block base (i.e MHDP
57 * register base + 0x30a00)
58 */
59 #define PHY_AUX_CTRL 0x04
60 #define PHY_RESET 0x20
61 #define PMA_TX_ELEC_IDLE_MASK 0xF0U
62 #define PMA_TX_ELEC_IDLE_SHIFT 4
63 #define PHY_L00_RESET_N_MASK 0x01U
64 #define PHY_PMA_XCVR_PLLCLK_EN 0x24
65 #define PHY_PMA_XCVR_PLLCLK_EN_ACK 0x28
66 #define PHY_PMA_XCVR_POWER_STATE_REQ 0x2c
67 #define PHY_POWER_STATE_LN_0 0x0000
68 #define PHY_POWER_STATE_LN_1 0x0008
69 #define PHY_POWER_STATE_LN_2 0x0010
70 #define PHY_POWER_STATE_LN_3 0x0018
71 #define PMA_XCVR_POWER_STATE_REQ_LN_MASK 0x3FU
72 #define PHY_PMA_XCVR_POWER_STATE_ACK 0x30
73 #define PHY_PMA_CMN_READY 0x34
74
75 /*
76 * register offsets from SD0801 PHY register block base (i.e MHDP
77 * register base + 0x500000)
78 */
79 #define CMN_SSM_BANDGAP_TMR 0x0021U
80 #define CMN_SSM_BIAS_TMR 0x0022U
81 #define CMN_PLLSM0_PLLPRE_TMR 0x002AU
82 #define CMN_PLLSM0_PLLLOCK_TMR 0x002CU
83 #define CMN_PLLSM1_PLLPRE_TMR 0x0032U
84 #define CMN_PLLSM1_PLLLOCK_TMR 0x0034U
85 #define CMN_CDIAG_CDB_PWRI_OVRD 0x0041U
86 #define CMN_CDIAG_XCVRC_PWRI_OVRD 0x0047U
87 #define CMN_BGCAL_INIT_TMR 0x0064U
88 #define CMN_BGCAL_ITER_TMR 0x0065U
89 #define CMN_IBCAL_INIT_TMR 0x0074U
90 #define CMN_PLL0_VCOCAL_TCTRL 0x0082U
91 #define CMN_PLL0_VCOCAL_INIT_TMR 0x0084U
92 #define CMN_PLL0_VCOCAL_ITER_TMR 0x0085U
93 #define CMN_PLL0_VCOCAL_REFTIM_START 0x0086U
94 #define CMN_PLL0_VCOCAL_PLLCNT_START 0x0088U
95 #define CMN_PLL0_INTDIV_M0 0x0090U
96 #define CMN_PLL0_FRACDIVL_M0 0x0091U
97 #define CMN_PLL0_FRACDIVH_M0 0x0092U
98 #define CMN_PLL0_HIGH_THR_M0 0x0093U
99 #define CMN_PLL0_DSM_DIAG_M0 0x0094U
100 #define CMN_PLL0_SS_CTRL1_M0 0x0098U
101 #define CMN_PLL0_SS_CTRL2_M0 0x0099U
102 #define CMN_PLL0_SS_CTRL3_M0 0x009AU
103 #define CMN_PLL0_SS_CTRL4_M0 0x009BU
104 #define CMN_PLL0_LOCK_REFCNT_START 0x009CU
105 #define CMN_PLL0_LOCK_PLLCNT_START 0x009EU
106 #define CMN_PLL0_LOCK_PLLCNT_THR 0x009FU
107 #define CMN_PLL0_INTDIV_M1 0x00A0U
108 #define CMN_PLL0_FRACDIVH_M1 0x00A2U
109 #define CMN_PLL0_HIGH_THR_M1 0x00A3U
110 #define CMN_PLL0_DSM_DIAG_M1 0x00A4U
111 #define CMN_PLL0_SS_CTRL1_M1 0x00A8U
112 #define CMN_PLL0_SS_CTRL2_M1 0x00A9U
113 #define CMN_PLL0_SS_CTRL3_M1 0x00AAU
114 #define CMN_PLL0_SS_CTRL4_M1 0x00ABU
115 #define CMN_PLL1_VCOCAL_TCTRL 0x00C2U
116 #define CMN_PLL1_VCOCAL_INIT_TMR 0x00C4U
117 #define CMN_PLL1_VCOCAL_ITER_TMR 0x00C5U
118 #define CMN_PLL1_VCOCAL_REFTIM_START 0x00C6U
119 #define CMN_PLL1_VCOCAL_PLLCNT_START 0x00C8U
120 #define CMN_PLL1_INTDIV_M0 0x00D0U
121 #define CMN_PLL1_FRACDIVL_M0 0x00D1U
122 #define CMN_PLL1_FRACDIVH_M0 0x00D2U
123 #define CMN_PLL1_HIGH_THR_M0 0x00D3U
124 #define CMN_PLL1_DSM_DIAG_M0 0x00D4U
125 #define CMN_PLL1_SS_CTRL1_M0 0x00D8U
126 #define CMN_PLL1_SS_CTRL2_M0 0x00D9U
127 #define CMN_PLL1_SS_CTRL3_M0 0x00DAU
128 #define CMN_PLL1_SS_CTRL4_M0 0x00DBU
129 #define CMN_PLL1_LOCK_REFCNT_START 0x00DCU
130 #define CMN_PLL1_LOCK_PLLCNT_START 0x00DEU
131 #define CMN_PLL1_LOCK_PLLCNT_THR 0x00DFU
132 #define CMN_TXPUCAL_TUNE 0x0103U
133 #define CMN_TXPUCAL_INIT_TMR 0x0104U
134 #define CMN_TXPUCAL_ITER_TMR 0x0105U
135 #define CMN_TXPDCAL_TUNE 0x010BU
136 #define CMN_TXPDCAL_INIT_TMR 0x010CU
137 #define CMN_TXPDCAL_ITER_TMR 0x010DU
138 #define CMN_RXCAL_INIT_TMR 0x0114U
139 #define CMN_RXCAL_ITER_TMR 0x0115U
140 #define CMN_SD_CAL_INIT_TMR 0x0124U
141 #define CMN_SD_CAL_ITER_TMR 0x0125U
142 #define CMN_SD_CAL_REFTIM_START 0x0126U
143 #define CMN_SD_CAL_PLLCNT_START 0x0128U
144 #define CMN_PDIAG_PLL0_CTRL_M0 0x01A0U
145 #define CMN_PDIAG_PLL0_CLK_SEL_M0 0x01A1U
146 #define CMN_PDIAG_PLL0_CP_PADJ_M0 0x01A4U
147 #define CMN_PDIAG_PLL0_CP_IADJ_M0 0x01A5U
148 #define CMN_PDIAG_PLL0_FILT_PADJ_M0 0x01A6U
149 #define CMN_PDIAG_PLL0_CTRL_M1 0x01B0U
150 #define CMN_PDIAG_PLL0_CLK_SEL_M1 0x01B1U
151 #define CMN_PDIAG_PLL0_CP_PADJ_M1 0x01B4U
152 #define CMN_PDIAG_PLL0_CP_IADJ_M1 0x01B5U
153 #define CMN_PDIAG_PLL0_FILT_PADJ_M1 0x01B6U
154 #define CMN_PDIAG_PLL1_CTRL_M0 0x01C0U
155 #define CMN_PDIAG_PLL1_CLK_SEL_M0 0x01C1U
156 #define CMN_PDIAG_PLL1_CP_PADJ_M0 0x01C4U
157 #define CMN_PDIAG_PLL1_CP_IADJ_M0 0x01C5U
158 #define CMN_PDIAG_PLL1_FILT_PADJ_M0 0x01C6U
159 #define CMN_DIAG_BIAS_OVRD1 0x01E1U
160
161 /* PMA TX Lane registers */
162 #define TX_TXCC_CTRL 0x0040U
163 #define TX_TXCC_CPOST_MULT_00 0x004CU
164 #define TX_TXCC_CPOST_MULT_01 0x004DU
165 #define TX_TXCC_MGNFS_MULT_000 0x0050U
166 #define DRV_DIAG_TX_DRV 0x00C6U
167 #define XCVR_DIAG_PLLDRC_CTRL 0x00E5U
168 #define XCVR_DIAG_HSCLK_SEL 0x00E6U
169 #define XCVR_DIAG_HSCLK_DIV 0x00E7U
170 #define XCVR_DIAG_BIDI_CTRL 0x00EAU
171 #define XCVR_DIAG_PSC_OVRD 0x00EBU
172 #define TX_PSC_A0 0x0100U
173 #define TX_PSC_A1 0x0101U
174 #define TX_PSC_A2 0x0102U
175 #define TX_PSC_A3 0x0103U
176 #define TX_RCVDET_ST_TMR 0x0123U
177 #define TX_DIAG_ACYA 0x01E7U
178 #define TX_DIAG_ACYA_HBDC_MASK 0x0001U
179
180 /* PMA RX Lane registers */
181 #define RX_PSC_A0 0x0000U
182 #define RX_PSC_A1 0x0001U
183 #define RX_PSC_A2 0x0002U
184 #define RX_PSC_A3 0x0003U
185 #define RX_PSC_CAL 0x0006U
186 #define RX_CDRLF_CNFG 0x0080U
187 #define RX_CDRLF_CNFG3 0x0082U
188 #define RX_SIGDET_HL_FILT_TMR 0x0090U
189 #define RX_REE_GCSM1_CTRL 0x0108U
190 #define RX_REE_GCSM1_EQENM_PH1 0x0109U
191 #define RX_REE_GCSM1_EQENM_PH2 0x010AU
192 #define RX_REE_GCSM2_CTRL 0x0110U
193 #define RX_REE_PERGCSM_CTRL 0x0118U
194 #define RX_REE_ATTEN_THR 0x0149U
195 #define RX_REE_TAP1_CLIP 0x0171U
196 #define RX_REE_TAP2TON_CLIP 0x0172U
197 #define RX_REE_SMGM_CTRL1 0x0177U
198 #define RX_REE_SMGM_CTRL2 0x0178U
199 #define RX_DIAG_DFE_CTRL 0x01E0U
200 #define RX_DIAG_DFE_AMP_TUNE_2 0x01E2U
201 #define RX_DIAG_DFE_AMP_TUNE_3 0x01E3U
202 #define RX_DIAG_NQST_CTRL 0x01E5U
203 #define RX_DIAG_SIGDET_TUNE 0x01E8U
204 #define RX_DIAG_PI_RATE 0x01F4U
205 #define RX_DIAG_PI_CAP 0x01F5U
206 #define RX_DIAG_ACYA 0x01FFU
207
208 /* PHY PCS common registers */
209 #define PHY_PLL_CFG 0x000EU
210 #define PHY_PIPE_USB3_GEN2_PRE_CFG0 0x0020U
211 #define PHY_PIPE_USB3_GEN2_POST_CFG0 0x0022U
212 #define PHY_PIPE_USB3_GEN2_POST_CFG1 0x0023U
213
214 /* PHY PMA common registers */
215 #define PHY_PMA_CMN_CTRL1 0x0000U
216 #define PHY_PMA_CMN_CTRL2 0x0001U
217 #define PHY_PMA_PLL_RAW_CTRL 0x0003U
218
219 static const struct reg_field phy_pll_cfg =
220 REG_FIELD(PHY_PLL_CFG, 0, 1);
221
222 static const struct reg_field phy_pma_cmn_ctrl_1 =
223 REG_FIELD(PHY_PMA_CMN_CTRL1, 0, 0);
224
225 static const struct reg_field phy_pma_cmn_ctrl_2 =
226 REG_FIELD(PHY_PMA_CMN_CTRL2, 0, 7);
227
228 static const struct reg_field phy_pma_pll_raw_ctrl =
229 REG_FIELD(PHY_PMA_PLL_RAW_CTRL, 0, 1);
230
231 static const struct reg_field phy_reset_ctrl =
232 REG_FIELD(PHY_RESET, 8, 8);
233
234 enum cdns_torrent_phy_type {
235 TYPE_NONE,
236 TYPE_DP,
237 TYPE_PCIE,
238 TYPE_SGMII,
239 TYPE_QSGMII,
240 TYPE_USB,
241 };
242
243 enum cdns_torrent_ssc_mode {
244 NO_SSC,
245 EXTERNAL_SSC,
246 INTERNAL_SSC
247 };
248
249 struct cdns_torrent_inst {
250 struct phy *phy;
251 u32 mlane;
252 enum cdns_torrent_phy_type phy_type;
253 u32 num_lanes;
254 struct reset_control *lnk_rst;
255 enum cdns_torrent_ssc_mode ssc_mode;
256 };
257
258 struct cdns_torrent_phy {
259 void __iomem *base; /* DPTX registers base */
260 void __iomem *sd_base; /* SD0801 registers base */
261 u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */
262 struct reset_control *phy_rst;
263 struct reset_control *apb_rst;
264 struct device *dev;
265 struct clk *clk;
266 unsigned long ref_clk_rate;
267 struct cdns_torrent_inst phys[MAX_NUM_LANES];
268 int nsubnodes;
269 const struct cdns_torrent_data *init_data;
270 struct regmap *regmap;
271 struct regmap *regmap_common_cdb;
272 struct regmap *regmap_phy_pcs_common_cdb;
273 struct regmap *regmap_phy_pma_common_cdb;
274 struct regmap *regmap_tx_lane_cdb[MAX_NUM_LANES];
275 struct regmap *regmap_rx_lane_cdb[MAX_NUM_LANES];
276 struct regmap *regmap_dptx_phy_reg;
277 struct regmap_field *phy_pll_cfg;
278 struct regmap_field *phy_pma_cmn_ctrl_1;
279 struct regmap_field *phy_pma_cmn_ctrl_2;
280 struct regmap_field *phy_pma_pll_raw_ctrl;
281 struct regmap_field *phy_reset_ctrl;
282 };
283
284 enum phy_powerstate {
285 POWERSTATE_A0 = 0,
286 /* Powerstate A1 is unused */
287 POWERSTATE_A2 = 2,
288 POWERSTATE_A3 = 3,
289 };
290
291 static int cdns_torrent_phy_init(struct phy *phy);
292 static int cdns_torrent_dp_init(struct phy *phy);
293 static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy,
294 u32 num_lanes);
295 static
296 int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy *cdns_phy);
297 static void cdns_torrent_dp_pma_cfg(struct cdns_torrent_phy *cdns_phy,
298 struct cdns_torrent_inst *inst);
299 static
300 void cdns_torrent_dp_pma_cmn_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy);
301 static
302 void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy,
303 u32 rate, bool ssc);
304 static
305 void cdns_torrent_dp_pma_cmn_cfg_25mhz(struct cdns_torrent_phy *cdns_phy);
306 static
307 void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy *cdns_phy,
308 u32 rate, bool ssc);
309 static void cdns_torrent_dp_pma_lane_cfg(struct cdns_torrent_phy *cdns_phy,
310 unsigned int lane);
311 static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
312 u32 rate, u32 num_lanes);
313 static int cdns_torrent_dp_configure(struct phy *phy,
314 union phy_configure_opts *opts);
315 static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
316 u32 num_lanes,
317 enum phy_powerstate powerstate);
318 static int cdns_torrent_phy_on(struct phy *phy);
319 static int cdns_torrent_phy_off(struct phy *phy);
320
321 static const struct phy_ops cdns_torrent_phy_ops = {
322 .init = cdns_torrent_phy_init,
323 .configure = cdns_torrent_dp_configure,
324 .power_on = cdns_torrent_phy_on,
325 .power_off = cdns_torrent_phy_off,
326 .owner = THIS_MODULE,
327 };
328
329 struct cdns_reg_pairs {
330 u32 val;
331 u32 off;
332 };
333
334 struct cdns_torrent_vals {
335 struct cdns_reg_pairs *reg_pairs;
336 u32 num_regs;
337 };
338
339 struct cdns_torrent_data {
340 u8 block_offset_shift;
341 u8 reg_offset_shift;
342 struct cdns_torrent_vals *link_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
343 [NUM_SSC_MODE];
344 struct cdns_torrent_vals *xcvr_diag_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
345 [NUM_SSC_MODE];
346 struct cdns_torrent_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
347 [NUM_SSC_MODE];
348 struct cdns_torrent_vals *cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
349 [NUM_SSC_MODE];
350 struct cdns_torrent_vals *tx_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
351 [NUM_SSC_MODE];
352 struct cdns_torrent_vals *rx_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
353 [NUM_SSC_MODE];
354 };
355
356 struct cdns_regmap_cdb_context {
357 struct device *dev;
358 void __iomem *base;
359 u8 reg_offset_shift;
360 };
361
362 static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val)
363 {
364 struct cdns_regmap_cdb_context *ctx = context;
365 u32 offset = reg << ctx->reg_offset_shift;
366
367 writew(val, ctx->base + offset);
368
369 return 0;
370 }
371
372 static int cdns_regmap_read(void *context, unsigned int reg, unsigned int *val)
373 {
374 struct cdns_regmap_cdb_context *ctx = context;
375 u32 offset = reg << ctx->reg_offset_shift;
376
377 *val = readw(ctx->base + offset);
378 return 0;
379 }
380
381 static int cdns_regmap_dptx_write(void *context, unsigned int reg,
382 unsigned int val)
383 {
384 struct cdns_regmap_cdb_context *ctx = context;
385 u32 offset = reg;
386
387 writel(val, ctx->base + offset);
388
389 return 0;
390 }
391
392 static int cdns_regmap_dptx_read(void *context, unsigned int reg,
393 unsigned int *val)
394 {
395 struct cdns_regmap_cdb_context *ctx = context;
396 u32 offset = reg;
397
398 *val = readl(ctx->base + offset);
399 return 0;
400 }
401
402 #define TORRENT_TX_LANE_CDB_REGMAP_CONF(n) \
403 { \
404 .name = "torrent_tx_lane" n "_cdb", \
405 .reg_stride = 1, \
406 .fast_io = true, \
407 .reg_write = cdns_regmap_write, \
408 .reg_read = cdns_regmap_read, \
409 }
410
411 #define TORRENT_RX_LANE_CDB_REGMAP_CONF(n) \
412 { \
413 .name = "torrent_rx_lane" n "_cdb", \
414 .reg_stride = 1, \
415 .fast_io = true, \
416 .reg_write = cdns_regmap_write, \
417 .reg_read = cdns_regmap_read, \
418 }
419
420 static const struct regmap_config cdns_torrent_tx_lane_cdb_config[] = {
421 TORRENT_TX_LANE_CDB_REGMAP_CONF("0"),
422 TORRENT_TX_LANE_CDB_REGMAP_CONF("1"),
423 TORRENT_TX_LANE_CDB_REGMAP_CONF("2"),
424 TORRENT_TX_LANE_CDB_REGMAP_CONF("3"),
425 };
426
427 static const struct regmap_config cdns_torrent_rx_lane_cdb_config[] = {
428 TORRENT_RX_LANE_CDB_REGMAP_CONF("0"),
429 TORRENT_RX_LANE_CDB_REGMAP_CONF("1"),
430 TORRENT_RX_LANE_CDB_REGMAP_CONF("2"),
431 TORRENT_RX_LANE_CDB_REGMAP_CONF("3"),
432 };
433
434 static const struct regmap_config cdns_torrent_common_cdb_config = {
435 .name = "torrent_common_cdb",
436 .reg_stride = 1,
437 .fast_io = true,
438 .reg_write = cdns_regmap_write,
439 .reg_read = cdns_regmap_read,
440 };
441
442 static const struct regmap_config cdns_torrent_phy_pcs_cmn_cdb_config = {
443 .name = "torrent_phy_pcs_cmn_cdb",
444 .reg_stride = 1,
445 .fast_io = true,
446 .reg_write = cdns_regmap_write,
447 .reg_read = cdns_regmap_read,
448 };
449
450 static const struct regmap_config cdns_torrent_phy_pma_cmn_cdb_config = {
451 .name = "torrent_phy_pma_cmn_cdb",
452 .reg_stride = 1,
453 .fast_io = true,
454 .reg_write = cdns_regmap_write,
455 .reg_read = cdns_regmap_read,
456 };
457
458 static const struct regmap_config cdns_torrent_dptx_phy_config = {
459 .name = "torrent_dptx_phy",
460 .reg_stride = 1,
461 .fast_io = true,
462 .reg_write = cdns_regmap_dptx_write,
463 .reg_read = cdns_regmap_dptx_read,
464 };
465
466 /* PHY mmr access functions */
467
468 static void cdns_torrent_phy_write(struct regmap *regmap, u32 offset, u32 val)
469 {
470 regmap_write(regmap, offset, val);
471 }
472
473 static u32 cdns_torrent_phy_read(struct regmap *regmap, u32 offset)
474 {
475 unsigned int val;
476
477 regmap_read(regmap, offset, &val);
478 return val;
479 }
480
481 /* DPTX mmr access functions */
482
483 static void cdns_torrent_dp_write(struct regmap *regmap, u32 offset, u32 val)
484 {
485 regmap_write(regmap, offset, val);
486 }
487
488 static u32 cdns_torrent_dp_read(struct regmap *regmap, u32 offset)
489 {
490 u32 val;
491
492 regmap_read(regmap, offset, &val);
493 return val;
494 }
495
496 /*
497 * Structure used to store values of PHY registers for voltage-related
498 * coefficients, for particular voltage swing and pre-emphasis level. Values
499 * are shared across all physical lanes.
500 */
501 struct coefficients {
502 /* Value of DRV_DIAG_TX_DRV register to use */
503 u16 diag_tx_drv;
504 /* Value of TX_TXCC_MGNFS_MULT_000 register to use */
505 u16 mgnfs_mult;
506 /* Value of TX_TXCC_CPOST_MULT_00 register to use */
507 u16 cpost_mult;
508 };
509
510 /*
511 * Array consists of values of voltage-related registers for sd0801 PHY. A value
512 * of 0xFFFF is a placeholder for invalid combination, and will never be used.
513 */
514 static const struct coefficients vltg_coeff[4][4] = {
515 /* voltage swing 0, pre-emphasis 0->3 */
516 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x002A,
517 .cpost_mult = 0x0000},
518 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
519 .cpost_mult = 0x0014},
520 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0012,
521 .cpost_mult = 0x0020},
522 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
523 .cpost_mult = 0x002A}
524 },
525
526 /* voltage swing 1, pre-emphasis 0->3 */
527 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
528 .cpost_mult = 0x0000},
529 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
530 .cpost_mult = 0x0012},
531 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
532 .cpost_mult = 0x001F},
533 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
534 .cpost_mult = 0xFFFF}
535 },
536
537 /* voltage swing 2, pre-emphasis 0->3 */
538 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
539 .cpost_mult = 0x0000},
540 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
541 .cpost_mult = 0x0013},
542 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
543 .cpost_mult = 0xFFFF},
544 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
545 .cpost_mult = 0xFFFF}
546 },
547
548 /* voltage swing 3, pre-emphasis 0->3 */
549 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
550 .cpost_mult = 0x0000},
551 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
552 .cpost_mult = 0xFFFF},
553 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
554 .cpost_mult = 0xFFFF},
555 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
556 .cpost_mult = 0xFFFF}
557 }
558 };
559
560 /*
561 * Enable or disable PLL for selected lanes.
562 */
563 static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy,
564 struct phy_configure_opts_dp *dp,
565 bool enable)
566 {
567 u32 rd_val;
568 u32 ret;
569 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
570
571 /*
572 * Used to determine, which bits to check for or enable in
573 * PHY_PMA_XCVR_PLLCLK_EN register.
574 */
575 u32 pll_bits;
576 /* Used to enable or disable lanes. */
577 u32 pll_val;
578
579 /* Select values of registers and mask, depending on enabled lane
580 * count.
581 */
582 switch (dp->lanes) {
583 /* lane 0 */
584 case (1):
585 pll_bits = 0x00000001;
586 break;
587 /* lanes 0-1 */
588 case (2):
589 pll_bits = 0x00000003;
590 break;
591 /* lanes 0-3, all */
592 default:
593 pll_bits = 0x0000000F;
594 break;
595 }
596
597 if (enable)
598 pll_val = pll_bits;
599 else
600 pll_val = 0x00000000;
601
602 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_val);
603
604 /* Wait for acknowledgment from PHY. */
605 ret = regmap_read_poll_timeout(regmap,
606 PHY_PMA_XCVR_PLLCLK_EN_ACK,
607 rd_val,
608 (rd_val & pll_bits) == pll_val,
609 0, POLL_TIMEOUT_US);
610 ndelay(100);
611 return ret;
612 }
613
614 /*
615 * Perform register operations related to setting link rate, once powerstate is
616 * set and PLL disable request was processed.
617 */
618 static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy *cdns_phy,
619 struct phy_configure_opts_dp *dp)
620 {
621 u32 ret;
622 u32 read_val;
623
624 /* Disable the cmn_pll0_en before re-programming the new data rate. */
625 regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, 0x0);
626
627 /*
628 * Wait for PLL ready de-assertion.
629 * For PLL0 - PHY_PMA_CMN_CTRL2[2] == 1
630 */
631 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
632 read_val,
633 ((read_val >> 2) & 0x01) != 0,
634 0, POLL_TIMEOUT_US);
635 if (ret)
636 return ret;
637 ndelay(200);
638
639 /* DP Rate Change - VCO Output settings. */
640 if (cdns_phy->ref_clk_rate == REF_CLK_19_2MHz) {
641 /* PMA common configuration 19.2MHz */
642 cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy, dp->link_rate,
643 dp->ssc);
644 cdns_torrent_dp_pma_cmn_cfg_19_2mhz(cdns_phy);
645 } else if (cdns_phy->ref_clk_rate == REF_CLK_25MHz) {
646 /* PMA common configuration 25MHz */
647 cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy, dp->link_rate,
648 dp->ssc);
649 cdns_torrent_dp_pma_cmn_cfg_25mhz(cdns_phy);
650 }
651 cdns_torrent_dp_pma_cmn_rate(cdns_phy, dp->link_rate, dp->lanes);
652
653 /* Enable the cmn_pll0_en. */
654 regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, 0x3);
655
656 /*
657 * Wait for PLL ready assertion.
658 * For PLL0 - PHY_PMA_CMN_CTRL2[0] == 1
659 */
660 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
661 read_val,
662 (read_val & 0x01) != 0,
663 0, POLL_TIMEOUT_US);
664 return ret;
665 }
666
667 /*
668 * Verify, that parameters to configure PHY with are correct.
669 */
670 static int cdns_torrent_dp_verify_config(struct cdns_torrent_inst *inst,
671 struct phy_configure_opts_dp *dp)
672 {
673 u8 i;
674
675 /* If changing link rate was required, verify it's supported. */
676 if (dp->set_rate) {
677 switch (dp->link_rate) {
678 case 1620:
679 case 2160:
680 case 2430:
681 case 2700:
682 case 3240:
683 case 4320:
684 case 5400:
685 case 8100:
686 /* valid bit rate */
687 break;
688 default:
689 return -EINVAL;
690 }
691 }
692
693 /* Verify lane count. */
694 switch (dp->lanes) {
695 case 1:
696 case 2:
697 case 4:
698 /* valid lane count. */
699 break;
700 default:
701 return -EINVAL;
702 }
703
704 /* Check against actual number of PHY's lanes. */
705 if (dp->lanes > inst->num_lanes)
706 return -EINVAL;
707
708 /*
709 * If changing voltages is required, check swing and pre-emphasis
710 * levels, per-lane.
711 */
712 if (dp->set_voltages) {
713 /* Lane count verified previously. */
714 for (i = 0; i < dp->lanes; i++) {
715 if (dp->voltage[i] > 3 || dp->pre[i] > 3)
716 return -EINVAL;
717
718 /* Sum of voltage swing and pre-emphasis levels cannot
719 * exceed 3.
720 */
721 if (dp->voltage[i] + dp->pre[i] > 3)
722 return -EINVAL;
723 }
724 }
725
726 return 0;
727 }
728
729 /* Set power state A0 and PLL clock enable to 0 on enabled lanes. */
730 static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy,
731 u32 num_lanes)
732 {
733 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
734 u32 pwr_state = cdns_torrent_dp_read(regmap,
735 PHY_PMA_XCVR_POWER_STATE_REQ);
736 u32 pll_clk_en = cdns_torrent_dp_read(regmap,
737 PHY_PMA_XCVR_PLLCLK_EN);
738
739 /* Lane 0 is always enabled. */
740 pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
741 PHY_POWER_STATE_LN_0);
742 pll_clk_en &= ~0x01U;
743
744 if (num_lanes > 1) {
745 /* lane 1 */
746 pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
747 PHY_POWER_STATE_LN_1);
748 pll_clk_en &= ~(0x01U << 1);
749 }
750
751 if (num_lanes > 2) {
752 /* lanes 2 and 3 */
753 pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
754 PHY_POWER_STATE_LN_2);
755 pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
756 PHY_POWER_STATE_LN_3);
757 pll_clk_en &= ~(0x01U << 2);
758 pll_clk_en &= ~(0x01U << 3);
759 }
760
761 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, pwr_state);
762 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_clk_en);
763 }
764
765 /* Configure lane count as required. */
766 static int cdns_torrent_dp_set_lanes(struct cdns_torrent_phy *cdns_phy,
767 struct phy_configure_opts_dp *dp)
768 {
769 u32 value;
770 u32 ret;
771 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
772 u8 lane_mask = (1 << dp->lanes) - 1;
773
774 value = cdns_torrent_dp_read(regmap, PHY_RESET);
775 /* clear pma_tx_elec_idle_ln_* bits. */
776 value &= ~PMA_TX_ELEC_IDLE_MASK;
777 /* Assert pma_tx_elec_idle_ln_* for disabled lanes. */
778 value |= ((~lane_mask) << PMA_TX_ELEC_IDLE_SHIFT) &
779 PMA_TX_ELEC_IDLE_MASK;
780 cdns_torrent_dp_write(regmap, PHY_RESET, value);
781
782 /* reset the link by asserting phy_l00_reset_n low */
783 cdns_torrent_dp_write(regmap, PHY_RESET,
784 value & (~PHY_L00_RESET_N_MASK));
785
786 /*
787 * Assert lane reset on unused lanes and lane 0 so they remain in reset
788 * and powered down when re-enabling the link
789 */
790 value = (value & 0x0000FFF0) | (0x0000000E & lane_mask);
791 cdns_torrent_dp_write(regmap, PHY_RESET, value);
792
793 cdns_torrent_dp_set_a0_pll(cdns_phy, dp->lanes);
794
795 /* release phy_l0*_reset_n based on used laneCount */
796 value = (value & 0x0000FFF0) | (0x0000000F & lane_mask);
797 cdns_torrent_dp_write(regmap, PHY_RESET, value);
798
799 /* Wait, until PHY gets ready after releasing PHY reset signal. */
800 ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
801 if (ret)
802 return ret;
803
804 ndelay(100);
805
806 /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
807 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, 0x0001);
808
809 ret = cdns_torrent_dp_run(cdns_phy, dp->lanes);
810
811 return ret;
812 }
813
814 /* Configure link rate as required. */
815 static int cdns_torrent_dp_set_rate(struct cdns_torrent_phy *cdns_phy,
816 struct phy_configure_opts_dp *dp)
817 {
818 u32 ret;
819
820 ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
821 POWERSTATE_A3);
822 if (ret)
823 return ret;
824 ret = cdns_torrent_dp_set_pll_en(cdns_phy, dp, false);
825 if (ret)
826 return ret;
827 ndelay(200);
828
829 ret = cdns_torrent_dp_configure_rate(cdns_phy, dp);
830 if (ret)
831 return ret;
832 ndelay(200);
833
834 ret = cdns_torrent_dp_set_pll_en(cdns_phy, dp, true);
835 if (ret)
836 return ret;
837 ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
838 POWERSTATE_A2);
839 if (ret)
840 return ret;
841 ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
842 POWERSTATE_A0);
843 if (ret)
844 return ret;
845 ndelay(900);
846
847 return ret;
848 }
849
850 /* Configure voltage swing and pre-emphasis for all enabled lanes. */
851 static void cdns_torrent_dp_set_voltages(struct cdns_torrent_phy *cdns_phy,
852 struct phy_configure_opts_dp *dp)
853 {
854 u8 lane;
855 u16 val;
856
857 for (lane = 0; lane < dp->lanes; lane++) {
858 val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[lane],
859 TX_DIAG_ACYA);
860 /*
861 * Write 1 to register bit TX_DIAG_ACYA[0] to freeze the
862 * current state of the analog TX driver.
863 */
864 val |= TX_DIAG_ACYA_HBDC_MASK;
865 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
866 TX_DIAG_ACYA, val);
867
868 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
869 TX_TXCC_CTRL, 0x08A4);
870 val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].diag_tx_drv;
871 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
872 DRV_DIAG_TX_DRV, val);
873 val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].mgnfs_mult;
874 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
875 TX_TXCC_MGNFS_MULT_000,
876 val);
877 val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].cpost_mult;
878 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
879 TX_TXCC_CPOST_MULT_00,
880 val);
881
882 val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[lane],
883 TX_DIAG_ACYA);
884 /*
885 * Write 0 to register bit TX_DIAG_ACYA[0] to allow the state of
886 * analog TX driver to reflect the new programmed one.
887 */
888 val &= ~TX_DIAG_ACYA_HBDC_MASK;
889 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
890 TX_DIAG_ACYA, val);
891 }
892 };
893
894 static int cdns_torrent_dp_configure(struct phy *phy,
895 union phy_configure_opts *opts)
896 {
897 struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
898 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
899 int ret;
900
901 ret = cdns_torrent_dp_verify_config(inst, &opts->dp);
902 if (ret) {
903 dev_err(&phy->dev, "invalid params for phy configure\n");
904 return ret;
905 }
906
907 if (opts->dp.set_lanes) {
908 ret = cdns_torrent_dp_set_lanes(cdns_phy, &opts->dp);
909 if (ret) {
910 dev_err(&phy->dev, "cdns_torrent_dp_set_lanes failed\n");
911 return ret;
912 }
913 }
914
915 if (opts->dp.set_rate) {
916 ret = cdns_torrent_dp_set_rate(cdns_phy, &opts->dp);
917 if (ret) {
918 dev_err(&phy->dev, "cdns_torrent_dp_set_rate failed\n");
919 return ret;
920 }
921 }
922
923 if (opts->dp.set_voltages)
924 cdns_torrent_dp_set_voltages(cdns_phy, &opts->dp);
925
926 return ret;
927 }
928
929 static int cdns_torrent_dp_init(struct phy *phy)
930 {
931 unsigned char lane_bits;
932 int ret;
933 struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
934 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
935 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
936
937 switch (cdns_phy->ref_clk_rate) {
938 case REF_CLK_19_2MHz:
939 case REF_CLK_25MHz:
940 /* Valid Ref Clock Rate */
941 break;
942 default:
943 dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n");
944 return -EINVAL;
945 }
946
947 cdns_torrent_dp_write(regmap, PHY_AUX_CTRL, 0x0003); /* enable AUX */
948
949 /* PHY PMA registers configuration function */
950 cdns_torrent_dp_pma_cfg(cdns_phy, inst);
951
952 /*
953 * Set lines power state to A0
954 * Set lines pll clk enable to 0
955 */
956 cdns_torrent_dp_set_a0_pll(cdns_phy, inst->num_lanes);
957
958 /*
959 * release phy_l0*_reset_n and pma_tx_elec_idle_ln_* based on
960 * used lanes
961 */
962 lane_bits = (1 << inst->num_lanes) - 1;
963 cdns_torrent_dp_write(regmap, PHY_RESET,
964 ((0xF & ~lane_bits) << 4) | (0xF & lane_bits));
965
966 /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
967 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, 0x0001);
968
969 /* PHY PMA registers configuration functions */
970 /* Initialize PHY with max supported link rate, without SSC. */
971 if (cdns_phy->ref_clk_rate == REF_CLK_19_2MHz)
972 cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy,
973 cdns_phy->max_bit_rate,
974 false);
975 else if (cdns_phy->ref_clk_rate == REF_CLK_25MHz)
976 cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy,
977 cdns_phy->max_bit_rate,
978 false);
979 cdns_torrent_dp_pma_cmn_rate(cdns_phy, cdns_phy->max_bit_rate,
980 inst->num_lanes);
981
982 /* take out of reset */
983 regmap_field_write(cdns_phy->phy_reset_ctrl, 0x1);
984
985 cdns_torrent_phy_on(phy);
986
987 ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
988 if (ret)
989 return ret;
990
991 ret = cdns_torrent_dp_run(cdns_phy, inst->num_lanes);
992
993 return ret;
994 }
995
996 static
997 int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy *cdns_phy)
998 {
999 unsigned int reg;
1000 int ret;
1001 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1002
1003 ret = regmap_read_poll_timeout(regmap, PHY_PMA_CMN_READY, reg,
1004 reg & 1, 0, POLL_TIMEOUT_US);
1005 if (ret == -ETIMEDOUT) {
1006 dev_err(cdns_phy->dev,
1007 "timeout waiting for PMA common ready\n");
1008 return -ETIMEDOUT;
1009 }
1010
1011 return 0;
1012 }
1013
1014 static void cdns_torrent_dp_pma_cfg(struct cdns_torrent_phy *cdns_phy,
1015 struct cdns_torrent_inst *inst)
1016 {
1017 unsigned int i;
1018
1019 if (cdns_phy->ref_clk_rate == REF_CLK_19_2MHz)
1020 /* PMA common configuration 19.2MHz */
1021 cdns_torrent_dp_pma_cmn_cfg_19_2mhz(cdns_phy);
1022 else if (cdns_phy->ref_clk_rate == REF_CLK_25MHz)
1023 /* PMA common configuration 25MHz */
1024 cdns_torrent_dp_pma_cmn_cfg_25mhz(cdns_phy);
1025
1026 /* PMA lane configuration to deal with multi-link operation */
1027 for (i = 0; i < inst->num_lanes; i++)
1028 cdns_torrent_dp_pma_lane_cfg(cdns_phy, i);
1029 }
1030
1031 static
1032 void cdns_torrent_dp_pma_cmn_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy)
1033 {
1034 struct regmap *regmap = cdns_phy->regmap_common_cdb;
1035
1036 /* refclock registers - assumes 19.2 MHz refclock */
1037 cdns_torrent_phy_write(regmap, CMN_SSM_BIAS_TMR, 0x0014);
1038 cdns_torrent_phy_write(regmap, CMN_PLLSM0_PLLPRE_TMR, 0x0027);
1039 cdns_torrent_phy_write(regmap, CMN_PLLSM0_PLLLOCK_TMR, 0x00A1);
1040 cdns_torrent_phy_write(regmap, CMN_PLLSM1_PLLPRE_TMR, 0x0027);
1041 cdns_torrent_phy_write(regmap, CMN_PLLSM1_PLLLOCK_TMR, 0x00A1);
1042 cdns_torrent_phy_write(regmap, CMN_BGCAL_INIT_TMR, 0x0060);
1043 cdns_torrent_phy_write(regmap, CMN_BGCAL_ITER_TMR, 0x0060);
1044 cdns_torrent_phy_write(regmap, CMN_IBCAL_INIT_TMR, 0x0014);
1045 cdns_torrent_phy_write(regmap, CMN_TXPUCAL_INIT_TMR, 0x0018);
1046 cdns_torrent_phy_write(regmap, CMN_TXPUCAL_ITER_TMR, 0x0005);
1047 cdns_torrent_phy_write(regmap, CMN_TXPDCAL_INIT_TMR, 0x0018);
1048 cdns_torrent_phy_write(regmap, CMN_TXPDCAL_ITER_TMR, 0x0005);
1049 cdns_torrent_phy_write(regmap, CMN_RXCAL_INIT_TMR, 0x0240);
1050 cdns_torrent_phy_write(regmap, CMN_RXCAL_ITER_TMR, 0x0005);
1051 cdns_torrent_phy_write(regmap, CMN_SD_CAL_INIT_TMR, 0x0002);
1052 cdns_torrent_phy_write(regmap, CMN_SD_CAL_ITER_TMR, 0x0002);
1053 cdns_torrent_phy_write(regmap, CMN_SD_CAL_REFTIM_START, 0x000B);
1054 cdns_torrent_phy_write(regmap, CMN_SD_CAL_PLLCNT_START, 0x0137);
1055
1056 /* PLL registers */
1057 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
1058 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
1059 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
1060 cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
1061 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
1062 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
1063 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
1064 cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
1065 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_INIT_TMR, 0x00C0);
1066 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_ITER_TMR, 0x0004);
1067 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_INIT_TMR, 0x00C0);
1068 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_ITER_TMR, 0x0004);
1069 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_REFTIM_START, 0x0260);
1070 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_TCTRL, 0x0003);
1071 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_REFTIM_START, 0x0260);
1072 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_TCTRL, 0x0003);
1073 }
1074
1075 /*
1076 * Set registers responsible for enabling and configuring SSC, with second and
1077 * third register values provided by parameters.
1078 */
1079 static
1080 void cdns_torrent_dp_enable_ssc_19_2mhz(struct cdns_torrent_phy *cdns_phy,
1081 u32 ctrl2_val, u32 ctrl3_val)
1082 {
1083 struct regmap *regmap = cdns_phy->regmap_common_cdb;
1084
1085 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
1086 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
1087 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl3_val);
1088 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
1089 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
1090 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
1091 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl3_val);
1092 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
1093 }
1094
1095 static
1096 void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy,
1097 u32 rate, bool ssc)
1098 {
1099 struct regmap *regmap = cdns_phy->regmap_common_cdb;
1100
1101 /* Assumes 19.2 MHz refclock */
1102 switch (rate) {
1103 /* Setting VCO for 10.8GHz */
1104 case 2700:
1105 case 5400:
1106 cdns_torrent_phy_write(regmap,
1107 CMN_PLL0_INTDIV_M0, 0x0119);
1108 cdns_torrent_phy_write(regmap,
1109 CMN_PLL0_FRACDIVL_M0, 0x4000);
1110 cdns_torrent_phy_write(regmap,
1111 CMN_PLL0_FRACDIVH_M0, 0x0002);
1112 cdns_torrent_phy_write(regmap,
1113 CMN_PLL0_HIGH_THR_M0, 0x00BC);
1114 cdns_torrent_phy_write(regmap,
1115 CMN_PDIAG_PLL0_CTRL_M0, 0x0012);
1116 cdns_torrent_phy_write(regmap,
1117 CMN_PLL1_INTDIV_M0, 0x0119);
1118 cdns_torrent_phy_write(regmap,
1119 CMN_PLL1_FRACDIVL_M0, 0x4000);
1120 cdns_torrent_phy_write(regmap,
1121 CMN_PLL1_FRACDIVH_M0, 0x0002);
1122 cdns_torrent_phy_write(regmap,
1123 CMN_PLL1_HIGH_THR_M0, 0x00BC);
1124 cdns_torrent_phy_write(regmap,
1125 CMN_PDIAG_PLL1_CTRL_M0, 0x0012);
1126 if (ssc)
1127 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x033A,
1128 0x006A);
1129 break;
1130 /* Setting VCO for 9.72GHz */
1131 case 1620:
1132 case 2430:
1133 case 3240:
1134 cdns_torrent_phy_write(regmap,
1135 CMN_PLL0_INTDIV_M0, 0x01FA);
1136 cdns_torrent_phy_write(regmap,
1137 CMN_PLL0_FRACDIVL_M0, 0x4000);
1138 cdns_torrent_phy_write(regmap,
1139 CMN_PLL0_FRACDIVH_M0, 0x0002);
1140 cdns_torrent_phy_write(regmap,
1141 CMN_PLL0_HIGH_THR_M0, 0x0152);
1142 cdns_torrent_phy_write(regmap,
1143 CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
1144 cdns_torrent_phy_write(regmap,
1145 CMN_PLL1_INTDIV_M0, 0x01FA);
1146 cdns_torrent_phy_write(regmap,
1147 CMN_PLL1_FRACDIVL_M0, 0x4000);
1148 cdns_torrent_phy_write(regmap,
1149 CMN_PLL1_FRACDIVH_M0, 0x0002);
1150 cdns_torrent_phy_write(regmap,
1151 CMN_PLL1_HIGH_THR_M0, 0x0152);
1152 cdns_torrent_phy_write(regmap,
1153 CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
1154 if (ssc)
1155 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x05DD,
1156 0x0069);
1157 break;
1158 /* Setting VCO for 8.64GHz */
1159 case 2160:
1160 case 4320:
1161 cdns_torrent_phy_write(regmap,
1162 CMN_PLL0_INTDIV_M0, 0x01C2);
1163 cdns_torrent_phy_write(regmap,
1164 CMN_PLL0_FRACDIVL_M0, 0x0000);
1165 cdns_torrent_phy_write(regmap,
1166 CMN_PLL0_FRACDIVH_M0, 0x0002);
1167 cdns_torrent_phy_write(regmap,
1168 CMN_PLL0_HIGH_THR_M0, 0x012C);
1169 cdns_torrent_phy_write(regmap,
1170 CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
1171 cdns_torrent_phy_write(regmap,
1172 CMN_PLL1_INTDIV_M0, 0x01C2);
1173 cdns_torrent_phy_write(regmap,
1174 CMN_PLL1_FRACDIVL_M0, 0x0000);
1175 cdns_torrent_phy_write(regmap,
1176 CMN_PLL1_FRACDIVH_M0, 0x0002);
1177 cdns_torrent_phy_write(regmap,
1178 CMN_PLL1_HIGH_THR_M0, 0x012C);
1179 cdns_torrent_phy_write(regmap,
1180 CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
1181 if (ssc)
1182 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x0536,
1183 0x0069);
1184 break;
1185 /* Setting VCO for 8.1GHz */
1186 case 8100:
1187 cdns_torrent_phy_write(regmap,
1188 CMN_PLL0_INTDIV_M0, 0x01A5);
1189 cdns_torrent_phy_write(regmap,
1190 CMN_PLL0_FRACDIVL_M0, 0xE000);
1191 cdns_torrent_phy_write(regmap,
1192 CMN_PLL0_FRACDIVH_M0, 0x0002);
1193 cdns_torrent_phy_write(regmap,
1194 CMN_PLL0_HIGH_THR_M0, 0x011A);
1195 cdns_torrent_phy_write(regmap,
1196 CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
1197 cdns_torrent_phy_write(regmap,
1198 CMN_PLL1_INTDIV_M0, 0x01A5);
1199 cdns_torrent_phy_write(regmap,
1200 CMN_PLL1_FRACDIVL_M0, 0xE000);
1201 cdns_torrent_phy_write(regmap,
1202 CMN_PLL1_FRACDIVH_M0, 0x0002);
1203 cdns_torrent_phy_write(regmap,
1204 CMN_PLL1_HIGH_THR_M0, 0x011A);
1205 cdns_torrent_phy_write(regmap,
1206 CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
1207 if (ssc)
1208 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x04D7,
1209 0x006A);
1210 break;
1211 }
1212
1213 if (ssc) {
1214 cdns_torrent_phy_write(regmap,
1215 CMN_PLL0_VCOCAL_PLLCNT_START, 0x025E);
1216 cdns_torrent_phy_write(regmap,
1217 CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
1218 cdns_torrent_phy_write(regmap,
1219 CMN_PLL1_VCOCAL_PLLCNT_START, 0x025E);
1220 cdns_torrent_phy_write(regmap,
1221 CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
1222 } else {
1223 cdns_torrent_phy_write(regmap,
1224 CMN_PLL0_VCOCAL_PLLCNT_START, 0x0260);
1225 cdns_torrent_phy_write(regmap,
1226 CMN_PLL1_VCOCAL_PLLCNT_START, 0x0260);
1227 /* Set reset register values to disable SSC */
1228 cdns_torrent_phy_write(regmap,
1229 CMN_PLL0_SS_CTRL1_M0, 0x0002);
1230 cdns_torrent_phy_write(regmap,
1231 CMN_PLL0_SS_CTRL2_M0, 0x0000);
1232 cdns_torrent_phy_write(regmap,
1233 CMN_PLL0_SS_CTRL3_M0, 0x0000);
1234 cdns_torrent_phy_write(regmap,
1235 CMN_PLL0_SS_CTRL4_M0, 0x0000);
1236 cdns_torrent_phy_write(regmap,
1237 CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
1238 cdns_torrent_phy_write(regmap,
1239 CMN_PLL1_SS_CTRL1_M0, 0x0002);
1240 cdns_torrent_phy_write(regmap,
1241 CMN_PLL1_SS_CTRL2_M0, 0x0000);
1242 cdns_torrent_phy_write(regmap,
1243 CMN_PLL1_SS_CTRL3_M0, 0x0000);
1244 cdns_torrent_phy_write(regmap,
1245 CMN_PLL1_SS_CTRL4_M0, 0x0000);
1246 cdns_torrent_phy_write(regmap,
1247 CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
1248 }
1249
1250 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x0099);
1251 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x0099);
1252 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x0099);
1253 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x0099);
1254 }
1255
1256 static
1257 void cdns_torrent_dp_pma_cmn_cfg_25mhz(struct cdns_torrent_phy *cdns_phy)
1258 {
1259 struct regmap *regmap = cdns_phy->regmap_common_cdb;
1260
1261 /* refclock registers - assumes 25 MHz refclock */
1262 cdns_torrent_phy_write(regmap, CMN_SSM_BIAS_TMR, 0x0019);
1263 cdns_torrent_phy_write(regmap, CMN_PLLSM0_PLLPRE_TMR, 0x0032);
1264 cdns_torrent_phy_write(regmap, CMN_PLLSM0_PLLLOCK_TMR, 0x00D1);
1265 cdns_torrent_phy_write(regmap, CMN_PLLSM1_PLLPRE_TMR, 0x0032);
1266 cdns_torrent_phy_write(regmap, CMN_PLLSM1_PLLLOCK_TMR, 0x00D1);
1267 cdns_torrent_phy_write(regmap, CMN_BGCAL_INIT_TMR, 0x007D);
1268 cdns_torrent_phy_write(regmap, CMN_BGCAL_ITER_TMR, 0x007D);
1269 cdns_torrent_phy_write(regmap, CMN_IBCAL_INIT_TMR, 0x0019);
1270 cdns_torrent_phy_write(regmap, CMN_TXPUCAL_INIT_TMR, 0x001E);
1271 cdns_torrent_phy_write(regmap, CMN_TXPUCAL_ITER_TMR, 0x0006);
1272 cdns_torrent_phy_write(regmap, CMN_TXPDCAL_INIT_TMR, 0x001E);
1273 cdns_torrent_phy_write(regmap, CMN_TXPDCAL_ITER_TMR, 0x0006);
1274 cdns_torrent_phy_write(regmap, CMN_RXCAL_INIT_TMR, 0x02EE);
1275 cdns_torrent_phy_write(regmap, CMN_RXCAL_ITER_TMR, 0x0006);
1276 cdns_torrent_phy_write(regmap, CMN_SD_CAL_INIT_TMR, 0x0002);
1277 cdns_torrent_phy_write(regmap, CMN_SD_CAL_ITER_TMR, 0x0002);
1278 cdns_torrent_phy_write(regmap, CMN_SD_CAL_REFTIM_START, 0x000E);
1279 cdns_torrent_phy_write(regmap, CMN_SD_CAL_PLLCNT_START, 0x012B);
1280
1281 /* PLL registers */
1282 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
1283 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
1284 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
1285 cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
1286 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
1287 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
1288 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
1289 cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
1290 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_INIT_TMR, 0x00FA);
1291 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_ITER_TMR, 0x0004);
1292 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_INIT_TMR, 0x00FA);
1293 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_ITER_TMR, 0x0004);
1294 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_REFTIM_START, 0x0317);
1295 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_TCTRL, 0x0003);
1296 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_REFTIM_START, 0x0317);
1297 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_TCTRL, 0x0003);
1298 }
1299
1300 /*
1301 * Set registers responsible for enabling and configuring SSC, with second
1302 * register value provided by a parameter.
1303 */
1304 static void cdns_torrent_dp_enable_ssc_25mhz(struct cdns_torrent_phy *cdns_phy,
1305 u32 ctrl2_val)
1306 {
1307 struct regmap *regmap = cdns_phy->regmap_common_cdb;
1308
1309 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
1310 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
1311 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x007F);
1312 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
1313 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
1314 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
1315 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x007F);
1316 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
1317 }
1318
1319 static
1320 void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy *cdns_phy,
1321 u32 rate, bool ssc)
1322 {
1323 struct regmap *regmap = cdns_phy->regmap_common_cdb;
1324
1325 /* Assumes 25 MHz refclock */
1326 switch (rate) {
1327 /* Setting VCO for 10.8GHz */
1328 case 2700:
1329 case 5400:
1330 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01B0);
1331 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
1332 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
1333 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0120);
1334 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01B0);
1335 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
1336 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
1337 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0120);
1338 if (ssc)
1339 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x0423);
1340 break;
1341 /* Setting VCO for 9.72GHz */
1342 case 1620:
1343 case 2430:
1344 case 3240:
1345 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0184);
1346 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xCCCD);
1347 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
1348 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0104);
1349 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0184);
1350 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xCCCD);
1351 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
1352 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0104);
1353 if (ssc)
1354 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x03B9);
1355 break;
1356 /* Setting VCO for 8.64GHz */
1357 case 2160:
1358 case 4320:
1359 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0159);
1360 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x999A);
1361 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
1362 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00E7);
1363 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0159);
1364 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x999A);
1365 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
1366 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00E7);
1367 if (ssc)
1368 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x034F);
1369 break;
1370 /* Setting VCO for 8.1GHz */
1371 case 8100:
1372 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0144);
1373 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
1374 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
1375 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00D8);
1376 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0144);
1377 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
1378 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
1379 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00D8);
1380 if (ssc)
1381 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x031A);
1382 break;
1383 }
1384
1385 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
1386 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
1387
1388 if (ssc) {
1389 cdns_torrent_phy_write(regmap,
1390 CMN_PLL0_VCOCAL_PLLCNT_START, 0x0315);
1391 cdns_torrent_phy_write(regmap,
1392 CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
1393 cdns_torrent_phy_write(regmap,
1394 CMN_PLL1_VCOCAL_PLLCNT_START, 0x0315);
1395 cdns_torrent_phy_write(regmap,
1396 CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
1397 } else {
1398 cdns_torrent_phy_write(regmap,
1399 CMN_PLL0_VCOCAL_PLLCNT_START, 0x0317);
1400 cdns_torrent_phy_write(regmap,
1401 CMN_PLL1_VCOCAL_PLLCNT_START, 0x0317);
1402 /* Set reset register values to disable SSC */
1403 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002);
1404 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000);
1405 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000);
1406 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000);
1407 cdns_torrent_phy_write(regmap,
1408 CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
1409 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002);
1410 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000);
1411 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000);
1412 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000);
1413 cdns_torrent_phy_write(regmap,
1414 CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
1415 }
1416
1417 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x00C7);
1418 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x00C7);
1419 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x00C7);
1420 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x00C7);
1421 }
1422
1423 static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
1424 u32 rate, u32 num_lanes)
1425 {
1426 unsigned int clk_sel_val = 0;
1427 unsigned int hsclk_div_val = 0;
1428 unsigned int i;
1429
1430 /* 16'h0000 for single DP link configuration */
1431 regmap_field_write(cdns_phy->phy_pll_cfg, 0x0);
1432
1433 switch (rate) {
1434 case 1620:
1435 clk_sel_val = 0x0f01;
1436 hsclk_div_val = 2;
1437 break;
1438 case 2160:
1439 case 2430:
1440 case 2700:
1441 clk_sel_val = 0x0701;
1442 hsclk_div_val = 1;
1443 break;
1444 case 3240:
1445 clk_sel_val = 0x0b00;
1446 hsclk_div_val = 2;
1447 break;
1448 case 4320:
1449 case 5400:
1450 clk_sel_val = 0x0301;
1451 hsclk_div_val = 0;
1452 break;
1453 case 8100:
1454 clk_sel_val = 0x0200;
1455 hsclk_div_val = 0;
1456 break;
1457 }
1458
1459 cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
1460 CMN_PDIAG_PLL0_CLK_SEL_M0, clk_sel_val);
1461 cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
1462 CMN_PDIAG_PLL1_CLK_SEL_M0, clk_sel_val);
1463
1464 /* PMA lane configuration to deal with multi-link operation */
1465 for (i = 0; i < num_lanes; i++)
1466 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[i],
1467 XCVR_DIAG_HSCLK_DIV, hsclk_div_val);
1468 }
1469
1470 static void cdns_torrent_dp_pma_lane_cfg(struct cdns_torrent_phy *cdns_phy,
1471 unsigned int lane)
1472 {
1473 /* Per lane, refclock-dependent receiver detection setting */
1474 if (cdns_phy->ref_clk_rate == REF_CLK_19_2MHz)
1475 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1476 TX_RCVDET_ST_TMR, 0x0780);
1477 else if (cdns_phy->ref_clk_rate == REF_CLK_25MHz)
1478 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1479 TX_RCVDET_ST_TMR, 0x09C4);
1480
1481 /* Writing Tx/Rx Power State Controllers registers */
1482 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1483 TX_PSC_A0, 0x00FB);
1484 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1485 TX_PSC_A2, 0x04AA);
1486 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1487 TX_PSC_A3, 0x04AA);
1488 cdns_torrent_phy_write(cdns_phy->regmap_rx_lane_cdb[lane],
1489 RX_PSC_A0, 0x0000);
1490 cdns_torrent_phy_write(cdns_phy->regmap_rx_lane_cdb[lane],
1491 RX_PSC_A2, 0x0000);
1492 cdns_torrent_phy_write(cdns_phy->regmap_rx_lane_cdb[lane],
1493 RX_PSC_A3, 0x0000);
1494
1495 cdns_torrent_phy_write(cdns_phy->regmap_rx_lane_cdb[lane],
1496 RX_PSC_CAL, 0x0000);
1497
1498 cdns_torrent_phy_write(cdns_phy->regmap_rx_lane_cdb[lane],
1499 RX_REE_GCSM1_CTRL, 0x0000);
1500 cdns_torrent_phy_write(cdns_phy->regmap_rx_lane_cdb[lane],
1501 RX_REE_GCSM2_CTRL, 0x0000);
1502 cdns_torrent_phy_write(cdns_phy->regmap_rx_lane_cdb[lane],
1503 RX_REE_PERGCSM_CTRL, 0x0000);
1504
1505 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1506 XCVR_DIAG_BIDI_CTRL, 0x000F);
1507 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1508 XCVR_DIAG_PLLDRC_CTRL, 0x0001);
1509 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1510 XCVR_DIAG_HSCLK_SEL, 0x0000);
1511 }
1512
1513 static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
1514 u32 num_lanes,
1515 enum phy_powerstate powerstate)
1516 {
1517 /* Register value for power state for a single byte. */
1518 u32 value_part;
1519 u32 value;
1520 u32 mask;
1521 u32 read_val;
1522 u32 ret;
1523 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1524
1525 switch (powerstate) {
1526 case (POWERSTATE_A0):
1527 value_part = 0x01U;
1528 break;
1529 case (POWERSTATE_A2):
1530 value_part = 0x04U;
1531 break;
1532 default:
1533 /* Powerstate A3 */
1534 value_part = 0x08U;
1535 break;
1536 }
1537
1538 /* Select values of registers and mask, depending on enabled
1539 * lane count.
1540 */
1541 switch (num_lanes) {
1542 /* lane 0 */
1543 case (1):
1544 value = value_part;
1545 mask = 0x0000003FU;
1546 break;
1547 /* lanes 0-1 */
1548 case (2):
1549 value = (value_part
1550 | (value_part << 8));
1551 mask = 0x00003F3FU;
1552 break;
1553 /* lanes 0-3, all */
1554 default:
1555 value = (value_part
1556 | (value_part << 8)
1557 | (value_part << 16)
1558 | (value_part << 24));
1559 mask = 0x3F3F3F3FU;
1560 break;
1561 }
1562
1563 /* Set power state A<n>. */
1564 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, value);
1565 /* Wait, until PHY acknowledges power state completion. */
1566 ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_POWER_STATE_ACK,
1567 read_val, (read_val & mask) == value, 0,
1568 POLL_TIMEOUT_US);
1569 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, 0x00000000);
1570 ndelay(100);
1571
1572 return ret;
1573 }
1574
1575 static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy, u32 num_lanes)
1576 {
1577 unsigned int read_val;
1578 int ret;
1579 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1580
1581 /*
1582 * waiting for ACK of pma_xcvr_pllclk_en_ln_*, only for the
1583 * master lane
1584 */
1585 ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_PLLCLK_EN_ACK,
1586 read_val, read_val & 1,
1587 0, POLL_TIMEOUT_US);
1588 if (ret == -ETIMEDOUT) {
1589 dev_err(cdns_phy->dev,
1590 "timeout waiting for link PLL clock enable ack\n");
1591 return ret;
1592 }
1593
1594 ndelay(100);
1595
1596 ret = cdns_torrent_dp_set_power_state(cdns_phy, num_lanes,
1597 POWERSTATE_A2);
1598 if (ret)
1599 return ret;
1600
1601 ret = cdns_torrent_dp_set_power_state(cdns_phy, num_lanes,
1602 POWERSTATE_A0);
1603
1604 return ret;
1605 }
1606
1607 static int cdns_torrent_phy_on(struct phy *phy)
1608 {
1609 struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1610 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1611 u32 read_val;
1612 int ret;
1613
1614 if (cdns_phy->nsubnodes == 1) {
1615 /* Take the PHY lane group out of reset */
1616 reset_control_deassert(inst->lnk_rst);
1617
1618 /* Take the PHY out of reset */
1619 ret = reset_control_deassert(cdns_phy->phy_rst);
1620 if (ret)
1621 return ret;
1622 }
1623
1624 /*
1625 * Wait for cmn_ready assertion
1626 * PHY_PMA_CMN_CTRL1[0] == 1
1627 */
1628 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_1,
1629 read_val, read_val, 1000,
1630 PLL_LOCK_TIMEOUT);
1631 if (ret) {
1632 dev_err(cdns_phy->dev, "Timeout waiting for CMN ready\n");
1633 return ret;
1634 }
1635
1636 mdelay(10);
1637
1638 return 0;
1639 }
1640
1641 static int cdns_torrent_phy_off(struct phy *phy)
1642 {
1643 struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1644 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1645 int ret;
1646
1647 if (cdns_phy->nsubnodes != 1)
1648 return 0;
1649
1650 ret = reset_control_assert(cdns_phy->phy_rst);
1651 if (ret)
1652 return ret;
1653
1654 return reset_control_assert(inst->lnk_rst);
1655 }
1656
1657 static struct regmap *cdns_regmap_init(struct device *dev, void __iomem *base,
1658 u32 block_offset,
1659 u8 reg_offset_shift,
1660 const struct regmap_config *config)
1661 {
1662 struct cdns_regmap_cdb_context *ctx;
1663
1664 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
1665 if (!ctx)
1666 return ERR_PTR(-ENOMEM);
1667
1668 ctx->dev = dev;
1669 ctx->base = base + block_offset;
1670 ctx->reg_offset_shift = reg_offset_shift;
1671
1672 return devm_regmap_init(dev, NULL, ctx, config);
1673 }
1674
1675 static int cdns_torrent_dp_regfield_init(struct cdns_torrent_phy *cdns_phy)
1676 {
1677 struct device *dev = cdns_phy->dev;
1678 struct regmap_field *field;
1679 struct regmap *regmap;
1680
1681 regmap = cdns_phy->regmap_dptx_phy_reg;
1682 field = devm_regmap_field_alloc(dev, regmap, phy_reset_ctrl);
1683 if (IS_ERR(field)) {
1684 dev_err(dev, "PHY_RESET reg field init failed\n");
1685 return PTR_ERR(field);
1686 }
1687 cdns_phy->phy_reset_ctrl = field;
1688
1689 return 0;
1690 }
1691
1692 static int cdns_torrent_regfield_init(struct cdns_torrent_phy *cdns_phy)
1693 {
1694 struct device *dev = cdns_phy->dev;
1695 struct regmap_field *field;
1696 struct regmap *regmap;
1697
1698 regmap = cdns_phy->regmap_phy_pcs_common_cdb;
1699 field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg);
1700 if (IS_ERR(field)) {
1701 dev_err(dev, "PHY_PLL_CFG reg field init failed\n");
1702 return PTR_ERR(field);
1703 }
1704 cdns_phy->phy_pll_cfg = field;
1705
1706 regmap = cdns_phy->regmap_phy_pma_common_cdb;
1707 field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_1);
1708 if (IS_ERR(field)) {
1709 dev_err(dev, "PHY_PMA_CMN_CTRL1 reg field init failed\n");
1710 return PTR_ERR(field);
1711 }
1712 cdns_phy->phy_pma_cmn_ctrl_1 = field;
1713
1714 regmap = cdns_phy->regmap_phy_pma_common_cdb;
1715 field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_2);
1716 if (IS_ERR(field)) {
1717 dev_err(dev, "PHY_PMA_CMN_CTRL2 reg field init failed\n");
1718 return PTR_ERR(field);
1719 }
1720 cdns_phy->phy_pma_cmn_ctrl_2 = field;
1721
1722 regmap = cdns_phy->regmap_phy_pma_common_cdb;
1723 field = devm_regmap_field_alloc(dev, regmap, phy_pma_pll_raw_ctrl);
1724 if (IS_ERR(field)) {
1725 dev_err(dev, "PHY_PMA_PLL_RAW_CTRL reg field init failed\n");
1726 return PTR_ERR(field);
1727 }
1728 cdns_phy->phy_pma_pll_raw_ctrl = field;
1729
1730 return 0;
1731 }
1732
1733 static int cdns_torrent_dp_regmap_init(struct cdns_torrent_phy *cdns_phy)
1734 {
1735 void __iomem *base = cdns_phy->base;
1736 struct device *dev = cdns_phy->dev;
1737 struct regmap *regmap;
1738 u8 reg_offset_shift;
1739 u32 block_offset;
1740
1741 reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
1742
1743 block_offset = TORRENT_DPTX_PHY_OFFSET;
1744 regmap = cdns_regmap_init(dev, base, block_offset,
1745 reg_offset_shift,
1746 &cdns_torrent_dptx_phy_config);
1747 if (IS_ERR(regmap)) {
1748 dev_err(dev, "Failed to init DPTX PHY regmap\n");
1749 return PTR_ERR(regmap);
1750 }
1751 cdns_phy->regmap_dptx_phy_reg = regmap;
1752
1753 return 0;
1754 }
1755
1756 static int cdns_torrent_regmap_init(struct cdns_torrent_phy *cdns_phy)
1757 {
1758 void __iomem *sd_base = cdns_phy->sd_base;
1759 u8 block_offset_shift, reg_offset_shift;
1760 struct device *dev = cdns_phy->dev;
1761 struct regmap *regmap;
1762 u32 block_offset;
1763 int i;
1764
1765 block_offset_shift = cdns_phy->init_data->block_offset_shift;
1766 reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
1767
1768 for (i = 0; i < MAX_NUM_LANES; i++) {
1769 block_offset = TORRENT_TX_LANE_CDB_OFFSET(i, block_offset_shift,
1770 reg_offset_shift);
1771 regmap = cdns_regmap_init(dev, sd_base, block_offset,
1772 reg_offset_shift,
1773 &cdns_torrent_tx_lane_cdb_config[i]);
1774 if (IS_ERR(regmap)) {
1775 dev_err(dev, "Failed to init tx lane CDB regmap\n");
1776 return PTR_ERR(regmap);
1777 }
1778 cdns_phy->regmap_tx_lane_cdb[i] = regmap;
1779
1780 block_offset = TORRENT_RX_LANE_CDB_OFFSET(i, block_offset_shift,
1781 reg_offset_shift);
1782 regmap = cdns_regmap_init(dev, sd_base, block_offset,
1783 reg_offset_shift,
1784 &cdns_torrent_rx_lane_cdb_config[i]);
1785 if (IS_ERR(regmap)) {
1786 dev_err(dev, "Failed to init rx lane CDB regmap\n");
1787 return PTR_ERR(regmap);
1788 }
1789 cdns_phy->regmap_rx_lane_cdb[i] = regmap;
1790 }
1791
1792 block_offset = TORRENT_COMMON_CDB_OFFSET;
1793 regmap = cdns_regmap_init(dev, sd_base, block_offset,
1794 reg_offset_shift,
1795 &cdns_torrent_common_cdb_config);
1796 if (IS_ERR(regmap)) {
1797 dev_err(dev, "Failed to init common CDB regmap\n");
1798 return PTR_ERR(regmap);
1799 }
1800 cdns_phy->regmap_common_cdb = regmap;
1801
1802 block_offset = TORRENT_PHY_PCS_COMMON_OFFSET(block_offset_shift);
1803 regmap = cdns_regmap_init(dev, sd_base, block_offset,
1804 reg_offset_shift,
1805 &cdns_torrent_phy_pcs_cmn_cdb_config);
1806 if (IS_ERR(regmap)) {
1807 dev_err(dev, "Failed to init PHY PCS common CDB regmap\n");
1808 return PTR_ERR(regmap);
1809 }
1810 cdns_phy->regmap_phy_pcs_common_cdb = regmap;
1811
1812 block_offset = TORRENT_PHY_PMA_COMMON_OFFSET(block_offset_shift);
1813 regmap = cdns_regmap_init(dev, sd_base, block_offset,
1814 reg_offset_shift,
1815 &cdns_torrent_phy_pma_cmn_cdb_config);
1816 if (IS_ERR(regmap)) {
1817 dev_err(dev, "Failed to init PHY PMA common CDB regmap\n");
1818 return PTR_ERR(regmap);
1819 }
1820 cdns_phy->regmap_phy_pma_common_cdb = regmap;
1821
1822 return 0;
1823 }
1824
1825 static int cdns_torrent_phy_init(struct phy *phy)
1826 {
1827 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1828 const struct cdns_torrent_data *init_data = cdns_phy->init_data;
1829 struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
1830 struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
1831 struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1832 enum cdns_torrent_phy_type phy_type = inst->phy_type;
1833 enum cdns_torrent_ssc_mode ssc = inst->ssc_mode;
1834 struct cdns_torrent_vals *pcs_cmn_vals;
1835 struct cdns_reg_pairs *reg_pairs;
1836 struct regmap *regmap;
1837 u32 num_regs;
1838 int i, j;
1839
1840 if (cdns_phy->nsubnodes > 1)
1841 return 0;
1842
1843 if (phy_type == TYPE_DP)
1844 return cdns_torrent_dp_init(phy);
1845
1846 /**
1847 * Spread spectrum generation is not required or supported
1848 * for SGMII/QSGMII
1849 */
1850 if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII)
1851 ssc = NO_SSC;
1852
1853 /* PHY configuration specific registers for single link */
1854 link_cmn_vals = init_data->link_cmn_vals[phy_type][TYPE_NONE][ssc];
1855 if (link_cmn_vals) {
1856 reg_pairs = link_cmn_vals->reg_pairs;
1857 num_regs = link_cmn_vals->num_regs;
1858 regmap = cdns_phy->regmap_common_cdb;
1859
1860 /**
1861 * First array value in link_cmn_vals must be of
1862 * PHY_PLL_CFG register
1863 */
1864 regmap_field_write(cdns_phy->phy_pll_cfg, reg_pairs[0].val);
1865
1866 for (i = 1; i < num_regs; i++)
1867 regmap_write(regmap, reg_pairs[i].off,
1868 reg_pairs[i].val);
1869 }
1870
1871 xcvr_diag_vals = init_data->xcvr_diag_vals[phy_type][TYPE_NONE][ssc];
1872 if (xcvr_diag_vals) {
1873 reg_pairs = xcvr_diag_vals->reg_pairs;
1874 num_regs = xcvr_diag_vals->num_regs;
1875 for (i = 0; i < inst->num_lanes; i++) {
1876 regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
1877 for (j = 0; j < num_regs; j++)
1878 regmap_write(regmap, reg_pairs[j].off,
1879 reg_pairs[j].val);
1880 }
1881 }
1882
1883 /* PHY PCS common registers configurations */
1884 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc];
1885 if (pcs_cmn_vals) {
1886 reg_pairs = pcs_cmn_vals->reg_pairs;
1887 num_regs = pcs_cmn_vals->num_regs;
1888 regmap = cdns_phy->regmap_phy_pcs_common_cdb;
1889 for (i = 0; i < num_regs; i++)
1890 regmap_write(regmap, reg_pairs[i].off,
1891 reg_pairs[i].val);
1892 }
1893
1894 /* PMA common registers configurations */
1895 cmn_vals = init_data->cmn_vals[phy_type][TYPE_NONE][ssc];
1896 if (cmn_vals) {
1897 reg_pairs = cmn_vals->reg_pairs;
1898 num_regs = cmn_vals->num_regs;
1899 regmap = cdns_phy->regmap_common_cdb;
1900 for (i = 0; i < num_regs; i++)
1901 regmap_write(regmap, reg_pairs[i].off,
1902 reg_pairs[i].val);
1903 }
1904
1905 /* PMA TX lane registers configurations */
1906 tx_ln_vals = init_data->tx_ln_vals[phy_type][TYPE_NONE][ssc];
1907 if (tx_ln_vals) {
1908 reg_pairs = tx_ln_vals->reg_pairs;
1909 num_regs = tx_ln_vals->num_regs;
1910 for (i = 0; i < inst->num_lanes; i++) {
1911 regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
1912 for (j = 0; j < num_regs; j++)
1913 regmap_write(regmap, reg_pairs[j].off,
1914 reg_pairs[j].val);
1915 }
1916 }
1917
1918 /* PMA RX lane registers configurations */
1919 rx_ln_vals = init_data->rx_ln_vals[phy_type][TYPE_NONE][ssc];
1920 if (rx_ln_vals) {
1921 reg_pairs = rx_ln_vals->reg_pairs;
1922 num_regs = rx_ln_vals->num_regs;
1923 for (i = 0; i < inst->num_lanes; i++) {
1924 regmap = cdns_phy->regmap_rx_lane_cdb[i + inst->mlane];
1925 for (j = 0; j < num_regs; j++)
1926 regmap_write(regmap, reg_pairs[j].off,
1927 reg_pairs[j].val);
1928 }
1929 }
1930
1931 return 0;
1932 }
1933
1934 static
1935 int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy *cdns_phy)
1936 {
1937 const struct cdns_torrent_data *init_data = cdns_phy->init_data;
1938 struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
1939 struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
1940 enum cdns_torrent_phy_type phy_t1, phy_t2, tmp_phy_type;
1941 struct cdns_torrent_vals *pcs_cmn_vals;
1942 int i, j, node, mlane, num_lanes, ret;
1943 struct cdns_reg_pairs *reg_pairs;
1944 enum cdns_torrent_ssc_mode ssc;
1945 struct regmap *regmap;
1946 u32 num_regs;
1947
1948 /* Maximum 2 links (subnodes) are supported */
1949 if (cdns_phy->nsubnodes != 2)
1950 return -EINVAL;
1951
1952 phy_t1 = cdns_phy->phys[0].phy_type;
1953 phy_t2 = cdns_phy->phys[1].phy_type;
1954
1955 /**
1956 * First configure the PHY for first link with phy_t1. Get the array
1957 * values as [phy_t1][phy_t2][ssc].
1958 */
1959 for (node = 0; node < cdns_phy->nsubnodes; node++) {
1960 if (node == 1) {
1961 /**
1962 * If first link with phy_t1 is configured, then
1963 * configure the PHY for second link with phy_t2.
1964 * Get the array values as [phy_t2][phy_t1][ssc].
1965 */
1966 tmp_phy_type = phy_t1;
1967 phy_t1 = phy_t2;
1968 phy_t2 = tmp_phy_type;
1969 }
1970
1971 mlane = cdns_phy->phys[node].mlane;
1972 ssc = cdns_phy->phys[node].ssc_mode;
1973 num_lanes = cdns_phy->phys[node].num_lanes;
1974
1975 /**
1976 * PHY configuration specific registers:
1977 * link_cmn_vals depend on combination of PHY types being
1978 * configured and are common for both PHY types, so array
1979 * values should be same for [phy_t1][phy_t2][ssc] and
1980 * [phy_t2][phy_t1][ssc].
1981 * xcvr_diag_vals also depend on combination of PHY types
1982 * being configured, but these can be different for particular
1983 * PHY type and are per lane.
1984 */
1985 link_cmn_vals = init_data->link_cmn_vals[phy_t1][phy_t2][ssc];
1986 if (link_cmn_vals) {
1987 reg_pairs = link_cmn_vals->reg_pairs;
1988 num_regs = link_cmn_vals->num_regs;
1989 regmap = cdns_phy->regmap_common_cdb;
1990
1991 /**
1992 * First array value in link_cmn_vals must be of
1993 * PHY_PLL_CFG register
1994 */
1995 regmap_field_write(cdns_phy->phy_pll_cfg,
1996 reg_pairs[0].val);
1997
1998 for (i = 1; i < num_regs; i++)
1999 regmap_write(regmap, reg_pairs[i].off,
2000 reg_pairs[i].val);
2001 }
2002
2003 xcvr_diag_vals = init_data->xcvr_diag_vals[phy_t1][phy_t2][ssc];
2004 if (xcvr_diag_vals) {
2005 reg_pairs = xcvr_diag_vals->reg_pairs;
2006 num_regs = xcvr_diag_vals->num_regs;
2007 for (i = 0; i < num_lanes; i++) {
2008 regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
2009 for (j = 0; j < num_regs; j++)
2010 regmap_write(regmap, reg_pairs[j].off,
2011 reg_pairs[j].val);
2012 }
2013 }
2014
2015 /* PHY PCS common registers configurations */
2016 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc];
2017 if (pcs_cmn_vals) {
2018 reg_pairs = pcs_cmn_vals->reg_pairs;
2019 num_regs = pcs_cmn_vals->num_regs;
2020 regmap = cdns_phy->regmap_phy_pcs_common_cdb;
2021 for (i = 0; i < num_regs; i++)
2022 regmap_write(regmap, reg_pairs[i].off,
2023 reg_pairs[i].val);
2024 }
2025
2026 /* PMA common registers configurations */
2027 cmn_vals = init_data->cmn_vals[phy_t1][phy_t2][ssc];
2028 if (cmn_vals) {
2029 reg_pairs = cmn_vals->reg_pairs;
2030 num_regs = cmn_vals->num_regs;
2031 regmap = cdns_phy->regmap_common_cdb;
2032 for (i = 0; i < num_regs; i++)
2033 regmap_write(regmap, reg_pairs[i].off,
2034 reg_pairs[i].val);
2035 }
2036
2037 /* PMA TX lane registers configurations */
2038 tx_ln_vals = init_data->tx_ln_vals[phy_t1][phy_t2][ssc];
2039 if (tx_ln_vals) {
2040 reg_pairs = tx_ln_vals->reg_pairs;
2041 num_regs = tx_ln_vals->num_regs;
2042 for (i = 0; i < num_lanes; i++) {
2043 regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
2044 for (j = 0; j < num_regs; j++)
2045 regmap_write(regmap, reg_pairs[j].off,
2046 reg_pairs[j].val);
2047 }
2048 }
2049
2050 /* PMA RX lane registers configurations */
2051 rx_ln_vals = init_data->rx_ln_vals[phy_t1][phy_t2][ssc];
2052 if (rx_ln_vals) {
2053 reg_pairs = rx_ln_vals->reg_pairs;
2054 num_regs = rx_ln_vals->num_regs;
2055 for (i = 0; i < num_lanes; i++) {
2056 regmap = cdns_phy->regmap_rx_lane_cdb[i + mlane];
2057 for (j = 0; j < num_regs; j++)
2058 regmap_write(regmap, reg_pairs[j].off,
2059 reg_pairs[j].val);
2060 }
2061 }
2062
2063 reset_control_deassert(cdns_phy->phys[node].lnk_rst);
2064 }
2065
2066 /* Take the PHY out of reset */
2067 ret = reset_control_deassert(cdns_phy->phy_rst);
2068 if (ret)
2069 return ret;
2070
2071 return 0;
2072 }
2073
2074 static int cdns_torrent_phy_probe(struct platform_device *pdev)
2075 {
2076 struct cdns_torrent_phy *cdns_phy;
2077 struct device *dev = &pdev->dev;
2078 struct phy_provider *phy_provider;
2079 const struct cdns_torrent_data *data;
2080 struct device_node *child;
2081 int ret, subnodes, node = 0, i;
2082 u32 total_num_lanes = 0;
2083 u8 init_dp_regmap = 0;
2084 u32 phy_type;
2085
2086 /* Get init data for this PHY */
2087 data = of_device_get_match_data(dev);
2088 if (!data)
2089 return -EINVAL;
2090
2091 cdns_phy = devm_kzalloc(dev, sizeof(*cdns_phy), GFP_KERNEL);
2092 if (!cdns_phy)
2093 return -ENOMEM;
2094
2095 dev_set_drvdata(dev, cdns_phy);
2096 cdns_phy->dev = dev;
2097 cdns_phy->init_data = data;
2098
2099 cdns_phy->phy_rst = devm_reset_control_get_exclusive_by_index(dev, 0);
2100 if (IS_ERR(cdns_phy->phy_rst)) {
2101 dev_err(dev, "%s: failed to get reset\n",
2102 dev->of_node->full_name);
2103 return PTR_ERR(cdns_phy->phy_rst);
2104 }
2105
2106 cdns_phy->apb_rst = devm_reset_control_get_optional(dev, "torrent_apb");
2107 if (IS_ERR(cdns_phy->apb_rst)) {
2108 dev_err(dev, "%s: failed to get apb reset\n",
2109 dev->of_node->full_name);
2110 return PTR_ERR(cdns_phy->apb_rst);
2111 }
2112
2113 cdns_phy->clk = devm_clk_get(dev, "refclk");
2114 if (IS_ERR(cdns_phy->clk)) {
2115 dev_err(dev, "phy ref clock not found\n");
2116 return PTR_ERR(cdns_phy->clk);
2117 }
2118
2119 cdns_phy->sd_base = devm_platform_ioremap_resource(pdev, 0);
2120 if (IS_ERR(cdns_phy->sd_base))
2121 return PTR_ERR(cdns_phy->sd_base);
2122
2123 subnodes = of_get_available_child_count(dev->of_node);
2124 if (subnodes == 0) {
2125 dev_err(dev, "No available link subnodes found\n");
2126 return -EINVAL;
2127 }
2128
2129 ret = cdns_torrent_regmap_init(cdns_phy);
2130 if (ret)
2131 return ret;
2132
2133 ret = cdns_torrent_regfield_init(cdns_phy);
2134 if (ret)
2135 return ret;
2136
2137 ret = clk_prepare_enable(cdns_phy->clk);
2138 if (ret) {
2139 dev_err(cdns_phy->dev, "Failed to prepare ref clock\n");
2140 return ret;
2141 }
2142
2143 cdns_phy->ref_clk_rate = clk_get_rate(cdns_phy->clk);
2144 if (!(cdns_phy->ref_clk_rate)) {
2145 dev_err(cdns_phy->dev, "Failed to get ref clock rate\n");
2146 clk_disable_unprepare(cdns_phy->clk);
2147 return -EINVAL;
2148 }
2149
2150 /* Enable APB */
2151 reset_control_deassert(cdns_phy->apb_rst);
2152
2153 for_each_available_child_of_node(dev->of_node, child) {
2154 struct phy *gphy;
2155
2156 /* PHY subnode name must be 'phy'. */
2157 if (!(of_node_name_eq(child, "phy")))
2158 continue;
2159
2160 cdns_phy->phys[node].lnk_rst =
2161 of_reset_control_array_get_exclusive(child);
2162 if (IS_ERR(cdns_phy->phys[node].lnk_rst)) {
2163 dev_err(dev, "%s: failed to get reset\n",
2164 child->full_name);
2165 ret = PTR_ERR(cdns_phy->phys[node].lnk_rst);
2166 goto put_lnk_rst;
2167 }
2168
2169 if (of_property_read_u32(child, "reg",
2170 &cdns_phy->phys[node].mlane)) {
2171 dev_err(dev, "%s: No \"reg\"-property.\n",
2172 child->full_name);
2173 ret = -EINVAL;
2174 goto put_child;
2175 }
2176
2177 if (of_property_read_u32(child, "cdns,phy-type", &phy_type)) {
2178 dev_err(dev, "%s: No \"cdns,phy-type\"-property.\n",
2179 child->full_name);
2180 ret = -EINVAL;
2181 goto put_child;
2182 }
2183
2184 switch (phy_type) {
2185 case PHY_TYPE_PCIE:
2186 cdns_phy->phys[node].phy_type = TYPE_PCIE;
2187 break;
2188 case PHY_TYPE_DP:
2189 cdns_phy->phys[node].phy_type = TYPE_DP;
2190 break;
2191 case PHY_TYPE_SGMII:
2192 cdns_phy->phys[node].phy_type = TYPE_SGMII;
2193 break;
2194 case PHY_TYPE_QSGMII:
2195 cdns_phy->phys[node].phy_type = TYPE_QSGMII;
2196 break;
2197 case PHY_TYPE_USB3:
2198 cdns_phy->phys[node].phy_type = TYPE_USB;
2199 break;
2200 default:
2201 dev_err(dev, "Unsupported protocol\n");
2202 ret = -EINVAL;
2203 goto put_child;
2204 }
2205
2206 if (of_property_read_u32(child, "cdns,num-lanes",
2207 &cdns_phy->phys[node].num_lanes)) {
2208 dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n",
2209 child->full_name);
2210 ret = -EINVAL;
2211 goto put_child;
2212 }
2213
2214 total_num_lanes += cdns_phy->phys[node].num_lanes;
2215
2216 /* Get SSC mode */
2217 cdns_phy->phys[node].ssc_mode = NO_SSC;
2218 of_property_read_u32(child, "cdns,ssc-mode",
2219 &cdns_phy->phys[node].ssc_mode);
2220
2221 gphy = devm_phy_create(dev, child, &cdns_torrent_phy_ops);
2222 if (IS_ERR(gphy)) {
2223 ret = PTR_ERR(gphy);
2224 goto put_child;
2225 }
2226
2227 if (cdns_phy->phys[node].phy_type == TYPE_DP) {
2228 switch (cdns_phy->phys[node].num_lanes) {
2229 case 1:
2230 case 2:
2231 case 4:
2232 /* valid number of lanes */
2233 break;
2234 default:
2235 dev_err(dev, "unsupported number of lanes: %d\n",
2236 cdns_phy->phys[node].num_lanes);
2237 ret = -EINVAL;
2238 goto put_child;
2239 }
2240
2241 cdns_phy->max_bit_rate = DEFAULT_MAX_BIT_RATE;
2242 of_property_read_u32(child, "cdns,max-bit-rate",
2243 &cdns_phy->max_bit_rate);
2244
2245 switch (cdns_phy->max_bit_rate) {
2246 case 1620:
2247 case 2160:
2248 case 2430:
2249 case 2700:
2250 case 3240:
2251 case 4320:
2252 case 5400:
2253 case 8100:
2254 /* valid bit rate */
2255 break;
2256 default:
2257 dev_err(dev, "unsupported max bit rate: %dMbps\n",
2258 cdns_phy->max_bit_rate);
2259 ret = -EINVAL;
2260 goto put_child;
2261 }
2262
2263 /* DPTX registers */
2264 cdns_phy->base = devm_platform_ioremap_resource(pdev, 1);
2265 if (IS_ERR(cdns_phy->base)) {
2266 ret = PTR_ERR(cdns_phy->base);
2267 goto put_child;
2268 }
2269
2270 if (!init_dp_regmap) {
2271 ret = cdns_torrent_dp_regmap_init(cdns_phy);
2272 if (ret)
2273 goto put_child;
2274
2275 ret = cdns_torrent_dp_regfield_init(cdns_phy);
2276 if (ret)
2277 goto put_child;
2278
2279 init_dp_regmap++;
2280 }
2281
2282 dev_info(dev, "%d lanes, max bit rate %d.%03d Gbps\n",
2283 cdns_phy->phys[node].num_lanes,
2284 cdns_phy->max_bit_rate / 1000,
2285 cdns_phy->max_bit_rate % 1000);
2286
2287 gphy->attrs.bus_width = cdns_phy->phys[node].num_lanes;
2288 gphy->attrs.max_link_rate = cdns_phy->max_bit_rate;
2289 gphy->attrs.mode = PHY_MODE_DP;
2290 }
2291
2292 cdns_phy->phys[node].phy = gphy;
2293 phy_set_drvdata(gphy, &cdns_phy->phys[node]);
2294
2295 node++;
2296 }
2297 cdns_phy->nsubnodes = node;
2298
2299 if (total_num_lanes > MAX_NUM_LANES) {
2300 dev_err(dev, "Invalid lane configuration\n");
2301 ret = -EINVAL;
2302 goto put_lnk_rst;
2303 }
2304
2305 if (cdns_phy->nsubnodes > 1) {
2306 ret = cdns_torrent_phy_configure_multilink(cdns_phy);
2307 if (ret)
2308 goto put_lnk_rst;
2309 }
2310
2311 phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
2312 if (IS_ERR(phy_provider)) {
2313 ret = PTR_ERR(phy_provider);
2314 goto put_lnk_rst;
2315 }
2316
2317 return 0;
2318
2319 put_child:
2320 node++;
2321 put_lnk_rst:
2322 for (i = 0; i < node; i++)
2323 reset_control_put(cdns_phy->phys[i].lnk_rst);
2324 of_node_put(child);
2325 reset_control_assert(cdns_phy->apb_rst);
2326 clk_disable_unprepare(cdns_phy->clk);
2327 return ret;
2328 }
2329
2330 static int cdns_torrent_phy_remove(struct platform_device *pdev)
2331 {
2332 struct cdns_torrent_phy *cdns_phy = platform_get_drvdata(pdev);
2333 int i;
2334
2335 reset_control_assert(cdns_phy->phy_rst);
2336 reset_control_assert(cdns_phy->apb_rst);
2337 for (i = 0; i < cdns_phy->nsubnodes; i++) {
2338 reset_control_assert(cdns_phy->phys[i].lnk_rst);
2339 reset_control_put(cdns_phy->phys[i].lnk_rst);
2340 }
2341
2342 clk_disable_unprepare(cdns_phy->clk);
2343
2344 return 0;
2345 }
2346
2347 /* USB and SGMII/QSGMII link configuration */
2348 static struct cdns_reg_pairs usb_sgmii_link_cmn_regs[] = {
2349 {0x0002, PHY_PLL_CFG},
2350 {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0},
2351 {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
2352 };
2353
2354 static struct cdns_reg_pairs usb_sgmii_xcvr_diag_ln_regs[] = {
2355 {0x0000, XCVR_DIAG_HSCLK_SEL},
2356 {0x0001, XCVR_DIAG_HSCLK_DIV},
2357 {0x0041, XCVR_DIAG_PLLDRC_CTRL}
2358 };
2359
2360 static struct cdns_reg_pairs sgmii_usb_xcvr_diag_ln_regs[] = {
2361 {0x0011, XCVR_DIAG_HSCLK_SEL},
2362 {0x0003, XCVR_DIAG_HSCLK_DIV},
2363 {0x009B, XCVR_DIAG_PLLDRC_CTRL}
2364 };
2365
2366 static struct cdns_torrent_vals usb_sgmii_link_cmn_vals = {
2367 .reg_pairs = usb_sgmii_link_cmn_regs,
2368 .num_regs = ARRAY_SIZE(usb_sgmii_link_cmn_regs),
2369 };
2370
2371 static struct cdns_torrent_vals usb_sgmii_xcvr_diag_ln_vals = {
2372 .reg_pairs = usb_sgmii_xcvr_diag_ln_regs,
2373 .num_regs = ARRAY_SIZE(usb_sgmii_xcvr_diag_ln_regs),
2374 };
2375
2376 static struct cdns_torrent_vals sgmii_usb_xcvr_diag_ln_vals = {
2377 .reg_pairs = sgmii_usb_xcvr_diag_ln_regs,
2378 .num_regs = ARRAY_SIZE(sgmii_usb_xcvr_diag_ln_regs),
2379 };
2380
2381 /* PCIe and USB Unique SSC link configuration */
2382 static struct cdns_reg_pairs pcie_usb_link_cmn_regs[] = {
2383 {0x0003, PHY_PLL_CFG},
2384 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
2385 {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
2386 {0x8600, CMN_PDIAG_PLL1_CLK_SEL_M0}
2387 };
2388
2389 static struct cdns_reg_pairs pcie_usb_xcvr_diag_ln_regs[] = {
2390 {0x0000, XCVR_DIAG_HSCLK_SEL},
2391 {0x0001, XCVR_DIAG_HSCLK_DIV},
2392 {0x0012, XCVR_DIAG_PLLDRC_CTRL}
2393 };
2394
2395 static struct cdns_reg_pairs usb_pcie_xcvr_diag_ln_regs[] = {
2396 {0x0011, XCVR_DIAG_HSCLK_SEL},
2397 {0x0001, XCVR_DIAG_HSCLK_DIV},
2398 {0x00C9, XCVR_DIAG_PLLDRC_CTRL}
2399 };
2400
2401 static struct cdns_torrent_vals pcie_usb_link_cmn_vals = {
2402 .reg_pairs = pcie_usb_link_cmn_regs,
2403 .num_regs = ARRAY_SIZE(pcie_usb_link_cmn_regs),
2404 };
2405
2406 static struct cdns_torrent_vals pcie_usb_xcvr_diag_ln_vals = {
2407 .reg_pairs = pcie_usb_xcvr_diag_ln_regs,
2408 .num_regs = ARRAY_SIZE(pcie_usb_xcvr_diag_ln_regs),
2409 };
2410
2411 static struct cdns_torrent_vals usb_pcie_xcvr_diag_ln_vals = {
2412 .reg_pairs = usb_pcie_xcvr_diag_ln_regs,
2413 .num_regs = ARRAY_SIZE(usb_pcie_xcvr_diag_ln_regs),
2414 };
2415
2416 /* USB 100 MHz Ref clk, internal SSC */
2417 static struct cdns_reg_pairs usb_100_int_ssc_cmn_regs[] = {
2418 {0x0004, CMN_PLL0_DSM_DIAG_M0},
2419 {0x0004, CMN_PLL0_DSM_DIAG_M1},
2420 {0x0004, CMN_PLL1_DSM_DIAG_M0},
2421 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2422 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
2423 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2424 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2425 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
2426 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2427 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2428 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
2429 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2430 {0x0064, CMN_PLL0_INTDIV_M0},
2431 {0x0050, CMN_PLL0_INTDIV_M1},
2432 {0x0064, CMN_PLL1_INTDIV_M0},
2433 {0x0002, CMN_PLL0_FRACDIVH_M0},
2434 {0x0002, CMN_PLL0_FRACDIVH_M1},
2435 {0x0002, CMN_PLL1_FRACDIVH_M0},
2436 {0x0044, CMN_PLL0_HIGH_THR_M0},
2437 {0x0036, CMN_PLL0_HIGH_THR_M1},
2438 {0x0044, CMN_PLL1_HIGH_THR_M0},
2439 {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
2440 {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
2441 {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
2442 {0x0001, CMN_PLL0_SS_CTRL1_M0},
2443 {0x0001, CMN_PLL0_SS_CTRL1_M1},
2444 {0x0001, CMN_PLL1_SS_CTRL1_M0},
2445 {0x011B, CMN_PLL0_SS_CTRL2_M0},
2446 {0x011B, CMN_PLL0_SS_CTRL2_M1},
2447 {0x011B, CMN_PLL1_SS_CTRL2_M0},
2448 {0x006E, CMN_PLL0_SS_CTRL3_M0},
2449 {0x0058, CMN_PLL0_SS_CTRL3_M1},
2450 {0x006E, CMN_PLL1_SS_CTRL3_M0},
2451 {0x000E, CMN_PLL0_SS_CTRL4_M0},
2452 {0x0012, CMN_PLL0_SS_CTRL4_M1},
2453 {0x000E, CMN_PLL1_SS_CTRL4_M0},
2454 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
2455 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
2456 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
2457 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
2458 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2459 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2460 {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
2461 {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
2462 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
2463 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
2464 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
2465 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
2466 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
2467 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
2468 };
2469
2470 static struct cdns_torrent_vals usb_100_int_ssc_cmn_vals = {
2471 .reg_pairs = usb_100_int_ssc_cmn_regs,
2472 .num_regs = ARRAY_SIZE(usb_100_int_ssc_cmn_regs),
2473 };
2474
2475 /* Single USB link configuration */
2476 static struct cdns_reg_pairs sl_usb_link_cmn_regs[] = {
2477 {0x0000, PHY_PLL_CFG},
2478 {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
2479 };
2480
2481 static struct cdns_reg_pairs sl_usb_xcvr_diag_ln_regs[] = {
2482 {0x0000, XCVR_DIAG_HSCLK_SEL},
2483 {0x0001, XCVR_DIAG_HSCLK_DIV},
2484 {0x0041, XCVR_DIAG_PLLDRC_CTRL}
2485 };
2486
2487 static struct cdns_torrent_vals sl_usb_link_cmn_vals = {
2488 .reg_pairs = sl_usb_link_cmn_regs,
2489 .num_regs = ARRAY_SIZE(sl_usb_link_cmn_regs),
2490 };
2491
2492 static struct cdns_torrent_vals sl_usb_xcvr_diag_ln_vals = {
2493 .reg_pairs = sl_usb_xcvr_diag_ln_regs,
2494 .num_regs = ARRAY_SIZE(sl_usb_xcvr_diag_ln_regs),
2495 };
2496
2497 /* USB PHY PCS common configuration */
2498 static struct cdns_reg_pairs usb_phy_pcs_cmn_regs[] = {
2499 {0x0A0A, PHY_PIPE_USB3_GEN2_PRE_CFG0},
2500 {0x1000, PHY_PIPE_USB3_GEN2_POST_CFG0},
2501 {0x0010, PHY_PIPE_USB3_GEN2_POST_CFG1}
2502 };
2503
2504 static struct cdns_torrent_vals usb_phy_pcs_cmn_vals = {
2505 .reg_pairs = usb_phy_pcs_cmn_regs,
2506 .num_regs = ARRAY_SIZE(usb_phy_pcs_cmn_regs),
2507 };
2508
2509 /* USB 100 MHz Ref clk, no SSC */
2510 static struct cdns_reg_pairs usb_100_no_ssc_cmn_regs[] = {
2511 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2512 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2513 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
2514 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
2515 };
2516
2517 static struct cdns_reg_pairs usb_100_no_ssc_tx_ln_regs[] = {
2518 {0x02FF, TX_PSC_A0},
2519 {0x06AF, TX_PSC_A1},
2520 {0x06AE, TX_PSC_A2},
2521 {0x06AE, TX_PSC_A3},
2522 {0x2A82, TX_TXCC_CTRL},
2523 {0x0014, TX_TXCC_CPOST_MULT_01},
2524 {0x0003, XCVR_DIAG_PSC_OVRD}
2525 };
2526
2527 static struct cdns_reg_pairs usb_100_no_ssc_rx_ln_regs[] = {
2528 {0x0D1D, RX_PSC_A0},
2529 {0x0D1D, RX_PSC_A1},
2530 {0x0D00, RX_PSC_A2},
2531 {0x0500, RX_PSC_A3},
2532 {0x0013, RX_SIGDET_HL_FILT_TMR},
2533 {0x0000, RX_REE_GCSM1_CTRL},
2534 {0x0C02, RX_REE_ATTEN_THR},
2535 {0x0330, RX_REE_SMGM_CTRL1},
2536 {0x0300, RX_REE_SMGM_CTRL2},
2537 {0x0019, RX_REE_TAP1_CLIP},
2538 {0x0019, RX_REE_TAP2TON_CLIP},
2539 {0x1004, RX_DIAG_SIGDET_TUNE},
2540 {0x00F9, RX_DIAG_NQST_CTRL},
2541 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
2542 {0x0002, RX_DIAG_DFE_AMP_TUNE_3},
2543 {0x0000, RX_DIAG_PI_CAP},
2544 {0x0031, RX_DIAG_PI_RATE},
2545 {0x0001, RX_DIAG_ACYA},
2546 {0x018C, RX_CDRLF_CNFG},
2547 {0x0003, RX_CDRLF_CNFG3}
2548 };
2549
2550 static struct cdns_torrent_vals usb_100_no_ssc_cmn_vals = {
2551 .reg_pairs = usb_100_no_ssc_cmn_regs,
2552 .num_regs = ARRAY_SIZE(usb_100_no_ssc_cmn_regs),
2553 };
2554
2555 static struct cdns_torrent_vals usb_100_no_ssc_tx_ln_vals = {
2556 .reg_pairs = usb_100_no_ssc_tx_ln_regs,
2557 .num_regs = ARRAY_SIZE(usb_100_no_ssc_tx_ln_regs),
2558 };
2559
2560 static struct cdns_torrent_vals usb_100_no_ssc_rx_ln_vals = {
2561 .reg_pairs = usb_100_no_ssc_rx_ln_regs,
2562 .num_regs = ARRAY_SIZE(usb_100_no_ssc_rx_ln_regs),
2563 };
2564
2565 /* Single link USB, 100 MHz Ref clk, internal SSC */
2566 static struct cdns_reg_pairs sl_usb_100_int_ssc_cmn_regs[] = {
2567 {0x0004, CMN_PLL0_DSM_DIAG_M0},
2568 {0x0004, CMN_PLL1_DSM_DIAG_M0},
2569 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2570 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2571 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2572 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2573 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2574 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2575 {0x0064, CMN_PLL0_INTDIV_M0},
2576 {0x0064, CMN_PLL1_INTDIV_M0},
2577 {0x0002, CMN_PLL0_FRACDIVH_M0},
2578 {0x0002, CMN_PLL1_FRACDIVH_M0},
2579 {0x0044, CMN_PLL0_HIGH_THR_M0},
2580 {0x0044, CMN_PLL1_HIGH_THR_M0},
2581 {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
2582 {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
2583 {0x0001, CMN_PLL0_SS_CTRL1_M0},
2584 {0x0001, CMN_PLL1_SS_CTRL1_M0},
2585 {0x011B, CMN_PLL0_SS_CTRL2_M0},
2586 {0x011B, CMN_PLL1_SS_CTRL2_M0},
2587 {0x006E, CMN_PLL0_SS_CTRL3_M0},
2588 {0x006E, CMN_PLL1_SS_CTRL3_M0},
2589 {0x000E, CMN_PLL0_SS_CTRL4_M0},
2590 {0x000E, CMN_PLL1_SS_CTRL4_M0},
2591 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
2592 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
2593 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
2594 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
2595 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2596 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2597 {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
2598 {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
2599 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
2600 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
2601 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
2602 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
2603 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
2604 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
2605 };
2606
2607 static struct cdns_torrent_vals sl_usb_100_int_ssc_cmn_vals = {
2608 .reg_pairs = sl_usb_100_int_ssc_cmn_regs,
2609 .num_regs = ARRAY_SIZE(sl_usb_100_int_ssc_cmn_regs),
2610 };
2611
2612 /* PCIe and SGMII/QSGMII Unique SSC link configuration */
2613 static struct cdns_reg_pairs pcie_sgmii_link_cmn_regs[] = {
2614 {0x0003, PHY_PLL_CFG},
2615 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
2616 {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
2617 {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
2618 };
2619
2620 static struct cdns_reg_pairs pcie_sgmii_xcvr_diag_ln_regs[] = {
2621 {0x0000, XCVR_DIAG_HSCLK_SEL},
2622 {0x0001, XCVR_DIAG_HSCLK_DIV},
2623 {0x0012, XCVR_DIAG_PLLDRC_CTRL}
2624 };
2625
2626 static struct cdns_reg_pairs sgmii_pcie_xcvr_diag_ln_regs[] = {
2627 {0x0011, XCVR_DIAG_HSCLK_SEL},
2628 {0x0003, XCVR_DIAG_HSCLK_DIV},
2629 {0x009B, XCVR_DIAG_PLLDRC_CTRL}
2630 };
2631
2632 static struct cdns_torrent_vals pcie_sgmii_link_cmn_vals = {
2633 .reg_pairs = pcie_sgmii_link_cmn_regs,
2634 .num_regs = ARRAY_SIZE(pcie_sgmii_link_cmn_regs),
2635 };
2636
2637 static struct cdns_torrent_vals pcie_sgmii_xcvr_diag_ln_vals = {
2638 .reg_pairs = pcie_sgmii_xcvr_diag_ln_regs,
2639 .num_regs = ARRAY_SIZE(pcie_sgmii_xcvr_diag_ln_regs),
2640 };
2641
2642 static struct cdns_torrent_vals sgmii_pcie_xcvr_diag_ln_vals = {
2643 .reg_pairs = sgmii_pcie_xcvr_diag_ln_regs,
2644 .num_regs = ARRAY_SIZE(sgmii_pcie_xcvr_diag_ln_regs),
2645 };
2646
2647 /* SGMII 100 MHz Ref clk, no SSC */
2648 static struct cdns_reg_pairs sgmii_100_no_ssc_cmn_regs[] = {
2649 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2650 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2651 {0x3700, CMN_DIAG_BIAS_OVRD1},
2652 {0x0008, CMN_TXPUCAL_TUNE},
2653 {0x0008, CMN_TXPDCAL_TUNE}
2654 };
2655
2656 static struct cdns_reg_pairs sgmii_100_no_ssc_tx_ln_regs[] = {
2657 {0x00F3, TX_PSC_A0},
2658 {0x04A2, TX_PSC_A2},
2659 {0x04A2, TX_PSC_A3},
2660 {0x0000, TX_TXCC_CPOST_MULT_00},
2661 {0x00B3, DRV_DIAG_TX_DRV}
2662 };
2663
2664 static struct cdns_reg_pairs sgmii_100_no_ssc_rx_ln_regs[] = {
2665 {0x091D, RX_PSC_A0},
2666 {0x0900, RX_PSC_A2},
2667 {0x0100, RX_PSC_A3},
2668 {0x03C7, RX_REE_GCSM1_EQENM_PH1},
2669 {0x01C7, RX_REE_GCSM1_EQENM_PH2},
2670 {0x0000, RX_DIAG_DFE_CTRL},
2671 {0x0019, RX_REE_TAP1_CLIP},
2672 {0x0019, RX_REE_TAP2TON_CLIP},
2673 {0x0098, RX_DIAG_NQST_CTRL},
2674 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
2675 {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
2676 {0x0000, RX_DIAG_PI_CAP},
2677 {0x0010, RX_DIAG_PI_RATE},
2678 {0x0001, RX_DIAG_ACYA},
2679 {0x018C, RX_CDRLF_CNFG},
2680 };
2681
2682 static struct cdns_torrent_vals sgmii_100_no_ssc_cmn_vals = {
2683 .reg_pairs = sgmii_100_no_ssc_cmn_regs,
2684 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_cmn_regs),
2685 };
2686
2687 static struct cdns_torrent_vals sgmii_100_no_ssc_tx_ln_vals = {
2688 .reg_pairs = sgmii_100_no_ssc_tx_ln_regs,
2689 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_tx_ln_regs),
2690 };
2691
2692 static struct cdns_torrent_vals sgmii_100_no_ssc_rx_ln_vals = {
2693 .reg_pairs = sgmii_100_no_ssc_rx_ln_regs,
2694 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_rx_ln_regs),
2695 };
2696
2697 /* SGMII 100 MHz Ref clk, internal SSC */
2698 static struct cdns_reg_pairs sgmii_100_int_ssc_cmn_regs[] = {
2699 {0x0004, CMN_PLL0_DSM_DIAG_M0},
2700 {0x0004, CMN_PLL0_DSM_DIAG_M1},
2701 {0x0004, CMN_PLL1_DSM_DIAG_M0},
2702 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2703 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
2704 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2705 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2706 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
2707 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2708 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2709 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
2710 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2711 {0x0064, CMN_PLL0_INTDIV_M0},
2712 {0x0050, CMN_PLL0_INTDIV_M1},
2713 {0x0064, CMN_PLL1_INTDIV_M0},
2714 {0x0002, CMN_PLL0_FRACDIVH_M0},
2715 {0x0002, CMN_PLL0_FRACDIVH_M1},
2716 {0x0002, CMN_PLL1_FRACDIVH_M0},
2717 {0x0044, CMN_PLL0_HIGH_THR_M0},
2718 {0x0036, CMN_PLL0_HIGH_THR_M1},
2719 {0x0044, CMN_PLL1_HIGH_THR_M0},
2720 {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
2721 {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
2722 {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
2723 {0x0001, CMN_PLL0_SS_CTRL1_M0},
2724 {0x0001, CMN_PLL0_SS_CTRL1_M1},
2725 {0x0001, CMN_PLL1_SS_CTRL1_M0},
2726 {0x011B, CMN_PLL0_SS_CTRL2_M0},
2727 {0x011B, CMN_PLL0_SS_CTRL2_M1},
2728 {0x011B, CMN_PLL1_SS_CTRL2_M0},
2729 {0x006E, CMN_PLL0_SS_CTRL3_M0},
2730 {0x0058, CMN_PLL0_SS_CTRL3_M1},
2731 {0x006E, CMN_PLL1_SS_CTRL3_M0},
2732 {0x000E, CMN_PLL0_SS_CTRL4_M0},
2733 {0x0012, CMN_PLL0_SS_CTRL4_M1},
2734 {0x000E, CMN_PLL1_SS_CTRL4_M0},
2735 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
2736 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
2737 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
2738 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
2739 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2740 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2741 {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
2742 {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
2743 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
2744 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
2745 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
2746 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
2747 {0x3700, CMN_DIAG_BIAS_OVRD1},
2748 {0x0008, CMN_TXPUCAL_TUNE},
2749 {0x0008, CMN_TXPDCAL_TUNE}
2750 };
2751
2752 static struct cdns_torrent_vals sgmii_100_int_ssc_cmn_vals = {
2753 .reg_pairs = sgmii_100_int_ssc_cmn_regs,
2754 .num_regs = ARRAY_SIZE(sgmii_100_int_ssc_cmn_regs),
2755 };
2756
2757 /* QSGMII 100 MHz Ref clk, no SSC */
2758 static struct cdns_reg_pairs qsgmii_100_no_ssc_cmn_regs[] = {
2759 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2760 {0x0003, CMN_PLL1_VCOCAL_TCTRL}
2761 };
2762
2763 static struct cdns_reg_pairs qsgmii_100_no_ssc_tx_ln_regs[] = {
2764 {0x00F3, TX_PSC_A0},
2765 {0x04A2, TX_PSC_A2},
2766 {0x04A2, TX_PSC_A3},
2767 {0x0000, TX_TXCC_CPOST_MULT_00},
2768 {0x0003, DRV_DIAG_TX_DRV}
2769 };
2770
2771 static struct cdns_reg_pairs qsgmii_100_no_ssc_rx_ln_regs[] = {
2772 {0x091D, RX_PSC_A0},
2773 {0x0900, RX_PSC_A2},
2774 {0x0100, RX_PSC_A3},
2775 {0x03C7, RX_REE_GCSM1_EQENM_PH1},
2776 {0x01C7, RX_REE_GCSM1_EQENM_PH2},
2777 {0x0000, RX_DIAG_DFE_CTRL},
2778 {0x0019, RX_REE_TAP1_CLIP},
2779 {0x0019, RX_REE_TAP2TON_CLIP},
2780 {0x0098, RX_DIAG_NQST_CTRL},
2781 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
2782 {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
2783 {0x0000, RX_DIAG_PI_CAP},
2784 {0x0010, RX_DIAG_PI_RATE},
2785 {0x0001, RX_DIAG_ACYA},
2786 {0x018C, RX_CDRLF_CNFG},
2787 };
2788
2789 static struct cdns_torrent_vals qsgmii_100_no_ssc_cmn_vals = {
2790 .reg_pairs = qsgmii_100_no_ssc_cmn_regs,
2791 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_cmn_regs),
2792 };
2793
2794 static struct cdns_torrent_vals qsgmii_100_no_ssc_tx_ln_vals = {
2795 .reg_pairs = qsgmii_100_no_ssc_tx_ln_regs,
2796 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_tx_ln_regs),
2797 };
2798
2799 static struct cdns_torrent_vals qsgmii_100_no_ssc_rx_ln_vals = {
2800 .reg_pairs = qsgmii_100_no_ssc_rx_ln_regs,
2801 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_rx_ln_regs),
2802 };
2803
2804 /* QSGMII 100 MHz Ref clk, internal SSC */
2805 static struct cdns_reg_pairs qsgmii_100_int_ssc_cmn_regs[] = {
2806 {0x0004, CMN_PLL0_DSM_DIAG_M0},
2807 {0x0004, CMN_PLL0_DSM_DIAG_M1},
2808 {0x0004, CMN_PLL1_DSM_DIAG_M0},
2809 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2810 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
2811 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2812 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2813 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
2814 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2815 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2816 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
2817 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2818 {0x0064, CMN_PLL0_INTDIV_M0},
2819 {0x0050, CMN_PLL0_INTDIV_M1},
2820 {0x0064, CMN_PLL1_INTDIV_M0},
2821 {0x0002, CMN_PLL0_FRACDIVH_M0},
2822 {0x0002, CMN_PLL0_FRACDIVH_M1},
2823 {0x0002, CMN_PLL1_FRACDIVH_M0},
2824 {0x0044, CMN_PLL0_HIGH_THR_M0},
2825 {0x0036, CMN_PLL0_HIGH_THR_M1},
2826 {0x0044, CMN_PLL1_HIGH_THR_M0},
2827 {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
2828 {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
2829 {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
2830 {0x0001, CMN_PLL0_SS_CTRL1_M0},
2831 {0x0001, CMN_PLL0_SS_CTRL1_M1},
2832 {0x0001, CMN_PLL1_SS_CTRL1_M0},
2833 {0x011B, CMN_PLL0_SS_CTRL2_M0},
2834 {0x011B, CMN_PLL0_SS_CTRL2_M1},
2835 {0x011B, CMN_PLL1_SS_CTRL2_M0},
2836 {0x006E, CMN_PLL0_SS_CTRL3_M0},
2837 {0x0058, CMN_PLL0_SS_CTRL3_M1},
2838 {0x006E, CMN_PLL1_SS_CTRL3_M0},
2839 {0x000E, CMN_PLL0_SS_CTRL4_M0},
2840 {0x0012, CMN_PLL0_SS_CTRL4_M1},
2841 {0x000E, CMN_PLL1_SS_CTRL4_M0},
2842 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
2843 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
2844 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
2845 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
2846 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2847 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2848 {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
2849 {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
2850 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
2851 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
2852 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
2853 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
2854 };
2855
2856 static struct cdns_torrent_vals qsgmii_100_int_ssc_cmn_vals = {
2857 .reg_pairs = qsgmii_100_int_ssc_cmn_regs,
2858 .num_regs = ARRAY_SIZE(qsgmii_100_int_ssc_cmn_regs),
2859 };
2860
2861 /* Single SGMII/QSGMII link configuration */
2862 static struct cdns_reg_pairs sl_sgmii_link_cmn_regs[] = {
2863 {0x0000, PHY_PLL_CFG},
2864 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}
2865 };
2866
2867 static struct cdns_reg_pairs sl_sgmii_xcvr_diag_ln_regs[] = {
2868 {0x0000, XCVR_DIAG_HSCLK_SEL},
2869 {0x0003, XCVR_DIAG_HSCLK_DIV},
2870 {0x0013, XCVR_DIAG_PLLDRC_CTRL}
2871 };
2872
2873 static struct cdns_torrent_vals sl_sgmii_link_cmn_vals = {
2874 .reg_pairs = sl_sgmii_link_cmn_regs,
2875 .num_regs = ARRAY_SIZE(sl_sgmii_link_cmn_regs),
2876 };
2877
2878 static struct cdns_torrent_vals sl_sgmii_xcvr_diag_ln_vals = {
2879 .reg_pairs = sl_sgmii_xcvr_diag_ln_regs,
2880 .num_regs = ARRAY_SIZE(sl_sgmii_xcvr_diag_ln_regs),
2881 };
2882
2883 /* Multi link PCIe, 100 MHz Ref clk, internal SSC */
2884 static struct cdns_reg_pairs pcie_100_int_ssc_cmn_regs[] = {
2885 {0x0004, CMN_PLL0_DSM_DIAG_M0},
2886 {0x0004, CMN_PLL0_DSM_DIAG_M1},
2887 {0x0004, CMN_PLL1_DSM_DIAG_M0},
2888 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2889 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
2890 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2891 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2892 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
2893 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2894 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2895 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
2896 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2897 {0x0064, CMN_PLL0_INTDIV_M0},
2898 {0x0050, CMN_PLL0_INTDIV_M1},
2899 {0x0064, CMN_PLL1_INTDIV_M0},
2900 {0x0002, CMN_PLL0_FRACDIVH_M0},
2901 {0x0002, CMN_PLL0_FRACDIVH_M1},
2902 {0x0002, CMN_PLL1_FRACDIVH_M0},
2903 {0x0044, CMN_PLL0_HIGH_THR_M0},
2904 {0x0036, CMN_PLL0_HIGH_THR_M1},
2905 {0x0044, CMN_PLL1_HIGH_THR_M0},
2906 {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
2907 {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
2908 {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
2909 {0x0001, CMN_PLL0_SS_CTRL1_M0},
2910 {0x0001, CMN_PLL0_SS_CTRL1_M1},
2911 {0x0001, CMN_PLL1_SS_CTRL1_M0},
2912 {0x011B, CMN_PLL0_SS_CTRL2_M0},
2913 {0x011B, CMN_PLL0_SS_CTRL2_M1},
2914 {0x011B, CMN_PLL1_SS_CTRL2_M0},
2915 {0x006E, CMN_PLL0_SS_CTRL3_M0},
2916 {0x0058, CMN_PLL0_SS_CTRL3_M1},
2917 {0x006E, CMN_PLL1_SS_CTRL3_M0},
2918 {0x000E, CMN_PLL0_SS_CTRL4_M0},
2919 {0x0012, CMN_PLL0_SS_CTRL4_M1},
2920 {0x000E, CMN_PLL1_SS_CTRL4_M0},
2921 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
2922 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
2923 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
2924 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
2925 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2926 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2927 {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
2928 {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
2929 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
2930 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
2931 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
2932 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
2933 };
2934
2935 static struct cdns_torrent_vals pcie_100_int_ssc_cmn_vals = {
2936 .reg_pairs = pcie_100_int_ssc_cmn_regs,
2937 .num_regs = ARRAY_SIZE(pcie_100_int_ssc_cmn_regs),
2938 };
2939
2940 /* Single link PCIe, 100 MHz Ref clk, internal SSC */
2941 static struct cdns_reg_pairs sl_pcie_100_int_ssc_cmn_regs[] = {
2942 {0x0004, CMN_PLL0_DSM_DIAG_M0},
2943 {0x0004, CMN_PLL0_DSM_DIAG_M1},
2944 {0x0004, CMN_PLL1_DSM_DIAG_M0},
2945 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2946 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
2947 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2948 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2949 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
2950 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2951 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2952 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
2953 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2954 {0x0064, CMN_PLL0_INTDIV_M0},
2955 {0x0050, CMN_PLL0_INTDIV_M1},
2956 {0x0050, CMN_PLL1_INTDIV_M0},
2957 {0x0002, CMN_PLL0_FRACDIVH_M0},
2958 {0x0002, CMN_PLL0_FRACDIVH_M1},
2959 {0x0002, CMN_PLL1_FRACDIVH_M0},
2960 {0x0044, CMN_PLL0_HIGH_THR_M0},
2961 {0x0036, CMN_PLL0_HIGH_THR_M1},
2962 {0x0036, CMN_PLL1_HIGH_THR_M0},
2963 {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
2964 {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
2965 {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
2966 {0x0001, CMN_PLL0_SS_CTRL1_M0},
2967 {0x0001, CMN_PLL0_SS_CTRL1_M1},
2968 {0x0001, CMN_PLL1_SS_CTRL1_M0},
2969 {0x011B, CMN_PLL0_SS_CTRL2_M0},
2970 {0x011B, CMN_PLL0_SS_CTRL2_M1},
2971 {0x011B, CMN_PLL1_SS_CTRL2_M0},
2972 {0x006E, CMN_PLL0_SS_CTRL3_M0},
2973 {0x0058, CMN_PLL0_SS_CTRL3_M1},
2974 {0x0058, CMN_PLL1_SS_CTRL3_M0},
2975 {0x000E, CMN_PLL0_SS_CTRL4_M0},
2976 {0x0012, CMN_PLL0_SS_CTRL4_M1},
2977 {0x0012, CMN_PLL1_SS_CTRL4_M0},
2978 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
2979 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
2980 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
2981 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
2982 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2983 {0x0003, CMN_PLL1_VCOCAL_TCTRL},
2984 {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
2985 {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
2986 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
2987 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
2988 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
2989 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
2990 };
2991
2992 static struct cdns_torrent_vals sl_pcie_100_int_ssc_cmn_vals = {
2993 .reg_pairs = sl_pcie_100_int_ssc_cmn_regs,
2994 .num_regs = ARRAY_SIZE(sl_pcie_100_int_ssc_cmn_regs),
2995 };
2996
2997 /* PCIe, 100 MHz Ref clk, no SSC & external SSC */
2998 static struct cdns_reg_pairs pcie_100_ext_no_ssc_cmn_regs[] = {
2999 {0x0003, CMN_PLL0_VCOCAL_TCTRL},
3000 {0x0003, CMN_PLL1_VCOCAL_TCTRL}
3001 };
3002
3003 static struct cdns_reg_pairs pcie_100_ext_no_ssc_rx_ln_regs[] = {
3004 {0x0019, RX_REE_TAP1_CLIP},
3005 {0x0019, RX_REE_TAP2TON_CLIP},
3006 {0x0001, RX_DIAG_ACYA}
3007 };
3008
3009 static struct cdns_torrent_vals pcie_100_no_ssc_cmn_vals = {
3010 .reg_pairs = pcie_100_ext_no_ssc_cmn_regs,
3011 .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_cmn_regs),
3012 };
3013
3014 static struct cdns_torrent_vals pcie_100_no_ssc_rx_ln_vals = {
3015 .reg_pairs = pcie_100_ext_no_ssc_rx_ln_regs,
3016 .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs),
3017 };
3018
3019 static const struct cdns_torrent_data cdns_map_torrent = {
3020 .block_offset_shift = 0x2,
3021 .reg_offset_shift = 0x2,
3022 .link_cmn_vals = {
3023 [TYPE_PCIE] = {
3024 [TYPE_NONE] = {
3025 [NO_SSC] = NULL,
3026 [EXTERNAL_SSC] = NULL,
3027 [INTERNAL_SSC] = NULL,
3028 },
3029 [TYPE_SGMII] = {
3030 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3031 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3032 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3033 },
3034 [TYPE_QSGMII] = {
3035 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3036 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3037 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3038 },
3039 [TYPE_USB] = {
3040 [NO_SSC] = &pcie_usb_link_cmn_vals,
3041 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3042 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3043 },
3044 },
3045 [TYPE_SGMII] = {
3046 [TYPE_NONE] = {
3047 [NO_SSC] = &sl_sgmii_link_cmn_vals,
3048 },
3049 [TYPE_PCIE] = {
3050 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3051 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3052 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3053 },
3054 [TYPE_USB] = {
3055 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3056 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3057 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3058 },
3059 },
3060 [TYPE_QSGMII] = {
3061 [TYPE_NONE] = {
3062 [NO_SSC] = &sl_sgmii_link_cmn_vals,
3063 },
3064 [TYPE_PCIE] = {
3065 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3066 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3067 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3068 },
3069 [TYPE_USB] = {
3070 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3071 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3072 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3073 },
3074 },
3075 [TYPE_USB] = {
3076 [TYPE_NONE] = {
3077 [NO_SSC] = &sl_usb_link_cmn_vals,
3078 [EXTERNAL_SSC] = &sl_usb_link_cmn_vals,
3079 [INTERNAL_SSC] = &sl_usb_link_cmn_vals,
3080 },
3081 [TYPE_PCIE] = {
3082 [NO_SSC] = &pcie_usb_link_cmn_vals,
3083 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3084 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3085 },
3086 [TYPE_SGMII] = {
3087 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3088 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3089 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3090 },
3091 [TYPE_QSGMII] = {
3092 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3093 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3094 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3095 },
3096 },
3097 },
3098 .xcvr_diag_vals = {
3099 [TYPE_PCIE] = {
3100 [TYPE_NONE] = {
3101 [NO_SSC] = NULL,
3102 [EXTERNAL_SSC] = NULL,
3103 [INTERNAL_SSC] = NULL,
3104 },
3105 [TYPE_SGMII] = {
3106 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3107 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3108 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3109 },
3110 [TYPE_QSGMII] = {
3111 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3112 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3113 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3114 },
3115 [TYPE_USB] = {
3116 [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3117 [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3118 [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3119 },
3120 },
3121 [TYPE_SGMII] = {
3122 [TYPE_NONE] = {
3123 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
3124 },
3125 [TYPE_PCIE] = {
3126 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3127 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3128 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3129 },
3130 [TYPE_USB] = {
3131 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3132 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3133 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3134 },
3135 },
3136 [TYPE_QSGMII] = {
3137 [TYPE_NONE] = {
3138 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
3139 },
3140 [TYPE_PCIE] = {
3141 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3142 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3143 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3144 },
3145 [TYPE_USB] = {
3146 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3147 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3148 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3149 },
3150 },
3151 [TYPE_USB] = {
3152 [TYPE_NONE] = {
3153 [NO_SSC] = &sl_usb_xcvr_diag_ln_vals,
3154 [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
3155 [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
3156 },
3157 [TYPE_PCIE] = {
3158 [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3159 [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3160 [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3161 },
3162 [TYPE_SGMII] = {
3163 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3164 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3165 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3166 },
3167 [TYPE_QSGMII] = {
3168 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3169 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3170 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3171 },
3172 },
3173 },
3174 .pcs_cmn_vals = {
3175 [TYPE_USB] = {
3176 [TYPE_NONE] = {
3177 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3178 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3179 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3180 },
3181 [TYPE_PCIE] = {
3182 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3183 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3184 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3185 },
3186 [TYPE_SGMII] = {
3187 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3188 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3189 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3190 },
3191 [TYPE_QSGMII] = {
3192 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3193 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3194 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3195 },
3196 },
3197 },
3198 .cmn_vals = {
3199 [TYPE_PCIE] = {
3200 [TYPE_NONE] = {
3201 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3202 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3203 [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals,
3204 },
3205 [TYPE_SGMII] = {
3206 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3207 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3208 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3209 },
3210 [TYPE_QSGMII] = {
3211 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3212 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3213 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3214 },
3215 [TYPE_USB] = {
3216 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3217 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3218 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3219 },
3220 },
3221 [TYPE_SGMII] = {
3222 [TYPE_NONE] = {
3223 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3224 },
3225 [TYPE_PCIE] = {
3226 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3227 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3228 [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals,
3229 },
3230 [TYPE_USB] = {
3231 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3232 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3233 [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3234 },
3235 },
3236 [TYPE_QSGMII] = {
3237 [TYPE_NONE] = {
3238 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3239 },
3240 [TYPE_PCIE] = {
3241 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3242 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3243 [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals,
3244 },
3245 [TYPE_USB] = {
3246 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3247 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3248 [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3249 },
3250 },
3251 [TYPE_USB] = {
3252 [TYPE_NONE] = {
3253 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3254 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3255 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
3256 },
3257 [TYPE_PCIE] = {
3258 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3259 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3260 [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals,
3261 },
3262 [TYPE_SGMII] = {
3263 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3264 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3265 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
3266 },
3267 [TYPE_QSGMII] = {
3268 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3269 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3270 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
3271 },
3272 },
3273 },
3274 .tx_ln_vals = {
3275 [TYPE_PCIE] = {
3276 [TYPE_NONE] = {
3277 [NO_SSC] = NULL,
3278 [EXTERNAL_SSC] = NULL,
3279 [INTERNAL_SSC] = NULL,
3280 },
3281 [TYPE_SGMII] = {
3282 [NO_SSC] = NULL,
3283 [EXTERNAL_SSC] = NULL,
3284 [INTERNAL_SSC] = NULL,
3285 },
3286 [TYPE_QSGMII] = {
3287 [NO_SSC] = NULL,
3288 [EXTERNAL_SSC] = NULL,
3289 [INTERNAL_SSC] = NULL,
3290 },
3291 [TYPE_USB] = {
3292 [NO_SSC] = NULL,
3293 [EXTERNAL_SSC] = NULL,
3294 [INTERNAL_SSC] = NULL,
3295 },
3296 },
3297 [TYPE_SGMII] = {
3298 [TYPE_NONE] = {
3299 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3300 },
3301 [TYPE_PCIE] = {
3302 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3303 [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3304 [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3305 },
3306 [TYPE_USB] = {
3307 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3308 [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3309 [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3310 },
3311 },
3312 [TYPE_QSGMII] = {
3313 [TYPE_NONE] = {
3314 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3315 },
3316 [TYPE_PCIE] = {
3317 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3318 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3319 [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3320 },
3321 [TYPE_USB] = {
3322 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3323 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3324 [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3325 },
3326 },
3327 [TYPE_USB] = {
3328 [TYPE_NONE] = {
3329 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3330 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3331 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3332 },
3333 [TYPE_PCIE] = {
3334 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3335 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3336 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3337 },
3338 [TYPE_SGMII] = {
3339 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3340 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3341 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3342 },
3343 [TYPE_QSGMII] = {
3344 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3345 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3346 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3347 },
3348 },
3349 },
3350 .rx_ln_vals = {
3351 [TYPE_PCIE] = {
3352 [TYPE_NONE] = {
3353 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3354 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3355 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3356 },
3357 [TYPE_SGMII] = {
3358 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3359 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3360 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3361 },
3362 [TYPE_QSGMII] = {
3363 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3364 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3365 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3366 },
3367 [TYPE_USB] = {
3368 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3369 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3370 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3371 },
3372 },
3373 [TYPE_SGMII] = {
3374 [TYPE_NONE] = {
3375 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3376 },
3377 [TYPE_PCIE] = {
3378 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3379 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3380 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3381 },
3382 [TYPE_USB] = {
3383 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3384 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3385 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3386 },
3387 },
3388 [TYPE_QSGMII] = {
3389 [TYPE_NONE] = {
3390 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3391 },
3392 [TYPE_PCIE] = {
3393 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3394 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3395 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3396 },
3397 [TYPE_USB] = {
3398 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3399 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3400 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3401 },
3402 },
3403 [TYPE_USB] = {
3404 [TYPE_NONE] = {
3405 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3406 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3407 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3408 },
3409 [TYPE_PCIE] = {
3410 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3411 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3412 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3413 },
3414 [TYPE_SGMII] = {
3415 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3416 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3417 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3418 },
3419 [TYPE_QSGMII] = {
3420 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3421 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3422 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3423 },
3424 },
3425 },
3426 };
3427
3428 static const struct cdns_torrent_data ti_j721e_map_torrent = {
3429 .block_offset_shift = 0x0,
3430 .reg_offset_shift = 0x1,
3431 .link_cmn_vals = {
3432 [TYPE_PCIE] = {
3433 [TYPE_NONE] = {
3434 [NO_SSC] = NULL,
3435 [EXTERNAL_SSC] = NULL,
3436 [INTERNAL_SSC] = NULL,
3437 },
3438 [TYPE_SGMII] = {
3439 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3440 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3441 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3442 },
3443 [TYPE_QSGMII] = {
3444 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3445 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3446 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3447 },
3448 [TYPE_USB] = {
3449 [NO_SSC] = &pcie_usb_link_cmn_vals,
3450 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3451 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3452 },
3453 },
3454 [TYPE_SGMII] = {
3455 [TYPE_NONE] = {
3456 [NO_SSC] = &sl_sgmii_link_cmn_vals,
3457 },
3458 [TYPE_PCIE] = {
3459 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3460 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3461 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3462 },
3463 [TYPE_USB] = {
3464 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3465 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3466 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3467 },
3468 },
3469 [TYPE_QSGMII] = {
3470 [TYPE_NONE] = {
3471 [NO_SSC] = &sl_sgmii_link_cmn_vals,
3472 },
3473 [TYPE_PCIE] = {
3474 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3475 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3476 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3477 },
3478 [TYPE_USB] = {
3479 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3480 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3481 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3482 },
3483 },
3484 [TYPE_USB] = {
3485 [TYPE_NONE] = {
3486 [NO_SSC] = &sl_usb_link_cmn_vals,
3487 [EXTERNAL_SSC] = &sl_usb_link_cmn_vals,
3488 [INTERNAL_SSC] = &sl_usb_link_cmn_vals,
3489 },
3490 [TYPE_PCIE] = {
3491 [NO_SSC] = &pcie_usb_link_cmn_vals,
3492 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3493 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3494 },
3495 [TYPE_SGMII] = {
3496 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3497 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3498 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3499 },
3500 [TYPE_QSGMII] = {
3501 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3502 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3503 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3504 },
3505 },
3506 },
3507 .xcvr_diag_vals = {
3508 [TYPE_PCIE] = {
3509 [TYPE_NONE] = {
3510 [NO_SSC] = NULL,
3511 [EXTERNAL_SSC] = NULL,
3512 [INTERNAL_SSC] = NULL,
3513 },
3514 [TYPE_SGMII] = {
3515 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3516 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3517 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3518 },
3519 [TYPE_QSGMII] = {
3520 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3521 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3522 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3523 },
3524 [TYPE_USB] = {
3525 [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3526 [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3527 [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3528 },
3529 },
3530 [TYPE_SGMII] = {
3531 [TYPE_NONE] = {
3532 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
3533 },
3534 [TYPE_PCIE] = {
3535 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3536 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3537 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3538 },
3539 [TYPE_USB] = {
3540 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3541 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3542 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3543 },
3544 },
3545 [TYPE_QSGMII] = {
3546 [TYPE_NONE] = {
3547 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
3548 },
3549 [TYPE_PCIE] = {
3550 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3551 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3552 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3553 },
3554 [TYPE_USB] = {
3555 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3556 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3557 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3558 },
3559 },
3560 [TYPE_USB] = {
3561 [TYPE_NONE] = {
3562 [NO_SSC] = &sl_usb_xcvr_diag_ln_vals,
3563 [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
3564 [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
3565 },
3566 [TYPE_PCIE] = {
3567 [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3568 [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3569 [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3570 },
3571 [TYPE_SGMII] = {
3572 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3573 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3574 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3575 },
3576 [TYPE_QSGMII] = {
3577 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3578 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3579 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3580 },
3581 },
3582 },
3583 .pcs_cmn_vals = {
3584 [TYPE_USB] = {
3585 [TYPE_NONE] = {
3586 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3587 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3588 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3589 },
3590 [TYPE_PCIE] = {
3591 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3592 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3593 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3594 },
3595 [TYPE_SGMII] = {
3596 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3597 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3598 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3599 },
3600 [TYPE_QSGMII] = {
3601 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3602 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3603 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3604 },
3605 },
3606 },
3607 .cmn_vals = {
3608 [TYPE_PCIE] = {
3609 [TYPE_NONE] = {
3610 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3611 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3612 [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals,
3613 },
3614 [TYPE_SGMII] = {
3615 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3616 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3617 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3618 },
3619 [TYPE_QSGMII] = {
3620 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3621 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3622 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3623 },
3624 [TYPE_USB] = {
3625 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3626 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3627 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3628 },
3629 },
3630 [TYPE_SGMII] = {
3631 [TYPE_NONE] = {
3632 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3633 },
3634 [TYPE_PCIE] = {
3635 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3636 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3637 [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals,
3638 },
3639 [TYPE_USB] = {
3640 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3641 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3642 [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3643 },
3644 },
3645 [TYPE_QSGMII] = {
3646 [TYPE_NONE] = {
3647 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3648 },
3649 [TYPE_PCIE] = {
3650 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3651 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3652 [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals,
3653 },
3654 [TYPE_USB] = {
3655 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3656 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3657 [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3658 },
3659 },
3660 [TYPE_USB] = {
3661 [TYPE_NONE] = {
3662 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3663 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3664 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
3665 },
3666 [TYPE_PCIE] = {
3667 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3668 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3669 [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals,
3670 },
3671 [TYPE_SGMII] = {
3672 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3673 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3674 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
3675 },
3676 [TYPE_QSGMII] = {
3677 [NO_SSC] = &usb_100_no_ssc_cmn_vals,
3678 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
3679 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
3680 },
3681 },
3682 },
3683 .tx_ln_vals = {
3684 [TYPE_PCIE] = {
3685 [TYPE_NONE] = {
3686 [NO_SSC] = NULL,
3687 [EXTERNAL_SSC] = NULL,
3688 [INTERNAL_SSC] = NULL,
3689 },
3690 [TYPE_SGMII] = {
3691 [NO_SSC] = NULL,
3692 [EXTERNAL_SSC] = NULL,
3693 [INTERNAL_SSC] = NULL,
3694 },
3695 [TYPE_QSGMII] = {
3696 [NO_SSC] = NULL,
3697 [EXTERNAL_SSC] = NULL,
3698 [INTERNAL_SSC] = NULL,
3699 },
3700 [TYPE_USB] = {
3701 [NO_SSC] = NULL,
3702 [EXTERNAL_SSC] = NULL,
3703 [INTERNAL_SSC] = NULL,
3704 },
3705 },
3706 [TYPE_SGMII] = {
3707 [TYPE_NONE] = {
3708 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3709 },
3710 [TYPE_PCIE] = {
3711 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3712 [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3713 [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3714 },
3715 [TYPE_USB] = {
3716 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3717 [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3718 [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
3719 },
3720 },
3721 [TYPE_QSGMII] = {
3722 [TYPE_NONE] = {
3723 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3724 },
3725 [TYPE_PCIE] = {
3726 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3727 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3728 [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3729 },
3730 [TYPE_USB] = {
3731 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3732 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3733 [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
3734 },
3735 },
3736 [TYPE_USB] = {
3737 [TYPE_NONE] = {
3738 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3739 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3740 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3741 },
3742 [TYPE_PCIE] = {
3743 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3744 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3745 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3746 },
3747 [TYPE_SGMII] = {
3748 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3749 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3750 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3751 },
3752 [TYPE_QSGMII] = {
3753 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
3754 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3755 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
3756 },
3757 },
3758 },
3759 .rx_ln_vals = {
3760 [TYPE_PCIE] = {
3761 [TYPE_NONE] = {
3762 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3763 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3764 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3765 },
3766 [TYPE_SGMII] = {
3767 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3768 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3769 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3770 },
3771 [TYPE_QSGMII] = {
3772 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3773 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3774 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3775 },
3776 [TYPE_USB] = {
3777 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3778 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3779 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
3780 },
3781 },
3782 [TYPE_SGMII] = {
3783 [TYPE_NONE] = {
3784 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3785 },
3786 [TYPE_PCIE] = {
3787 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3788 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3789 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3790 },
3791 [TYPE_USB] = {
3792 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3793 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3794 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
3795 },
3796 },
3797 [TYPE_QSGMII] = {
3798 [TYPE_NONE] = {
3799 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3800 },
3801 [TYPE_PCIE] = {
3802 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3803 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3804 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3805 },
3806 [TYPE_USB] = {
3807 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3808 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3809 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
3810 },
3811 },
3812 [TYPE_USB] = {
3813 [TYPE_NONE] = {
3814 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3815 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3816 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3817 },
3818 [TYPE_PCIE] = {
3819 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3820 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3821 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3822 },
3823 [TYPE_SGMII] = {
3824 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3825 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3826 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3827 },
3828 [TYPE_QSGMII] = {
3829 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
3830 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3831 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
3832 },
3833 },
3834 },
3835 };
3836
3837 static const struct of_device_id cdns_torrent_phy_of_match[] = {
3838 {
3839 .compatible = "cdns,torrent-phy",
3840 .data = &cdns_map_torrent,
3841 },
3842 {
3843 .compatible = "ti,j721e-serdes-10g",
3844 .data = &ti_j721e_map_torrent,
3845 },
3846 {}
3847 };
3848 MODULE_DEVICE_TABLE(of, cdns_torrent_phy_of_match);
3849
3850 static struct platform_driver cdns_torrent_phy_driver = {
3851 .probe = cdns_torrent_phy_probe,
3852 .remove = cdns_torrent_phy_remove,
3853 .driver = {
3854 .name = "cdns-torrent-phy",
3855 .of_match_table = cdns_torrent_phy_of_match,
3856 }
3857 };
3858 module_platform_driver(cdns_torrent_phy_driver);
3859
3860 MODULE_AUTHOR("Cadence Design Systems, Inc.");
3861 MODULE_DESCRIPTION("Cadence Torrent PHY driver");
3862 MODULE_LICENSE("GPL v2");