1 // SPDX-License-Identifier: GPL-2.0-only
3 * Cadence Torrent SD0801 PHY driver.
5 * Copyright 2018 Cadence Design Systems, Inc.
9 #include <dt-bindings/phy/phy.h>
10 #include <linux/clk.h>
11 #include <linux/delay.h>
12 #include <linux/err.h>
14 #include <linux/iopoll.h>
15 #include <linux/kernel.h>
16 #include <linux/module.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>
25 #define REF_CLK_19_2MHz 19200000
26 #define REF_CLK_25MHz 25000000
28 #define MAX_NUM_LANES 4
29 #define DEFAULT_MAX_BIT_RATE 8100 /* in Mbps */
31 #define NUM_SSC_MODE 3
32 #define NUM_PHY_TYPE 6
34 #define POLL_TIMEOUT_US 5000
35 #define PLL_LOCK_TIMEOUT 100000
37 #define TORRENT_COMMON_CDB_OFFSET 0x0
39 #define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \
40 ((0x4000 << (block_offset)) + \
41 (((ln) << 9) << (reg_offset)))
43 #define TORRENT_RX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \
44 ((0x8000 << (block_offset)) + \
45 (((ln) << 9) << (reg_offset)))
47 #define TORRENT_PHY_PCS_COMMON_OFFSET(block_offset) \
48 (0xC000 << (block_offset))
50 #define TORRENT_PHY_PMA_COMMON_OFFSET(block_offset) \
51 (0xE000 << (block_offset))
53 #define TORRENT_DPTX_PHY_OFFSET 0x0
56 * register offsets from DPTX PHY register block base (i.e MHDP
57 * register base + 0x30a00)
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
76 * register offsets from SD0801 PHY register block base (i.e MHDP
77 * register base + 0x500000)
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
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
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
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
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
219 static const struct reg_field phy_pll_cfg
=
220 REG_FIELD(PHY_PLL_CFG
, 0, 1);
222 static const struct reg_field phy_pma_cmn_ctrl_1
=
223 REG_FIELD(PHY_PMA_CMN_CTRL1
, 0, 0);
225 static const struct reg_field phy_pma_cmn_ctrl_2
=
226 REG_FIELD(PHY_PMA_CMN_CTRL2
, 0, 7);
228 static const struct reg_field phy_pma_pll_raw_ctrl
=
229 REG_FIELD(PHY_PMA_PLL_RAW_CTRL
, 0, 1);
231 static const struct reg_field phy_reset_ctrl
=
232 REG_FIELD(PHY_RESET
, 8, 8);
234 enum cdns_torrent_phy_type
{
243 enum cdns_torrent_ssc_mode
{
249 struct cdns_torrent_inst
{
252 enum cdns_torrent_phy_type phy_type
;
254 struct reset_control
*lnk_rst
;
255 enum cdns_torrent_ssc_mode ssc_mode
;
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
;
266 unsigned long ref_clk_rate
;
267 struct cdns_torrent_inst phys
[MAX_NUM_LANES
];
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
;
284 enum phy_powerstate
{
286 /* Powerstate A1 is unused */
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
,
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
);
300 void cdns_torrent_dp_pma_cmn_cfg_19_2mhz(struct cdns_torrent_phy
*cdns_phy
);
302 void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy
*cdns_phy
,
305 void cdns_torrent_dp_pma_cmn_cfg_25mhz(struct cdns_torrent_phy
*cdns_phy
);
307 void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy
*cdns_phy
,
309 static void cdns_torrent_dp_pma_lane_cfg(struct cdns_torrent_phy
*cdns_phy
,
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
,
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
);
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
,
329 struct cdns_reg_pairs
{
334 struct cdns_torrent_vals
{
335 struct cdns_reg_pairs
*reg_pairs
;
339 struct cdns_torrent_data
{
340 u8 block_offset_shift
;
342 struct cdns_torrent_vals
*link_cmn_vals
[NUM_PHY_TYPE
][NUM_PHY_TYPE
]
344 struct cdns_torrent_vals
*xcvr_diag_vals
[NUM_PHY_TYPE
][NUM_PHY_TYPE
]
346 struct cdns_torrent_vals
*pcs_cmn_vals
[NUM_PHY_TYPE
][NUM_PHY_TYPE
]
348 struct cdns_torrent_vals
*cmn_vals
[NUM_PHY_TYPE
][NUM_PHY_TYPE
]
350 struct cdns_torrent_vals
*tx_ln_vals
[NUM_PHY_TYPE
][NUM_PHY_TYPE
]
352 struct cdns_torrent_vals
*rx_ln_vals
[NUM_PHY_TYPE
][NUM_PHY_TYPE
]
356 struct cdns_regmap_cdb_context
{
362 static int cdns_regmap_write(void *context
, unsigned int reg
, unsigned int val
)
364 struct cdns_regmap_cdb_context
*ctx
= context
;
365 u32 offset
= reg
<< ctx
->reg_offset_shift
;
367 writew(val
, ctx
->base
+ offset
);
372 static int cdns_regmap_read(void *context
, unsigned int reg
, unsigned int *val
)
374 struct cdns_regmap_cdb_context
*ctx
= context
;
375 u32 offset
= reg
<< ctx
->reg_offset_shift
;
377 *val
= readw(ctx
->base
+ offset
);
381 static int cdns_regmap_dptx_write(void *context
, unsigned int reg
,
384 struct cdns_regmap_cdb_context
*ctx
= context
;
387 writel(val
, ctx
->base
+ offset
);
392 static int cdns_regmap_dptx_read(void *context
, unsigned int reg
,
395 struct cdns_regmap_cdb_context
*ctx
= context
;
398 *val
= readl(ctx
->base
+ offset
);
402 #define TORRENT_TX_LANE_CDB_REGMAP_CONF(n) \
404 .name = "torrent_tx_lane" n "_cdb", \
407 .reg_write = cdns_regmap_write, \
408 .reg_read = cdns_regmap_read, \
411 #define TORRENT_RX_LANE_CDB_REGMAP_CONF(n) \
413 .name = "torrent_rx_lane" n "_cdb", \
416 .reg_write = cdns_regmap_write, \
417 .reg_read = cdns_regmap_read, \
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"),
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"),
434 static const struct regmap_config cdns_torrent_common_cdb_config
= {
435 .name
= "torrent_common_cdb",
438 .reg_write
= cdns_regmap_write
,
439 .reg_read
= cdns_regmap_read
,
442 static const struct regmap_config cdns_torrent_phy_pcs_cmn_cdb_config
= {
443 .name
= "torrent_phy_pcs_cmn_cdb",
446 .reg_write
= cdns_regmap_write
,
447 .reg_read
= cdns_regmap_read
,
450 static const struct regmap_config cdns_torrent_phy_pma_cmn_cdb_config
= {
451 .name
= "torrent_phy_pma_cmn_cdb",
454 .reg_write
= cdns_regmap_write
,
455 .reg_read
= cdns_regmap_read
,
458 static const struct regmap_config cdns_torrent_dptx_phy_config
= {
459 .name
= "torrent_dptx_phy",
462 .reg_write
= cdns_regmap_dptx_write
,
463 .reg_read
= cdns_regmap_dptx_read
,
466 /* PHY mmr access functions */
468 static void cdns_torrent_phy_write(struct regmap
*regmap
, u32 offset
, u32 val
)
470 regmap_write(regmap
, offset
, val
);
473 static u32
cdns_torrent_phy_read(struct regmap
*regmap
, u32 offset
)
477 regmap_read(regmap
, offset
, &val
);
481 /* DPTX mmr access functions */
483 static void cdns_torrent_dp_write(struct regmap
*regmap
, u32 offset
, u32 val
)
485 regmap_write(regmap
, offset
, val
);
488 static u32
cdns_torrent_dp_read(struct regmap
*regmap
, u32 offset
)
492 regmap_read(regmap
, offset
, &val
);
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.
501 struct coefficients
{
502 /* Value of DRV_DIAG_TX_DRV register to use */
504 /* Value of TX_TXCC_MGNFS_MULT_000 register to use */
506 /* Value of TX_TXCC_CPOST_MULT_00 register to use */
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.
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}
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}
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}
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}
561 * Enable or disable PLL for selected lanes.
563 static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy
*cdns_phy
,
564 struct phy_configure_opts_dp
*dp
,
569 struct regmap
*regmap
= cdns_phy
->regmap_dptx_phy_reg
;
572 * Used to determine, which bits to check for or enable in
573 * PHY_PMA_XCVR_PLLCLK_EN register.
576 /* Used to enable or disable lanes. */
579 /* Select values of registers and mask, depending on enabled lane
585 pll_bits
= 0x00000001;
589 pll_bits
= 0x00000003;
593 pll_bits
= 0x0000000F;
600 pll_val
= 0x00000000;
602 cdns_torrent_dp_write(regmap
, PHY_PMA_XCVR_PLLCLK_EN
, pll_val
);
604 /* Wait for acknowledgment from PHY. */
605 ret
= regmap_read_poll_timeout(regmap
,
606 PHY_PMA_XCVR_PLLCLK_EN_ACK
,
608 (rd_val
& pll_bits
) == pll_val
,
615 * Perform register operations related to setting link rate, once powerstate is
616 * set and PLL disable request was processed.
618 static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy
*cdns_phy
,
619 struct phy_configure_opts_dp
*dp
)
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);
628 * Wait for PLL ready de-assertion.
629 * For PLL0 - PHY_PMA_CMN_CTRL2[2] == 1
631 ret
= regmap_field_read_poll_timeout(cdns_phy
->phy_pma_cmn_ctrl_2
,
633 ((read_val
>> 2) & 0x01) != 0,
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
,
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
,
649 cdns_torrent_dp_pma_cmn_cfg_25mhz(cdns_phy
);
651 cdns_torrent_dp_pma_cmn_rate(cdns_phy
, dp
->link_rate
, dp
->lanes
);
653 /* Enable the cmn_pll0_en. */
654 regmap_field_write(cdns_phy
->phy_pma_pll_raw_ctrl
, 0x3);
657 * Wait for PLL ready assertion.
658 * For PLL0 - PHY_PMA_CMN_CTRL2[0] == 1
660 ret
= regmap_field_read_poll_timeout(cdns_phy
->phy_pma_cmn_ctrl_2
,
662 (read_val
& 0x01) != 0,
668 * Verify, that parameters to configure PHY with are correct.
670 static int cdns_torrent_dp_verify_config(struct cdns_torrent_inst
*inst
,
671 struct phy_configure_opts_dp
*dp
)
675 /* If changing link rate was required, verify it's supported. */
677 switch (dp
->link_rate
) {
693 /* Verify lane count. */
698 /* valid lane count. */
704 /* Check against actual number of PHY's lanes. */
705 if (dp
->lanes
> inst
->num_lanes
)
709 * If changing voltages is required, check swing and pre-emphasis
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)
718 /* Sum of voltage swing and pre-emphasis levels cannot
721 if (dp
->voltage
[i
] + dp
->pre
[i
] > 3)
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
,
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
);
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
;
746 pwr_state
&= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK
<<
747 PHY_POWER_STATE_LN_1
);
748 pll_clk_en
&= ~(0x01U
<< 1);
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);
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
);
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
)
771 struct regmap
*regmap
= cdns_phy
->regmap_dptx_phy_reg
;
772 u8 lane_mask
= (1 << dp
->lanes
) - 1;
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
);
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
));
787 * Assert lane reset on unused lanes and lane 0 so they remain in reset
788 * and powered down when re-enabling the link
790 value
= (value
& 0x0000FFF0) | (0x0000000E & lane_mask
);
791 cdns_torrent_dp_write(regmap
, PHY_RESET
, value
);
793 cdns_torrent_dp_set_a0_pll(cdns_phy
, dp
->lanes
);
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
);
799 /* Wait, until PHY gets ready after releasing PHY reset signal. */
800 ret
= cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy
);
806 /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
807 cdns_torrent_dp_write(regmap
, PHY_PMA_XCVR_PLLCLK_EN
, 0x0001);
809 ret
= cdns_torrent_dp_run(cdns_phy
, dp
->lanes
);
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
)
820 ret
= cdns_torrent_dp_set_power_state(cdns_phy
, dp
->lanes
,
824 ret
= cdns_torrent_dp_set_pll_en(cdns_phy
, dp
, false);
829 ret
= cdns_torrent_dp_configure_rate(cdns_phy
, dp
);
834 ret
= cdns_torrent_dp_set_pll_en(cdns_phy
, dp
, true);
837 ret
= cdns_torrent_dp_set_power_state(cdns_phy
, dp
->lanes
,
841 ret
= cdns_torrent_dp_set_power_state(cdns_phy
, dp
->lanes
,
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
)
857 for (lane
= 0; lane
< dp
->lanes
; lane
++) {
858 val
= cdns_torrent_phy_read(cdns_phy
->regmap_tx_lane_cdb
[lane
],
861 * Write 1 to register bit TX_DIAG_ACYA[0] to freeze the
862 * current state of the analog TX driver.
864 val
|= TX_DIAG_ACYA_HBDC_MASK
;
865 cdns_torrent_phy_write(cdns_phy
->regmap_tx_lane_cdb
[lane
],
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
,
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
,
882 val
= cdns_torrent_phy_read(cdns_phy
->regmap_tx_lane_cdb
[lane
],
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.
888 val
&= ~TX_DIAG_ACYA_HBDC_MASK
;
889 cdns_torrent_phy_write(cdns_phy
->regmap_tx_lane_cdb
[lane
],
894 static int cdns_torrent_dp_configure(struct phy
*phy
,
895 union phy_configure_opts
*opts
)
897 struct cdns_torrent_inst
*inst
= phy_get_drvdata(phy
);
898 struct cdns_torrent_phy
*cdns_phy
= dev_get_drvdata(phy
->dev
.parent
);
901 ret
= cdns_torrent_dp_verify_config(inst
, &opts
->dp
);
903 dev_err(&phy
->dev
, "invalid params for phy configure\n");
907 if (opts
->dp
.set_lanes
) {
908 ret
= cdns_torrent_dp_set_lanes(cdns_phy
, &opts
->dp
);
910 dev_err(&phy
->dev
, "cdns_torrent_dp_set_lanes failed\n");
915 if (opts
->dp
.set_rate
) {
916 ret
= cdns_torrent_dp_set_rate(cdns_phy
, &opts
->dp
);
918 dev_err(&phy
->dev
, "cdns_torrent_dp_set_rate failed\n");
923 if (opts
->dp
.set_voltages
)
924 cdns_torrent_dp_set_voltages(cdns_phy
, &opts
->dp
);
929 static int cdns_torrent_dp_init(struct phy
*phy
)
931 unsigned char lane_bits
;
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
;
937 switch (cdns_phy
->ref_clk_rate
) {
938 case REF_CLK_19_2MHz
:
940 /* Valid Ref Clock Rate */
943 dev_err(cdns_phy
->dev
, "Unsupported Ref Clock Rate\n");
947 cdns_torrent_dp_write(regmap
, PHY_AUX_CTRL
, 0x0003); /* enable AUX */
949 /* PHY PMA registers configuration function */
950 cdns_torrent_dp_pma_cfg(cdns_phy
, inst
);
953 * Set lines power state to A0
954 * Set lines pll clk enable to 0
956 cdns_torrent_dp_set_a0_pll(cdns_phy
, inst
->num_lanes
);
959 * release phy_l0*_reset_n and pma_tx_elec_idle_ln_* based on
962 lane_bits
= (1 << inst
->num_lanes
) - 1;
963 cdns_torrent_dp_write(regmap
, PHY_RESET
,
964 ((0xF & ~lane_bits
) << 4) | (0xF & lane_bits
));
966 /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
967 cdns_torrent_dp_write(regmap
, PHY_PMA_XCVR_PLLCLK_EN
, 0x0001);
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
,
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
,
979 cdns_torrent_dp_pma_cmn_rate(cdns_phy
, cdns_phy
->max_bit_rate
,
982 /* take out of reset */
983 regmap_field_write(cdns_phy
->phy_reset_ctrl
, 0x1);
985 cdns_torrent_phy_on(phy
);
987 ret
= cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy
);
991 ret
= cdns_torrent_dp_run(cdns_phy
, inst
->num_lanes
);
997 int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy
*cdns_phy
)
1001 struct regmap
*regmap
= cdns_phy
->regmap_dptx_phy_reg
;
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");
1014 static void cdns_torrent_dp_pma_cfg(struct cdns_torrent_phy
*cdns_phy
,
1015 struct cdns_torrent_inst
*inst
)
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
);
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
);
1032 void cdns_torrent_dp_pma_cmn_cfg_19_2mhz(struct cdns_torrent_phy
*cdns_phy
)
1034 struct regmap
*regmap
= cdns_phy
->regmap_common_cdb
;
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);
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);
1076 * Set registers responsible for enabling and configuring SSC, with second and
1077 * third register values provided by parameters.
1080 void cdns_torrent_dp_enable_ssc_19_2mhz(struct cdns_torrent_phy
*cdns_phy
,
1081 u32 ctrl2_val
, u32 ctrl3_val
)
1083 struct regmap
*regmap
= cdns_phy
->regmap_common_cdb
;
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);
1096 void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy
*cdns_phy
,
1099 struct regmap
*regmap
= cdns_phy
->regmap_common_cdb
;
1101 /* Assumes 19.2 MHz refclock */
1103 /* Setting VCO for 10.8GHz */
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);
1127 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy
, 0x033A,
1130 /* Setting VCO for 9.72GHz */
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);
1155 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy
, 0x05DD,
1158 /* Setting VCO for 8.64GHz */
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);
1182 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy
, 0x0536,
1185 /* Setting VCO for 8.1GHz */
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);
1208 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy
, 0x04D7,
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);
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);
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);
1257 void cdns_torrent_dp_pma_cmn_cfg_25mhz(struct cdns_torrent_phy
*cdns_phy
)
1259 struct regmap
*regmap
= cdns_phy
->regmap_common_cdb
;
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);
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);
1301 * Set registers responsible for enabling and configuring SSC, with second
1302 * register value provided by a parameter.
1304 static void cdns_torrent_dp_enable_ssc_25mhz(struct cdns_torrent_phy
*cdns_phy
,
1307 struct regmap
*regmap
= cdns_phy
->regmap_common_cdb
;
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);
1320 void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy
*cdns_phy
,
1323 struct regmap
*regmap
= cdns_phy
->regmap_common_cdb
;
1325 /* Assumes 25 MHz refclock */
1327 /* Setting VCO for 10.8GHz */
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);
1339 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy
, 0x0423);
1341 /* Setting VCO for 9.72GHz */
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);
1354 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy
, 0x03B9);
1356 /* Setting VCO for 8.64GHz */
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);
1368 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy
, 0x034F);
1370 /* Setting VCO for 8.1GHz */
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);
1381 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy
, 0x031A);
1385 cdns_torrent_phy_write(regmap
, CMN_PDIAG_PLL0_CTRL_M0
, 0x0002);
1386 cdns_torrent_phy_write(regmap
, CMN_PDIAG_PLL1_CTRL_M0
, 0x0002);
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);
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);
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);
1423 static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy
*cdns_phy
,
1424 u32 rate
, u32 num_lanes
)
1426 unsigned int clk_sel_val
= 0;
1427 unsigned int hsclk_div_val
= 0;
1430 /* 16'h0000 for single DP link configuration */
1431 regmap_field_write(cdns_phy
->phy_pll_cfg
, 0x0);
1435 clk_sel_val
= 0x0f01;
1441 clk_sel_val
= 0x0701;
1445 clk_sel_val
= 0x0b00;
1450 clk_sel_val
= 0x0301;
1454 clk_sel_val
= 0x0200;
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
);
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
);
1470 static void cdns_torrent_dp_pma_lane_cfg(struct cdns_torrent_phy
*cdns_phy
,
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);
1481 /* Writing Tx/Rx Power State Controllers registers */
1482 cdns_torrent_phy_write(cdns_phy
->regmap_tx_lane_cdb
[lane
],
1484 cdns_torrent_phy_write(cdns_phy
->regmap_tx_lane_cdb
[lane
],
1486 cdns_torrent_phy_write(cdns_phy
->regmap_tx_lane_cdb
[lane
],
1488 cdns_torrent_phy_write(cdns_phy
->regmap_rx_lane_cdb
[lane
],
1490 cdns_torrent_phy_write(cdns_phy
->regmap_rx_lane_cdb
[lane
],
1492 cdns_torrent_phy_write(cdns_phy
->regmap_rx_lane_cdb
[lane
],
1495 cdns_torrent_phy_write(cdns_phy
->regmap_rx_lane_cdb
[lane
],
1496 RX_PSC_CAL
, 0x0000);
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);
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);
1513 static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy
*cdns_phy
,
1515 enum phy_powerstate powerstate
)
1517 /* Register value for power state for a single byte. */
1523 struct regmap
*regmap
= cdns_phy
->regmap_dptx_phy_reg
;
1525 switch (powerstate
) {
1526 case (POWERSTATE_A0
):
1529 case (POWERSTATE_A2
):
1538 /* Select values of registers and mask, depending on enabled
1541 switch (num_lanes
) {
1550 | (value_part
<< 8));
1553 /* lanes 0-3, all */
1557 | (value_part
<< 16)
1558 | (value_part
<< 24));
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,
1569 cdns_torrent_dp_write(regmap
, PHY_PMA_XCVR_POWER_STATE_REQ
, 0x00000000);
1575 static int cdns_torrent_dp_run(struct cdns_torrent_phy
*cdns_phy
, u32 num_lanes
)
1577 unsigned int read_val
;
1579 struct regmap
*regmap
= cdns_phy
->regmap_dptx_phy_reg
;
1582 * waiting for ACK of pma_xcvr_pllclk_en_ln_*, only for the
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");
1596 ret
= cdns_torrent_dp_set_power_state(cdns_phy
, num_lanes
,
1601 ret
= cdns_torrent_dp_set_power_state(cdns_phy
, num_lanes
,
1607 static int cdns_torrent_phy_on(struct phy
*phy
)
1609 struct cdns_torrent_inst
*inst
= phy_get_drvdata(phy
);
1610 struct cdns_torrent_phy
*cdns_phy
= dev_get_drvdata(phy
->dev
.parent
);
1614 if (cdns_phy
->nsubnodes
== 1) {
1615 /* Take the PHY lane group out of reset */
1616 reset_control_deassert(inst
->lnk_rst
);
1618 /* Take the PHY out of reset */
1619 ret
= reset_control_deassert(cdns_phy
->phy_rst
);
1625 * Wait for cmn_ready assertion
1626 * PHY_PMA_CMN_CTRL1[0] == 1
1628 ret
= regmap_field_read_poll_timeout(cdns_phy
->phy_pma_cmn_ctrl_1
,
1629 read_val
, read_val
, 1000,
1632 dev_err(cdns_phy
->dev
, "Timeout waiting for CMN ready\n");
1641 static int cdns_torrent_phy_off(struct phy
*phy
)
1643 struct cdns_torrent_inst
*inst
= phy_get_drvdata(phy
);
1644 struct cdns_torrent_phy
*cdns_phy
= dev_get_drvdata(phy
->dev
.parent
);
1647 if (cdns_phy
->nsubnodes
!= 1)
1650 ret
= reset_control_assert(cdns_phy
->phy_rst
);
1654 return reset_control_assert(inst
->lnk_rst
);
1657 static struct regmap
*cdns_regmap_init(struct device
*dev
, void __iomem
*base
,
1659 u8 reg_offset_shift
,
1660 const struct regmap_config
*config
)
1662 struct cdns_regmap_cdb_context
*ctx
;
1664 ctx
= devm_kzalloc(dev
, sizeof(*ctx
), GFP_KERNEL
);
1666 return ERR_PTR(-ENOMEM
);
1669 ctx
->base
= base
+ block_offset
;
1670 ctx
->reg_offset_shift
= reg_offset_shift
;
1672 return devm_regmap_init(dev
, NULL
, ctx
, config
);
1675 static int cdns_torrent_dp_regfield_init(struct cdns_torrent_phy
*cdns_phy
)
1677 struct device
*dev
= cdns_phy
->dev
;
1678 struct regmap_field
*field
;
1679 struct regmap
*regmap
;
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
);
1687 cdns_phy
->phy_reset_ctrl
= field
;
1692 static int cdns_torrent_regfield_init(struct cdns_torrent_phy
*cdns_phy
)
1694 struct device
*dev
= cdns_phy
->dev
;
1695 struct regmap_field
*field
;
1696 struct regmap
*regmap
;
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
);
1704 cdns_phy
->phy_pll_cfg
= field
;
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
);
1712 cdns_phy
->phy_pma_cmn_ctrl_1
= field
;
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
);
1720 cdns_phy
->phy_pma_cmn_ctrl_2
= field
;
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
);
1728 cdns_phy
->phy_pma_pll_raw_ctrl
= field
;
1733 static int cdns_torrent_dp_regmap_init(struct cdns_torrent_phy
*cdns_phy
)
1735 void __iomem
*base
= cdns_phy
->base
;
1736 struct device
*dev
= cdns_phy
->dev
;
1737 struct regmap
*regmap
;
1738 u8 reg_offset_shift
;
1741 reg_offset_shift
= cdns_phy
->init_data
->reg_offset_shift
;
1743 block_offset
= TORRENT_DPTX_PHY_OFFSET
;
1744 regmap
= cdns_regmap_init(dev
, base
, block_offset
,
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
);
1751 cdns_phy
->regmap_dptx_phy_reg
= regmap
;
1756 static int cdns_torrent_regmap_init(struct cdns_torrent_phy
*cdns_phy
)
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
;
1765 block_offset_shift
= cdns_phy
->init_data
->block_offset_shift
;
1766 reg_offset_shift
= cdns_phy
->init_data
->reg_offset_shift
;
1768 for (i
= 0; i
< MAX_NUM_LANES
; i
++) {
1769 block_offset
= TORRENT_TX_LANE_CDB_OFFSET(i
, block_offset_shift
,
1771 regmap
= cdns_regmap_init(dev
, sd_base
, block_offset
,
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
);
1778 cdns_phy
->regmap_tx_lane_cdb
[i
] = regmap
;
1780 block_offset
= TORRENT_RX_LANE_CDB_OFFSET(i
, block_offset_shift
,
1782 regmap
= cdns_regmap_init(dev
, sd_base
, block_offset
,
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
);
1789 cdns_phy
->regmap_rx_lane_cdb
[i
] = regmap
;
1792 block_offset
= TORRENT_COMMON_CDB_OFFSET
;
1793 regmap
= cdns_regmap_init(dev
, sd_base
, block_offset
,
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
);
1800 cdns_phy
->regmap_common_cdb
= regmap
;
1802 block_offset
= TORRENT_PHY_PCS_COMMON_OFFSET(block_offset_shift
);
1803 regmap
= cdns_regmap_init(dev
, sd_base
, block_offset
,
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
);
1810 cdns_phy
->regmap_phy_pcs_common_cdb
= regmap
;
1812 block_offset
= TORRENT_PHY_PMA_COMMON_OFFSET(block_offset_shift
);
1813 regmap
= cdns_regmap_init(dev
, sd_base
, block_offset
,
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
);
1820 cdns_phy
->regmap_phy_pma_common_cdb
= regmap
;
1825 static int cdns_torrent_phy_init(struct phy
*phy
)
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
;
1840 if (cdns_phy
->nsubnodes
> 1)
1843 if (phy_type
== TYPE_DP
)
1844 return cdns_torrent_dp_init(phy
);
1847 * Spread spectrum generation is not required or supported
1850 if (phy_type
== TYPE_SGMII
|| phy_type
== TYPE_QSGMII
)
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
;
1861 * First array value in link_cmn_vals must be of
1862 * PHY_PLL_CFG register
1864 regmap_field_write(cdns_phy
->phy_pll_cfg
, reg_pairs
[0].val
);
1866 for (i
= 1; i
< num_regs
; i
++)
1867 regmap_write(regmap
, reg_pairs
[i
].off
,
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
,
1883 /* PHY PCS common registers configurations */
1884 pcs_cmn_vals
= init_data
->pcs_cmn_vals
[phy_type
][TYPE_NONE
][ssc
];
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
,
1894 /* PMA common registers configurations */
1895 cmn_vals
= init_data
->cmn_vals
[phy_type
][TYPE_NONE
][ssc
];
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
,
1905 /* PMA TX lane registers configurations */
1906 tx_ln_vals
= init_data
->tx_ln_vals
[phy_type
][TYPE_NONE
][ssc
];
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
,
1918 /* PMA RX lane registers configurations */
1919 rx_ln_vals
= init_data
->rx_ln_vals
[phy_type
][TYPE_NONE
][ssc
];
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
,
1935 int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy
*cdns_phy
)
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
;
1948 /* Maximum 2 links (subnodes) are supported */
1949 if (cdns_phy
->nsubnodes
!= 2)
1952 phy_t1
= cdns_phy
->phys
[0].phy_type
;
1953 phy_t2
= cdns_phy
->phys
[1].phy_type
;
1956 * First configure the PHY for first link with phy_t1. Get the array
1957 * values as [phy_t1][phy_t2][ssc].
1959 for (node
= 0; node
< cdns_phy
->nsubnodes
; node
++) {
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].
1966 tmp_phy_type
= phy_t1
;
1968 phy_t2
= tmp_phy_type
;
1971 mlane
= cdns_phy
->phys
[node
].mlane
;
1972 ssc
= cdns_phy
->phys
[node
].ssc_mode
;
1973 num_lanes
= cdns_phy
->phys
[node
].num_lanes
;
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.
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
;
1992 * First array value in link_cmn_vals must be of
1993 * PHY_PLL_CFG register
1995 regmap_field_write(cdns_phy
->phy_pll_cfg
,
1998 for (i
= 1; i
< num_regs
; i
++)
1999 regmap_write(regmap
, reg_pairs
[i
].off
,
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
,
2015 /* PHY PCS common registers configurations */
2016 pcs_cmn_vals
= init_data
->pcs_cmn_vals
[phy_t1
][phy_t2
][ssc
];
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
,
2026 /* PMA common registers configurations */
2027 cmn_vals
= init_data
->cmn_vals
[phy_t1
][phy_t2
][ssc
];
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
,
2037 /* PMA TX lane registers configurations */
2038 tx_ln_vals
= init_data
->tx_ln_vals
[phy_t1
][phy_t2
][ssc
];
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
,
2050 /* PMA RX lane registers configurations */
2051 rx_ln_vals
= init_data
->rx_ln_vals
[phy_t1
][phy_t2
][ssc
];
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
,
2063 reset_control_deassert(cdns_phy
->phys
[node
].lnk_rst
);
2066 /* Take the PHY out of reset */
2067 ret
= reset_control_deassert(cdns_phy
->phy_rst
);
2074 static int cdns_torrent_phy_probe(struct platform_device
*pdev
)
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;
2086 /* Get init data for this PHY */
2087 data
= of_device_get_match_data(dev
);
2091 cdns_phy
= devm_kzalloc(dev
, sizeof(*cdns_phy
), GFP_KERNEL
);
2095 dev_set_drvdata(dev
, cdns_phy
);
2096 cdns_phy
->dev
= dev
;
2097 cdns_phy
->init_data
= data
;
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
);
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
);
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
);
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
);
2123 subnodes
= of_get_available_child_count(dev
->of_node
);
2124 if (subnodes
== 0) {
2125 dev_err(dev
, "No available link subnodes found\n");
2129 ret
= cdns_torrent_regmap_init(cdns_phy
);
2133 ret
= cdns_torrent_regfield_init(cdns_phy
);
2137 ret
= clk_prepare_enable(cdns_phy
->clk
);
2139 dev_err(cdns_phy
->dev
, "Failed to prepare ref clock\n");
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
);
2151 reset_control_deassert(cdns_phy
->apb_rst
);
2153 for_each_available_child_of_node(dev
->of_node
, child
) {
2156 /* PHY subnode name must be 'phy'. */
2157 if (!(of_node_name_eq(child
, "phy")))
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",
2165 ret
= PTR_ERR(cdns_phy
->phys
[node
].lnk_rst
);
2169 if (of_property_read_u32(child
, "reg",
2170 &cdns_phy
->phys
[node
].mlane
)) {
2171 dev_err(dev
, "%s: No \"reg\"-property.\n",
2177 if (of_property_read_u32(child
, "cdns,phy-type", &phy_type
)) {
2178 dev_err(dev
, "%s: No \"cdns,phy-type\"-property.\n",
2186 cdns_phy
->phys
[node
].phy_type
= TYPE_PCIE
;
2189 cdns_phy
->phys
[node
].phy_type
= TYPE_DP
;
2191 case PHY_TYPE_SGMII
:
2192 cdns_phy
->phys
[node
].phy_type
= TYPE_SGMII
;
2194 case PHY_TYPE_QSGMII
:
2195 cdns_phy
->phys
[node
].phy_type
= TYPE_QSGMII
;
2198 cdns_phy
->phys
[node
].phy_type
= TYPE_USB
;
2201 dev_err(dev
, "Unsupported protocol\n");
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",
2214 total_num_lanes
+= cdns_phy
->phys
[node
].num_lanes
;
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
);
2221 gphy
= devm_phy_create(dev
, child
, &cdns_torrent_phy_ops
);
2223 ret
= PTR_ERR(gphy
);
2227 if (cdns_phy
->phys
[node
].phy_type
== TYPE_DP
) {
2228 switch (cdns_phy
->phys
[node
].num_lanes
) {
2232 /* valid number of lanes */
2235 dev_err(dev
, "unsupported number of lanes: %d\n",
2236 cdns_phy
->phys
[node
].num_lanes
);
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
);
2245 switch (cdns_phy
->max_bit_rate
) {
2254 /* valid bit rate */
2257 dev_err(dev
, "unsupported max bit rate: %dMbps\n",
2258 cdns_phy
->max_bit_rate
);
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
);
2270 if (!init_dp_regmap
) {
2271 ret
= cdns_torrent_dp_regmap_init(cdns_phy
);
2275 ret
= cdns_torrent_dp_regfield_init(cdns_phy
);
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);
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
;
2292 cdns_phy
->phys
[node
].phy
= gphy
;
2293 phy_set_drvdata(gphy
, &cdns_phy
->phys
[node
]);
2297 cdns_phy
->nsubnodes
= node
;
2299 if (total_num_lanes
> MAX_NUM_LANES
) {
2300 dev_err(dev
, "Invalid lane configuration\n");
2304 if (cdns_phy
->nsubnodes
> 1) {
2305 ret
= cdns_torrent_phy_configure_multilink(cdns_phy
);
2310 phy_provider
= devm_of_phy_provider_register(dev
, of_phy_simple_xlate
);
2311 if (IS_ERR(phy_provider
)) {
2312 ret
= PTR_ERR(phy_provider
);
2321 for (i
= 0; i
< node
; i
++)
2322 reset_control_put(cdns_phy
->phys
[i
].lnk_rst
);
2324 reset_control_assert(cdns_phy
->apb_rst
);
2325 clk_disable_unprepare(cdns_phy
->clk
);
2329 static int cdns_torrent_phy_remove(struct platform_device
*pdev
)
2331 struct cdns_torrent_phy
*cdns_phy
= platform_get_drvdata(pdev
);
2334 reset_control_assert(cdns_phy
->phy_rst
);
2335 reset_control_assert(cdns_phy
->apb_rst
);
2336 for (i
= 0; i
< cdns_phy
->nsubnodes
; i
++) {
2337 reset_control_assert(cdns_phy
->phys
[i
].lnk_rst
);
2338 reset_control_put(cdns_phy
->phys
[i
].lnk_rst
);
2341 clk_disable_unprepare(cdns_phy
->clk
);
2346 /* USB and SGMII/QSGMII link configuration */
2347 static struct cdns_reg_pairs usb_sgmii_link_cmn_regs
[] = {
2348 {0x0002, PHY_PLL_CFG
},
2349 {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0
},
2350 {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0
}
2353 static struct cdns_reg_pairs usb_sgmii_xcvr_diag_ln_regs
[] = {
2354 {0x0000, XCVR_DIAG_HSCLK_SEL
},
2355 {0x0001, XCVR_DIAG_HSCLK_DIV
},
2356 {0x0041, XCVR_DIAG_PLLDRC_CTRL
}
2359 static struct cdns_reg_pairs sgmii_usb_xcvr_diag_ln_regs
[] = {
2360 {0x0011, XCVR_DIAG_HSCLK_SEL
},
2361 {0x0003, XCVR_DIAG_HSCLK_DIV
},
2362 {0x009B, XCVR_DIAG_PLLDRC_CTRL
}
2365 static struct cdns_torrent_vals usb_sgmii_link_cmn_vals
= {
2366 .reg_pairs
= usb_sgmii_link_cmn_regs
,
2367 .num_regs
= ARRAY_SIZE(usb_sgmii_link_cmn_regs
),
2370 static struct cdns_torrent_vals usb_sgmii_xcvr_diag_ln_vals
= {
2371 .reg_pairs
= usb_sgmii_xcvr_diag_ln_regs
,
2372 .num_regs
= ARRAY_SIZE(usb_sgmii_xcvr_diag_ln_regs
),
2375 static struct cdns_torrent_vals sgmii_usb_xcvr_diag_ln_vals
= {
2376 .reg_pairs
= sgmii_usb_xcvr_diag_ln_regs
,
2377 .num_regs
= ARRAY_SIZE(sgmii_usb_xcvr_diag_ln_regs
),
2380 /* PCIe and USB Unique SSC link configuration */
2381 static struct cdns_reg_pairs pcie_usb_link_cmn_regs
[] = {
2382 {0x0003, PHY_PLL_CFG
},
2383 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0
},
2384 {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1
},
2385 {0x8600, CMN_PDIAG_PLL1_CLK_SEL_M0
}
2388 static struct cdns_reg_pairs pcie_usb_xcvr_diag_ln_regs
[] = {
2389 {0x0000, XCVR_DIAG_HSCLK_SEL
},
2390 {0x0001, XCVR_DIAG_HSCLK_DIV
},
2391 {0x0012, XCVR_DIAG_PLLDRC_CTRL
}
2394 static struct cdns_reg_pairs usb_pcie_xcvr_diag_ln_regs
[] = {
2395 {0x0011, XCVR_DIAG_HSCLK_SEL
},
2396 {0x0001, XCVR_DIAG_HSCLK_DIV
},
2397 {0x00C9, XCVR_DIAG_PLLDRC_CTRL
}
2400 static struct cdns_torrent_vals pcie_usb_link_cmn_vals
= {
2401 .reg_pairs
= pcie_usb_link_cmn_regs
,
2402 .num_regs
= ARRAY_SIZE(pcie_usb_link_cmn_regs
),
2405 static struct cdns_torrent_vals pcie_usb_xcvr_diag_ln_vals
= {
2406 .reg_pairs
= pcie_usb_xcvr_diag_ln_regs
,
2407 .num_regs
= ARRAY_SIZE(pcie_usb_xcvr_diag_ln_regs
),
2410 static struct cdns_torrent_vals usb_pcie_xcvr_diag_ln_vals
= {
2411 .reg_pairs
= usb_pcie_xcvr_diag_ln_regs
,
2412 .num_regs
= ARRAY_SIZE(usb_pcie_xcvr_diag_ln_regs
),
2415 /* USB 100 MHz Ref clk, internal SSC */
2416 static struct cdns_reg_pairs usb_100_int_ssc_cmn_regs
[] = {
2417 {0x0004, CMN_PLL0_DSM_DIAG_M0
},
2418 {0x0004, CMN_PLL0_DSM_DIAG_M1
},
2419 {0x0004, CMN_PLL1_DSM_DIAG_M0
},
2420 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0
},
2421 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1
},
2422 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0
},
2423 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0
},
2424 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1
},
2425 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0
},
2426 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0
},
2427 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1
},
2428 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0
},
2429 {0x0064, CMN_PLL0_INTDIV_M0
},
2430 {0x0050, CMN_PLL0_INTDIV_M1
},
2431 {0x0064, CMN_PLL1_INTDIV_M0
},
2432 {0x0002, CMN_PLL0_FRACDIVH_M0
},
2433 {0x0002, CMN_PLL0_FRACDIVH_M1
},
2434 {0x0002, CMN_PLL1_FRACDIVH_M0
},
2435 {0x0044, CMN_PLL0_HIGH_THR_M0
},
2436 {0x0036, CMN_PLL0_HIGH_THR_M1
},
2437 {0x0044, CMN_PLL1_HIGH_THR_M0
},
2438 {0x0002, CMN_PDIAG_PLL0_CTRL_M0
},
2439 {0x0002, CMN_PDIAG_PLL0_CTRL_M1
},
2440 {0x0002, CMN_PDIAG_PLL1_CTRL_M0
},
2441 {0x0001, CMN_PLL0_SS_CTRL1_M0
},
2442 {0x0001, CMN_PLL0_SS_CTRL1_M1
},
2443 {0x0001, CMN_PLL1_SS_CTRL1_M0
},
2444 {0x011B, CMN_PLL0_SS_CTRL2_M0
},
2445 {0x011B, CMN_PLL0_SS_CTRL2_M1
},
2446 {0x011B, CMN_PLL1_SS_CTRL2_M0
},
2447 {0x006E, CMN_PLL0_SS_CTRL3_M0
},
2448 {0x0058, CMN_PLL0_SS_CTRL3_M1
},
2449 {0x006E, CMN_PLL1_SS_CTRL3_M0
},
2450 {0x000E, CMN_PLL0_SS_CTRL4_M0
},
2451 {0x0012, CMN_PLL0_SS_CTRL4_M1
},
2452 {0x000E, CMN_PLL1_SS_CTRL4_M0
},
2453 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START
},
2454 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START
},
2455 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START
},
2456 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START
},
2457 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2458 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2459 {0x00C7, CMN_PLL0_LOCK_REFCNT_START
},
2460 {0x00C7, CMN_PLL1_LOCK_REFCNT_START
},
2461 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START
},
2462 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START
},
2463 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR
},
2464 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR
},
2465 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD
},
2466 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD
}
2469 static struct cdns_torrent_vals usb_100_int_ssc_cmn_vals
= {
2470 .reg_pairs
= usb_100_int_ssc_cmn_regs
,
2471 .num_regs
= ARRAY_SIZE(usb_100_int_ssc_cmn_regs
),
2474 /* Single USB link configuration */
2475 static struct cdns_reg_pairs sl_usb_link_cmn_regs
[] = {
2476 {0x0000, PHY_PLL_CFG
},
2477 {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0
}
2480 static struct cdns_reg_pairs sl_usb_xcvr_diag_ln_regs
[] = {
2481 {0x0000, XCVR_DIAG_HSCLK_SEL
},
2482 {0x0001, XCVR_DIAG_HSCLK_DIV
},
2483 {0x0041, XCVR_DIAG_PLLDRC_CTRL
}
2486 static struct cdns_torrent_vals sl_usb_link_cmn_vals
= {
2487 .reg_pairs
= sl_usb_link_cmn_regs
,
2488 .num_regs
= ARRAY_SIZE(sl_usb_link_cmn_regs
),
2491 static struct cdns_torrent_vals sl_usb_xcvr_diag_ln_vals
= {
2492 .reg_pairs
= sl_usb_xcvr_diag_ln_regs
,
2493 .num_regs
= ARRAY_SIZE(sl_usb_xcvr_diag_ln_regs
),
2496 /* USB PHY PCS common configuration */
2497 static struct cdns_reg_pairs usb_phy_pcs_cmn_regs
[] = {
2498 {0x0A0A, PHY_PIPE_USB3_GEN2_PRE_CFG0
},
2499 {0x1000, PHY_PIPE_USB3_GEN2_POST_CFG0
},
2500 {0x0010, PHY_PIPE_USB3_GEN2_POST_CFG1
}
2503 static struct cdns_torrent_vals usb_phy_pcs_cmn_vals
= {
2504 .reg_pairs
= usb_phy_pcs_cmn_regs
,
2505 .num_regs
= ARRAY_SIZE(usb_phy_pcs_cmn_regs
),
2508 /* USB 100 MHz Ref clk, no SSC */
2509 static struct cdns_reg_pairs usb_100_no_ssc_cmn_regs
[] = {
2510 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2511 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2512 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD
},
2513 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD
}
2516 static struct cdns_reg_pairs usb_100_no_ssc_tx_ln_regs
[] = {
2517 {0x02FF, TX_PSC_A0
},
2518 {0x06AF, TX_PSC_A1
},
2519 {0x06AE, TX_PSC_A2
},
2520 {0x06AE, TX_PSC_A3
},
2521 {0x2A82, TX_TXCC_CTRL
},
2522 {0x0014, TX_TXCC_CPOST_MULT_01
},
2523 {0x0003, XCVR_DIAG_PSC_OVRD
}
2526 static struct cdns_reg_pairs usb_100_no_ssc_rx_ln_regs
[] = {
2527 {0x0D1D, RX_PSC_A0
},
2528 {0x0D1D, RX_PSC_A1
},
2529 {0x0D00, RX_PSC_A2
},
2530 {0x0500, RX_PSC_A3
},
2531 {0x0013, RX_SIGDET_HL_FILT_TMR
},
2532 {0x0000, RX_REE_GCSM1_CTRL
},
2533 {0x0C02, RX_REE_ATTEN_THR
},
2534 {0x0330, RX_REE_SMGM_CTRL1
},
2535 {0x0300, RX_REE_SMGM_CTRL2
},
2536 {0x0019, RX_REE_TAP1_CLIP
},
2537 {0x0019, RX_REE_TAP2TON_CLIP
},
2538 {0x1004, RX_DIAG_SIGDET_TUNE
},
2539 {0x00F9, RX_DIAG_NQST_CTRL
},
2540 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2
},
2541 {0x0002, RX_DIAG_DFE_AMP_TUNE_3
},
2542 {0x0000, RX_DIAG_PI_CAP
},
2543 {0x0031, RX_DIAG_PI_RATE
},
2544 {0x0001, RX_DIAG_ACYA
},
2545 {0x018C, RX_CDRLF_CNFG
},
2546 {0x0003, RX_CDRLF_CNFG3
}
2549 static struct cdns_torrent_vals usb_100_no_ssc_cmn_vals
= {
2550 .reg_pairs
= usb_100_no_ssc_cmn_regs
,
2551 .num_regs
= ARRAY_SIZE(usb_100_no_ssc_cmn_regs
),
2554 static struct cdns_torrent_vals usb_100_no_ssc_tx_ln_vals
= {
2555 .reg_pairs
= usb_100_no_ssc_tx_ln_regs
,
2556 .num_regs
= ARRAY_SIZE(usb_100_no_ssc_tx_ln_regs
),
2559 static struct cdns_torrent_vals usb_100_no_ssc_rx_ln_vals
= {
2560 .reg_pairs
= usb_100_no_ssc_rx_ln_regs
,
2561 .num_regs
= ARRAY_SIZE(usb_100_no_ssc_rx_ln_regs
),
2564 /* Single link USB, 100 MHz Ref clk, internal SSC */
2565 static struct cdns_reg_pairs sl_usb_100_int_ssc_cmn_regs
[] = {
2566 {0x0004, CMN_PLL0_DSM_DIAG_M0
},
2567 {0x0004, CMN_PLL1_DSM_DIAG_M0
},
2568 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0
},
2569 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0
},
2570 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0
},
2571 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0
},
2572 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0
},
2573 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0
},
2574 {0x0064, CMN_PLL0_INTDIV_M0
},
2575 {0x0064, CMN_PLL1_INTDIV_M0
},
2576 {0x0002, CMN_PLL0_FRACDIVH_M0
},
2577 {0x0002, CMN_PLL1_FRACDIVH_M0
},
2578 {0x0044, CMN_PLL0_HIGH_THR_M0
},
2579 {0x0044, CMN_PLL1_HIGH_THR_M0
},
2580 {0x0002, CMN_PDIAG_PLL0_CTRL_M0
},
2581 {0x0002, CMN_PDIAG_PLL1_CTRL_M0
},
2582 {0x0001, CMN_PLL0_SS_CTRL1_M0
},
2583 {0x0001, CMN_PLL1_SS_CTRL1_M0
},
2584 {0x011B, CMN_PLL0_SS_CTRL2_M0
},
2585 {0x011B, CMN_PLL1_SS_CTRL2_M0
},
2586 {0x006E, CMN_PLL0_SS_CTRL3_M0
},
2587 {0x006E, CMN_PLL1_SS_CTRL3_M0
},
2588 {0x000E, CMN_PLL0_SS_CTRL4_M0
},
2589 {0x000E, CMN_PLL1_SS_CTRL4_M0
},
2590 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START
},
2591 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START
},
2592 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START
},
2593 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START
},
2594 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2595 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2596 {0x00C7, CMN_PLL0_LOCK_REFCNT_START
},
2597 {0x00C7, CMN_PLL1_LOCK_REFCNT_START
},
2598 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START
},
2599 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START
},
2600 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR
},
2601 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR
},
2602 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD
},
2603 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD
}
2606 static struct cdns_torrent_vals sl_usb_100_int_ssc_cmn_vals
= {
2607 .reg_pairs
= sl_usb_100_int_ssc_cmn_regs
,
2608 .num_regs
= ARRAY_SIZE(sl_usb_100_int_ssc_cmn_regs
),
2611 /* PCIe and SGMII/QSGMII Unique SSC link configuration */
2612 static struct cdns_reg_pairs pcie_sgmii_link_cmn_regs
[] = {
2613 {0x0003, PHY_PLL_CFG
},
2614 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0
},
2615 {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1
},
2616 {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0
}
2619 static struct cdns_reg_pairs pcie_sgmii_xcvr_diag_ln_regs
[] = {
2620 {0x0000, XCVR_DIAG_HSCLK_SEL
},
2621 {0x0001, XCVR_DIAG_HSCLK_DIV
},
2622 {0x0012, XCVR_DIAG_PLLDRC_CTRL
}
2625 static struct cdns_reg_pairs sgmii_pcie_xcvr_diag_ln_regs
[] = {
2626 {0x0011, XCVR_DIAG_HSCLK_SEL
},
2627 {0x0003, XCVR_DIAG_HSCLK_DIV
},
2628 {0x009B, XCVR_DIAG_PLLDRC_CTRL
}
2631 static struct cdns_torrent_vals pcie_sgmii_link_cmn_vals
= {
2632 .reg_pairs
= pcie_sgmii_link_cmn_regs
,
2633 .num_regs
= ARRAY_SIZE(pcie_sgmii_link_cmn_regs
),
2636 static struct cdns_torrent_vals pcie_sgmii_xcvr_diag_ln_vals
= {
2637 .reg_pairs
= pcie_sgmii_xcvr_diag_ln_regs
,
2638 .num_regs
= ARRAY_SIZE(pcie_sgmii_xcvr_diag_ln_regs
),
2641 static struct cdns_torrent_vals sgmii_pcie_xcvr_diag_ln_vals
= {
2642 .reg_pairs
= sgmii_pcie_xcvr_diag_ln_regs
,
2643 .num_regs
= ARRAY_SIZE(sgmii_pcie_xcvr_diag_ln_regs
),
2646 /* SGMII 100 MHz Ref clk, no SSC */
2647 static struct cdns_reg_pairs sgmii_100_no_ssc_cmn_regs
[] = {
2648 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2649 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2650 {0x3700, CMN_DIAG_BIAS_OVRD1
},
2651 {0x0008, CMN_TXPUCAL_TUNE
},
2652 {0x0008, CMN_TXPDCAL_TUNE
}
2655 static struct cdns_reg_pairs sgmii_100_no_ssc_tx_ln_regs
[] = {
2656 {0x00F3, TX_PSC_A0
},
2657 {0x04A2, TX_PSC_A2
},
2658 {0x04A2, TX_PSC_A3
},
2659 {0x0000, TX_TXCC_CPOST_MULT_00
},
2660 {0x00B3, DRV_DIAG_TX_DRV
}
2663 static struct cdns_reg_pairs sgmii_100_no_ssc_rx_ln_regs
[] = {
2664 {0x091D, RX_PSC_A0
},
2665 {0x0900, RX_PSC_A2
},
2666 {0x0100, RX_PSC_A3
},
2667 {0x03C7, RX_REE_GCSM1_EQENM_PH1
},
2668 {0x01C7, RX_REE_GCSM1_EQENM_PH2
},
2669 {0x0000, RX_DIAG_DFE_CTRL
},
2670 {0x0019, RX_REE_TAP1_CLIP
},
2671 {0x0019, RX_REE_TAP2TON_CLIP
},
2672 {0x0098, RX_DIAG_NQST_CTRL
},
2673 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2
},
2674 {0x0000, RX_DIAG_DFE_AMP_TUNE_3
},
2675 {0x0000, RX_DIAG_PI_CAP
},
2676 {0x0010, RX_DIAG_PI_RATE
},
2677 {0x0001, RX_DIAG_ACYA
},
2678 {0x018C, RX_CDRLF_CNFG
},
2681 static struct cdns_torrent_vals sgmii_100_no_ssc_cmn_vals
= {
2682 .reg_pairs
= sgmii_100_no_ssc_cmn_regs
,
2683 .num_regs
= ARRAY_SIZE(sgmii_100_no_ssc_cmn_regs
),
2686 static struct cdns_torrent_vals sgmii_100_no_ssc_tx_ln_vals
= {
2687 .reg_pairs
= sgmii_100_no_ssc_tx_ln_regs
,
2688 .num_regs
= ARRAY_SIZE(sgmii_100_no_ssc_tx_ln_regs
),
2691 static struct cdns_torrent_vals sgmii_100_no_ssc_rx_ln_vals
= {
2692 .reg_pairs
= sgmii_100_no_ssc_rx_ln_regs
,
2693 .num_regs
= ARRAY_SIZE(sgmii_100_no_ssc_rx_ln_regs
),
2696 /* SGMII 100 MHz Ref clk, internal SSC */
2697 static struct cdns_reg_pairs sgmii_100_int_ssc_cmn_regs
[] = {
2698 {0x0004, CMN_PLL0_DSM_DIAG_M0
},
2699 {0x0004, CMN_PLL0_DSM_DIAG_M1
},
2700 {0x0004, CMN_PLL1_DSM_DIAG_M0
},
2701 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0
},
2702 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1
},
2703 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0
},
2704 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0
},
2705 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1
},
2706 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0
},
2707 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0
},
2708 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1
},
2709 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0
},
2710 {0x0064, CMN_PLL0_INTDIV_M0
},
2711 {0x0050, CMN_PLL0_INTDIV_M1
},
2712 {0x0064, CMN_PLL1_INTDIV_M0
},
2713 {0x0002, CMN_PLL0_FRACDIVH_M0
},
2714 {0x0002, CMN_PLL0_FRACDIVH_M1
},
2715 {0x0002, CMN_PLL1_FRACDIVH_M0
},
2716 {0x0044, CMN_PLL0_HIGH_THR_M0
},
2717 {0x0036, CMN_PLL0_HIGH_THR_M1
},
2718 {0x0044, CMN_PLL1_HIGH_THR_M0
},
2719 {0x0002, CMN_PDIAG_PLL0_CTRL_M0
},
2720 {0x0002, CMN_PDIAG_PLL0_CTRL_M1
},
2721 {0x0002, CMN_PDIAG_PLL1_CTRL_M0
},
2722 {0x0001, CMN_PLL0_SS_CTRL1_M0
},
2723 {0x0001, CMN_PLL0_SS_CTRL1_M1
},
2724 {0x0001, CMN_PLL1_SS_CTRL1_M0
},
2725 {0x011B, CMN_PLL0_SS_CTRL2_M0
},
2726 {0x011B, CMN_PLL0_SS_CTRL2_M1
},
2727 {0x011B, CMN_PLL1_SS_CTRL2_M0
},
2728 {0x006E, CMN_PLL0_SS_CTRL3_M0
},
2729 {0x0058, CMN_PLL0_SS_CTRL3_M1
},
2730 {0x006E, CMN_PLL1_SS_CTRL3_M0
},
2731 {0x000E, CMN_PLL0_SS_CTRL4_M0
},
2732 {0x0012, CMN_PLL0_SS_CTRL4_M1
},
2733 {0x000E, CMN_PLL1_SS_CTRL4_M0
},
2734 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START
},
2735 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START
},
2736 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START
},
2737 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START
},
2738 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2739 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2740 {0x00C7, CMN_PLL0_LOCK_REFCNT_START
},
2741 {0x00C7, CMN_PLL1_LOCK_REFCNT_START
},
2742 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START
},
2743 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START
},
2744 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR
},
2745 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR
},
2746 {0x3700, CMN_DIAG_BIAS_OVRD1
},
2747 {0x0008, CMN_TXPUCAL_TUNE
},
2748 {0x0008, CMN_TXPDCAL_TUNE
}
2751 static struct cdns_torrent_vals sgmii_100_int_ssc_cmn_vals
= {
2752 .reg_pairs
= sgmii_100_int_ssc_cmn_regs
,
2753 .num_regs
= ARRAY_SIZE(sgmii_100_int_ssc_cmn_regs
),
2756 /* QSGMII 100 MHz Ref clk, no SSC */
2757 static struct cdns_reg_pairs qsgmii_100_no_ssc_cmn_regs
[] = {
2758 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2759 {0x0003, CMN_PLL1_VCOCAL_TCTRL
}
2762 static struct cdns_reg_pairs qsgmii_100_no_ssc_tx_ln_regs
[] = {
2763 {0x00F3, TX_PSC_A0
},
2764 {0x04A2, TX_PSC_A2
},
2765 {0x04A2, TX_PSC_A3
},
2766 {0x0000, TX_TXCC_CPOST_MULT_00
},
2767 {0x0003, DRV_DIAG_TX_DRV
}
2770 static struct cdns_reg_pairs qsgmii_100_no_ssc_rx_ln_regs
[] = {
2771 {0x091D, RX_PSC_A0
},
2772 {0x0900, RX_PSC_A2
},
2773 {0x0100, RX_PSC_A3
},
2774 {0x03C7, RX_REE_GCSM1_EQENM_PH1
},
2775 {0x01C7, RX_REE_GCSM1_EQENM_PH2
},
2776 {0x0000, RX_DIAG_DFE_CTRL
},
2777 {0x0019, RX_REE_TAP1_CLIP
},
2778 {0x0019, RX_REE_TAP2TON_CLIP
},
2779 {0x0098, RX_DIAG_NQST_CTRL
},
2780 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2
},
2781 {0x0000, RX_DIAG_DFE_AMP_TUNE_3
},
2782 {0x0000, RX_DIAG_PI_CAP
},
2783 {0x0010, RX_DIAG_PI_RATE
},
2784 {0x0001, RX_DIAG_ACYA
},
2785 {0x018C, RX_CDRLF_CNFG
},
2788 static struct cdns_torrent_vals qsgmii_100_no_ssc_cmn_vals
= {
2789 .reg_pairs
= qsgmii_100_no_ssc_cmn_regs
,
2790 .num_regs
= ARRAY_SIZE(qsgmii_100_no_ssc_cmn_regs
),
2793 static struct cdns_torrent_vals qsgmii_100_no_ssc_tx_ln_vals
= {
2794 .reg_pairs
= qsgmii_100_no_ssc_tx_ln_regs
,
2795 .num_regs
= ARRAY_SIZE(qsgmii_100_no_ssc_tx_ln_regs
),
2798 static struct cdns_torrent_vals qsgmii_100_no_ssc_rx_ln_vals
= {
2799 .reg_pairs
= qsgmii_100_no_ssc_rx_ln_regs
,
2800 .num_regs
= ARRAY_SIZE(qsgmii_100_no_ssc_rx_ln_regs
),
2803 /* QSGMII 100 MHz Ref clk, internal SSC */
2804 static struct cdns_reg_pairs qsgmii_100_int_ssc_cmn_regs
[] = {
2805 {0x0004, CMN_PLL0_DSM_DIAG_M0
},
2806 {0x0004, CMN_PLL0_DSM_DIAG_M1
},
2807 {0x0004, CMN_PLL1_DSM_DIAG_M0
},
2808 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0
},
2809 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1
},
2810 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0
},
2811 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0
},
2812 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1
},
2813 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0
},
2814 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0
},
2815 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1
},
2816 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0
},
2817 {0x0064, CMN_PLL0_INTDIV_M0
},
2818 {0x0050, CMN_PLL0_INTDIV_M1
},
2819 {0x0064, CMN_PLL1_INTDIV_M0
},
2820 {0x0002, CMN_PLL0_FRACDIVH_M0
},
2821 {0x0002, CMN_PLL0_FRACDIVH_M1
},
2822 {0x0002, CMN_PLL1_FRACDIVH_M0
},
2823 {0x0044, CMN_PLL0_HIGH_THR_M0
},
2824 {0x0036, CMN_PLL0_HIGH_THR_M1
},
2825 {0x0044, CMN_PLL1_HIGH_THR_M0
},
2826 {0x0002, CMN_PDIAG_PLL0_CTRL_M0
},
2827 {0x0002, CMN_PDIAG_PLL0_CTRL_M1
},
2828 {0x0002, CMN_PDIAG_PLL1_CTRL_M0
},
2829 {0x0001, CMN_PLL0_SS_CTRL1_M0
},
2830 {0x0001, CMN_PLL0_SS_CTRL1_M1
},
2831 {0x0001, CMN_PLL1_SS_CTRL1_M0
},
2832 {0x011B, CMN_PLL0_SS_CTRL2_M0
},
2833 {0x011B, CMN_PLL0_SS_CTRL2_M1
},
2834 {0x011B, CMN_PLL1_SS_CTRL2_M0
},
2835 {0x006E, CMN_PLL0_SS_CTRL3_M0
},
2836 {0x0058, CMN_PLL0_SS_CTRL3_M1
},
2837 {0x006E, CMN_PLL1_SS_CTRL3_M0
},
2838 {0x000E, CMN_PLL0_SS_CTRL4_M0
},
2839 {0x0012, CMN_PLL0_SS_CTRL4_M1
},
2840 {0x000E, CMN_PLL1_SS_CTRL4_M0
},
2841 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START
},
2842 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START
},
2843 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START
},
2844 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START
},
2845 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2846 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2847 {0x00C7, CMN_PLL0_LOCK_REFCNT_START
},
2848 {0x00C7, CMN_PLL1_LOCK_REFCNT_START
},
2849 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START
},
2850 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START
},
2851 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR
},
2852 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR
}
2855 static struct cdns_torrent_vals qsgmii_100_int_ssc_cmn_vals
= {
2856 .reg_pairs
= qsgmii_100_int_ssc_cmn_regs
,
2857 .num_regs
= ARRAY_SIZE(qsgmii_100_int_ssc_cmn_regs
),
2860 /* Single SGMII/QSGMII link configuration */
2861 static struct cdns_reg_pairs sl_sgmii_link_cmn_regs
[] = {
2862 {0x0000, PHY_PLL_CFG
},
2863 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0
}
2866 static struct cdns_reg_pairs sl_sgmii_xcvr_diag_ln_regs
[] = {
2867 {0x0000, XCVR_DIAG_HSCLK_SEL
},
2868 {0x0003, XCVR_DIAG_HSCLK_DIV
},
2869 {0x0013, XCVR_DIAG_PLLDRC_CTRL
}
2872 static struct cdns_torrent_vals sl_sgmii_link_cmn_vals
= {
2873 .reg_pairs
= sl_sgmii_link_cmn_regs
,
2874 .num_regs
= ARRAY_SIZE(sl_sgmii_link_cmn_regs
),
2877 static struct cdns_torrent_vals sl_sgmii_xcvr_diag_ln_vals
= {
2878 .reg_pairs
= sl_sgmii_xcvr_diag_ln_regs
,
2879 .num_regs
= ARRAY_SIZE(sl_sgmii_xcvr_diag_ln_regs
),
2882 /* Multi link PCIe, 100 MHz Ref clk, internal SSC */
2883 static struct cdns_reg_pairs pcie_100_int_ssc_cmn_regs
[] = {
2884 {0x0004, CMN_PLL0_DSM_DIAG_M0
},
2885 {0x0004, CMN_PLL0_DSM_DIAG_M1
},
2886 {0x0004, CMN_PLL1_DSM_DIAG_M0
},
2887 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0
},
2888 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1
},
2889 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0
},
2890 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0
},
2891 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1
},
2892 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0
},
2893 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0
},
2894 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1
},
2895 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0
},
2896 {0x0064, CMN_PLL0_INTDIV_M0
},
2897 {0x0050, CMN_PLL0_INTDIV_M1
},
2898 {0x0064, CMN_PLL1_INTDIV_M0
},
2899 {0x0002, CMN_PLL0_FRACDIVH_M0
},
2900 {0x0002, CMN_PLL0_FRACDIVH_M1
},
2901 {0x0002, CMN_PLL1_FRACDIVH_M0
},
2902 {0x0044, CMN_PLL0_HIGH_THR_M0
},
2903 {0x0036, CMN_PLL0_HIGH_THR_M1
},
2904 {0x0044, CMN_PLL1_HIGH_THR_M0
},
2905 {0x0002, CMN_PDIAG_PLL0_CTRL_M0
},
2906 {0x0002, CMN_PDIAG_PLL0_CTRL_M1
},
2907 {0x0002, CMN_PDIAG_PLL1_CTRL_M0
},
2908 {0x0001, CMN_PLL0_SS_CTRL1_M0
},
2909 {0x0001, CMN_PLL0_SS_CTRL1_M1
},
2910 {0x0001, CMN_PLL1_SS_CTRL1_M0
},
2911 {0x011B, CMN_PLL0_SS_CTRL2_M0
},
2912 {0x011B, CMN_PLL0_SS_CTRL2_M1
},
2913 {0x011B, CMN_PLL1_SS_CTRL2_M0
},
2914 {0x006E, CMN_PLL0_SS_CTRL3_M0
},
2915 {0x0058, CMN_PLL0_SS_CTRL3_M1
},
2916 {0x006E, CMN_PLL1_SS_CTRL3_M0
},
2917 {0x000E, CMN_PLL0_SS_CTRL4_M0
},
2918 {0x0012, CMN_PLL0_SS_CTRL4_M1
},
2919 {0x000E, CMN_PLL1_SS_CTRL4_M0
},
2920 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START
},
2921 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START
},
2922 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START
},
2923 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START
},
2924 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2925 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2926 {0x00C7, CMN_PLL0_LOCK_REFCNT_START
},
2927 {0x00C7, CMN_PLL1_LOCK_REFCNT_START
},
2928 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START
},
2929 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START
},
2930 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR
},
2931 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR
}
2934 static struct cdns_torrent_vals pcie_100_int_ssc_cmn_vals
= {
2935 .reg_pairs
= pcie_100_int_ssc_cmn_regs
,
2936 .num_regs
= ARRAY_SIZE(pcie_100_int_ssc_cmn_regs
),
2939 /* Single link PCIe, 100 MHz Ref clk, internal SSC */
2940 static struct cdns_reg_pairs sl_pcie_100_int_ssc_cmn_regs
[] = {
2941 {0x0004, CMN_PLL0_DSM_DIAG_M0
},
2942 {0x0004, CMN_PLL0_DSM_DIAG_M1
},
2943 {0x0004, CMN_PLL1_DSM_DIAG_M0
},
2944 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0
},
2945 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1
},
2946 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0
},
2947 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0
},
2948 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1
},
2949 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0
},
2950 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0
},
2951 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1
},
2952 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0
},
2953 {0x0064, CMN_PLL0_INTDIV_M0
},
2954 {0x0050, CMN_PLL0_INTDIV_M1
},
2955 {0x0050, CMN_PLL1_INTDIV_M0
},
2956 {0x0002, CMN_PLL0_FRACDIVH_M0
},
2957 {0x0002, CMN_PLL0_FRACDIVH_M1
},
2958 {0x0002, CMN_PLL1_FRACDIVH_M0
},
2959 {0x0044, CMN_PLL0_HIGH_THR_M0
},
2960 {0x0036, CMN_PLL0_HIGH_THR_M1
},
2961 {0x0036, CMN_PLL1_HIGH_THR_M0
},
2962 {0x0002, CMN_PDIAG_PLL0_CTRL_M0
},
2963 {0x0002, CMN_PDIAG_PLL0_CTRL_M1
},
2964 {0x0002, CMN_PDIAG_PLL1_CTRL_M0
},
2965 {0x0001, CMN_PLL0_SS_CTRL1_M0
},
2966 {0x0001, CMN_PLL0_SS_CTRL1_M1
},
2967 {0x0001, CMN_PLL1_SS_CTRL1_M0
},
2968 {0x011B, CMN_PLL0_SS_CTRL2_M0
},
2969 {0x011B, CMN_PLL0_SS_CTRL2_M1
},
2970 {0x011B, CMN_PLL1_SS_CTRL2_M0
},
2971 {0x006E, CMN_PLL0_SS_CTRL3_M0
},
2972 {0x0058, CMN_PLL0_SS_CTRL3_M1
},
2973 {0x0058, CMN_PLL1_SS_CTRL3_M0
},
2974 {0x000E, CMN_PLL0_SS_CTRL4_M0
},
2975 {0x0012, CMN_PLL0_SS_CTRL4_M1
},
2976 {0x0012, CMN_PLL1_SS_CTRL4_M0
},
2977 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START
},
2978 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START
},
2979 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START
},
2980 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START
},
2981 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2982 {0x0003, CMN_PLL1_VCOCAL_TCTRL
},
2983 {0x00C7, CMN_PLL0_LOCK_REFCNT_START
},
2984 {0x00C7, CMN_PLL1_LOCK_REFCNT_START
},
2985 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START
},
2986 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START
},
2987 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR
},
2988 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR
}
2991 static struct cdns_torrent_vals sl_pcie_100_int_ssc_cmn_vals
= {
2992 .reg_pairs
= sl_pcie_100_int_ssc_cmn_regs
,
2993 .num_regs
= ARRAY_SIZE(sl_pcie_100_int_ssc_cmn_regs
),
2996 /* PCIe, 100 MHz Ref clk, no SSC & external SSC */
2997 static struct cdns_reg_pairs pcie_100_ext_no_ssc_cmn_regs
[] = {
2998 {0x0003, CMN_PLL0_VCOCAL_TCTRL
},
2999 {0x0003, CMN_PLL1_VCOCAL_TCTRL
}
3002 static struct cdns_reg_pairs pcie_100_ext_no_ssc_rx_ln_regs
[] = {
3003 {0x0019, RX_REE_TAP1_CLIP
},
3004 {0x0019, RX_REE_TAP2TON_CLIP
},
3005 {0x0001, RX_DIAG_ACYA
}
3008 static struct cdns_torrent_vals pcie_100_no_ssc_cmn_vals
= {
3009 .reg_pairs
= pcie_100_ext_no_ssc_cmn_regs
,
3010 .num_regs
= ARRAY_SIZE(pcie_100_ext_no_ssc_cmn_regs
),
3013 static struct cdns_torrent_vals pcie_100_no_ssc_rx_ln_vals
= {
3014 .reg_pairs
= pcie_100_ext_no_ssc_rx_ln_regs
,
3015 .num_regs
= ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs
),
3018 static const struct cdns_torrent_data cdns_map_torrent
= {
3019 .block_offset_shift
= 0x2,
3020 .reg_offset_shift
= 0x2,
3025 [EXTERNAL_SSC
] = NULL
,
3026 [INTERNAL_SSC
] = NULL
,
3029 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3030 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3031 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3034 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3035 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3036 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3039 [NO_SSC
] = &pcie_usb_link_cmn_vals
,
3040 [EXTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3041 [INTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3046 [NO_SSC
] = &sl_sgmii_link_cmn_vals
,
3049 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3050 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3051 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3054 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3055 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3056 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3061 [NO_SSC
] = &sl_sgmii_link_cmn_vals
,
3064 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3065 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3066 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3069 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3070 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3071 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3076 [NO_SSC
] = &sl_usb_link_cmn_vals
,
3077 [EXTERNAL_SSC
] = &sl_usb_link_cmn_vals
,
3078 [INTERNAL_SSC
] = &sl_usb_link_cmn_vals
,
3081 [NO_SSC
] = &pcie_usb_link_cmn_vals
,
3082 [EXTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3083 [INTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3086 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3087 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3088 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3091 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3092 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3093 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3101 [EXTERNAL_SSC
] = NULL
,
3102 [INTERNAL_SSC
] = NULL
,
3105 [NO_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3106 [EXTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3107 [INTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3110 [NO_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3111 [EXTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3112 [INTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3115 [NO_SSC
] = &pcie_usb_xcvr_diag_ln_vals
,
3116 [EXTERNAL_SSC
] = &pcie_usb_xcvr_diag_ln_vals
,
3117 [INTERNAL_SSC
] = &pcie_usb_xcvr_diag_ln_vals
,
3122 [NO_SSC
] = &sl_sgmii_xcvr_diag_ln_vals
,
3125 [NO_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3126 [EXTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3127 [INTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3130 [NO_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3131 [EXTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3132 [INTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3137 [NO_SSC
] = &sl_sgmii_xcvr_diag_ln_vals
,
3140 [NO_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3141 [EXTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3142 [INTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3145 [NO_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3146 [EXTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3147 [INTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3152 [NO_SSC
] = &sl_usb_xcvr_diag_ln_vals
,
3153 [EXTERNAL_SSC
] = &sl_usb_xcvr_diag_ln_vals
,
3154 [INTERNAL_SSC
] = &sl_usb_xcvr_diag_ln_vals
,
3157 [NO_SSC
] = &usb_pcie_xcvr_diag_ln_vals
,
3158 [EXTERNAL_SSC
] = &usb_pcie_xcvr_diag_ln_vals
,
3159 [INTERNAL_SSC
] = &usb_pcie_xcvr_diag_ln_vals
,
3162 [NO_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3163 [EXTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3164 [INTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3167 [NO_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3168 [EXTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3169 [INTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3176 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3177 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3178 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3181 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3182 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3183 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3186 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3187 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3188 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3191 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3192 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3193 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3200 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3201 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3202 [INTERNAL_SSC
] = &sl_pcie_100_int_ssc_cmn_vals
,
3205 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3206 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3207 [INTERNAL_SSC
] = &pcie_100_int_ssc_cmn_vals
,
3210 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3211 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3212 [INTERNAL_SSC
] = &pcie_100_int_ssc_cmn_vals
,
3215 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3216 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3217 [INTERNAL_SSC
] = &pcie_100_int_ssc_cmn_vals
,
3222 [NO_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3225 [NO_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3226 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3227 [INTERNAL_SSC
] = &sgmii_100_int_ssc_cmn_vals
,
3230 [NO_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3231 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3232 [INTERNAL_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3237 [NO_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3240 [NO_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3241 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3242 [INTERNAL_SSC
] = &qsgmii_100_int_ssc_cmn_vals
,
3245 [NO_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3246 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3247 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3252 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3253 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3254 [INTERNAL_SSC
] = &sl_usb_100_int_ssc_cmn_vals
,
3257 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3258 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3259 [INTERNAL_SSC
] = &usb_100_int_ssc_cmn_vals
,
3262 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3263 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3264 [INTERNAL_SSC
] = &sl_usb_100_int_ssc_cmn_vals
,
3267 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3268 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3269 [INTERNAL_SSC
] = &sl_usb_100_int_ssc_cmn_vals
,
3277 [EXTERNAL_SSC
] = NULL
,
3278 [INTERNAL_SSC
] = NULL
,
3282 [EXTERNAL_SSC
] = NULL
,
3283 [INTERNAL_SSC
] = NULL
,
3287 [EXTERNAL_SSC
] = NULL
,
3288 [INTERNAL_SSC
] = NULL
,
3292 [EXTERNAL_SSC
] = NULL
,
3293 [INTERNAL_SSC
] = NULL
,
3298 [NO_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3301 [NO_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3302 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3303 [INTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3306 [NO_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3307 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3308 [INTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3313 [NO_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3316 [NO_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3317 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3318 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3321 [NO_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3322 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3323 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3328 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3329 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3330 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3333 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3334 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3335 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3338 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3339 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3340 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3343 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3344 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3345 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3352 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3353 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3354 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3357 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3358 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3359 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3362 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3363 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3364 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3367 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3368 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3369 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3374 [NO_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3377 [NO_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3378 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3379 [INTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3382 [NO_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3383 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3384 [INTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3389 [NO_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3392 [NO_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3393 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3394 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3397 [NO_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3398 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3399 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3404 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3405 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3406 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3409 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3410 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3411 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3414 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3415 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3416 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3419 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3420 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3421 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3427 static const struct cdns_torrent_data ti_j721e_map_torrent
= {
3428 .block_offset_shift
= 0x0,
3429 .reg_offset_shift
= 0x1,
3434 [EXTERNAL_SSC
] = NULL
,
3435 [INTERNAL_SSC
] = NULL
,
3438 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3439 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3440 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3443 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3444 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3445 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3448 [NO_SSC
] = &pcie_usb_link_cmn_vals
,
3449 [EXTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3450 [INTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3455 [NO_SSC
] = &sl_sgmii_link_cmn_vals
,
3458 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3459 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3460 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3463 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3464 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3465 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3470 [NO_SSC
] = &sl_sgmii_link_cmn_vals
,
3473 [NO_SSC
] = &pcie_sgmii_link_cmn_vals
,
3474 [EXTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3475 [INTERNAL_SSC
] = &pcie_sgmii_link_cmn_vals
,
3478 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3479 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3480 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3485 [NO_SSC
] = &sl_usb_link_cmn_vals
,
3486 [EXTERNAL_SSC
] = &sl_usb_link_cmn_vals
,
3487 [INTERNAL_SSC
] = &sl_usb_link_cmn_vals
,
3490 [NO_SSC
] = &pcie_usb_link_cmn_vals
,
3491 [EXTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3492 [INTERNAL_SSC
] = &pcie_usb_link_cmn_vals
,
3495 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3496 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3497 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3500 [NO_SSC
] = &usb_sgmii_link_cmn_vals
,
3501 [EXTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3502 [INTERNAL_SSC
] = &usb_sgmii_link_cmn_vals
,
3510 [EXTERNAL_SSC
] = NULL
,
3511 [INTERNAL_SSC
] = NULL
,
3514 [NO_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3515 [EXTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3516 [INTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3519 [NO_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3520 [EXTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3521 [INTERNAL_SSC
] = &pcie_sgmii_xcvr_diag_ln_vals
,
3524 [NO_SSC
] = &pcie_usb_xcvr_diag_ln_vals
,
3525 [EXTERNAL_SSC
] = &pcie_usb_xcvr_diag_ln_vals
,
3526 [INTERNAL_SSC
] = &pcie_usb_xcvr_diag_ln_vals
,
3531 [NO_SSC
] = &sl_sgmii_xcvr_diag_ln_vals
,
3534 [NO_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3535 [EXTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3536 [INTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3539 [NO_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3540 [EXTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3541 [INTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3546 [NO_SSC
] = &sl_sgmii_xcvr_diag_ln_vals
,
3549 [NO_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3550 [EXTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3551 [INTERNAL_SSC
] = &sgmii_pcie_xcvr_diag_ln_vals
,
3554 [NO_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3555 [EXTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3556 [INTERNAL_SSC
] = &sgmii_usb_xcvr_diag_ln_vals
,
3561 [NO_SSC
] = &sl_usb_xcvr_diag_ln_vals
,
3562 [EXTERNAL_SSC
] = &sl_usb_xcvr_diag_ln_vals
,
3563 [INTERNAL_SSC
] = &sl_usb_xcvr_diag_ln_vals
,
3566 [NO_SSC
] = &usb_pcie_xcvr_diag_ln_vals
,
3567 [EXTERNAL_SSC
] = &usb_pcie_xcvr_diag_ln_vals
,
3568 [INTERNAL_SSC
] = &usb_pcie_xcvr_diag_ln_vals
,
3571 [NO_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3572 [EXTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3573 [INTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3576 [NO_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3577 [EXTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3578 [INTERNAL_SSC
] = &usb_sgmii_xcvr_diag_ln_vals
,
3585 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3586 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3587 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3590 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3591 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3592 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3595 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3596 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3597 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3600 [NO_SSC
] = &usb_phy_pcs_cmn_vals
,
3601 [EXTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3602 [INTERNAL_SSC
] = &usb_phy_pcs_cmn_vals
,
3609 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3610 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3611 [INTERNAL_SSC
] = &sl_pcie_100_int_ssc_cmn_vals
,
3614 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3615 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3616 [INTERNAL_SSC
] = &pcie_100_int_ssc_cmn_vals
,
3619 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3620 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3621 [INTERNAL_SSC
] = &pcie_100_int_ssc_cmn_vals
,
3624 [NO_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3625 [EXTERNAL_SSC
] = &pcie_100_no_ssc_cmn_vals
,
3626 [INTERNAL_SSC
] = &pcie_100_int_ssc_cmn_vals
,
3631 [NO_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3634 [NO_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3635 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3636 [INTERNAL_SSC
] = &sgmii_100_int_ssc_cmn_vals
,
3639 [NO_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3640 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3641 [INTERNAL_SSC
] = &sgmii_100_no_ssc_cmn_vals
,
3646 [NO_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3649 [NO_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3650 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3651 [INTERNAL_SSC
] = &qsgmii_100_int_ssc_cmn_vals
,
3654 [NO_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3655 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3656 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_cmn_vals
,
3661 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3662 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3663 [INTERNAL_SSC
] = &sl_usb_100_int_ssc_cmn_vals
,
3666 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3667 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3668 [INTERNAL_SSC
] = &usb_100_int_ssc_cmn_vals
,
3671 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3672 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3673 [INTERNAL_SSC
] = &sl_usb_100_int_ssc_cmn_vals
,
3676 [NO_SSC
] = &usb_100_no_ssc_cmn_vals
,
3677 [EXTERNAL_SSC
] = &usb_100_no_ssc_cmn_vals
,
3678 [INTERNAL_SSC
] = &sl_usb_100_int_ssc_cmn_vals
,
3686 [EXTERNAL_SSC
] = NULL
,
3687 [INTERNAL_SSC
] = NULL
,
3691 [EXTERNAL_SSC
] = NULL
,
3692 [INTERNAL_SSC
] = NULL
,
3696 [EXTERNAL_SSC
] = NULL
,
3697 [INTERNAL_SSC
] = NULL
,
3701 [EXTERNAL_SSC
] = NULL
,
3702 [INTERNAL_SSC
] = NULL
,
3707 [NO_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3710 [NO_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3711 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3712 [INTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3715 [NO_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3716 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3717 [INTERNAL_SSC
] = &sgmii_100_no_ssc_tx_ln_vals
,
3722 [NO_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3725 [NO_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3726 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3727 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3730 [NO_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3731 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3732 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_tx_ln_vals
,
3737 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3738 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3739 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3742 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3743 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3744 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3747 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3748 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3749 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3752 [NO_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3753 [EXTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3754 [INTERNAL_SSC
] = &usb_100_no_ssc_tx_ln_vals
,
3761 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3762 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3763 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3766 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3767 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3768 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3771 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3772 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3773 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3776 [NO_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3777 [EXTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3778 [INTERNAL_SSC
] = &pcie_100_no_ssc_rx_ln_vals
,
3783 [NO_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3786 [NO_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3787 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3788 [INTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3791 [NO_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3792 [EXTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3793 [INTERNAL_SSC
] = &sgmii_100_no_ssc_rx_ln_vals
,
3798 [NO_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3801 [NO_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3802 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3803 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3806 [NO_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3807 [EXTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3808 [INTERNAL_SSC
] = &qsgmii_100_no_ssc_rx_ln_vals
,
3813 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3814 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3815 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3818 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3819 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3820 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3823 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3824 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3825 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3828 [NO_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3829 [EXTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3830 [INTERNAL_SSC
] = &usb_100_no_ssc_rx_ln_vals
,
3836 static const struct of_device_id cdns_torrent_phy_of_match
[] = {
3838 .compatible
= "cdns,torrent-phy",
3839 .data
= &cdns_map_torrent
,
3842 .compatible
= "ti,j721e-serdes-10g",
3843 .data
= &ti_j721e_map_torrent
,
3847 MODULE_DEVICE_TABLE(of
, cdns_torrent_phy_of_match
);
3849 static struct platform_driver cdns_torrent_phy_driver
= {
3850 .probe
= cdns_torrent_phy_probe
,
3851 .remove
= cdns_torrent_phy_remove
,
3853 .name
= "cdns-torrent-phy",
3854 .of_match_table
= cdns_torrent_phy_of_match
,
3857 module_platform_driver(cdns_torrent_phy_driver
);
3859 MODULE_AUTHOR("Cadence Design Systems, Inc.");
3860 MODULE_DESCRIPTION("Cadence Torrent PHY driver");
3861 MODULE_LICENSE("GPL v2");