blob: be7a1e192c4b29c41de95b4f364ce34824c15fa3 [file] [log] [blame]
developerc50c2352021-12-01 10:45:35 +08001// SPDX-License-Identifier: GPL-2.0+
2#include <linux/bitfield.h>
3#include <linux/module.h>
4#include <linux/nvmem-consumer.h>
5#include <linux/of_platform.h>
6#include <linux/phy.h>
7
8#define ANALOG_INTERNAL_OPERATION_MAX_US (20)
9#define ZCAL_CTRL_MIN (0)
10#define ZCAL_CTRL_MAX (63)
11#define TXRESERVE_MIN (0)
12#define TXRESERVE_MAX (7)
13
14
15#define MTK_EXT_PAGE_ACCESS 0x1f
16#define MTK_PHY_PAGE_STANDARD 0x0000
17#define MTK_PHY_PAGE_EXTENDED 0x0001
18#define MTK_PHY_PAGE_EXTENDED_2 0x0002
19#define MTK_PHY_PAGE_EXTENDED_3 0x0003
20#define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
21#define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5
22
23/* Registers on MDIO_MMD_VEND1 */
24#define MTK_PHY_TXVLD_DA_RG (0x12)
25#define MTK_PHY_DA_TX_I2MPB_A_GBE_MASK GENMASK(15, 10)
26#define MTK_PHY_DA_TX_I2MPB_A_TBT_MASK GENMASK(5, 0)
27
28#define MTK_PHY_TX_I2MPB_TEST_MODE_A2 (0x16)
29#define MTK_PHY_DA_TX_I2MPB_A_HBT_MASK GENMASK(15, 10)
30#define MTK_PHY_DA_TX_I2MPB_A_TST_MASK GENMASK(5, 0)
31
32#define MTK_PHY_TX_I2MPB_TEST_MODE_B1 (0x17)
33#define MTK_PHY_DA_TX_I2MPB_B_GBE_MASK GENMASK(13, 8)
34#define MTK_PHY_DA_TX_I2MPB_B_TBT_MASK GENMASK(5, 0)
35
36#define MTK_PHY_TX_I2MPB_TEST_MODE_B2 (0x18)
37#define MTK_PHY_DA_TX_I2MPB_B_HBT_MASK GENMASK(13, 8)
38#define MTK_PHY_DA_TX_I2MPB_B_TST_MASK GENMASK(5, 0)
39
40#define MTK_PHY_TX_I2MPB_TEST_MODE_C1 (0x19)
41#define MTK_PHY_DA_TX_I2MPB_C_GBE_MASK GENMASK(13, 8)
42#define MTK_PHY_DA_TX_I2MPB_C_TBT_MASK GENMASK(5, 0)
43
44#define MTK_PHY_TX_I2MPB_TEST_MODE_C2 (0x20)
45#define MTK_PHY_DA_TX_I2MPB_C_HBT_MASK GENMASK(13, 8)
46#define MTK_PHY_DA_TX_I2MPB_C_TST_MASK GENMASK(5, 0)
47
48#define MTK_PHY_TX_I2MPB_TEST_MODE_D1 (0x21)
49#define MTK_PHY_DA_TX_I2MPB_D_GBE_MASK GENMASK(13, 8)
50#define MTK_PHY_DA_TX_I2MPB_D_TBT_MASK GENMASK(5, 0)
51
52#define MTK_PHY_TX_I2MPB_TEST_MODE_D2 (0x22)
53#define MTK_PHY_DA_TX_I2MPB_D_HBT_MASK GENMASK(13, 8)
54#define MTK_PHY_DA_TX_I2MPB_D_TST_MASK GENMASK(5, 0)
55
56
57#define MTK_PHY_RESERVE_RG_0 (0x27)
58#define MTK_PHY_RESERVE_RG_1 (0x28)
59
60#define MTK_PHY_RG_ANA_TEST_POWERUP_TX (0x3b)
61#define MTK_PHY_TANA_CAL_MODE (0xc1)
62#define MTK_PHY_TANA_CAL_MODE_SHIFT (8)
63
64#define MTK_PHY_RXADC_CTRL_RG9 (0xc8)
65#define MTK_PHY_DA_RX_PSBN_TBT_MASK GENMASK(14, 12)
66#define MTK_PHY_DA_RX_PSBN_HBT_MASK GENMASK(10, 8)
67#define MTK_PHY_DA_RX_PSBN_GBE_MASK GENMASK(6, 4)
68#define MTK_PHY_DA_RX_PSBN_LP_MASK GENMASK(2, 0)
69
70#define MTK_PHY_RG_ANA_CAL_RG0 (0xdb)
71#define MTK_PHY_RG_CAL_CKINV BIT(12)
72#define MTK_PHY_RG_ANA_CALEN BIT(8)
73#define MTK_PHY_RG_REXT_CALEN BIT(4)
74#define MTK_PHY_RG_ZCALEN_A BIT(0)
75
76#define MTK_PHY_RG_ANA_CAL_RG1 (0xdc)
77#define MTK_PHY_RG_ZCALEN_B BIT(12)
78#define MTK_PHY_RG_ZCALEN_C BIT(8)
79#define MTK_PHY_RG_ZCALEN_D BIT(4)
80#define MTK_PHY_RG_TXVOS_CALEN BIT(0)
81
82#define MTK_PHY_RG_ANA_CAL_RG2 (0xdd)
83#define MTK_PHY_RG_TXG_CALEN_A BIT(12)
84#define MTK_PHY_RG_TXG_CALEN_B BIT(8)
85#define MTK_PHY_RG_TXG_CALEN_C BIT(4)
86#define MTK_PHY_RG_TXG_CALEN_D BIT(0)
87
88#define MTK_PHY_RG_ANA_CAL_RG5 (0xe0)
89#define MTK_PHY_RG_REXT_TRIM_MASK GENMASK(13, 8)
90#define MTK_PHY_RG_ZCAL_CTRL_MASK GENMASK(5, 0)
91
92#define MTK_PHY_RG_DEV1E_REG172 (0x172)
93#define MTK_PHY_CR_TX_AMP_OFFSET_A_MASK GENMASK(13, 8)
94#define MTK_PHY_CR_TX_AMP_OFFSET_B_MASK GENMASK(6, 0)
95
96#define MTK_PHY_RG_DEV1E_REG173 (0x173)
97#define MTK_PHY_CR_TX_AMP_OFFSET_C_MASK GENMASK(13, 8)
98#define MTK_PHY_CR_TX_AMP_OFFSET_D_MASK GENMASK(6, 0)
99
100#define MTK_PHY_RG_DEV1E_REG174 (0x174)
101#define MTK_PHY_RSEL_TX_A_MASK GENMASK(14, 8)
102#define MTK_PHY_RSEL_TX_B_MASK GENMASK(6, 0)
103
104#define MTK_PHY_RG_DEV1E_REG175 (0x175)
105#define MTK_PHY_RSEL_TX_C_MASK GENMASK(14, 8)
106#define MTK_PHY_RSEL_TX_D_MASK GENMASK(6, 0)
107
108#define MTK_PHY_RG_DEV1E_REG17A (0x17a)
109#define MTK_PHY_AD_CAL_COMP_OUT_SHIFT (8)
110
111#define MTK_PHY_RG_DEV1E_REG17B (0x17b)
112#define MTK_PHY_DA_CAL_CLK BIT(0)
113
114#define MTK_PHY_RG_DEV1E_REG17C (0x17c)
115#define MTK_PHY_DA_CALIN_FLAG BIT(0)
116
117#define MTK_PHY_RG_DEV1E_REG17D (0x17d)
118#define MTK_PHY_DASN_DAC_IN0_A_MASK GENMASK(9, 0)
119
120#define MTK_PHY_RG_DEV1E_REG17E (0x17e)
121#define MTK_PHY_DASN_DAC_IN0_B_MASK GENMASK(9, 0)
122
123#define MTK_PHY_RG_DEV1E_REG17F (0x17f)
124#define MTK_PHY_DASN_DAC_IN0_C_MASK GENMASK(9, 0)
125
126#define MTK_PHY_RG_DEV1E_REG180 (0x180)
127#define MTK_PHY_DASN_DAC_IN0_D_MASK GENMASK(9, 0)
128
129#define MTK_PHY_RG_DEV1E_REG181 (0x181)
130#define MTK_PHY_DASN_DAC_IN1_A_MASK GENMASK(9, 0)
131
132#define MTK_PHY_RG_DEV1E_REG182 (0x182)
133#define MTK_PHY_DASN_DAC_IN1_B_MASK GENMASK(9, 0)
134
135#define MTK_PHY_RG_DEV1E_REG183 (0x183)
136#define MTK_PHY_DASN_DAC_IN1_C_MASK GENMASK(9, 0)
137
138#define MTK_PHY_RG_DEV1E_REG184 (0x180)
139#define MTK_PHY_DASN_DAC_IN1_D_MASK GENMASK(9, 0)
140
141#define MTK_PHY_RG_DEV1E_REG53D (0x53d)
142#define MTK_PHY_DA_TX_R50_A_NORMAL_MASK GENMASK(13, 8)
143#define MTK_PHY_DA_TX_R50_A_TBT_MASK GENMASK(5, 0)
144
145#define MTK_PHY_RG_DEV1E_REG53E (0x53e)
146#define MTK_PHY_DA_TX_R50_B_NORMAL_MASK GENMASK(13, 8)
147#define MTK_PHY_DA_TX_R50_B_TBT_MASK GENMASK(5, 0)
148
149#define MTK_PHY_RG_DEV1E_REG53F (0x53f)
150#define MTK_PHY_DA_TX_R50_C_NORMAL_MASK GENMASK(13, 8)
151#define MTK_PHY_DA_TX_R50_C_TBT_MASK GENMASK(5, 0)
152
153#define MTK_PHY_RG_DEV1E_REG540 (0x540)
154#define MTK_PHY_DA_TX_R50_D_NORMAL_MASK GENMASK(13, 8)
155#define MTK_PHY_DA_TX_R50_D_TBT_MASK GENMASK(5, 0)
156
157
158/* Registers on MDIO_MMD_VEND2 */
159#define MTK_PHY_ANA_TEST_BUS_CTRL_RG (0x100)
160#define MTK_PHY_ANA_TEST_MODE_MASK GENMASK(15, 8)
161
162#define MTK_PHY_RG_DEV1F_REG110 (0x110)
163#define MTK_PHY_RG_TST_DMY2_MASK GENMASK(5, 0)
164#define MTK_PHY_RG_TANA_RESERVE_MASK GENMASK(13, 8)
165
166#define MTK_PHY_RG_DEV1F_REG115 (0x115)
167#define MTK_PHY_RG_BG_RASEL_MASK GENMASK(2, 0)
168
169/*
170 * These macro privides efuse parsing for internal phy.
171 */
172#define EFS_DA_TX_I2MPB_A(x) (((x) >> 0) & GENMASK(5, 0))
173#define EFS_DA_TX_I2MPB_B(x) (((x) >> 6) & GENMASK(5, 0))
174#define EFS_DA_TX_I2MPB_C(x) (((x) >> 12) & GENMASK(5, 0))
175#define EFS_DA_TX_I2MPB_D(x) (((x) >> 18) & GENMASK(5, 0))
176#define EFS_DA_TX_AMP_OFFSET_A(x) (((x) >> 24) & GENMASK(5, 0))
177
178#define EFS_DA_TX_AMP_OFFSET_B(x) (((x) >> 0) & GENMASK(5, 0))
179#define EFS_DA_TX_AMP_OFFSET_C(x) (((x) >> 6) & GENMASK(5, 0))
180#define EFS_DA_TX_AMP_OFFSET_D(x) (((x) >> 12) & GENMASK(5, 0))
181#define EFS_DA_TX_R50_A(x) (((x) >> 18) & GENMASK(5, 0))
182#define EFS_DA_TX_R50_B(x) (((x) >> 24) & GENMASK(5, 0))
183
184#define EFS_DA_TX_R50_C(x) (((x) >> 0) & GENMASK(5, 0))
185#define EFS_DA_TX_R50_D(x) (((x) >> 6) & GENMASK(5, 0))
186#define EFS_DA_TX_R50_A_10M(x) (((x) >> 12) & GENMASK(5, 0))
187#define EFS_DA_TX_R50_B_10M(x) (((x) >> 18) & GENMASK(5, 0))
188
189#define EFS_RG_BG_RASEL(x) (((x) >> 4) & GENMASK(2, 0))
190#define EFS_RG_REXT_TRIM(x) (((x) >> 7) & GENMASK(5, 0))
191
192typedef enum {
193 PAIR_A,
194 PAIR_B,
195 PAIR_C,
196 PAIR_D,
197} phy_cal_pair_t;
198
199const u8 mt798x_zcal_to_r50[64] = {
200 7, 8, 9, 9, 10, 10, 11, 11,
201 12, 13, 13, 14, 14, 15, 16, 16,
202 17, 18, 18, 19, 20, 21, 21, 22,
203 23, 24, 24, 25, 26, 27, 28, 29,
204 30, 31, 32, 33, 34, 35, 36, 37,
205 38, 40, 41, 42, 43, 45, 46, 48,
206 49, 51, 52, 54, 55, 57, 59, 61,
207 62, 63, 63, 63, 63, 63, 63, 63
208};
209
210const char pair[4] = {'A', 'B', 'C', 'D'};
211
212#define CAL_NO_PAIR(cal_item, cal_mode, ...) \
213 cal_ret = cal_item##_cal_##cal_mode(phydev, ##__VA_ARGS__);
214
215#define CAL_PAIR_A_TO_A(cal_item, cal_mode, ...) \
216 for(i=PAIR_A; i<=PAIR_A; i++) { \
217 cal_ret = cal_item##_cal_##cal_mode(phydev, ##__VA_ARGS__, i);\
218 if(cal_ret) break; \
219 }
220
221#define CAL_PAIR_A_TO_D(cal_item, cal_mode, ...) \
222 for(i=PAIR_A; i<=PAIR_D; i++) { \
223 cal_ret = cal_item##_cal_##cal_mode(phydev, ##__VA_ARGS__, i);\
224 if(cal_ret) break; \
225 }
226
developerc6e131e2021-12-08 12:36:24 +0800227#define SW_CAL(cal_item, cal_mode_get, pair_mode) \
228 if(ret || (!ret && strcmp("sw", cal_mode_get) == 0)) { \
229 CAL_##pair_mode(cal_item, sw) \
230 }
developerc50c2352021-12-01 10:45:35 +0800231
232#define SW_EFUSE_CAL(cal_item, cal_mode_get, pair_mode,...) \
developerc6e131e2021-12-08 12:36:24 +0800233 if ((efs_valid && ret) || \
234 (!ret && strcmp("efuse", cal_mode_get) == 0)) { \
developerc50c2352021-12-01 10:45:35 +0800235 CAL_##pair_mode(cal_item, efuse, ##__VA_ARGS__) \
developerc6e131e2021-12-08 12:36:24 +0800236 } else if ((!efs_valid && ret) || \
237 (!ret && strcmp("sw", cal_mode_get) == 0)) { \
developerc50c2352021-12-01 10:45:35 +0800238 CAL_##pair_mode(cal_item, sw) \
developerc50c2352021-12-01 10:45:35 +0800239 }
240
241#define EFUSE_CAL(cal_item, cal_mode_get, pair_mode, ...) \
242 if ((efs_valid && ret) || \
developerc6e131e2021-12-08 12:36:24 +0800243 (!ret && strcmp("efuse", cal_mode_get) == 0)) {\
developerc50c2352021-12-01 10:45:35 +0800244 CAL_##pair_mode(cal_item, efuse, ##__VA_ARGS__) \
developerc50c2352021-12-01 10:45:35 +0800245 }
246
247#define CAL_FLOW(cal_item, cal_mode, cal_mode_get, pair_mode,...) \
248 ret = of_property_read_string(phydev->mdio.dev.of_node, \
249 #cal_item, &cal_mode_get); \
250 cal_mode##_CAL(cal_item, cal_mode_get, pair_mode, ##__VA_ARGS__)\
developerc6e131e2021-12-08 12:36:24 +0800251 else { \
252 dev_info(&phydev->mdio.dev, "%s cal mode %s%s," \
253 " use default value," \
254 " efs-valid: %s", \
255 #cal_item, \
256 ret? "" : cal_mode_get, \
257 ret? "not specified" : " not supported", \
258 efs_valid? "yes" : "no"); \
259 } \
developerc50c2352021-12-01 10:45:35 +0800260 if(cal_ret) { \
261 dev_err(&phydev->mdio.dev, "cal_item cal failed\n"); \
262 ret = -EIO; \
263 goto out; \
264 }
265
266static int mtk_gephy_read_page(struct phy_device *phydev)
267{
268 return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
269}
270
271static int mtk_gephy_write_page(struct phy_device *phydev, int page)
272{
273 return __phy_write(phydev, MTK_EXT_PAGE_ACCESS, page);
274}
275
276/*
277 * One calibration cycle consists of:
278 * 1.Set DA_CALIN_FLAG high to start calibration. Keep it high
279 * until AD_CAL_COMP is ready to output calibration result.
280 * 2.Wait until DA_CAL_CLK is available.
281 * 3.Fetch AD_CAL_COMP_OUT.
282 */
283static int cal_cycle(struct phy_device *phydev, int devad,
284 u32 regnum, u16 mask, u16 cal_val)
285{
286 unsigned long timeout;
287 int reg_val;
288 int ret;
289
290 phy_modify_mmd(phydev, devad, regnum,
291 mask, cal_val);
292 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17C,
293 MTK_PHY_DA_CALIN_FLAG);
294
295 timeout = jiffies + usecs_to_jiffies(ANALOG_INTERNAL_OPERATION_MAX_US);
296 do{
297 reg_val = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17B);
298 } while(time_before(jiffies, timeout) && !(reg_val & BIT(0)));
299
300 if(!(reg_val & BIT(0))) {
301 dev_err(&phydev->mdio.dev, "Calibration cycle timeout\n");
302 return -ETIMEDOUT;
303 }
304
305 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17C,
306 MTK_PHY_DA_CALIN_FLAG);
307 ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17A) >>
308 MTK_PHY_AD_CAL_COMP_OUT_SHIFT;
309 dev_dbg(&phydev->mdio.dev, "cal_val: 0x%x, ret: %d\n", cal_val, ret);
310
311 return ret;
312}
313
314static int rext_fill_result(struct phy_device *phydev, u16 *buf)
315{
316 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
317 MTK_PHY_RG_REXT_TRIM_MASK, buf[0] << 8);
318 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG115,
319 MTK_PHY_RG_BG_RASEL_MASK, buf[1]);
320
321 return 0;
322}
323
324static int rext_cal_efuse(struct phy_device *phydev, u32 *buf)
325{
326 u16 rext_cal_val[2];
327
328 rext_cal_val[0] = EFS_RG_REXT_TRIM(buf[3]);
329 rext_cal_val[1] = EFS_RG_BG_RASEL(buf[3]);
330 rext_fill_result(phydev, rext_cal_val);
331
332 return 0;
333}
334
335static int rext_cal_sw(struct phy_device *phydev)
336{
337 u8 rg_zcal_ctrl_def;
338 u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
339 u8 lower_ret, upper_ret;
340 u16 rext_cal_val[2];
341 int ret;
342
343 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
344 MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
345 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
346 MTK_PHY_RG_TXVOS_CALEN);
347 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
348 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN | MTK_PHY_RG_REXT_CALEN);
349 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
350 MTK_PHY_RG_TST_DMY2_MASK, 0x1);
351
352 rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5) &
353 MTK_PHY_RG_ZCAL_CTRL_MASK;
354 zcal_lower = ZCAL_CTRL_MIN;
355 zcal_upper = ZCAL_CTRL_MAX;
356
357 dev_dbg(&phydev->mdio.dev, "Start REXT SW cal.\n");
358 while((zcal_upper-zcal_lower) > 1) {
359 rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower+zcal_upper, 2);
360 ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
361 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
362 if(ret==1)
363 zcal_upper = rg_zcal_ctrl;
364 else if(ret==0)
365 zcal_lower = rg_zcal_ctrl;
366 else
367 goto restore;
368 }
369
370 ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
371 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
372 if(lower_ret < 0)
373 goto restore;
374
375 ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
376 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
377 if(upper_ret < 0)
378 goto restore;
379
380 ret = upper_ret-lower_ret;
381 if (ret == 1) {
382 rext_cal_val[0] = zcal_upper;
383 rext_cal_val[1] = zcal_upper >> 3;
384 rext_fill_result(phydev, rext_cal_val);
385 dev_info(&phydev->mdio.dev, "REXT SW cal result: 0x%x\n", zcal_upper);
386 ret = 0;
387 } else
388 ret = -EINVAL;
389
390restore:
391 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
392 MTK_PHY_ANA_TEST_MODE_MASK);
393 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
394 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN | MTK_PHY_RG_REXT_CALEN);
395 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
396 MTK_PHY_RG_TST_DMY2_MASK);
397 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
398 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
399
400 return ret;
401}
402
403static int tx_offset_fill_result(struct phy_device *phydev, u16 *buf)
404{
405 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG172,
406 MTK_PHY_CR_TX_AMP_OFFSET_A_MASK, buf[0] << 8);
407 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG172,
408 MTK_PHY_CR_TX_AMP_OFFSET_B_MASK, buf[1]);
409 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG173,
410 MTK_PHY_CR_TX_AMP_OFFSET_C_MASK, buf[2] << 8);
411 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG173,
412 MTK_PHY_CR_TX_AMP_OFFSET_D_MASK, buf[3]);
413
414 return 0;
415}
416
417static int tx_offset_cal_efuse(struct phy_device *phydev, u32 *buf)
418{
419 u16 tx_offset_cal_val[4];
420
421 tx_offset_cal_val[0] = EFS_DA_TX_AMP_OFFSET_A(buf[0]);
422 tx_offset_cal_val[1] = EFS_DA_TX_AMP_OFFSET_B(buf[1]);
423 tx_offset_cal_val[2] = EFS_DA_TX_AMP_OFFSET_C(buf[1]);
424 tx_offset_cal_val[3] = EFS_DA_TX_AMP_OFFSET_D(buf[1]);
425
426 tx_offset_fill_result(phydev, tx_offset_cal_val);
427
428 return 0;
429}
430
431static int tx_amp_fill_result(struct phy_device *phydev, u16 *buf)
432{
433 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
434 MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, buf[0] << 10);
435 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
436 MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0]);
437 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
438 MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, buf[0] << 10);
439 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
440 MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0]);
441
442 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
443 MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, buf[1] << 8);
444 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
445 MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1]);
446 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
447 MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, buf[1] << 8);
448 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
449 MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1]);
450
451 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
452 MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, buf[2] << 8);
453 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
454 MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2]);
455 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
456 MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, buf[2] << 8);
457 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
458 MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2]);
459
460 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
461 MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, buf[3] << 8);
462 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
463 MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3]);
464 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
465 MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, buf[3] << 8);
466 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
467 MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3]);
468
469 return 0;
470}
471
472static int tx_amp_cal_efuse(struct phy_device *phydev, u32 *buf)
473{
474 u16 tx_amp_cal_val[4];
475
476 tx_amp_cal_val[0] = EFS_DA_TX_I2MPB_A(buf[0]);
477 tx_amp_cal_val[1] = EFS_DA_TX_I2MPB_B(buf[0]);
478 tx_amp_cal_val[2] = EFS_DA_TX_I2MPB_C(buf[0]);
479 tx_amp_cal_val[3] = EFS_DA_TX_I2MPB_D(buf[0]);
480 tx_amp_fill_result(phydev, tx_amp_cal_val);
481
482 return 0;
483}
484
485static int tx_r50_fill_result(struct phy_device *phydev, u16 *buf,
486 phy_cal_pair_t txg_calen_x)
487{
488 switch(txg_calen_x) {
489 case PAIR_A:
490 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
491 MTK_PHY_DA_TX_R50_A_NORMAL_MASK, buf[0] << 8);
492 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
493 MTK_PHY_DA_TX_R50_A_TBT_MASK, buf[0]);
494 break;
495 case PAIR_B:
496 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
497 MTK_PHY_DA_TX_R50_B_NORMAL_MASK, buf[0] << 8);
498 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
499 MTK_PHY_DA_TX_R50_B_TBT_MASK, buf[0]);
500 break;
501 case PAIR_C:
502 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
503 MTK_PHY_DA_TX_R50_C_NORMAL_MASK, buf[0] << 8);
504 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
505 MTK_PHY_DA_TX_R50_C_TBT_MASK, buf[0]);
506 break;
507 case PAIR_D:
508 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
509 MTK_PHY_DA_TX_R50_D_NORMAL_MASK, buf[0] << 8);
510 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
511 MTK_PHY_DA_TX_R50_D_TBT_MASK, buf[0]);
512 break;
513 }
514 return 0;
515}
516
517static int tx_r50_cal_efuse(struct phy_device *phydev, u32 *buf,
518 phy_cal_pair_t txg_calen_x)
519{
520 u16 tx_r50_cal_val[1];
521
522 switch(txg_calen_x) {
523 case PAIR_A:
524 tx_r50_cal_val[0] = EFS_DA_TX_R50_A(buf[1]);
525 break;
526 case PAIR_B:
527 tx_r50_cal_val[0] = EFS_DA_TX_R50_B(buf[1]);
528 break;
529 case PAIR_C:
530 tx_r50_cal_val[0] = EFS_DA_TX_R50_C(buf[2]);
531 break;
532 case PAIR_D:
533 tx_r50_cal_val[0] = EFS_DA_TX_R50_D(buf[2]);
534 break;
535 }
536 tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
537
538 return 0;
539}
540
541static int tx_r50_cal_sw(struct phy_device *phydev, phy_cal_pair_t txg_calen_x)
542{
543 u8 rg_zcal_ctrl_def;
544 u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
545 u8 lower_ret, upper_ret;
546 u16 tx_r50_cal_val[1];
547 int ret;
548
549 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
550 MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
551 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
552 MTK_PHY_RG_TXVOS_CALEN);
553 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
554 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
555 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
556 BIT(txg_calen_x * 4));
557 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
558 MTK_PHY_RG_TST_DMY2_MASK, 0x1);
559
560 rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5) &
561 MTK_PHY_RG_ZCAL_CTRL_MASK;
562 zcal_lower = ZCAL_CTRL_MIN;
563 zcal_upper = ZCAL_CTRL_MAX;
564
565 dev_dbg(&phydev->mdio.dev, "Start TX-R50 Part%c SW cal.\n", pair[txg_calen_x]);
566 while((zcal_upper-zcal_lower) > 1) {
567 rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower+zcal_upper, 2);
568 ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
569 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
570 if(ret==1)
571 zcal_upper = rg_zcal_ctrl;
572 else if(ret==0)
573 zcal_lower = rg_zcal_ctrl;
574 else
575 goto restore;
576 }
577
578 ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
579 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
580 if(lower_ret < 0)
581 goto restore;
582
583 ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
584 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
585 if(upper_ret < 0)
586 goto restore;
587
588 ret = upper_ret-lower_ret;
589 if (ret == 1) {
590 tx_r50_cal_val[0] = mt798x_zcal_to_r50[zcal_upper];
591 tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
592 dev_info(&phydev->mdio.dev, "TX-R50 Part%c SW cal result: 0x%x\n",
593 pair[txg_calen_x], zcal_lower);
594 ret = 0;
595 } else
596 ret = -EINVAL;
597
598restore:
599 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
600 MTK_PHY_ANA_TEST_MODE_MASK);
601 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
602 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
603 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
604 BIT(txg_calen_x * 4));
605 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
606 MTK_PHY_RG_TST_DMY2_MASK);
607 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
608 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
609
610 return ret;
611}
612
613static int tx_vcm_cal_sw(struct phy_device *phydev, phy_cal_pair_t rg_txreserve_x)
614{
615 u8 lower_idx, upper_idx, txreserve_val;
616 u8 lower_ret, upper_ret;
617 int ret;
618
619 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
620 MTK_PHY_RG_ANA_CALEN);
621 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
622 MTK_PHY_RG_CAL_CKINV);
623 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
624 MTK_PHY_RG_TXVOS_CALEN);
625
626 switch(rg_txreserve_x) {
627 case PAIR_A:
628 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17D,
629 MTK_PHY_DASN_DAC_IN0_A_MASK);
630 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG181,
631 MTK_PHY_DASN_DAC_IN1_A_MASK);
632 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
633 MTK_PHY_RG_ZCALEN_A);
634 break;
635 case PAIR_B:
636 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17E,
637 MTK_PHY_DASN_DAC_IN0_B_MASK);
638 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG182,
639 MTK_PHY_DASN_DAC_IN1_B_MASK);
640 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
641 MTK_PHY_RG_ZCALEN_B);
642 break;
643 case PAIR_C:
644 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17F,
645 MTK_PHY_DASN_DAC_IN0_C_MASK);
646 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG183,
647 MTK_PHY_DASN_DAC_IN1_C_MASK);
648 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
649 MTK_PHY_RG_ZCALEN_C);
650 break;
651 case PAIR_D:
652 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG180,
653 MTK_PHY_DASN_DAC_IN0_D_MASK);
654 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG184,
655 MTK_PHY_DASN_DAC_IN1_D_MASK);
656 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
657 MTK_PHY_RG_ZCALEN_D);
658 break;
659 default:
660 ret = -EINVAL;
661 goto restore;
662 }
663
664 lower_idx = TXRESERVE_MIN;
665 upper_idx = TXRESERVE_MAX;
666
667 dev_dbg(&phydev->mdio.dev, "Start TX-VCM SW cal.\n");
668 while((upper_idx-lower_idx) > 1) {
669 txreserve_val = DIV_ROUND_CLOSEST(lower_idx+upper_idx, 2);
670 ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
671 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
672 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
673 txreserve_val << 12 | txreserve_val << 8 |
674 txreserve_val << 4 | txreserve_val);
675 if(ret==1)
676 upper_idx = txreserve_val;
677 else if(ret==0)
678 lower_idx = txreserve_val;
679 else
680 goto restore;
681 }
682
683 /* We calibrate TX-VCM in different logic. Check upper index and then
684 * lower index. If this calibration is valid, apply lower index's result.
685 */
686 ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
687 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
688 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
689 lower_idx << 12 | lower_idx << 8 | lower_idx << 4 | lower_idx);
690 if(lower_ret < 0)
691 goto restore;
692
693 ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
694 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
695 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
696 upper_idx << 12 | upper_idx << 8 | upper_idx << 4 | upper_idx);
697 if(upper_ret < 0)
698 goto restore;
699
700 ret = upper_ret-lower_ret;
701 if (ret == 1) {
702 ret = 0;
703 dev_info(&phydev->mdio.dev, "TX-VCM SW cal result: 0x%x\n", upper_idx);
704 } else if (lower_idx == TXRESERVE_MIN && upper_ret == 1 && lower_ret == 1) {
705 ret = 0;
706 cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
707 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
708 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
709 lower_idx << 12 | lower_idx << 8 | lower_idx << 4 | lower_idx);
710 dev_warn(&phydev->mdio.dev, "TX-VCM SW cal result at low margin 0x%x\n", lower_idx);
711 } else if (upper_idx == TXRESERVE_MAX && upper_ret == 0 && lower_ret == 0) {
712 ret = 0;
713 dev_warn(&phydev->mdio.dev, "TX-VCM SW cal result at high margin 0x%x\n", upper_idx);
714 } else
715 ret = -EINVAL;
716
717restore:
718 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
719 MTK_PHY_RG_ANA_CALEN);
720 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
721 MTK_PHY_RG_TXVOS_CALEN);
722 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
723 MTK_PHY_RG_ZCALEN_A);
724 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
725 MTK_PHY_RG_ZCALEN_B | MTK_PHY_RG_ZCALEN_C | MTK_PHY_RG_ZCALEN_D);
726
727 return ret;
728}
729
730static void mtk_gephy_config_init(struct phy_device *phydev)
731{
732 /* Disable EEE */
733 phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0);
734
735 /* Enable HW auto downshift */
736 phy_modify_paged(phydev, MTK_PHY_PAGE_EXTENDED, 0x14, 0, BIT(4));
737
738 /* Increase SlvDPSready time */
739 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
740 __phy_write(phydev, 0x10, 0xafae);
741 __phy_write(phydev, 0x12, 0x2f);
742 __phy_write(phydev, 0x10, 0x8fae);
743 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
744
745 /* Adjust 100_mse_threshold */
746 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x123, 0xffff);
747
748 /* Disable mcc */
749 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xa6, 0x300);
750}
751
752static int mt7530_phy_config_init(struct phy_device *phydev)
753{
754 mtk_gephy_config_init(phydev);
755
756 /* Increase post_update_timer */
757 phy_write_paged(phydev, MTK_PHY_PAGE_EXTENDED_3, 0x11, 0x4b);
758
759 return 0;
760}
761
762static int mt7531_phy_config_init(struct phy_device *phydev)
763{
764 if (phydev->interface != PHY_INTERFACE_MODE_INTERNAL)
765 return -EINVAL;
766
767 mtk_gephy_config_init(phydev);
768
769 /* PHY link down power saving enable */
770 phy_set_bits(phydev, 0x17, BIT(4));
771 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 0xc6, 0x300);
772
773 /* Set TX Pair delay selection */
774 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404);
775 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404);
776
777 return 0;
778}
779
780static int mt798x_phy_config_init(struct phy_device *phydev)
781{
782 const char *cal_mode_from_dts;
783 int i, ret, cal_ret;
784 u32 *buf;
785 bool efs_valid = true;
786 size_t len;
787 struct nvmem_cell *cell;
788
789 if (phydev->interface != PHY_INTERFACE_MODE_GMII)
790 return -EINVAL;
791
792 cell = nvmem_cell_get(&phydev->mdio.dev, "phy-cal-data");
793 if (IS_ERR(cell)) {
794 if (PTR_ERR(cell) == -EPROBE_DEFER)
795 return PTR_ERR(cell);
796 return 0;
797 }
798
799 buf = (u32 *)nvmem_cell_read(cell, &len);
800 if (IS_ERR(buf))
801 return PTR_ERR(buf);
802 nvmem_cell_put(cell);
803
804 if(!buf[0] && !buf[1] && !buf[2] && !buf[3])
805 efs_valid = false;
806
807 if (len < 4 * sizeof(u32)) {
808 dev_err(&phydev->mdio.dev, "invalid calibration data\n");
809 ret = -EINVAL;
810 goto out;
811 }
812
813 CAL_FLOW(rext, SW_EFUSE, cal_mode_from_dts, NO_PAIR, buf)
814 CAL_FLOW(tx_offset, EFUSE, cal_mode_from_dts, NO_PAIR, buf)
815 CAL_FLOW(tx_amp, EFUSE, cal_mode_from_dts, NO_PAIR, buf)
816 CAL_FLOW(tx_r50, SW_EFUSE, cal_mode_from_dts, PAIR_A_TO_D, buf)
817 CAL_FLOW(tx_vcm, SW, cal_mode_from_dts, PAIR_A_TO_A)
developer6bd23712021-12-02 18:02:39 +0800818 ret = 0;
developerc50c2352021-12-01 10:45:35 +0800819
820out:
821 kfree(buf);
822 return ret;
823}
824
825static struct phy_driver mtk_gephy_driver[] = {
826#if 0
827 {
828 PHY_ID_MATCH_EXACT(0x03a29412),
829 .name = "MediaTek MT7530 PHY",
830 .config_init = mt7530_phy_config_init,
831 /* Interrupts are handled by the switch, not the PHY
832 * itself.
833 */
834 .config_intr = genphy_no_config_intr,
835 .handle_interrupt = genphy_no_ack_interrupt,
836 .suspend = genphy_suspend,
837 .resume = genphy_resume,
838 .read_page = mtk_gephy_read_page,
839 .write_page = mtk_gephy_write_page,
840 },
841 {
842 PHY_ID_MATCH_EXACT(0x03a29441),
843 .name = "MediaTek MT7531 PHY",
844 .config_init = mt7531_phy_config_init,
845 /* Interrupts are handled by the switch, not the PHY
846 * itself.
847 */
848 .config_intr = genphy_no_config_intr,
849 .handle_interrupt = genphy_no_ack_interrupt,
850 .suspend = genphy_suspend,
851 .resume = genphy_resume,
852 .read_page = mtk_gephy_read_page,
853 .write_page = mtk_gephy_write_page,
854 },
855#endif
856 {
857 PHY_ID_MATCH_EXACT(0x03a29461),
858 .name = "MediaTek MT798x PHY",
859 .config_init = mt798x_phy_config_init,
860 /* Interrupts are handled by the switch, not the PHY
861 * itself.
862 */
863 .config_intr = genphy_no_config_intr,
864 .handle_interrupt = genphy_no_ack_interrupt,
865 .suspend = genphy_suspend,
866 .resume = genphy_resume,
867 .read_page = mtk_gephy_read_page,
868 .write_page = mtk_gephy_write_page,
869 },
870};
871
872module_phy_driver(mtk_gephy_driver);
873
874static struct mdio_device_id __maybe_unused mtk_gephy_tbl[] = {
875 { PHY_ID_MATCH_VENDOR(0x03a29400) },
876 { }
877};
878
879MODULE_DESCRIPTION("MediaTek Gigabit Ethernet PHY driver");
880MODULE_AUTHOR("DENG, Qingfang <dqfext@gmail.com>");
881MODULE_LICENSE("GPL");
882
883MODULE_DEVICE_TABLE(mdio, mtk_gephy_tbl);