blob: b8a1f153f2cdff9c21d45a20822bb8edee9992c5 [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
227#define SW_CAL(cal_item, cal_mode_get, pair_mode) \
228 CAL_##pair_mode(cal_item, sw) \
229
230#define SW_EFUSE_CAL(cal_item, cal_mode_get, pair_mode,...) \
231 if (ret || (!ret && strcmp("efuse", cal_mode_get) == 0)) { \
232 CAL_##pair_mode(cal_item, efuse, ##__VA_ARGS__) \
233 } else if (!ret && strcmp("sw", cal_mode_get) == 0) { \
234 CAL_##pair_mode(cal_item, sw) \
235 } else { \
236 dev_info(&phydev->mdio.dev, "%s cal mode %s not supported\n", \
237 #cal_item, \
238 cal_mode_get); \
239 }
240
241#define EFUSE_CAL(cal_item, cal_mode_get, pair_mode, ...) \
242 if ((efs_valid && ret) || \
243 (efs_valid && !ret && strcmp("efuse", cal_mode_get) == 0)) {\
244 CAL_##pair_mode(cal_item, efuse, ##__VA_ARGS__) \
245 } else { \
246 dev_info(&phydev->mdio.dev, "%s uses default value, " \
247 "efs-valid: %s, dts: %s\n", \
248 #cal_item, \
249 efs_valid? "yes" : "no", \
250 ret? "empty" : cal_mode_get); \
251 }
252
253#define CAL_FLOW(cal_item, cal_mode, cal_mode_get, pair_mode,...) \
254 ret = of_property_read_string(phydev->mdio.dev.of_node, \
255 #cal_item, &cal_mode_get); \
256 cal_mode##_CAL(cal_item, cal_mode_get, pair_mode, ##__VA_ARGS__)\
257 if(cal_ret) { \
258 dev_err(&phydev->mdio.dev, "cal_item cal failed\n"); \
259 ret = -EIO; \
260 goto out; \
261 }
262
263static int mtk_gephy_read_page(struct phy_device *phydev)
264{
265 return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
266}
267
268static int mtk_gephy_write_page(struct phy_device *phydev, int page)
269{
270 return __phy_write(phydev, MTK_EXT_PAGE_ACCESS, page);
271}
272
273/*
274 * One calibration cycle consists of:
275 * 1.Set DA_CALIN_FLAG high to start calibration. Keep it high
276 * until AD_CAL_COMP is ready to output calibration result.
277 * 2.Wait until DA_CAL_CLK is available.
278 * 3.Fetch AD_CAL_COMP_OUT.
279 */
280static int cal_cycle(struct phy_device *phydev, int devad,
281 u32 regnum, u16 mask, u16 cal_val)
282{
283 unsigned long timeout;
284 int reg_val;
285 int ret;
286
287 phy_modify_mmd(phydev, devad, regnum,
288 mask, cal_val);
289 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17C,
290 MTK_PHY_DA_CALIN_FLAG);
291
292 timeout = jiffies + usecs_to_jiffies(ANALOG_INTERNAL_OPERATION_MAX_US);
293 do{
294 reg_val = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17B);
295 } while(time_before(jiffies, timeout) && !(reg_val & BIT(0)));
296
297 if(!(reg_val & BIT(0))) {
298 dev_err(&phydev->mdio.dev, "Calibration cycle timeout\n");
299 return -ETIMEDOUT;
300 }
301
302 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17C,
303 MTK_PHY_DA_CALIN_FLAG);
304 ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17A) >>
305 MTK_PHY_AD_CAL_COMP_OUT_SHIFT;
306 dev_dbg(&phydev->mdio.dev, "cal_val: 0x%x, ret: %d\n", cal_val, ret);
307
308 return ret;
309}
310
311static int rext_fill_result(struct phy_device *phydev, u16 *buf)
312{
313 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
314 MTK_PHY_RG_REXT_TRIM_MASK, buf[0] << 8);
315 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG115,
316 MTK_PHY_RG_BG_RASEL_MASK, buf[1]);
317
318 return 0;
319}
320
321static int rext_cal_efuse(struct phy_device *phydev, u32 *buf)
322{
323 u16 rext_cal_val[2];
324
325 rext_cal_val[0] = EFS_RG_REXT_TRIM(buf[3]);
326 rext_cal_val[1] = EFS_RG_BG_RASEL(buf[3]);
327 rext_fill_result(phydev, rext_cal_val);
328
329 return 0;
330}
331
332static int rext_cal_sw(struct phy_device *phydev)
333{
334 u8 rg_zcal_ctrl_def;
335 u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
336 u8 lower_ret, upper_ret;
337 u16 rext_cal_val[2];
338 int ret;
339
340 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
341 MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
342 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
343 MTK_PHY_RG_TXVOS_CALEN);
344 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
345 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN | MTK_PHY_RG_REXT_CALEN);
346 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
347 MTK_PHY_RG_TST_DMY2_MASK, 0x1);
348
349 rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5) &
350 MTK_PHY_RG_ZCAL_CTRL_MASK;
351 zcal_lower = ZCAL_CTRL_MIN;
352 zcal_upper = ZCAL_CTRL_MAX;
353
354 dev_dbg(&phydev->mdio.dev, "Start REXT SW cal.\n");
355 while((zcal_upper-zcal_lower) > 1) {
356 rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower+zcal_upper, 2);
357 ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
358 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
359 if(ret==1)
360 zcal_upper = rg_zcal_ctrl;
361 else if(ret==0)
362 zcal_lower = rg_zcal_ctrl;
363 else
364 goto restore;
365 }
366
367 ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
368 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
369 if(lower_ret < 0)
370 goto restore;
371
372 ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
373 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
374 if(upper_ret < 0)
375 goto restore;
376
377 ret = upper_ret-lower_ret;
378 if (ret == 1) {
379 rext_cal_val[0] = zcal_upper;
380 rext_cal_val[1] = zcal_upper >> 3;
381 rext_fill_result(phydev, rext_cal_val);
382 dev_info(&phydev->mdio.dev, "REXT SW cal result: 0x%x\n", zcal_upper);
383 ret = 0;
384 } else
385 ret = -EINVAL;
386
387restore:
388 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
389 MTK_PHY_ANA_TEST_MODE_MASK);
390 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
391 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN | MTK_PHY_RG_REXT_CALEN);
392 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
393 MTK_PHY_RG_TST_DMY2_MASK);
394 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
395 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
396
397 return ret;
398}
399
400static int tx_offset_fill_result(struct phy_device *phydev, u16 *buf)
401{
402 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG172,
403 MTK_PHY_CR_TX_AMP_OFFSET_A_MASK, buf[0] << 8);
404 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG172,
405 MTK_PHY_CR_TX_AMP_OFFSET_B_MASK, buf[1]);
406 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG173,
407 MTK_PHY_CR_TX_AMP_OFFSET_C_MASK, buf[2] << 8);
408 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG173,
409 MTK_PHY_CR_TX_AMP_OFFSET_D_MASK, buf[3]);
410
411 return 0;
412}
413
414static int tx_offset_cal_efuse(struct phy_device *phydev, u32 *buf)
415{
416 u16 tx_offset_cal_val[4];
417
418 tx_offset_cal_val[0] = EFS_DA_TX_AMP_OFFSET_A(buf[0]);
419 tx_offset_cal_val[1] = EFS_DA_TX_AMP_OFFSET_B(buf[1]);
420 tx_offset_cal_val[2] = EFS_DA_TX_AMP_OFFSET_C(buf[1]);
421 tx_offset_cal_val[3] = EFS_DA_TX_AMP_OFFSET_D(buf[1]);
422
423 tx_offset_fill_result(phydev, tx_offset_cal_val);
424
425 return 0;
426}
427
428static int tx_amp_fill_result(struct phy_device *phydev, u16 *buf)
429{
430 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
431 MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, buf[0] << 10);
432 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
433 MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0]);
434 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
435 MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, buf[0] << 10);
436 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
437 MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0]);
438
439 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
440 MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, buf[1] << 8);
441 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
442 MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1]);
443 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
444 MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, buf[1] << 8);
445 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
446 MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1]);
447
448 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
449 MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, buf[2] << 8);
450 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
451 MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2]);
452 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
453 MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, buf[2] << 8);
454 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
455 MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2]);
456
457 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
458 MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, buf[3] << 8);
459 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
460 MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3]);
461 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
462 MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, buf[3] << 8);
463 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
464 MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3]);
465
466 return 0;
467}
468
469static int tx_amp_cal_efuse(struct phy_device *phydev, u32 *buf)
470{
471 u16 tx_amp_cal_val[4];
472
473 tx_amp_cal_val[0] = EFS_DA_TX_I2MPB_A(buf[0]);
474 tx_amp_cal_val[1] = EFS_DA_TX_I2MPB_B(buf[0]);
475 tx_amp_cal_val[2] = EFS_DA_TX_I2MPB_C(buf[0]);
476 tx_amp_cal_val[3] = EFS_DA_TX_I2MPB_D(buf[0]);
477 tx_amp_fill_result(phydev, tx_amp_cal_val);
478
479 return 0;
480}
481
482static int tx_r50_fill_result(struct phy_device *phydev, u16 *buf,
483 phy_cal_pair_t txg_calen_x)
484{
485 switch(txg_calen_x) {
486 case PAIR_A:
487 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
488 MTK_PHY_DA_TX_R50_A_NORMAL_MASK, buf[0] << 8);
489 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
490 MTK_PHY_DA_TX_R50_A_TBT_MASK, buf[0]);
491 break;
492 case PAIR_B:
493 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
494 MTK_PHY_DA_TX_R50_B_NORMAL_MASK, buf[0] << 8);
495 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
496 MTK_PHY_DA_TX_R50_B_TBT_MASK, buf[0]);
497 break;
498 case PAIR_C:
499 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
500 MTK_PHY_DA_TX_R50_C_NORMAL_MASK, buf[0] << 8);
501 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
502 MTK_PHY_DA_TX_R50_C_TBT_MASK, buf[0]);
503 break;
504 case PAIR_D:
505 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
506 MTK_PHY_DA_TX_R50_D_NORMAL_MASK, buf[0] << 8);
507 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
508 MTK_PHY_DA_TX_R50_D_TBT_MASK, buf[0]);
509 break;
510 }
511 return 0;
512}
513
514static int tx_r50_cal_efuse(struct phy_device *phydev, u32 *buf,
515 phy_cal_pair_t txg_calen_x)
516{
517 u16 tx_r50_cal_val[1];
518
519 switch(txg_calen_x) {
520 case PAIR_A:
521 tx_r50_cal_val[0] = EFS_DA_TX_R50_A(buf[1]);
522 break;
523 case PAIR_B:
524 tx_r50_cal_val[0] = EFS_DA_TX_R50_B(buf[1]);
525 break;
526 case PAIR_C:
527 tx_r50_cal_val[0] = EFS_DA_TX_R50_C(buf[2]);
528 break;
529 case PAIR_D:
530 tx_r50_cal_val[0] = EFS_DA_TX_R50_D(buf[2]);
531 break;
532 }
533 tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
534
535 return 0;
536}
537
538static int tx_r50_cal_sw(struct phy_device *phydev, phy_cal_pair_t txg_calen_x)
539{
540 u8 rg_zcal_ctrl_def;
541 u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
542 u8 lower_ret, upper_ret;
543 u16 tx_r50_cal_val[1];
544 int ret;
545
546 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
547 MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
548 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
549 MTK_PHY_RG_TXVOS_CALEN);
550 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
551 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
552 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
553 BIT(txg_calen_x * 4));
554 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
555 MTK_PHY_RG_TST_DMY2_MASK, 0x1);
556
557 rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5) &
558 MTK_PHY_RG_ZCAL_CTRL_MASK;
559 zcal_lower = ZCAL_CTRL_MIN;
560 zcal_upper = ZCAL_CTRL_MAX;
561
562 dev_dbg(&phydev->mdio.dev, "Start TX-R50 Part%c SW cal.\n", pair[txg_calen_x]);
563 while((zcal_upper-zcal_lower) > 1) {
564 rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower+zcal_upper, 2);
565 ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
566 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
567 if(ret==1)
568 zcal_upper = rg_zcal_ctrl;
569 else if(ret==0)
570 zcal_lower = rg_zcal_ctrl;
571 else
572 goto restore;
573 }
574
575 ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
576 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
577 if(lower_ret < 0)
578 goto restore;
579
580 ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
581 MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
582 if(upper_ret < 0)
583 goto restore;
584
585 ret = upper_ret-lower_ret;
586 if (ret == 1) {
587 tx_r50_cal_val[0] = mt798x_zcal_to_r50[zcal_upper];
588 tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
589 dev_info(&phydev->mdio.dev, "TX-R50 Part%c SW cal result: 0x%x\n",
590 pair[txg_calen_x], zcal_lower);
591 ret = 0;
592 } else
593 ret = -EINVAL;
594
595restore:
596 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
597 MTK_PHY_ANA_TEST_MODE_MASK);
598 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
599 MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
600 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
601 BIT(txg_calen_x * 4));
602 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DEV1F_REG110,
603 MTK_PHY_RG_TST_DMY2_MASK);
604 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
605 MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
606
607 return ret;
608}
609
610static int tx_vcm_cal_sw(struct phy_device *phydev, phy_cal_pair_t rg_txreserve_x)
611{
612 u8 lower_idx, upper_idx, txreserve_val;
613 u8 lower_ret, upper_ret;
614 int ret;
615
616 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
617 MTK_PHY_RG_ANA_CALEN);
618 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
619 MTK_PHY_RG_CAL_CKINV);
620 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
621 MTK_PHY_RG_TXVOS_CALEN);
622
623 switch(rg_txreserve_x) {
624 case PAIR_A:
625 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17D,
626 MTK_PHY_DASN_DAC_IN0_A_MASK);
627 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG181,
628 MTK_PHY_DASN_DAC_IN1_A_MASK);
629 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
630 MTK_PHY_RG_ZCALEN_A);
631 break;
632 case PAIR_B:
633 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17E,
634 MTK_PHY_DASN_DAC_IN0_B_MASK);
635 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG182,
636 MTK_PHY_DASN_DAC_IN1_B_MASK);
637 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
638 MTK_PHY_RG_ZCALEN_B);
639 break;
640 case PAIR_C:
641 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG17F,
642 MTK_PHY_DASN_DAC_IN0_C_MASK);
643 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG183,
644 MTK_PHY_DASN_DAC_IN1_C_MASK);
645 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
646 MTK_PHY_RG_ZCALEN_C);
647 break;
648 case PAIR_D:
649 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG180,
650 MTK_PHY_DASN_DAC_IN0_D_MASK);
651 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG184,
652 MTK_PHY_DASN_DAC_IN1_D_MASK);
653 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
654 MTK_PHY_RG_ZCALEN_D);
655 break;
656 default:
657 ret = -EINVAL;
658 goto restore;
659 }
660
661 lower_idx = TXRESERVE_MIN;
662 upper_idx = TXRESERVE_MAX;
663
664 dev_dbg(&phydev->mdio.dev, "Start TX-VCM SW cal.\n");
665 while((upper_idx-lower_idx) > 1) {
666 txreserve_val = DIV_ROUND_CLOSEST(lower_idx+upper_idx, 2);
667 ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
668 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
669 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
670 txreserve_val << 12 | txreserve_val << 8 |
671 txreserve_val << 4 | txreserve_val);
672 if(ret==1)
673 upper_idx = txreserve_val;
674 else if(ret==0)
675 lower_idx = txreserve_val;
676 else
677 goto restore;
678 }
679
680 /* We calibrate TX-VCM in different logic. Check upper index and then
681 * lower index. If this calibration is valid, apply lower index's result.
682 */
683 ret = lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
684 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
685 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
686 lower_idx << 12 | lower_idx << 8 | lower_idx << 4 | lower_idx);
687 if(lower_ret < 0)
688 goto restore;
689
690 ret = upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
691 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
692 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
693 upper_idx << 12 | upper_idx << 8 | upper_idx << 4 | upper_idx);
694 if(upper_ret < 0)
695 goto restore;
696
697 ret = upper_ret-lower_ret;
698 if (ret == 1) {
699 ret = 0;
700 dev_info(&phydev->mdio.dev, "TX-VCM SW cal result: 0x%x\n", upper_idx);
701 } else if (lower_idx == TXRESERVE_MIN && upper_ret == 1 && lower_ret == 1) {
702 ret = 0;
703 cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
704 MTK_PHY_DA_RX_PSBN_TBT_MASK | MTK_PHY_DA_RX_PSBN_HBT_MASK |
705 MTK_PHY_DA_RX_PSBN_GBE_MASK | MTK_PHY_DA_RX_PSBN_LP_MASK,
706 lower_idx << 12 | lower_idx << 8 | lower_idx << 4 | lower_idx);
707 dev_warn(&phydev->mdio.dev, "TX-VCM SW cal result at low margin 0x%x\n", lower_idx);
708 } else if (upper_idx == TXRESERVE_MAX && upper_ret == 0 && lower_ret == 0) {
709 ret = 0;
710 dev_warn(&phydev->mdio.dev, "TX-VCM SW cal result at high margin 0x%x\n", upper_idx);
711 } else
712 ret = -EINVAL;
713
714restore:
715 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
716 MTK_PHY_RG_ANA_CALEN);
717 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
718 MTK_PHY_RG_TXVOS_CALEN);
719 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
720 MTK_PHY_RG_ZCALEN_A);
721 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
722 MTK_PHY_RG_ZCALEN_B | MTK_PHY_RG_ZCALEN_C | MTK_PHY_RG_ZCALEN_D);
723
724 return ret;
725}
726
727static void mtk_gephy_config_init(struct phy_device *phydev)
728{
729 /* Disable EEE */
730 phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0);
731
732 /* Enable HW auto downshift */
733 phy_modify_paged(phydev, MTK_PHY_PAGE_EXTENDED, 0x14, 0, BIT(4));
734
735 /* Increase SlvDPSready time */
736 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
737 __phy_write(phydev, 0x10, 0xafae);
738 __phy_write(phydev, 0x12, 0x2f);
739 __phy_write(phydev, 0x10, 0x8fae);
740 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
741
742 /* Adjust 100_mse_threshold */
743 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x123, 0xffff);
744
745 /* Disable mcc */
746 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xa6, 0x300);
747}
748
749static int mt7530_phy_config_init(struct phy_device *phydev)
750{
751 mtk_gephy_config_init(phydev);
752
753 /* Increase post_update_timer */
754 phy_write_paged(phydev, MTK_PHY_PAGE_EXTENDED_3, 0x11, 0x4b);
755
756 return 0;
757}
758
759static int mt7531_phy_config_init(struct phy_device *phydev)
760{
761 if (phydev->interface != PHY_INTERFACE_MODE_INTERNAL)
762 return -EINVAL;
763
764 mtk_gephy_config_init(phydev);
765
766 /* PHY link down power saving enable */
767 phy_set_bits(phydev, 0x17, BIT(4));
768 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 0xc6, 0x300);
769
770 /* Set TX Pair delay selection */
771 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404);
772 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404);
773
774 return 0;
775}
776
777static int mt798x_phy_config_init(struct phy_device *phydev)
778{
779 const char *cal_mode_from_dts;
780 int i, ret, cal_ret;
781 u32 *buf;
782 bool efs_valid = true;
783 size_t len;
784 struct nvmem_cell *cell;
785
786 if (phydev->interface != PHY_INTERFACE_MODE_GMII)
787 return -EINVAL;
788
789 cell = nvmem_cell_get(&phydev->mdio.dev, "phy-cal-data");
790 if (IS_ERR(cell)) {
791 if (PTR_ERR(cell) == -EPROBE_DEFER)
792 return PTR_ERR(cell);
793 return 0;
794 }
795
796 buf = (u32 *)nvmem_cell_read(cell, &len);
797 if (IS_ERR(buf))
798 return PTR_ERR(buf);
799 nvmem_cell_put(cell);
800
801 if(!buf[0] && !buf[1] && !buf[2] && !buf[3])
802 efs_valid = false;
803
804 if (len < 4 * sizeof(u32)) {
805 dev_err(&phydev->mdio.dev, "invalid calibration data\n");
806 ret = -EINVAL;
807 goto out;
808 }
809
810 CAL_FLOW(rext, SW_EFUSE, cal_mode_from_dts, NO_PAIR, buf)
811 CAL_FLOW(tx_offset, EFUSE, cal_mode_from_dts, NO_PAIR, buf)
812 CAL_FLOW(tx_amp, EFUSE, cal_mode_from_dts, NO_PAIR, buf)
813 CAL_FLOW(tx_r50, SW_EFUSE, cal_mode_from_dts, PAIR_A_TO_D, buf)
814 CAL_FLOW(tx_vcm, SW, cal_mode_from_dts, PAIR_A_TO_A)
815
816out:
817 kfree(buf);
818 return ret;
819}
820
821static struct phy_driver mtk_gephy_driver[] = {
822#if 0
823 {
824 PHY_ID_MATCH_EXACT(0x03a29412),
825 .name = "MediaTek MT7530 PHY",
826 .config_init = mt7530_phy_config_init,
827 /* Interrupts are handled by the switch, not the PHY
828 * itself.
829 */
830 .config_intr = genphy_no_config_intr,
831 .handle_interrupt = genphy_no_ack_interrupt,
832 .suspend = genphy_suspend,
833 .resume = genphy_resume,
834 .read_page = mtk_gephy_read_page,
835 .write_page = mtk_gephy_write_page,
836 },
837 {
838 PHY_ID_MATCH_EXACT(0x03a29441),
839 .name = "MediaTek MT7531 PHY",
840 .config_init = mt7531_phy_config_init,
841 /* Interrupts are handled by the switch, not the PHY
842 * itself.
843 */
844 .config_intr = genphy_no_config_intr,
845 .handle_interrupt = genphy_no_ack_interrupt,
846 .suspend = genphy_suspend,
847 .resume = genphy_resume,
848 .read_page = mtk_gephy_read_page,
849 .write_page = mtk_gephy_write_page,
850 },
851#endif
852 {
853 PHY_ID_MATCH_EXACT(0x03a29461),
854 .name = "MediaTek MT798x PHY",
855 .config_init = mt798x_phy_config_init,
856 /* Interrupts are handled by the switch, not the PHY
857 * itself.
858 */
859 .config_intr = genphy_no_config_intr,
860 .handle_interrupt = genphy_no_ack_interrupt,
861 .suspend = genphy_suspend,
862 .resume = genphy_resume,
863 .read_page = mtk_gephy_read_page,
864 .write_page = mtk_gephy_write_page,
865 },
866};
867
868module_phy_driver(mtk_gephy_driver);
869
870static struct mdio_device_id __maybe_unused mtk_gephy_tbl[] = {
871 { PHY_ID_MATCH_VENDOR(0x03a29400) },
872 { }
873};
874
875MODULE_DESCRIPTION("MediaTek Gigabit Ethernet PHY driver");
876MODULE_AUTHOR("DENG, Qingfang <dqfext@gmail.com>");
877MODULE_LICENSE("GPL");
878
879MODULE_DEVICE_TABLE(mdio, mtk_gephy_tbl);