blob: d95d4b432a987fff45f6efff26db8c2e32483346 [file] [log] [blame]
Alan Douglasfda76da2021-07-21 21:28:36 +05301// SPDX-License-Identifier: GPL-2.0
2/*
3 * Cadence Sierra PHY Driver
4 *
5 * Based on the linux driver provided by Cadence
6 *
7 * Copyright (c) 2018 Cadence Design Systems
8 * Author: Alan Douglas <adouglas@cadence.com>
9 *
10 * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
11 * Jean-Jacques Hiblot <jjhiblot@ti.com>
12 *
13 */
14#include <common.h>
15#include <clk.h>
Aswath Govindrajuf01608f2022-01-28 13:41:50 +053016#include <linux/delay.h>
Aswath Govindraju304341f2022-01-28 13:41:36 +053017#include <linux/clk-provider.h>
Alan Douglasfda76da2021-07-21 21:28:36 +053018#include <generic-phy.h>
19#include <reset.h>
20#include <dm/device.h>
21#include <dm/device-internal.h>
22#include <dm/device_compat.h>
23#include <dm/lists.h>
24#include <dm/read.h>
25#include <dm/uclass.h>
26#include <dm/devres.h>
27#include <linux/io.h>
28#include <dt-bindings/phy/phy.h>
Aswath Govindraju304341f2022-01-28 13:41:36 +053029#include <dt-bindings/phy/phy-cadence.h>
Alan Douglasfda76da2021-07-21 21:28:36 +053030#include <regmap.h>
31
Aswath Govindrajuf01608f2022-01-28 13:41:50 +053032#define usleep_range(a, b) udelay((b))
33
Swapnil Jakhadee42a8472022-01-28 13:41:40 +053034#define NUM_SSC_MODE 3
Swapnil Jakhade547eec42022-01-28 13:41:48 +053035#define NUM_PHY_TYPE 4
Swapnil Jakhadee42a8472022-01-28 13:41:40 +053036
Alan Douglasfda76da2021-07-21 21:28:36 +053037/* PHY register offsets */
38#define SIERRA_COMMON_CDB_OFFSET 0x0
39#define SIERRA_MACRO_ID_REG 0x0
Aswath Govindraju304341f2022-01-28 13:41:36 +053040#define SIERRA_CMN_PLLLC_GEN_PREG 0x42
Alan Douglasfda76da2021-07-21 21:28:36 +053041#define SIERRA_CMN_PLLLC_MODE_PREG 0x48
42#define SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG 0x49
43#define SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG 0x4A
44#define SIERRA_CMN_PLLLC_LOCK_CNTSTART_PREG 0x4B
45#define SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG 0x4F
46#define SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG 0x50
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +053047#define SIERRA_CMN_PLLLC_DSMCORR_PREG 0x51
48#define SIERRA_CMN_PLLLC_SS_PREG 0x52
49#define SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG 0x53
50#define SIERRA_CMN_PLLLC_SSTWOPT_PREG 0x54
Alan Douglasfda76da2021-07-21 21:28:36 +053051#define SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG 0x62
Aswath Govindraju304341f2022-01-28 13:41:36 +053052#define SIERRA_CMN_REFRCV_PREG 0x98
53#define SIERRA_CMN_REFRCV1_PREG 0xB8
54#define SIERRA_CMN_PLLLC1_GEN_PREG 0xC2
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +053055#define SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG 0x63
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +053056#define SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG 0xCA
57#define SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG 0xD0
58#define SIERRA_CMN_PLLLC1_SS_TIME_STEPSIZE_MODE_PREG 0xE2
Alan Douglasfda76da2021-07-21 21:28:36 +053059
60#define SIERRA_LANE_CDB_OFFSET(ln, offset) \
61 (0x4000 + ((ln) * (0x800 >> (2 - (offset)))))
62
63#define SIERRA_DET_STANDEC_A_PREG 0x000
64#define SIERRA_DET_STANDEC_B_PREG 0x001
65#define SIERRA_DET_STANDEC_C_PREG 0x002
66#define SIERRA_DET_STANDEC_D_PREG 0x003
67#define SIERRA_DET_STANDEC_E_PREG 0x004
68#define SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG 0x008
69#define SIERRA_PSM_A0IN_TMR_PREG 0x009
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +053070#define SIERRA_PSM_A3IN_TMR_PREG 0x00C
Alan Douglasfda76da2021-07-21 21:28:36 +053071#define SIERRA_PSM_DIAG_PREG 0x015
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +053072#define SIERRA_PSC_LN_A3_PREG 0x023
73#define SIERRA_PSC_LN_A4_PREG 0x024
74#define SIERRA_PSC_LN_IDLE_PREG 0x026
Alan Douglasfda76da2021-07-21 21:28:36 +053075#define SIERRA_PSC_TX_A0_PREG 0x028
76#define SIERRA_PSC_TX_A1_PREG 0x029
77#define SIERRA_PSC_TX_A2_PREG 0x02A
78#define SIERRA_PSC_TX_A3_PREG 0x02B
79#define SIERRA_PSC_RX_A0_PREG 0x030
80#define SIERRA_PSC_RX_A1_PREG 0x031
81#define SIERRA_PSC_RX_A2_PREG 0x032
82#define SIERRA_PSC_RX_A3_PREG 0x033
83#define SIERRA_PLLCTRL_SUBRATE_PREG 0x03A
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +053084#define SIERRA_PLLCTRL_GEN_A_PREG 0x03B
Alan Douglasfda76da2021-07-21 21:28:36 +053085#define SIERRA_PLLCTRL_GEN_D_PREG 0x03E
86#define SIERRA_PLLCTRL_CPGAIN_MODE_PREG 0x03F
87#define SIERRA_PLLCTRL_STATUS_PREG 0x044
88#define SIERRA_CLKPATH_BIASTRIM_PREG 0x04B
89#define SIERRA_DFE_BIASTRIM_PREG 0x04C
90#define SIERRA_DRVCTRL_ATTEN_PREG 0x06A
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +053091#define SIERRA_DRVCTRL_BOOST_PREG 0x06F
Alan Douglasfda76da2021-07-21 21:28:36 +053092#define SIERRA_CLKPATHCTRL_TMR_PREG 0x081
93#define SIERRA_RX_CREQ_FLTR_A_MODE3_PREG 0x085
94#define SIERRA_RX_CREQ_FLTR_A_MODE2_PREG 0x086
95#define SIERRA_RX_CREQ_FLTR_A_MODE1_PREG 0x087
96#define SIERRA_RX_CREQ_FLTR_A_MODE0_PREG 0x088
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +053097#define SIERRA_CREQ_DCBIASATTEN_OVR_PREG 0x08C
Alan Douglasfda76da2021-07-21 21:28:36 +053098#define SIERRA_CREQ_CCLKDET_MODE01_PREG 0x08E
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +053099#define SIERRA_RX_CTLE_CAL_PREG 0x08F
Alan Douglasfda76da2021-07-21 21:28:36 +0530100#define SIERRA_RX_CTLE_MAINTENANCE_PREG 0x091
101#define SIERRA_CREQ_FSMCLK_SEL_PREG 0x092
102#define SIERRA_CREQ_EQ_CTRL_PREG 0x093
103#define SIERRA_CREQ_SPARE_PREG 0x096
104#define SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG 0x097
105#define SIERRA_CTLELUT_CTRL_PREG 0x098
106#define SIERRA_DFE_ECMP_RATESEL_PREG 0x0C0
107#define SIERRA_DFE_SMP_RATESEL_PREG 0x0C1
108#define SIERRA_DEQ_PHALIGN_CTRL 0x0C4
109#define SIERRA_DEQ_CONCUR_CTRL1_PREG 0x0C8
110#define SIERRA_DEQ_CONCUR_CTRL2_PREG 0x0C9
111#define SIERRA_DEQ_EPIPWR_CTRL2_PREG 0x0CD
112#define SIERRA_DEQ_FAST_MAINT_CYCLES_PREG 0x0CE
113#define SIERRA_DEQ_ERRCMP_CTRL_PREG 0x0D0
114#define SIERRA_DEQ_OFFSET_CTRL_PREG 0x0D8
115#define SIERRA_DEQ_GAIN_CTRL_PREG 0x0E0
116#define SIERRA_DEQ_VGATUNE_CTRL_PREG 0x0E1
117#define SIERRA_DEQ_GLUT0 0x0E8
118#define SIERRA_DEQ_GLUT1 0x0E9
119#define SIERRA_DEQ_GLUT2 0x0EA
120#define SIERRA_DEQ_GLUT3 0x0EB
121#define SIERRA_DEQ_GLUT4 0x0EC
122#define SIERRA_DEQ_GLUT5 0x0ED
123#define SIERRA_DEQ_GLUT6 0x0EE
124#define SIERRA_DEQ_GLUT7 0x0EF
125#define SIERRA_DEQ_GLUT8 0x0F0
126#define SIERRA_DEQ_GLUT9 0x0F1
127#define SIERRA_DEQ_GLUT10 0x0F2
128#define SIERRA_DEQ_GLUT11 0x0F3
129#define SIERRA_DEQ_GLUT12 0x0F4
130#define SIERRA_DEQ_GLUT13 0x0F5
131#define SIERRA_DEQ_GLUT14 0x0F6
132#define SIERRA_DEQ_GLUT15 0x0F7
133#define SIERRA_DEQ_GLUT16 0x0F8
134#define SIERRA_DEQ_ALUT0 0x108
135#define SIERRA_DEQ_ALUT1 0x109
136#define SIERRA_DEQ_ALUT2 0x10A
137#define SIERRA_DEQ_ALUT3 0x10B
138#define SIERRA_DEQ_ALUT4 0x10C
139#define SIERRA_DEQ_ALUT5 0x10D
140#define SIERRA_DEQ_ALUT6 0x10E
141#define SIERRA_DEQ_ALUT7 0x10F
142#define SIERRA_DEQ_ALUT8 0x110
143#define SIERRA_DEQ_ALUT9 0x111
144#define SIERRA_DEQ_ALUT10 0x112
145#define SIERRA_DEQ_ALUT11 0x113
146#define SIERRA_DEQ_ALUT12 0x114
147#define SIERRA_DEQ_ALUT13 0x115
148#define SIERRA_DEQ_DFETAP_CTRL_PREG 0x128
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +0530149#define SIERRA_DEQ_DFETAP0 0x129
150#define SIERRA_DEQ_DFETAP1 0x12B
151#define SIERRA_DEQ_DFETAP2 0x12D
152#define SIERRA_DEQ_DFETAP3 0x12F
153#define SIERRA_DEQ_DFETAP4 0x131
Alan Douglasfda76da2021-07-21 21:28:36 +0530154#define SIERRA_DFE_EN_1010_IGNORE_PREG 0x134
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +0530155#define SIERRA_DEQ_PRECUR_PREG 0x138
156#define SIERRA_DEQ_POSTCUR_PREG 0x140
157#define SIERRA_DEQ_POSTCUR_DECR_PREG 0x142
Alan Douglasfda76da2021-07-21 21:28:36 +0530158#define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG 0x150
159#define SIERRA_DEQ_TAU_CTRL2_PREG 0x151
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +0530160#define SIERRA_DEQ_TAU_CTRL3_PREG 0x152
161#define SIERRA_DEQ_OPENEYE_CTRL_PREG 0x158
Alan Douglasfda76da2021-07-21 21:28:36 +0530162#define SIERRA_DEQ_PICTRL_PREG 0x161
163#define SIERRA_CPICAL_TMRVAL_MODE1_PREG 0x170
164#define SIERRA_CPICAL_TMRVAL_MODE0_PREG 0x171
165#define SIERRA_CPICAL_PICNT_MODE1_PREG 0x174
166#define SIERRA_CPI_OUTBUF_RATESEL_PREG 0x17C
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +0530167#define SIERRA_CPI_RESBIAS_BIN_PREG 0x17E
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +0530168#define SIERRA_CPI_TRIM_PREG 0x17F
Alan Douglasfda76da2021-07-21 21:28:36 +0530169#define SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG 0x183
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +0530170#define SIERRA_EPI_CTRL_PREG 0x187
Alan Douglasfda76da2021-07-21 21:28:36 +0530171#define SIERRA_LFPSDET_SUPPORT_PREG 0x188
172#define SIERRA_LFPSFILT_NS_PREG 0x18A
173#define SIERRA_LFPSFILT_RD_PREG 0x18B
174#define SIERRA_LFPSFILT_MP_PREG 0x18C
175#define SIERRA_SIGDET_SUPPORT_PREG 0x190
176#define SIERRA_SDFILT_H2L_A_PREG 0x191
177#define SIERRA_SDFILT_L2H_PREG 0x193
178#define SIERRA_RXBUFFER_CTLECTRL_PREG 0x19E
179#define SIERRA_RXBUFFER_RCDFECTRL_PREG 0x19F
180#define SIERRA_RXBUFFER_DFECTRL_PREG 0x1A0
181#define SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG 0x14F
182#define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG 0x150
183
Swapnil Jakhade5b6b3dc2022-01-28 13:41:43 +0530184#define SIERRA_PHY_PCS_COMMON_OFFSET 0xc000
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +0530185#define SIERRA_PHY_PIPE_CMN_CTRL1 0x0
Alan Douglasfda76da2021-07-21 21:28:36 +0530186#define SIERRA_PHY_PLL_CFG 0xe
187
Swapnil Jakhade13a62082022-01-28 13:41:45 +0530188/* PHY PMA common registers */
189#define SIERRA_PHY_PMA_COMMON_OFFSET 0xe000
190#define SIERRA_PHY_PMA_CMN_CTRL 0x0
191
Swapnil Jakhadeb5c512f2022-01-28 13:41:46 +0530192/* PHY PCS lane registers */
193#define SIERRA_PHY_PCS_LANE_CDB_OFFSET(ln, offset) \
194 (0xD000 + ((ln) * (0x800 >> (3 - (offset)))))
195#define SIERRA_PHY_ISO_LINK_CTRL 0xB
196
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530197/* PHY PMA lane registers */
198#define SIERRA_PHY_PMA_LANE_CDB_OFFSET(ln, offset) \
199 (0xF000 + ((ln) * (0x800 >> (3 - (offset)))))
200#define SIERRA_PHY_PMA_XCVR_CTRL 0x000
201
Alan Douglasfda76da2021-07-21 21:28:36 +0530202#define SIERRA_MACRO_ID 0x00007364
203#define SIERRA_MAX_LANES 16
204#define PLL_LOCK_TIME 100
205
Aswath Govindraju304341f2022-01-28 13:41:36 +0530206#define CDNS_SIERRA_INPUT_CLOCKS 5
Kishon Vijay Abraham Id6042522022-01-28 13:41:33 +0530207enum cdns_sierra_clock_input {
208 PHY_CLK,
209 CMN_REFCLK_DIG_DIV,
210 CMN_REFCLK1_DIG_DIV,
Aswath Govindraju304341f2022-01-28 13:41:36 +0530211 PLL0_REFCLK,
212 PLL1_REFCLK,
Kishon Vijay Abraham Id6042522022-01-28 13:41:33 +0530213};
214
Aswath Govindraju304341f2022-01-28 13:41:36 +0530215#define SIERRA_NUM_CMN_PLLC 2
216#define SIERRA_NUM_CMN_PLLC_PARENTS 2
217
Alan Douglasfda76da2021-07-21 21:28:36 +0530218static const struct reg_field macro_id_type =
219 REG_FIELD(SIERRA_MACRO_ID_REG, 0, 15);
220static const struct reg_field phy_pll_cfg_1 =
221 REG_FIELD(SIERRA_PHY_PLL_CFG, 1, 1);
Swapnil Jakhade13a62082022-01-28 13:41:45 +0530222static const struct reg_field pma_cmn_ready =
223 REG_FIELD(SIERRA_PHY_PMA_CMN_CTRL, 0, 0);
Alan Douglasfda76da2021-07-21 21:28:36 +0530224static const struct reg_field pllctrl_lock =
225 REG_FIELD(SIERRA_PLLCTRL_STATUS_PREG, 0, 0);
Swapnil Jakhadeb5c512f2022-01-28 13:41:46 +0530226static const struct reg_field phy_iso_link_ctrl_1 =
227 REG_FIELD(SIERRA_PHY_ISO_LINK_CTRL, 1, 1);
Alan Douglasfda76da2021-07-21 21:28:36 +0530228
Aswath Govindraju304341f2022-01-28 13:41:36 +0530229static const char * const clk_names[] = {
230 [CDNS_SIERRA_PLL_CMNLC] = "pll_cmnlc",
231 [CDNS_SIERRA_PLL_CMNLC1] = "pll_cmnlc1",
232};
233
234enum cdns_sierra_cmn_plllc {
235 CMN_PLLLC,
236 CMN_PLLLC1,
237};
238
239struct cdns_sierra_pll_mux_reg_fields {
240 struct reg_field pfdclk_sel_preg;
241 struct reg_field plllc1en_field;
242 struct reg_field termen_field;
243};
244
245static const struct cdns_sierra_pll_mux_reg_fields cmn_plllc_pfdclk1_sel_preg[] = {
246 [CMN_PLLLC] = {
247 .pfdclk_sel_preg = REG_FIELD(SIERRA_CMN_PLLLC_GEN_PREG, 1, 1),
248 .plllc1en_field = REG_FIELD(SIERRA_CMN_REFRCV1_PREG, 8, 8),
249 .termen_field = REG_FIELD(SIERRA_CMN_REFRCV1_PREG, 0, 0),
250 },
251 [CMN_PLLLC1] = {
252 .pfdclk_sel_preg = REG_FIELD(SIERRA_CMN_PLLLC1_GEN_PREG, 1, 1),
253 .plllc1en_field = REG_FIELD(SIERRA_CMN_REFRCV_PREG, 8, 8),
254 .termen_field = REG_FIELD(SIERRA_CMN_REFRCV_PREG, 0, 0),
255 },
256};
257
258struct cdns_sierra_pll_mux {
259 struct cdns_sierra_phy *sp;
260 struct clk *clk;
261 struct clk *parent_clks[2];
262 struct regmap_field *pfdclk_sel_preg;
263 struct regmap_field *plllc1en_field;
264 struct regmap_field *termen_field;
265};
266
Alan Douglasfda76da2021-07-21 21:28:36 +0530267#define reset_control_assert(rst) cdns_reset_assert(rst)
268#define reset_control_deassert(rst) cdns_reset_deassert(rst)
269#define reset_control reset_ctl
270
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530271enum cdns_sierra_phy_type {
272 TYPE_NONE,
273 TYPE_PCIE,
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +0530274 TYPE_USB,
275 TYPE_QSGMII
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530276};
277
278enum cdns_sierra_ssc_mode {
279 NO_SSC,
280 EXTERNAL_SSC,
281 INTERNAL_SSC
282};
283
Alan Douglasfda76da2021-07-21 21:28:36 +0530284struct cdns_sierra_inst {
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530285 enum cdns_sierra_phy_type phy_type;
Alan Douglasfda76da2021-07-21 21:28:36 +0530286 u32 num_lanes;
287 u32 mlane;
288 struct reset_ctl_bulk *lnk_rst;
Swapnil Jakhade0d372ea2022-01-28 13:41:42 +0530289 enum cdns_sierra_ssc_mode ssc_mode;
Alan Douglasfda76da2021-07-21 21:28:36 +0530290};
291
292struct cdns_reg_pairs {
293 u16 val;
294 u32 off;
295};
296
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530297struct cdns_sierra_vals {
298 const struct cdns_reg_pairs *reg_pairs;
299 u32 num_regs;
300};
301
Alan Douglasfda76da2021-07-21 21:28:36 +0530302struct cdns_sierra_data {
303 u32 id_value;
304 u8 block_offset_shift;
305 u8 reg_offset_shift;
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +0530306 struct cdns_sierra_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
307 [NUM_SSC_MODE];
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530308 struct cdns_sierra_vals *phy_pma_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
309 [NUM_SSC_MODE];
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530310 struct cdns_sierra_vals *pma_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
311 [NUM_SSC_MODE];
312 struct cdns_sierra_vals *pma_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
313 [NUM_SSC_MODE];
Alan Douglasfda76da2021-07-21 21:28:36 +0530314};
315
Alan Douglasfda76da2021-07-21 21:28:36 +0530316struct cdns_sierra_phy {
317 struct udevice *dev;
318 void *base;
319 size_t size;
320 struct regmap *regmap;
321 struct cdns_sierra_data *init_data;
Aswath Govindraju11fcd0e2022-01-28 13:41:35 +0530322 struct cdns_sierra_inst *phys[SIERRA_MAX_LANES];
Alan Douglasfda76da2021-07-21 21:28:36 +0530323 struct reset_control *phy_rst;
324 struct regmap *regmap_lane_cdb[SIERRA_MAX_LANES];
Swapnil Jakhade5b6b3dc2022-01-28 13:41:43 +0530325 struct regmap *regmap_phy_pcs_common_cdb;
Swapnil Jakhadeb5c512f2022-01-28 13:41:46 +0530326 struct regmap *regmap_phy_pcs_lane_cdb[SIERRA_MAX_LANES];
Swapnil Jakhade13a62082022-01-28 13:41:45 +0530327 struct regmap *regmap_phy_pma_common_cdb;
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530328 struct regmap *regmap_phy_pma_lane_cdb[SIERRA_MAX_LANES];
Alan Douglasfda76da2021-07-21 21:28:36 +0530329 struct regmap *regmap_common_cdb;
330 struct regmap_field *macro_id_type;
331 struct regmap_field *phy_pll_cfg_1;
Swapnil Jakhade13a62082022-01-28 13:41:45 +0530332 struct regmap_field *pma_cmn_ready;
Alan Douglasfda76da2021-07-21 21:28:36 +0530333 struct regmap_field *pllctrl_lock[SIERRA_MAX_LANES];
Aswath Govindraju304341f2022-01-28 13:41:36 +0530334 struct regmap_field *cmn_refrcv_refclk_plllc1en_preg[SIERRA_NUM_CMN_PLLC];
335 struct regmap_field *cmn_refrcv_refclk_termen_preg[SIERRA_NUM_CMN_PLLC];
336 struct regmap_field *cmn_plllc_pfdclk1_sel_preg[SIERRA_NUM_CMN_PLLC];
Kishon Vijay Abraham Id6042522022-01-28 13:41:33 +0530337 struct clk *input_clks[CDNS_SIERRA_INPUT_CLOCKS];
Swapnil Jakhadeb5c512f2022-01-28 13:41:46 +0530338 struct regmap_field *phy_iso_link_ctrl_1[SIERRA_MAX_LANES];
Alan Douglasfda76da2021-07-21 21:28:36 +0530339 int nsubnodes;
340 u32 num_lanes;
341 bool autoconf;
Aswath Govindrajuf01608f2022-01-28 13:41:50 +0530342 unsigned int already_configured;
Alan Douglasfda76da2021-07-21 21:28:36 +0530343};
344
345static inline int cdns_reset_assert(struct reset_control *rst)
346{
347 if (rst)
348 return reset_assert(rst);
349 else
350 return 0;
351}
352
353static inline int cdns_reset_deassert(struct reset_control *rst)
354{
355 if (rst)
356 return reset_deassert(rst);
357 else
358 return 0;
359}
360
361static inline struct cdns_sierra_inst *phy_get_drvdata(struct phy *phy)
362{
363 struct cdns_sierra_phy *sp = dev_get_priv(phy->dev);
364 int index;
365
366 if (phy->id >= SIERRA_MAX_LANES)
367 return NULL;
368
369 for (index = 0; index < sp->nsubnodes; index++) {
Aswath Govindraju11fcd0e2022-01-28 13:41:35 +0530370 if (phy->id == sp->phys[index]->mlane)
371 return sp->phys[index];
Alan Douglasfda76da2021-07-21 21:28:36 +0530372 }
373
374 return NULL;
375}
376
377static int cdns_sierra_phy_init(struct phy *gphy)
378{
379 struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
380 struct cdns_sierra_phy *phy = dev_get_priv(gphy->dev);
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530381 struct cdns_sierra_data *init_data = phy->init_data;
382 struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals;
383 enum cdns_sierra_phy_type phy_type = ins->phy_type;
Swapnil Jakhade0d372ea2022-01-28 13:41:42 +0530384 enum cdns_sierra_ssc_mode ssc = ins->ssc_mode;
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530385 struct cdns_sierra_vals *phy_pma_ln_vals;
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530386 const struct cdns_reg_pairs *reg_pairs;
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +0530387 struct cdns_sierra_vals *pcs_cmn_vals;
Alan Douglasfda76da2021-07-21 21:28:36 +0530388 struct regmap *regmap = phy->regmap;
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530389 u32 num_regs;
Alan Douglasfda76da2021-07-21 21:28:36 +0530390 int i, j;
Alan Douglasfda76da2021-07-21 21:28:36 +0530391
392 /* Initialise the PHY registers, unless auto configured */
Aswath Govindrajuf01608f2022-01-28 13:41:50 +0530393 if (phy->autoconf || phy->already_configured || phy->nsubnodes > 1)
Alan Douglasfda76da2021-07-21 21:28:36 +0530394 return 0;
395
Kishon Vijay Abraham Id6042522022-01-28 13:41:33 +0530396 clk_set_rate(phy->input_clks[CMN_REFCLK_DIG_DIV], 25000000);
397 clk_set_rate(phy->input_clks[CMN_REFCLK1_DIG_DIV], 25000000);
Alan Douglasfda76da2021-07-21 21:28:36 +0530398
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +0530399 /* PHY PCS common registers configurations */
400 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc];
401 if (pcs_cmn_vals) {
402 reg_pairs = pcs_cmn_vals->reg_pairs;
403 num_regs = pcs_cmn_vals->num_regs;
404 regmap = phy->regmap_phy_pcs_common_cdb;
405 for (i = 0; i < num_regs; i++)
406 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
407 }
408
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530409 /* PHY PMA lane registers configurations */
410 phy_pma_ln_vals = init_data->phy_pma_ln_vals[phy_type][TYPE_NONE][ssc];
411 if (phy_pma_ln_vals) {
412 reg_pairs = phy_pma_ln_vals->reg_pairs;
413 num_regs = phy_pma_ln_vals->num_regs;
414 for (i = 0; i < ins->num_lanes; i++) {
415 regmap = phy->regmap_phy_pma_lane_cdb[i + ins->mlane];
416 for (j = 0; j < num_regs; j++)
417 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
418 }
419 }
420
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530421 /* PMA common registers configurations */
422 pma_cmn_vals = init_data->pma_cmn_vals[phy_type][TYPE_NONE][ssc];
423 if (pma_cmn_vals) {
424 reg_pairs = pma_cmn_vals->reg_pairs;
425 num_regs = pma_cmn_vals->num_regs;
426 regmap = phy->regmap_common_cdb;
427 for (i = 0; i < num_regs; i++)
428 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
Alan Douglasfda76da2021-07-21 21:28:36 +0530429 }
430
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530431 /* PMA TX lane registers configurations */
432 pma_ln_vals = init_data->pma_ln_vals[phy_type][TYPE_NONE][ssc];
433 if (pma_ln_vals) {
434 reg_pairs = pma_ln_vals->reg_pairs;
435 num_regs = pma_ln_vals->num_regs;
436 for (i = 0; i < ins->num_lanes; i++) {
Alan Douglasfda76da2021-07-21 21:28:36 +0530437 regmap = phy->regmap_lane_cdb[i + ins->mlane];
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530438 for (j = 0; j < num_regs; j++)
439 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
Alan Douglasfda76da2021-07-21 21:28:36 +0530440 }
441 }
442
443 return 0;
444}
445
446static int cdns_sierra_phy_on(struct phy *gphy)
447{
448 struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
449 struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev);
450 struct udevice *dev = gphy->dev;
451 u32 val;
452 int ret;
453
Aswath Govindrajuf01608f2022-01-28 13:41:50 +0530454 if (sp->already_configured) {
455 usleep_range(5000, 10000);
456 return 0;
457 }
458
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530459 if (sp->nsubnodes == 1) {
460 /* Take the PHY out of reset */
461 ret = reset_control_deassert(sp->phy_rst);
462 if (ret) {
463 dev_err(dev, "Failed to take the PHY out of reset\n");
464 return ret;
465 }
Kishon Vijay Abraham I1ff2b712022-01-28 13:41:29 +0530466 }
467
Alan Douglasfda76da2021-07-21 21:28:36 +0530468 /* Take the PHY lane group out of reset */
469 ret = reset_deassert_bulk(ins->lnk_rst);
470 if (ret) {
471 dev_err(dev, "Failed to take the PHY lane out of reset\n");
472 return ret;
473 }
474
Swapnil Jakhadeb5c512f2022-01-28 13:41:46 +0530475 if (ins->phy_type == TYPE_PCIE || ins->phy_type == TYPE_USB) {
476 ret = regmap_field_read_poll_timeout(sp->phy_iso_link_ctrl_1[ins->mlane],
477 val, !val, 1000, PLL_LOCK_TIME);
478 if (ret) {
479 dev_err(dev, "Timeout waiting for PHY status ready\n");
480 return ret;
481 }
482 }
483
Swapnil Jakhade13a62082022-01-28 13:41:45 +0530484 /*
485 * Wait for cmn_ready assertion
486 * PHY_PMA_CMN_CTRL[0] == 1
487 */
488 ret = regmap_field_read_poll_timeout(sp->pma_cmn_ready, val, val,
489 1000, PLL_LOCK_TIME);
490 if (ret) {
491 dev_err(dev, "Timeout waiting for CMN ready\n");
492 return ret;
493 }
494
Alan Douglasfda76da2021-07-21 21:28:36 +0530495 ret = regmap_field_read_poll_timeout(sp->pllctrl_lock[ins->mlane],
496 val, val, 1000, PLL_LOCK_TIME);
497 if (ret < 0)
498 dev_err(dev, "PLL lock of lane failed\n");
499
500 reset_control_assert(sp->phy_rst);
501 reset_control_deassert(sp->phy_rst);
502
503 return ret;
504}
505
506static int cdns_sierra_phy_off(struct phy *gphy)
507{
508 struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
509
510 return reset_assert_bulk(ins->lnk_rst);
511}
512
513static int cdns_sierra_phy_reset(struct phy *gphy)
514{
515 struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev);
516
517 reset_control_assert(sp->phy_rst);
518 reset_control_deassert(sp->phy_rst);
519 return 0;
520};
521
522static const struct phy_ops ops = {
523 .init = cdns_sierra_phy_init,
524 .power_on = cdns_sierra_phy_on,
525 .power_off = cdns_sierra_phy_off,
526 .reset = cdns_sierra_phy_reset,
527};
528
Aswath Govindraju304341f2022-01-28 13:41:36 +0530529struct cdns_sierra_pll_mux_sel {
530 enum cdns_sierra_cmn_plllc mux_sel;
531 u32 table[2];
532 const char *node_name;
533 u32 num_parents;
534 u32 parents[2];
535};
536
537static struct cdns_sierra_pll_mux_sel pll_clk_mux_sel[] = {
538 {
539 .num_parents = 2,
540 .parents = { PLL0_REFCLK, PLL1_REFCLK },
541 .mux_sel = CMN_PLLLC,
542 .table = { 0, 1 },
543 .node_name = "pll_cmnlc",
544 },
545 {
546 .num_parents = 2,
547 .parents = { PLL1_REFCLK, PLL0_REFCLK },
548 .mux_sel = CMN_PLLLC1,
549 .table = { 1, 0 },
550 .node_name = "pll_cmnlc1",
551 },
552};
553
554static int cdns_sierra_pll_mux_set_parent(struct clk *clk, struct clk *parent)
555{
556 struct udevice *dev = clk->dev;
557 struct cdns_sierra_pll_mux *priv = dev_get_priv(dev);
558 struct cdns_sierra_pll_mux_sel *data = dev_get_plat(dev);
559 struct cdns_sierra_phy *sp = priv->sp;
560 int ret;
561 int i;
562
563 for (i = 0; i < ARRAY_SIZE(priv->parent_clks); i++) {
564 if (parent->dev == priv->parent_clks[i]->dev)
565 break;
566 }
567
568 if (i == ARRAY_SIZE(priv->parent_clks))
569 return -EINVAL;
570
571 ret = regmap_field_write(sp->cmn_refrcv_refclk_plllc1en_preg[data[clk->id].mux_sel], i);
572 ret |= regmap_field_write(sp->cmn_refrcv_refclk_termen_preg[data[clk->id].mux_sel], i);
573 ret |= regmap_field_write(sp->cmn_plllc_pfdclk1_sel_preg[data[clk->id].mux_sel],
574 data[clk->id].table[i]);
575
576 return ret;
577}
578
579static const struct clk_ops cdns_sierra_pll_mux_ops = {
580 .set_parent = cdns_sierra_pll_mux_set_parent,
581};
582
583int cdns_sierra_pll_mux_probe(struct udevice *dev)
584{
585 struct cdns_sierra_pll_mux *priv = dev_get_priv(dev);
586 struct cdns_sierra_phy *sp = dev_get_priv(dev->parent);
587 struct cdns_sierra_pll_mux_sel *data = dev_get_plat(dev);
588 struct clk *clk;
589 int i, j;
590
591 for (j = 0; j < SIERRA_NUM_CMN_PLLC; j++) {
592 for (i = 0; i < ARRAY_SIZE(priv->parent_clks); i++) {
593 clk = sp->input_clks[data[j].parents[i]];
594 if (IS_ERR_OR_NULL(clk)) {
595 dev_err(dev, "No parent clock for PLL mux clocks\n");
596 return IS_ERR(clk) ? PTR_ERR(clk) : -ENOENT;
597 }
598 priv->parent_clks[i] = clk;
599 }
600 }
601
602 priv->sp = dev_get_priv(dev->parent);
603
604 return 0;
605}
606
607U_BOOT_DRIVER(cdns_sierra_pll_mux_clk) = {
608 .name = "cdns_sierra_mux_clk",
609 .id = UCLASS_CLK,
610 .priv_auto = sizeof(struct cdns_sierra_pll_mux),
611 .ops = &cdns_sierra_pll_mux_ops,
612 .probe = cdns_sierra_pll_mux_probe,
613 .plat_auto = sizeof(struct cdns_sierra_pll_mux_sel) * SIERRA_NUM_CMN_PLLC,
614};
615
616static int cdns_sierra_pll_bind_of_clocks(struct cdns_sierra_phy *sp)
617{
618 struct udevice *dev = sp->dev;
619 struct driver *cdns_sierra_clk_drv;
620 struct cdns_sierra_pll_mux_sel *data = pll_clk_mux_sel;
621 int i, rc;
622
623 cdns_sierra_clk_drv = lists_driver_lookup_name("cdns_sierra_mux_clk");
624 if (!cdns_sierra_clk_drv) {
625 dev_err(dev, "Can not find driver 'cdns_sierra_mux_clk'\n");
626 return -ENOENT;
627 }
628
629 rc = device_bind(dev, cdns_sierra_clk_drv, "pll_mux_clk",
630 data, dev_ofnode(dev), NULL);
631 if (rc) {
632 dev_err(dev, "cannot bind driver for clock %s\n",
633 clk_names[i]);
634 }
635
636 return 0;
637}
638
Alan Douglasfda76da2021-07-21 21:28:36 +0530639static int cdns_sierra_get_optional(struct cdns_sierra_inst *inst,
640 ofnode child)
641{
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530642 u32 phy_type;
643
Alan Douglasfda76da2021-07-21 21:28:36 +0530644 if (ofnode_read_u32(child, "reg", &inst->mlane))
645 return -EINVAL;
646
647 if (ofnode_read_u32(child, "cdns,num-lanes", &inst->num_lanes))
648 return -EINVAL;
649
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530650 if (ofnode_read_u32(child, "cdns,phy-type", &phy_type))
Alan Douglasfda76da2021-07-21 21:28:36 +0530651 return -EINVAL;
652
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530653 switch (phy_type) {
654 case PHY_TYPE_PCIE:
655 inst->phy_type = TYPE_PCIE;
656 break;
657 case PHY_TYPE_USB3:
658 inst->phy_type = TYPE_USB;
659 break;
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +0530660 case PHY_TYPE_QSGMII:
661 inst->phy_type = TYPE_QSGMII;
662 break;
Swapnil Jakhadee42a8472022-01-28 13:41:40 +0530663 default:
664 return -EINVAL;
665 }
666
Swapnil Jakhade0d372ea2022-01-28 13:41:42 +0530667 inst->ssc_mode = EXTERNAL_SSC;
668 ofnode_read_u32(child, "cdns,ssc-mode", &inst->ssc_mode);
669
Alan Douglasfda76da2021-07-21 21:28:36 +0530670 return 0;
671}
672
673static struct regmap *cdns_regmap_init(struct udevice *dev, void __iomem *base,
674 u32 block_offset, u8 block_offset_shift,
675 u8 reg_offset_shift)
676{
677 struct cdns_sierra_phy *sp = dev_get_priv(dev);
678 struct regmap_config config;
679
680 config.r_start = (ulong)(base + (block_offset << block_offset_shift));
681 config.r_size = sp->size - (block_offset << block_offset_shift);
682 config.reg_offset_shift = reg_offset_shift;
683 config.width = REGMAP_SIZE_16;
684
685 return devm_regmap_init(dev, NULL, NULL, &config);
686}
687
688static int cdns_regfield_init(struct cdns_sierra_phy *sp)
689{
690 struct udevice *dev = sp->dev;
691 struct regmap_field *field;
Aswath Govindraju304341f2022-01-28 13:41:36 +0530692 struct reg_field reg_field;
Alan Douglasfda76da2021-07-21 21:28:36 +0530693 struct regmap *regmap;
694 int i;
695
696 regmap = sp->regmap_common_cdb;
697 field = devm_regmap_field_alloc(dev, regmap, macro_id_type);
698 if (IS_ERR(field)) {
699 dev_err(dev, "MACRO_ID_TYPE reg field init failed\n");
700 return PTR_ERR(field);
701 }
702 sp->macro_id_type = field;
703
Aswath Govindraju304341f2022-01-28 13:41:36 +0530704 for (i = 0; i < SIERRA_NUM_CMN_PLLC; i++) {
705 reg_field = cmn_plllc_pfdclk1_sel_preg[i].pfdclk_sel_preg;
706 field = devm_regmap_field_alloc(dev, regmap, reg_field);
707 if (IS_ERR(field)) {
708 dev_err(dev, "PLLLC%d_PFDCLK1_SEL failed\n", i);
709 return PTR_ERR(field);
710 }
711 sp->cmn_plllc_pfdclk1_sel_preg[i] = field;
712
713 reg_field = cmn_plllc_pfdclk1_sel_preg[i].plllc1en_field;
714 field = devm_regmap_field_alloc(dev, regmap, reg_field);
715 if (IS_ERR(field)) {
716 dev_err(dev, "REFRCV%d_REFCLK_PLLLC1EN failed\n", i);
717 return PTR_ERR(field);
718 }
719 sp->cmn_refrcv_refclk_plllc1en_preg[i] = field;
720
721 reg_field = cmn_plllc_pfdclk1_sel_preg[i].termen_field;
722 field = devm_regmap_field_alloc(dev, regmap, reg_field);
723 if (IS_ERR(field)) {
724 dev_err(dev, "REFRCV%d_REFCLK_TERMEN failed\n", i);
725 return PTR_ERR(field);
726 }
727 sp->cmn_refrcv_refclk_termen_preg[i] = field;
728 }
729
Swapnil Jakhade5b6b3dc2022-01-28 13:41:43 +0530730 regmap = sp->regmap_phy_pcs_common_cdb;
Alan Douglasfda76da2021-07-21 21:28:36 +0530731 field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg_1);
732 if (IS_ERR(field)) {
733 dev_err(dev, "PHY_PLL_CFG_1 reg field init failed\n");
734 return PTR_ERR(field);
735 }
736 sp->phy_pll_cfg_1 = field;
737
Swapnil Jakhade13a62082022-01-28 13:41:45 +0530738 regmap = sp->regmap_phy_pma_common_cdb;
739 field = devm_regmap_field_alloc(dev, regmap, pma_cmn_ready);
740 if (IS_ERR(field)) {
741 dev_err(dev, "PHY_PMA_CMN_CTRL reg field init failed\n");
742 return PTR_ERR(field);
743 }
744 sp->pma_cmn_ready = field;
745
Alan Douglasfda76da2021-07-21 21:28:36 +0530746 for (i = 0; i < SIERRA_MAX_LANES; i++) {
747 regmap = sp->regmap_lane_cdb[i];
748 field = devm_regmap_field_alloc(dev, regmap, pllctrl_lock);
749 if (IS_ERR(field)) {
750 dev_err(dev, "P%d_ENABLE reg field init failed\n", i);
751 return PTR_ERR(field);
752 }
Swapnil Jakhadeb5c512f2022-01-28 13:41:46 +0530753 sp->pllctrl_lock[i] = field;
754 }
755
756 for (i = 0; i < SIERRA_MAX_LANES; i++) {
757 regmap = sp->regmap_phy_pcs_lane_cdb[i];
758 field = devm_regmap_field_alloc(dev, regmap, phy_iso_link_ctrl_1);
759 if (IS_ERR(field)) {
760 dev_err(dev, "PHY_ISO_LINK_CTRL reg field init for lane %d failed\n", i);
761 return PTR_ERR(field);
762 }
763 sp->phy_iso_link_ctrl_1[i] = field;
Alan Douglasfda76da2021-07-21 21:28:36 +0530764 }
765
766 return 0;
767}
768
769static int cdns_regmap_init_blocks(struct cdns_sierra_phy *sp,
770 void __iomem *base, u8 block_offset_shift,
771 u8 reg_offset_shift)
772{
773 struct udevice *dev = sp->dev;
774 struct regmap *regmap;
775 u32 block_offset;
776 int i;
777
778 for (i = 0; i < SIERRA_MAX_LANES; i++) {
779 block_offset = SIERRA_LANE_CDB_OFFSET(i, reg_offset_shift);
780 regmap = cdns_regmap_init(dev, base, block_offset,
781 block_offset_shift, reg_offset_shift);
782 if (IS_ERR(regmap)) {
783 dev_err(dev, "Failed to init lane CDB regmap\n");
784 return PTR_ERR(regmap);
785 }
786 sp->regmap_lane_cdb[i] = regmap;
787 }
788
789 regmap = cdns_regmap_init(dev, base, SIERRA_COMMON_CDB_OFFSET,
790 block_offset_shift, reg_offset_shift);
791 if (IS_ERR(regmap)) {
792 dev_err(dev, "Failed to init common CDB regmap\n");
793 return PTR_ERR(regmap);
794 }
795 sp->regmap_common_cdb = regmap;
796
Swapnil Jakhade5b6b3dc2022-01-28 13:41:43 +0530797 regmap = cdns_regmap_init(dev, base, SIERRA_PHY_PCS_COMMON_OFFSET,
Alan Douglasfda76da2021-07-21 21:28:36 +0530798 block_offset_shift, reg_offset_shift);
799 if (IS_ERR(regmap)) {
Swapnil Jakhade5b6b3dc2022-01-28 13:41:43 +0530800 dev_err(dev, "Failed to init PHY PCS common CDB regmap\n");
Alan Douglasfda76da2021-07-21 21:28:36 +0530801 return PTR_ERR(regmap);
802 }
Swapnil Jakhade5b6b3dc2022-01-28 13:41:43 +0530803 sp->regmap_phy_pcs_common_cdb = regmap;
Alan Douglasfda76da2021-07-21 21:28:36 +0530804
Swapnil Jakhadeb5c512f2022-01-28 13:41:46 +0530805 for (i = 0; i < SIERRA_MAX_LANES; i++) {
806 block_offset = SIERRA_PHY_PCS_LANE_CDB_OFFSET(i, reg_offset_shift);
807 regmap = cdns_regmap_init(dev, base, block_offset,
808 block_offset_shift, reg_offset_shift);
809 if (IS_ERR(regmap)) {
810 dev_err(dev, "Failed to init PHY PCS lane CDB regmap\n");
811 return PTR_ERR(regmap);
812 }
813 sp->regmap_phy_pcs_lane_cdb[i] = regmap;
814 }
815
Swapnil Jakhade13a62082022-01-28 13:41:45 +0530816 regmap = cdns_regmap_init(dev, base, SIERRA_PHY_PMA_COMMON_OFFSET,
817 block_offset_shift, reg_offset_shift);
818 if (IS_ERR(regmap)) {
819 dev_err(dev, "Failed to init PHY PMA common CDB regmap\n");
820 return PTR_ERR(regmap);
821 }
822 sp->regmap_phy_pma_common_cdb = regmap;
823
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530824 for (i = 0; i < SIERRA_MAX_LANES; i++) {
825 block_offset = SIERRA_PHY_PMA_LANE_CDB_OFFSET(i, reg_offset_shift);
826 regmap = cdns_regmap_init(dev, base, block_offset,
827 block_offset_shift, reg_offset_shift);
828 if (IS_ERR(regmap)) {
829 dev_err(dev, "Failed to init PHY PMA lane CDB regmap\n");
830 return PTR_ERR(regmap);
831 }
832 sp->regmap_phy_pma_lane_cdb[i] = regmap;
833 }
834
Alan Douglasfda76da2021-07-21 21:28:36 +0530835 return 0;
836}
837
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530838static int cdns_sierra_phy_configure_multilink(struct cdns_sierra_phy *sp)
839{
840 const struct cdns_sierra_data *init_data = sp->init_data;
841 enum cdns_sierra_phy_type phy_t1, phy_t2, tmp_phy_type;
842 struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals;
843 struct cdns_sierra_vals *phy_pma_ln_vals;
844 const struct cdns_reg_pairs *reg_pairs;
845 struct cdns_sierra_vals *pcs_cmn_vals;
846 int i, j, node, mlane, num_lanes, ret;
847 enum cdns_sierra_ssc_mode ssc;
848 struct regmap *regmap;
849 u32 num_regs;
850
851 /* Maximum 2 links (subnodes) are supported */
852 if (sp->nsubnodes != 2)
853 return -EINVAL;
854
855 clk_set_rate(sp->input_clks[CMN_REFCLK_DIG_DIV], 25000000);
856 clk_set_rate(sp->input_clks[CMN_REFCLK1_DIG_DIV], 25000000);
857
858 /* PHY configured to use both PLL LC and LC1 */
859 regmap_field_write(sp->phy_pll_cfg_1, 0x1);
860
861 phy_t1 = sp->phys[0]->phy_type;
862 phy_t2 = sp->phys[1]->phy_type;
863
864 /*
865 * First configure the PHY for first link with phy_t1. Get the array
866 * values as [phy_t1][phy_t2][ssc].
867 */
868 for (node = 0; node < sp->nsubnodes; node++) {
869 if (node == 1) {
870 /*
871 * If first link with phy_t1 is configured, then
872 * configure the PHY for second link with phy_t2.
873 * Get the array values as [phy_t2][phy_t1][ssc].
874 */
875 tmp_phy_type = phy_t1;
876 phy_t1 = phy_t2;
877 phy_t2 = tmp_phy_type;
878 }
879
880 mlane = sp->phys[node]->mlane;
881 ssc = sp->phys[node]->ssc_mode;
882 num_lanes = sp->phys[node]->num_lanes;
883
884 /* PHY PCS common registers configurations */
885 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc];
886 if (pcs_cmn_vals) {
887 reg_pairs = pcs_cmn_vals->reg_pairs;
888 num_regs = pcs_cmn_vals->num_regs;
889 regmap = sp->regmap_phy_pcs_common_cdb;
890 for (i = 0; i < num_regs; i++)
891 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
892 }
893
894 /* PHY PMA lane registers configurations */
895 phy_pma_ln_vals = init_data->phy_pma_ln_vals[phy_t1][phy_t2][ssc];
896 if (phy_pma_ln_vals) {
897 reg_pairs = phy_pma_ln_vals->reg_pairs;
898 num_regs = phy_pma_ln_vals->num_regs;
899 for (i = 0; i < num_lanes; i++) {
900 regmap = sp->regmap_phy_pma_lane_cdb[i + mlane];
901 for (j = 0; j < num_regs; j++)
902 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
903 }
904 }
905
906 /* PMA common registers configurations */
907 pma_cmn_vals = init_data->pma_cmn_vals[phy_t1][phy_t2][ssc];
908 if (pma_cmn_vals) {
909 reg_pairs = pma_cmn_vals->reg_pairs;
910 num_regs = pma_cmn_vals->num_regs;
911 regmap = sp->regmap_common_cdb;
912 for (i = 0; i < num_regs; i++)
913 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val);
914 }
915
916 /* PMA TX lane registers configurations */
917 pma_ln_vals = init_data->pma_ln_vals[phy_t1][phy_t2][ssc];
918 if (pma_ln_vals) {
919 reg_pairs = pma_ln_vals->reg_pairs;
920 num_regs = pma_ln_vals->num_regs;
921 for (i = 0; i < num_lanes; i++) {
922 regmap = sp->regmap_lane_cdb[i + mlane];
923 for (j = 0; j < num_regs; j++)
924 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val);
925 }
926 }
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +0530927
928 if (phy_t1 == TYPE_QSGMII)
929 reset_deassert_bulk(sp->phys[node]->lnk_rst);
Swapnil Jakhade547eec42022-01-28 13:41:48 +0530930 }
931
932 /* Take the PHY out of reset */
933 ret = reset_control_deassert(sp->phy_rst);
934 if (ret)
935 return ret;
936
937 return 0;
938}
939
Kishon Vijay Abraham I47d0bcb2022-01-28 13:41:31 +0530940static int cdns_sierra_phy_get_clocks(struct cdns_sierra_phy *sp,
941 struct udevice *dev)
942{
943 struct clk *clk;
944 int ret;
945
Kishon Vijay Abraham I47d0bcb2022-01-28 13:41:31 +0530946 clk = devm_clk_get_optional(dev, "cmn_refclk_dig_div");
947 if (IS_ERR(clk)) {
948 dev_err(dev, "cmn_refclk_dig_div clock not found\n");
949 ret = PTR_ERR(clk);
950 return ret;
951 }
Kishon Vijay Abraham Id6042522022-01-28 13:41:33 +0530952 sp->input_clks[CMN_REFCLK_DIG_DIV] = clk;
Kishon Vijay Abraham I47d0bcb2022-01-28 13:41:31 +0530953
954 clk = devm_clk_get_optional(dev, "cmn_refclk1_dig_div");
955 if (IS_ERR(clk)) {
956 dev_err(dev, "cmn_refclk1_dig_div clock not found\n");
957 ret = PTR_ERR(clk);
958 return ret;
959 }
Kishon Vijay Abraham Id6042522022-01-28 13:41:33 +0530960 sp->input_clks[CMN_REFCLK1_DIG_DIV] = clk;
Kishon Vijay Abraham I47d0bcb2022-01-28 13:41:31 +0530961
Aswath Govindraju304341f2022-01-28 13:41:36 +0530962 clk = devm_clk_get_optional(dev, "pll0_refclk");
963 if (IS_ERR(clk)) {
964 dev_err(dev, "pll0_refclk clock not found\n");
965 ret = PTR_ERR(clk);
966 return ret;
967 }
968 sp->input_clks[PLL0_REFCLK] = clk;
969
970 clk = devm_clk_get_optional(dev, "pll1_refclk");
971 if (IS_ERR(clk)) {
972 dev_err(dev, "pll1_refclk clock not found\n");
973 ret = PTR_ERR(clk);
974 return ret;
975 }
976 sp->input_clks[PLL1_REFCLK] = clk;
977
Kishon Vijay Abraham I47d0bcb2022-01-28 13:41:31 +0530978 return 0;
979}
980
Aswath Govindrajuf01608f2022-01-28 13:41:50 +0530981static int cdns_sierra_phy_clk(struct cdns_sierra_phy *sp)
982{
983 struct udevice *dev = sp->dev;
984 struct clk *clk;
985 int ret;
986
987 clk = devm_clk_get_optional(dev, "phy_clk");
988 if (IS_ERR(clk)) {
989 dev_err(dev, "failed to get clock phy_clk\n");
990 return PTR_ERR(clk);
991 }
992 sp->input_clks[PHY_CLK] = clk;
993
994 ret = clk_prepare_enable(sp->input_clks[PHY_CLK]);
995 if (ret)
996 return ret;
997
998 return 0;
999}
Kishon Vijay Abraham I12fbc5c2022-01-28 13:41:32 +05301000static int cdns_sierra_phy_get_resets(struct cdns_sierra_phy *sp,
1001 struct udevice *dev)
1002{
1003 struct reset_control *rst;
1004
1005 rst = devm_reset_control_get(dev, "sierra_reset");
1006 if (IS_ERR(rst)) {
1007 dev_err(dev, "failed to get reset\n");
1008 return PTR_ERR(rst);
1009 }
1010 sp->phy_rst = rst;
1011
1012 return 0;
1013}
1014
Aswath Govindraju11fcd0e2022-01-28 13:41:35 +05301015static int cdns_sierra_bind_link_nodes(struct cdns_sierra_phy *sp)
1016{
1017 struct udevice *dev = sp->dev;
1018 struct driver *link_drv;
1019 ofnode child;
1020 int rc;
1021
1022 link_drv = lists_driver_lookup_name("sierra_phy_link");
1023 if (!link_drv) {
1024 dev_err(dev, "Cannot find driver 'sierra_phy_link'\n");
1025 return -ENOENT;
1026 }
1027
1028 ofnode_for_each_subnode(child, dev_ofnode(dev)) {
1029 if (!(ofnode_name_eq(child, "phy") ||
1030 ofnode_name_eq(child, "link")))
1031 continue;
1032
1033 rc = device_bind(dev, link_drv, "link", NULL, child, NULL);
1034 if (rc) {
1035 dev_err(dev, "cannot bind driver for link\n");
1036 return rc;
1037 }
1038 }
1039
1040 return 0;
1041}
1042
1043static int cdns_sierra_link_probe(struct udevice *dev)
1044{
1045 struct cdns_sierra_inst *inst = dev_get_priv(dev);
1046 struct cdns_sierra_phy *sp = dev_get_priv(dev->parent);
1047 struct reset_ctl_bulk *rst;
1048 int ret, node;
1049
1050 rst = devm_reset_bulk_get_by_node(dev, dev_ofnode(dev));
1051 if (IS_ERR(rst)) {
1052 ret = PTR_ERR(rst);
1053 dev_err(dev, "failed to get reset\n");
1054 return ret;
1055 }
1056 inst->lnk_rst = rst;
1057
1058 ret = cdns_sierra_get_optional(inst, dev_ofnode(dev));
1059 if (ret) {
1060 dev_err(dev, "missing property in node\n");
1061 return ret;
1062 }
1063 node = sp->nsubnodes;
1064 sp->phys[node] = inst;
1065 sp->nsubnodes += 1;
1066 sp->num_lanes += inst->num_lanes;
1067
1068 /* If more than one subnode, configure the PHY as multilink */
Aswath Govindrajuf01608f2022-01-28 13:41:50 +05301069 if (!sp->autoconf && !sp->already_configured && sp->nsubnodes > 1) {
Swapnil Jakhade547eec42022-01-28 13:41:48 +05301070 ret = cdns_sierra_phy_configure_multilink(sp);
1071 if (ret)
1072 return ret;
1073 }
Aswath Govindraju11fcd0e2022-01-28 13:41:35 +05301074
1075 return 0;
1076}
1077
1078U_BOOT_DRIVER(sierra_phy_link) = {
1079 .name = "sierra_phy_link",
1080 .id = UCLASS_PHY,
1081 .probe = cdns_sierra_link_probe,
1082 .priv_auto = sizeof(struct cdns_sierra_inst),
1083};
1084
Alan Douglasfda76da2021-07-21 21:28:36 +05301085static int cdns_sierra_phy_probe(struct udevice *dev)
1086{
1087 struct cdns_sierra_phy *sp = dev_get_priv(dev);
1088 struct cdns_sierra_data *data;
1089 unsigned int id_value;
Aswath Govindraju304341f2022-01-28 13:41:36 +05301090 int ret;
Alan Douglasfda76da2021-07-21 21:28:36 +05301091
1092 sp->dev = dev;
1093
1094 sp->base = devfdt_remap_addr_index(dev, 0);
1095 if (!sp->base) {
1096 dev_err(dev, "unable to map regs\n");
1097 return -ENOMEM;
1098 }
1099 devfdt_get_addr_size_index(dev, 0, (fdt_size_t *)&sp->size);
1100
1101 /* Get init data for this PHY */
1102 data = (struct cdns_sierra_data *)dev_get_driver_data(dev);
1103 sp->init_data = data;
1104
1105 ret = cdns_regmap_init_blocks(sp, sp->base, data->block_offset_shift,
1106 data->reg_offset_shift);
1107 if (ret)
1108 return ret;
1109
1110 ret = cdns_regfield_init(sp);
1111 if (ret)
1112 return ret;
1113
Kishon Vijay Abraham I47d0bcb2022-01-28 13:41:31 +05301114 ret = cdns_sierra_phy_get_clocks(sp, dev);
1115 if (ret)
1116 return ret;
Alan Douglasfda76da2021-07-21 21:28:36 +05301117
Aswath Govindraju304341f2022-01-28 13:41:36 +05301118 ret = cdns_sierra_pll_bind_of_clocks(sp);
1119 if (ret)
1120 return ret;
Alan Douglasfda76da2021-07-21 21:28:36 +05301121
Aswath Govindrajuf01608f2022-01-28 13:41:50 +05301122 regmap_field_read(sp->pma_cmn_ready, &sp->already_configured);
Kishon Vijay Abraham I12fbc5c2022-01-28 13:41:32 +05301123
Aswath Govindrajuf01608f2022-01-28 13:41:50 +05301124 if (!sp->already_configured) {
1125 ret = cdns_sierra_phy_clk(sp);
1126 if (ret)
1127 return ret;
1128
1129 ret = cdns_sierra_phy_get_resets(sp, dev);
1130 if (ret)
1131 return ret;
1132 }
Alan Douglasfda76da2021-07-21 21:28:36 +05301133
1134 /* Check that PHY is present */
1135 regmap_field_read(sp->macro_id_type, &id_value);
1136 if (sp->init_data->id_value != id_value) {
1137 dev_err(dev, "PHY not found 0x%x vs 0x%x\n",
1138 sp->init_data->id_value, id_value);
1139 ret = -EINVAL;
1140 goto clk_disable;
1141 }
1142
1143 sp->autoconf = dev_read_bool(dev, "cdns,autoconf");
Aswath Govindraju11fcd0e2022-01-28 13:41:35 +05301144 /* Binding link nodes as children to serdes */
1145 ret = cdns_sierra_bind_link_nodes(sp);
1146 if (ret)
1147 goto clk_disable;
Alan Douglasfda76da2021-07-21 21:28:36 +05301148
Alan Douglasfda76da2021-07-21 21:28:36 +05301149 dev_info(dev, "sierra probed\n");
1150 return 0;
1151
Alan Douglasfda76da2021-07-21 21:28:36 +05301152clk_disable:
Aswath Govindrajuf01608f2022-01-28 13:41:50 +05301153 if (!sp->already_configured)
1154 clk_disable_unprepare(sp->input_clks[PHY_CLK]);
Alan Douglasfda76da2021-07-21 21:28:36 +05301155 return ret;
1156}
1157
1158static int cdns_sierra_phy_remove(struct udevice *dev)
1159{
1160 struct cdns_sierra_phy *phy = dev_get_priv(dev);
1161 int i;
1162
1163 reset_control_assert(phy->phy_rst);
1164
1165 /*
1166 * The device level resets will be put automatically.
1167 * Need to put the subnode resets here though.
1168 */
1169 for (i = 0; i < phy->nsubnodes; i++)
Aswath Govindraju11fcd0e2022-01-28 13:41:35 +05301170 reset_assert_bulk(phy->phys[i]->lnk_rst);
Alan Douglasfda76da2021-07-21 21:28:36 +05301171
Kishon Vijay Abraham I25f8b372022-01-28 13:41:34 +05301172 clk_disable_unprepare(phy->input_clks[PHY_CLK]);
1173
Alan Douglasfda76da2021-07-21 21:28:36 +05301174 return 0;
1175}
1176
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301177/* QSGMII PHY PMA lane configuration */
1178static struct cdns_reg_pairs qsgmii_phy_pma_ln_regs[] = {
1179 {0x9010, SIERRA_PHY_PMA_XCVR_CTRL}
1180};
1181
1182static struct cdns_sierra_vals qsgmii_phy_pma_ln_vals = {
1183 .reg_pairs = qsgmii_phy_pma_ln_regs,
1184 .num_regs = ARRAY_SIZE(qsgmii_phy_pma_ln_regs),
1185};
1186
1187/* QSGMII refclk 100MHz, 20b, opt1, No BW cal, no ssc, PLL LC1 */
1188static const struct cdns_reg_pairs qsgmii_100_no_ssc_plllc1_cmn_regs[] = {
1189 {0x2085, SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG},
1190 {0x0000, SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG},
1191 {0x0000, SIERRA_CMN_PLLLC1_SS_TIME_STEPSIZE_MODE_PREG}
1192};
1193
1194static const struct cdns_reg_pairs qsgmii_100_no_ssc_plllc1_ln_regs[] = {
1195 {0xFC08, SIERRA_DET_STANDEC_A_PREG},
1196 {0x0252, SIERRA_DET_STANDEC_E_PREG},
1197 {0x0004, SIERRA_PSC_LN_IDLE_PREG},
1198 {0x0FFE, SIERRA_PSC_RX_A0_PREG},
1199 {0x0011, SIERRA_PLLCTRL_SUBRATE_PREG},
1200 {0x0001, SIERRA_PLLCTRL_GEN_A_PREG},
1201 {0x5233, SIERRA_PLLCTRL_CPGAIN_MODE_PREG},
1202 {0x0000, SIERRA_DRVCTRL_ATTEN_PREG},
1203 {0x0089, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
1204 {0x3C3C, SIERRA_CREQ_CCLKDET_MODE01_PREG},
1205 {0x3222, SIERRA_CREQ_FSMCLK_SEL_PREG},
1206 {0x0000, SIERRA_CREQ_EQ_CTRL_PREG},
1207 {0x8422, SIERRA_CTLELUT_CTRL_PREG},
1208 {0x4111, SIERRA_DFE_ECMP_RATESEL_PREG},
1209 {0x4111, SIERRA_DFE_SMP_RATESEL_PREG},
1210 {0x0002, SIERRA_DEQ_PHALIGN_CTRL},
1211 {0x9595, SIERRA_DEQ_VGATUNE_CTRL_PREG},
1212 {0x0186, SIERRA_DEQ_GLUT0},
1213 {0x0186, SIERRA_DEQ_GLUT1},
1214 {0x0186, SIERRA_DEQ_GLUT2},
1215 {0x0186, SIERRA_DEQ_GLUT3},
1216 {0x0186, SIERRA_DEQ_GLUT4},
1217 {0x0861, SIERRA_DEQ_ALUT0},
1218 {0x07E0, SIERRA_DEQ_ALUT1},
1219 {0x079E, SIERRA_DEQ_ALUT2},
1220 {0x071D, SIERRA_DEQ_ALUT3},
1221 {0x03F5, SIERRA_DEQ_DFETAP_CTRL_PREG},
1222 {0x0C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG},
1223 {0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1224 {0x1C04, SIERRA_DEQ_TAU_CTRL2_PREG},
1225 {0x0033, SIERRA_DEQ_PICTRL_PREG},
1226 {0x0660, SIERRA_CPICAL_TMRVAL_MODE0_PREG},
1227 {0x00D5, SIERRA_CPI_OUTBUF_RATESEL_PREG},
1228 {0x0B6D, SIERRA_CPI_RESBIAS_BIN_PREG},
1229 {0x0102, SIERRA_RXBUFFER_CTLECTRL_PREG},
1230 {0x0002, SIERRA_RXBUFFER_RCDFECTRL_PREG}
1231};
1232
1233static struct cdns_sierra_vals qsgmii_100_no_ssc_plllc1_cmn_vals = {
1234 .reg_pairs = qsgmii_100_no_ssc_plllc1_cmn_regs,
1235 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_plllc1_cmn_regs),
1236};
1237
1238static struct cdns_sierra_vals qsgmii_100_no_ssc_plllc1_ln_vals = {
1239 .reg_pairs = qsgmii_100_no_ssc_plllc1_ln_regs,
1240 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_plllc1_ln_regs),
1241};
1242
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301243/* PCIE PHY PCS common configuration */
1244static struct cdns_reg_pairs pcie_phy_pcs_cmn_regs[] = {
1245 {0x0430, SIERRA_PHY_PIPE_CMN_CTRL1}
1246};
1247
1248static struct cdns_sierra_vals pcie_phy_pcs_cmn_vals = {
1249 .reg_pairs = pcie_phy_pcs_cmn_regs,
1250 .num_regs = ARRAY_SIZE(pcie_phy_pcs_cmn_regs),
1251};
1252
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301253/* refclk100MHz_32b_PCIe_cmn_pll_no_ssc, pcie_links_using_plllc, pipe_bw_3 */
1254static const struct cdns_reg_pairs pcie_100_no_ssc_plllc_cmn_regs[] = {
1255 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
1256 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
1257 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
1258 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}
1259};
1260
1261/*
1262 * refclk100MHz_32b_PCIe_ln_no_ssc, multilink, using_plllc,
1263 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
1264 */
1265static const struct cdns_reg_pairs ml_pcie_100_no_ssc_ln_regs[] = {
1266 {0xFC08, SIERRA_DET_STANDEC_A_PREG},
1267 {0x001D, SIERRA_PSM_A3IN_TMR_PREG},
1268 {0x0004, SIERRA_PSC_LN_A3_PREG},
1269 {0x0004, SIERRA_PSC_LN_A4_PREG},
1270 {0x0004, SIERRA_PSC_LN_IDLE_PREG},
1271 {0x1555, SIERRA_DFE_BIASTRIM_PREG},
1272 {0x9703, SIERRA_DRVCTRL_BOOST_PREG},
1273 {0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
1274 {0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
1275 {0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
1276 {0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
1277 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
1278 {0x9800, SIERRA_RX_CTLE_CAL_PREG},
1279 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
1280 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
1281 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
1282 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
1283 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
1284 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
1285 {0x0041, SIERRA_DEQ_GLUT0},
1286 {0x0082, SIERRA_DEQ_GLUT1},
1287 {0x00C3, SIERRA_DEQ_GLUT2},
1288 {0x0145, SIERRA_DEQ_GLUT3},
1289 {0x0186, SIERRA_DEQ_GLUT4},
1290 {0x09E7, SIERRA_DEQ_ALUT0},
1291 {0x09A6, SIERRA_DEQ_ALUT1},
1292 {0x0965, SIERRA_DEQ_ALUT2},
1293 {0x08E3, SIERRA_DEQ_ALUT3},
1294 {0x00FA, SIERRA_DEQ_DFETAP0},
1295 {0x00FA, SIERRA_DEQ_DFETAP1},
1296 {0x00FA, SIERRA_DEQ_DFETAP2},
1297 {0x00FA, SIERRA_DEQ_DFETAP3},
1298 {0x00FA, SIERRA_DEQ_DFETAP4},
1299 {0x000F, SIERRA_DEQ_PRECUR_PREG},
1300 {0x0280, SIERRA_DEQ_POSTCUR_PREG},
1301 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
1302 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1303 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
1304 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
1305 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
1306 {0x002B, SIERRA_CPI_TRIM_PREG},
1307 {0x0003, SIERRA_EPI_CTRL_PREG},
1308 {0x803F, SIERRA_SDFILT_H2L_A_PREG},
1309 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
1310 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
1311 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
1312};
1313
1314static struct cdns_sierra_vals pcie_100_no_ssc_plllc_cmn_vals = {
1315 .reg_pairs = pcie_100_no_ssc_plllc_cmn_regs,
1316 .num_regs = ARRAY_SIZE(pcie_100_no_ssc_plllc_cmn_regs),
1317};
1318
1319static struct cdns_sierra_vals ml_pcie_100_no_ssc_ln_vals = {
1320 .reg_pairs = ml_pcie_100_no_ssc_ln_regs,
1321 .num_regs = ARRAY_SIZE(ml_pcie_100_no_ssc_ln_regs),
1322};
1323
1324/* refclk100MHz_32b_PCIe_cmn_pll_int_ssc, pcie_links_using_plllc, pipe_bw_3 */
1325static const struct cdns_reg_pairs pcie_100_int_ssc_plllc_cmn_regs[] = {
1326 {0x000E, SIERRA_CMN_PLLLC_MODE_PREG},
1327 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
1328 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
1329 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
1330 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
1331 {0x0581, SIERRA_CMN_PLLLC_DSMCORR_PREG},
1332 {0x7F80, SIERRA_CMN_PLLLC_SS_PREG},
1333 {0x0041, SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG},
1334 {0x0464, SIERRA_CMN_PLLLC_SSTWOPT_PREG},
1335 {0x0D0D, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG},
1336 {0x0060, SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG}
1337};
1338
1339/*
1340 * refclk100MHz_32b_PCIe_ln_int_ssc, multilink, using_plllc,
1341 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
1342 */
1343static const struct cdns_reg_pairs ml_pcie_100_int_ssc_ln_regs[] = {
1344 {0xFC08, SIERRA_DET_STANDEC_A_PREG},
1345 {0x001D, SIERRA_PSM_A3IN_TMR_PREG},
1346 {0x0004, SIERRA_PSC_LN_A3_PREG},
1347 {0x0004, SIERRA_PSC_LN_A4_PREG},
1348 {0x0004, SIERRA_PSC_LN_IDLE_PREG},
1349 {0x1555, SIERRA_DFE_BIASTRIM_PREG},
1350 {0x9703, SIERRA_DRVCTRL_BOOST_PREG},
1351 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
1352 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
1353 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
1354 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
1355 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
1356 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
1357 {0x9800, SIERRA_RX_CTLE_CAL_PREG},
1358 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
1359 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
1360 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
1361 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
1362 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
1363 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
1364 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
1365 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
1366 {0x0041, SIERRA_DEQ_GLUT0},
1367 {0x0082, SIERRA_DEQ_GLUT1},
1368 {0x00C3, SIERRA_DEQ_GLUT2},
1369 {0x0145, SIERRA_DEQ_GLUT3},
1370 {0x0186, SIERRA_DEQ_GLUT4},
1371 {0x09E7, SIERRA_DEQ_ALUT0},
1372 {0x09A6, SIERRA_DEQ_ALUT1},
1373 {0x0965, SIERRA_DEQ_ALUT2},
1374 {0x08E3, SIERRA_DEQ_ALUT3},
1375 {0x00FA, SIERRA_DEQ_DFETAP0},
1376 {0x00FA, SIERRA_DEQ_DFETAP1},
1377 {0x00FA, SIERRA_DEQ_DFETAP2},
1378 {0x00FA, SIERRA_DEQ_DFETAP3},
1379 {0x00FA, SIERRA_DEQ_DFETAP4},
1380 {0x000F, SIERRA_DEQ_PRECUR_PREG},
1381 {0x0280, SIERRA_DEQ_POSTCUR_PREG},
1382 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
1383 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1384 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
1385 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
1386 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
1387 {0x002B, SIERRA_CPI_TRIM_PREG},
1388 {0x0003, SIERRA_EPI_CTRL_PREG},
1389 {0x803F, SIERRA_SDFILT_H2L_A_PREG},
1390 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
1391 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
1392 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
1393};
1394
1395static struct cdns_sierra_vals pcie_100_int_ssc_plllc_cmn_vals = {
1396 .reg_pairs = pcie_100_int_ssc_plllc_cmn_regs,
1397 .num_regs = ARRAY_SIZE(pcie_100_int_ssc_plllc_cmn_regs),
1398};
1399
1400static struct cdns_sierra_vals ml_pcie_100_int_ssc_ln_vals = {
1401 .reg_pairs = ml_pcie_100_int_ssc_ln_regs,
1402 .num_regs = ARRAY_SIZE(ml_pcie_100_int_ssc_ln_regs),
1403};
1404
1405/* refclk100MHz_32b_PCIe_cmn_pll_ext_ssc, pcie_links_using_plllc, pipe_bw_3 */
1406static const struct cdns_reg_pairs pcie_100_ext_ssc_plllc_cmn_regs[] = {
1407 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
1408 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
1409 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
1410 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
1411 {0x1B1B, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
1412};
1413
1414/*
1415 * refclk100MHz_32b_PCIe_ln_ext_ssc, multilink, using_plllc,
1416 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz
1417 */
1418static const struct cdns_reg_pairs ml_pcie_100_ext_ssc_ln_regs[] = {
1419 {0xFC08, SIERRA_DET_STANDEC_A_PREG},
1420 {0x001D, SIERRA_PSM_A3IN_TMR_PREG},
1421 {0x0004, SIERRA_PSC_LN_A3_PREG},
1422 {0x0004, SIERRA_PSC_LN_A4_PREG},
1423 {0x0004, SIERRA_PSC_LN_IDLE_PREG},
1424 {0x1555, SIERRA_DFE_BIASTRIM_PREG},
1425 {0x9703, SIERRA_DRVCTRL_BOOST_PREG},
1426 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
1427 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
1428 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
1429 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
1430 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
1431 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
1432 {0x9800, SIERRA_RX_CTLE_CAL_PREG},
1433 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
1434 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
1435 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
1436 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
1437 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
1438 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
1439 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
1440 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
1441 {0x0041, SIERRA_DEQ_GLUT0},
1442 {0x0082, SIERRA_DEQ_GLUT1},
1443 {0x00C3, SIERRA_DEQ_GLUT2},
1444 {0x0145, SIERRA_DEQ_GLUT3},
1445 {0x0186, SIERRA_DEQ_GLUT4},
1446 {0x09E7, SIERRA_DEQ_ALUT0},
1447 {0x09A6, SIERRA_DEQ_ALUT1},
1448 {0x0965, SIERRA_DEQ_ALUT2},
1449 {0x08E3, SIERRA_DEQ_ALUT3},
1450 {0x00FA, SIERRA_DEQ_DFETAP0},
1451 {0x00FA, SIERRA_DEQ_DFETAP1},
1452 {0x00FA, SIERRA_DEQ_DFETAP2},
1453 {0x00FA, SIERRA_DEQ_DFETAP3},
1454 {0x00FA, SIERRA_DEQ_DFETAP4},
1455 {0x000F, SIERRA_DEQ_PRECUR_PREG},
1456 {0x0280, SIERRA_DEQ_POSTCUR_PREG},
1457 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
1458 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1459 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
1460 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
1461 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
1462 {0x002B, SIERRA_CPI_TRIM_PREG},
1463 {0x0003, SIERRA_EPI_CTRL_PREG},
1464 {0x803F, SIERRA_SDFILT_H2L_A_PREG},
1465 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
1466 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
1467 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
1468};
1469
1470static struct cdns_sierra_vals pcie_100_ext_ssc_plllc_cmn_vals = {
1471 .reg_pairs = pcie_100_ext_ssc_plllc_cmn_regs,
1472 .num_regs = ARRAY_SIZE(pcie_100_ext_ssc_plllc_cmn_regs),
1473};
1474
1475static struct cdns_sierra_vals ml_pcie_100_ext_ssc_ln_vals = {
1476 .reg_pairs = ml_pcie_100_ext_ssc_ln_regs,
1477 .num_regs = ARRAY_SIZE(ml_pcie_100_ext_ssc_ln_regs),
1478};
1479
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301480/* refclk100MHz_32b_PCIe_cmn_pll_no_ssc */
1481static const struct cdns_reg_pairs cdns_pcie_cmn_regs_no_ssc[] = {
1482 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
1483 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
1484 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
1485 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}
1486};
1487
1488/* refclk100MHz_32b_PCIe_ln_no_ssc */
1489static const struct cdns_reg_pairs cdns_pcie_ln_regs_no_ssc[] = {
1490 {0xFC08, SIERRA_DET_STANDEC_A_PREG},
1491 {0x001D, SIERRA_PSM_A3IN_TMR_PREG},
1492 {0x1555, SIERRA_DFE_BIASTRIM_PREG},
1493 {0x9703, SIERRA_DRVCTRL_BOOST_PREG},
1494 {0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
1495 {0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
1496 {0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
1497 {0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
1498 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
1499 {0x9800, SIERRA_RX_CTLE_CAL_PREG},
1500 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
1501 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
1502 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
1503 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
1504 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
1505 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
1506 {0x0041, SIERRA_DEQ_GLUT0},
1507 {0x0082, SIERRA_DEQ_GLUT1},
1508 {0x00C3, SIERRA_DEQ_GLUT2},
1509 {0x0145, SIERRA_DEQ_GLUT3},
1510 {0x0186, SIERRA_DEQ_GLUT4},
1511 {0x09E7, SIERRA_DEQ_ALUT0},
1512 {0x09A6, SIERRA_DEQ_ALUT1},
1513 {0x0965, SIERRA_DEQ_ALUT2},
1514 {0x08E3, SIERRA_DEQ_ALUT3},
1515 {0x00FA, SIERRA_DEQ_DFETAP0},
1516 {0x00FA, SIERRA_DEQ_DFETAP1},
1517 {0x00FA, SIERRA_DEQ_DFETAP2},
1518 {0x00FA, SIERRA_DEQ_DFETAP3},
1519 {0x00FA, SIERRA_DEQ_DFETAP4},
1520 {0x000F, SIERRA_DEQ_PRECUR_PREG},
1521 {0x0280, SIERRA_DEQ_POSTCUR_PREG},
1522 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
1523 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1524 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
1525 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
1526 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
1527 {0x002B, SIERRA_CPI_TRIM_PREG},
1528 {0x0003, SIERRA_EPI_CTRL_PREG},
1529 {0x803F, SIERRA_SDFILT_H2L_A_PREG},
1530 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
1531 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
1532 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
1533};
1534
1535static struct cdns_sierra_vals pcie_100_no_ssc_cmn_vals = {
1536 .reg_pairs = cdns_pcie_cmn_regs_no_ssc,
1537 .num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_no_ssc),
1538};
1539
1540static struct cdns_sierra_vals pcie_100_no_ssc_ln_vals = {
1541 .reg_pairs = cdns_pcie_ln_regs_no_ssc,
1542 .num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_no_ssc),
1543};
1544
1545/* refclk100MHz_32b_PCIe_cmn_pll_int_ssc */
1546static const struct cdns_reg_pairs cdns_pcie_cmn_regs_int_ssc[] = {
1547 {0x000E, SIERRA_CMN_PLLLC_MODE_PREG},
1548 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
1549 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
1550 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
1551 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
1552 {0x0581, SIERRA_CMN_PLLLC_DSMCORR_PREG},
1553 {0x7F80, SIERRA_CMN_PLLLC_SS_PREG},
1554 {0x0041, SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG},
1555 {0x0464, SIERRA_CMN_PLLLC_SSTWOPT_PREG},
1556 {0x0D0D, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG},
1557 {0x0060, SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG}
1558};
1559
1560/* refclk100MHz_32b_PCIe_ln_int_ssc */
1561static const struct cdns_reg_pairs cdns_pcie_ln_regs_int_ssc[] = {
1562 {0xFC08, SIERRA_DET_STANDEC_A_PREG},
1563 {0x001D, SIERRA_PSM_A3IN_TMR_PREG},
1564 {0x1555, SIERRA_DFE_BIASTRIM_PREG},
1565 {0x9703, SIERRA_DRVCTRL_BOOST_PREG},
1566 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
1567 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
1568 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
1569 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
1570 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
1571 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
1572 {0x9800, SIERRA_RX_CTLE_CAL_PREG},
1573 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
1574 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
1575 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
1576 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
1577 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
1578 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
1579 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
1580 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
1581 {0x0041, SIERRA_DEQ_GLUT0},
1582 {0x0082, SIERRA_DEQ_GLUT1},
1583 {0x00C3, SIERRA_DEQ_GLUT2},
1584 {0x0145, SIERRA_DEQ_GLUT3},
1585 {0x0186, SIERRA_DEQ_GLUT4},
1586 {0x09E7, SIERRA_DEQ_ALUT0},
1587 {0x09A6, SIERRA_DEQ_ALUT1},
1588 {0x0965, SIERRA_DEQ_ALUT2},
1589 {0x08E3, SIERRA_DEQ_ALUT3},
1590 {0x00FA, SIERRA_DEQ_DFETAP0},
1591 {0x00FA, SIERRA_DEQ_DFETAP1},
1592 {0x00FA, SIERRA_DEQ_DFETAP2},
1593 {0x00FA, SIERRA_DEQ_DFETAP3},
1594 {0x00FA, SIERRA_DEQ_DFETAP4},
1595 {0x000F, SIERRA_DEQ_PRECUR_PREG},
1596 {0x0280, SIERRA_DEQ_POSTCUR_PREG},
1597 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
1598 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1599 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
1600 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
1601 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
1602 {0x002B, SIERRA_CPI_TRIM_PREG},
1603 {0x0003, SIERRA_EPI_CTRL_PREG},
1604 {0x803F, SIERRA_SDFILT_H2L_A_PREG},
1605 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
1606 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
1607 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
1608};
1609
1610static struct cdns_sierra_vals pcie_100_int_ssc_cmn_vals = {
1611 .reg_pairs = cdns_pcie_cmn_regs_int_ssc,
1612 .num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_int_ssc),
1613};
1614
1615static struct cdns_sierra_vals pcie_100_int_ssc_ln_vals = {
1616 .reg_pairs = cdns_pcie_ln_regs_int_ssc,
1617 .num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_int_ssc),
1618};
1619
Alan Douglasfda76da2021-07-21 21:28:36 +05301620/* refclk100MHz_32b_PCIe_cmn_pll_ext_ssc */
1621static struct cdns_reg_pairs cdns_pcie_cmn_regs_ext_ssc[] = {
1622 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
1623 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
1624 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
1625 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
1626 {0x1B1B, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
1627};
1628
1629/* refclk100MHz_32b_PCIe_ln_ext_ssc */
1630static struct cdns_reg_pairs cdns_pcie_ln_regs_ext_ssc[] = {
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301631 {0xFC08, SIERRA_DET_STANDEC_A_PREG},
1632 {0x001D, SIERRA_PSM_A3IN_TMR_PREG},
1633 {0x1555, SIERRA_DFE_BIASTRIM_PREG},
1634 {0x9703, SIERRA_DRVCTRL_BOOST_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301635 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
1636 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
1637 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
1638 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
1639 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301640 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG},
1641 {0x9800, SIERRA_RX_CTLE_CAL_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301642 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301643 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
1644 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG},
1645 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
1646 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
1647 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG},
1648 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG},
1649 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG},
1650 {0x0041, SIERRA_DEQ_GLUT0},
1651 {0x0082, SIERRA_DEQ_GLUT1},
1652 {0x00C3, SIERRA_DEQ_GLUT2},
1653 {0x0145, SIERRA_DEQ_GLUT3},
1654 {0x0186, SIERRA_DEQ_GLUT4},
1655 {0x09E7, SIERRA_DEQ_ALUT0},
1656 {0x09A6, SIERRA_DEQ_ALUT1},
1657 {0x0965, SIERRA_DEQ_ALUT2},
1658 {0x08E3, SIERRA_DEQ_ALUT3},
1659 {0x00FA, SIERRA_DEQ_DFETAP0},
1660 {0x00FA, SIERRA_DEQ_DFETAP1},
1661 {0x00FA, SIERRA_DEQ_DFETAP2},
1662 {0x00FA, SIERRA_DEQ_DFETAP3},
1663 {0x00FA, SIERRA_DEQ_DFETAP4},
1664 {0x000F, SIERRA_DEQ_PRECUR_PREG},
1665 {0x0280, SIERRA_DEQ_POSTCUR_PREG},
1666 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG},
1667 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1668 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG},
1669 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG},
1670 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG},
1671 {0x002B, SIERRA_CPI_TRIM_PREG},
1672 {0x0003, SIERRA_EPI_CTRL_PREG},
1673 {0x803F, SIERRA_SDFILT_H2L_A_PREG},
1674 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG},
1675 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG},
1676 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}
Alan Douglasfda76da2021-07-21 21:28:36 +05301677};
1678
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301679static struct cdns_sierra_vals pcie_100_ext_ssc_cmn_vals = {
1680 .reg_pairs = cdns_pcie_cmn_regs_ext_ssc,
1681 .num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_ext_ssc),
1682};
1683
1684static struct cdns_sierra_vals pcie_100_ext_ssc_ln_vals = {
1685 .reg_pairs = cdns_pcie_ln_regs_ext_ssc,
1686 .num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_ext_ssc),
1687};
1688
Alan Douglasfda76da2021-07-21 21:28:36 +05301689/* refclk100MHz_20b_USB_cmn_pll_ext_ssc */
1690static struct cdns_reg_pairs cdns_usb_cmn_regs_ext_ssc[] = {
1691 {0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
1692 {0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
1693 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
1694 {0x0000, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
1695};
1696
1697/* refclk100MHz_20b_USB_ln_ext_ssc */
1698static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
1699 {0xFE0A, SIERRA_DET_STANDEC_A_PREG},
1700 {0x000F, SIERRA_DET_STANDEC_B_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301701 {0x55A5, SIERRA_DET_STANDEC_C_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301702 {0x69ad, SIERRA_DET_STANDEC_D_PREG},
1703 {0x0241, SIERRA_DET_STANDEC_E_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301704 {0x0110, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301705 {0x0014, SIERRA_PSM_A0IN_TMR_PREG},
1706 {0xCF00, SIERRA_PSM_DIAG_PREG},
1707 {0x001F, SIERRA_PSC_TX_A0_PREG},
1708 {0x0007, SIERRA_PSC_TX_A1_PREG},
1709 {0x0003, SIERRA_PSC_TX_A2_PREG},
1710 {0x0003, SIERRA_PSC_TX_A3_PREG},
1711 {0x0FFF, SIERRA_PSC_RX_A0_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301712 {0x0003, SIERRA_PSC_RX_A1_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301713 {0x0003, SIERRA_PSC_RX_A2_PREG},
1714 {0x0001, SIERRA_PSC_RX_A3_PREG},
1715 {0x0001, SIERRA_PLLCTRL_SUBRATE_PREG},
1716 {0x0406, SIERRA_PLLCTRL_GEN_D_PREG},
1717 {0x5233, SIERRA_PLLCTRL_CPGAIN_MODE_PREG},
1718 {0x00CA, SIERRA_CLKPATH_BIASTRIM_PREG},
1719 {0x2512, SIERRA_DFE_BIASTRIM_PREG},
1720 {0x0000, SIERRA_DRVCTRL_ATTEN_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301721 {0x823E, SIERRA_CLKPATHCTRL_TMR_PREG},
1722 {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
1723 {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301724 {0x7B3C, SIERRA_CREQ_CCLKDET_MODE01_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301725 {0x023C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301726 {0x3232, SIERRA_CREQ_FSMCLK_SEL_PREG},
1727 {0x0000, SIERRA_CREQ_EQ_CTRL_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301728 {0x0000, SIERRA_CREQ_SPARE_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301729 {0xCC44, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301730 {0x8452, SIERRA_CTLELUT_CTRL_PREG},
1731 {0x4121, SIERRA_DFE_ECMP_RATESEL_PREG},
1732 {0x4121, SIERRA_DFE_SMP_RATESEL_PREG},
1733 {0x0003, SIERRA_DEQ_PHALIGN_CTRL},
Alan Douglasfda76da2021-07-21 21:28:36 +05301734 {0x3200, SIERRA_DEQ_CONCUR_CTRL1_PREG},
1735 {0x5064, SIERRA_DEQ_CONCUR_CTRL2_PREG},
1736 {0x0030, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
1737 {0x0048, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
1738 {0x5A5A, SIERRA_DEQ_ERRCMP_CTRL_PREG},
1739 {0x02F5, SIERRA_DEQ_OFFSET_CTRL_PREG},
1740 {0x02F5, SIERRA_DEQ_GAIN_CTRL_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301741 {0x9999, SIERRA_DEQ_VGATUNE_CTRL_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301742 {0x0014, SIERRA_DEQ_GLUT0},
1743 {0x0014, SIERRA_DEQ_GLUT1},
1744 {0x0014, SIERRA_DEQ_GLUT2},
1745 {0x0014, SIERRA_DEQ_GLUT3},
1746 {0x0014, SIERRA_DEQ_GLUT4},
1747 {0x0014, SIERRA_DEQ_GLUT5},
1748 {0x0014, SIERRA_DEQ_GLUT6},
1749 {0x0014, SIERRA_DEQ_GLUT7},
1750 {0x0014, SIERRA_DEQ_GLUT8},
1751 {0x0014, SIERRA_DEQ_GLUT9},
1752 {0x0014, SIERRA_DEQ_GLUT10},
1753 {0x0014, SIERRA_DEQ_GLUT11},
1754 {0x0014, SIERRA_DEQ_GLUT12},
1755 {0x0014, SIERRA_DEQ_GLUT13},
1756 {0x0014, SIERRA_DEQ_GLUT14},
1757 {0x0014, SIERRA_DEQ_GLUT15},
1758 {0x0014, SIERRA_DEQ_GLUT16},
1759 {0x0BAE, SIERRA_DEQ_ALUT0},
1760 {0x0AEB, SIERRA_DEQ_ALUT1},
1761 {0x0A28, SIERRA_DEQ_ALUT2},
1762 {0x0965, SIERRA_DEQ_ALUT3},
1763 {0x08A2, SIERRA_DEQ_ALUT4},
1764 {0x07DF, SIERRA_DEQ_ALUT5},
1765 {0x071C, SIERRA_DEQ_ALUT6},
1766 {0x0659, SIERRA_DEQ_ALUT7},
1767 {0x0596, SIERRA_DEQ_ALUT8},
1768 {0x0514, SIERRA_DEQ_ALUT9},
1769 {0x0492, SIERRA_DEQ_ALUT10},
1770 {0x0410, SIERRA_DEQ_ALUT11},
1771 {0x038E, SIERRA_DEQ_ALUT12},
1772 {0x030C, SIERRA_DEQ_ALUT13},
1773 {0x03F4, SIERRA_DEQ_DFETAP_CTRL_PREG},
1774 {0x0001, SIERRA_DFE_EN_1010_IGNORE_PREG},
1775 {0x3C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG},
1776 {0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
1777 {0x1C08, SIERRA_DEQ_TAU_CTRL2_PREG},
1778 {0x0033, SIERRA_DEQ_PICTRL_PREG},
1779 {0x0400, SIERRA_CPICAL_TMRVAL_MODE1_PREG},
1780 {0x0330, SIERRA_CPICAL_TMRVAL_MODE0_PREG},
1781 {0x01FF, SIERRA_CPICAL_PICNT_MODE1_PREG},
1782 {0x0009, SIERRA_CPI_OUTBUF_RATESEL_PREG},
1783 {0x3232, SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG},
1784 {0x0005, SIERRA_LFPSDET_SUPPORT_PREG},
1785 {0x000F, SIERRA_LFPSFILT_NS_PREG},
1786 {0x0009, SIERRA_LFPSFILT_RD_PREG},
1787 {0x0001, SIERRA_LFPSFILT_MP_PREG},
Sanket Parmara3666262022-01-28 13:41:28 +05301788 {0x6013, SIERRA_SIGDET_SUPPORT_PREG},
Alan Douglasfda76da2021-07-21 21:28:36 +05301789 {0x8013, SIERRA_SDFILT_H2L_A_PREG},
1790 {0x8009, SIERRA_SDFILT_L2H_PREG},
1791 {0x0024, SIERRA_RXBUFFER_CTLECTRL_PREG},
1792 {0x0020, SIERRA_RXBUFFER_RCDFECTRL_PREG},
1793 {0x4243, SIERRA_RXBUFFER_DFECTRL_PREG}
1794};
1795
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301796static struct cdns_sierra_vals usb_100_ext_ssc_cmn_vals = {
1797 .reg_pairs = cdns_usb_cmn_regs_ext_ssc,
1798 .num_regs = ARRAY_SIZE(cdns_usb_cmn_regs_ext_ssc),
1799};
1800
1801static struct cdns_sierra_vals usb_100_ext_ssc_ln_vals = {
1802 .reg_pairs = cdns_usb_ln_regs_ext_ssc,
1803 .num_regs = ARRAY_SIZE(cdns_usb_ln_regs_ext_ssc),
1804};
1805
Alan Douglasfda76da2021-07-21 21:28:36 +05301806static const struct cdns_sierra_data cdns_map_sierra = {
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301807 .id_value = SIERRA_MACRO_ID,
1808 .block_offset_shift = 0x2,
1809 .reg_offset_shift = 0x2,
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301810 .pcs_cmn_vals = {
1811 [TYPE_PCIE] = {
1812 [TYPE_NONE] = {
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301813 [NO_SSC] = &pcie_phy_pcs_cmn_vals,
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301814 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301815 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301816 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301817 [TYPE_QSGMII] = {
1818 [NO_SSC] = &pcie_phy_pcs_cmn_vals,
1819 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
1820 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
1821 },
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301822 },
1823 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301824 .pma_cmn_vals = {
1825 [TYPE_PCIE] = {
1826 [TYPE_NONE] = {
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301827 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
1828 [EXTERNAL_SSC] = &pcie_100_ext_ssc_cmn_vals,
1829 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301830 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301831 [TYPE_QSGMII] = {
1832 [NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals,
1833 [EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals,
1834 [INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals,
1835 },
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301836 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301837 [TYPE_USB] = {
1838 [TYPE_NONE] = {
1839 [EXTERNAL_SSC] = &usb_100_ext_ssc_cmn_vals,
1840 },
1841 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301842 [TYPE_QSGMII] = {
1843 [TYPE_PCIE] = {
1844 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
1845 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
1846 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
1847 },
1848 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301849 },
1850 .pma_ln_vals = {
1851 [TYPE_PCIE] = {
1852 [TYPE_NONE] = {
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301853 [NO_SSC] = &pcie_100_no_ssc_ln_vals,
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301854 [EXTERNAL_SSC] = &pcie_100_ext_ssc_ln_vals,
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301855 [INTERNAL_SSC] = &pcie_100_int_ssc_ln_vals,
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301856 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301857 [TYPE_QSGMII] = {
1858 [NO_SSC] = &ml_pcie_100_no_ssc_ln_vals,
1859 [EXTERNAL_SSC] = &ml_pcie_100_ext_ssc_ln_vals,
1860 [INTERNAL_SSC] = &ml_pcie_100_int_ssc_ln_vals,
1861 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301862 },
1863 [TYPE_USB] = {
1864 [TYPE_NONE] = {
1865 [EXTERNAL_SSC] = &usb_100_ext_ssc_ln_vals,
1866 },
1867 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301868 [TYPE_QSGMII] = {
1869 [TYPE_PCIE] = {
1870 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
1871 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
1872 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
1873 },
1874 },
1875
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301876 },
Alan Douglasfda76da2021-07-21 21:28:36 +05301877};
1878
1879static const struct cdns_sierra_data cdns_ti_map_sierra = {
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301880 .id_value = SIERRA_MACRO_ID,
1881 .block_offset_shift = 0x0,
1882 .reg_offset_shift = 0x1,
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301883 .pcs_cmn_vals = {
1884 [TYPE_PCIE] = {
1885 [TYPE_NONE] = {
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301886 [NO_SSC] = &pcie_phy_pcs_cmn_vals,
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301887 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301888 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301889 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301890 [TYPE_QSGMII] = {
1891 [NO_SSC] = &pcie_phy_pcs_cmn_vals,
1892 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
1893 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals,
1894 },
1895 },
1896 },
1897 .phy_pma_ln_vals = {
1898 [TYPE_QSGMII] = {
1899 [TYPE_PCIE] = {
1900 [NO_SSC] = &qsgmii_phy_pma_ln_vals,
1901 [EXTERNAL_SSC] = &qsgmii_phy_pma_ln_vals,
1902 [INTERNAL_SSC] = &qsgmii_phy_pma_ln_vals,
1903 },
Swapnil Jakhadeaa20b302022-01-28 13:41:44 +05301904 },
1905 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301906 .pma_cmn_vals = {
1907 [TYPE_PCIE] = {
1908 [TYPE_NONE] = {
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301909 [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301910 [EXTERNAL_SSC] = &pcie_100_ext_ssc_cmn_vals,
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301911 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301912 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301913 [TYPE_QSGMII] = {
1914 [NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals,
1915 [EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals,
1916 [INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals,
1917 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301918 },
1919 [TYPE_USB] = {
1920 [TYPE_NONE] = {
1921 [EXTERNAL_SSC] = &usb_100_ext_ssc_cmn_vals,
1922 },
1923 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301924 [TYPE_QSGMII] = {
1925 [TYPE_PCIE] = {
1926 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
1927 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
1928 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals,
1929 },
1930 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301931 },
1932 .pma_ln_vals = {
1933 [TYPE_PCIE] = {
1934 [TYPE_NONE] = {
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301935 [NO_SSC] = &pcie_100_no_ssc_ln_vals,
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301936 [EXTERNAL_SSC] = &pcie_100_ext_ssc_ln_vals,
Swapnil Jakhade7b7f88b2022-01-28 13:41:47 +05301937 [INTERNAL_SSC] = &pcie_100_int_ssc_ln_vals,
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301938 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301939 [TYPE_QSGMII] = {
1940 [NO_SSC] = &ml_pcie_100_no_ssc_ln_vals,
1941 [EXTERNAL_SSC] = &ml_pcie_100_ext_ssc_ln_vals,
1942 [INTERNAL_SSC] = &ml_pcie_100_int_ssc_ln_vals,
1943 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301944 },
1945 [TYPE_USB] = {
1946 [TYPE_NONE] = {
1947 [EXTERNAL_SSC] = &usb_100_ext_ssc_ln_vals,
1948 },
1949 },
Swapnil Jakhadee51f3e52022-01-28 13:41:49 +05301950 [TYPE_QSGMII] = {
1951 [TYPE_PCIE] = {
1952 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
1953 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
1954 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals,
1955 },
1956 },
Swapnil Jakhadee42a8472022-01-28 13:41:40 +05301957 },
Alan Douglasfda76da2021-07-21 21:28:36 +05301958};
1959
1960static const struct udevice_id cdns_sierra_id_table[] = {
1961 {
1962 .compatible = "cdns,sierra-phy-t0",
1963 .data = (ulong)&cdns_map_sierra,
1964 },
1965 {
1966 .compatible = "ti,sierra-phy-t0",
1967 .data = (ulong)&cdns_ti_map_sierra,
1968 },
1969 {}
1970};
1971
1972U_BOOT_DRIVER(sierra_phy_provider) = {
1973 .name = "cdns,sierra",
1974 .id = UCLASS_PHY,
1975 .of_match = cdns_sierra_id_table,
1976 .probe = cdns_sierra_phy_probe,
1977 .remove = cdns_sierra_phy_remove,
1978 .ops = &ops,
1979 .priv_auto = sizeof(struct cdns_sierra_phy),
1980};