blob: b690245b059a4487e53071eda261f63b06a13885 [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>
developer23021292022-10-21 19:10:10 +08005#include <linux/of_address.h>
developerc50c2352021-12-01 10:45:35 +08006#include <linux/of_platform.h>
7#include <linux/phy.h>
8
developer043f7b92023-03-13 13:57:36 +08009#define MTK_GPHY_ID_MT7530 0x03a29412
10#define MTK_GPHY_ID_MT7531 0x03a29441
11#ifdef CONFIG_MEDIATEK_GE_PHY_SOC
12#define MTK_GPHY_ID_MT7981 0x03a29461
13#define MTK_GPHY_ID_MT7988 0x03a29481
14#endif
15
developerc50c2352021-12-01 10:45:35 +080016#define MTK_EXT_PAGE_ACCESS 0x1f
17#define MTK_PHY_PAGE_STANDARD 0x0000
18#define MTK_PHY_PAGE_EXTENDED 0x0001
19#define MTK_PHY_PAGE_EXTENDED_2 0x0002
20#define MTK_PHY_PAGE_EXTENDED_3 0x0003
developer7fbc5262023-03-28 23:44:26 +080021/* Registers on Page 3 */
22#define MTK_PHY_LPI_REG_14 (0x14)
23#define MTK_PHY_LPI_WAKE_TIMER_1000_MASK GENMASK(8, 0)
24
25#define MTK_PHY_LPI_REG_1c (0x1c)
26#define MTK_PHY_SMI_DET_ON_THRESH_MASK GENMASK(13, 8)
27/*******************************/
28
developerc50c2352021-12-01 10:45:35 +080029#define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
30#define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5
31
developer2149cd92023-03-10 19:01:41 +080032#define ANALOG_INTERNAL_OPERATION_MAX_US (20)
33#define ZCAL_CTRL_MIN (0)
34#define ZCAL_CTRL_MAX (63)
35#define TXRESERVE_MIN (0)
36#define TXRESERVE_MAX (7)
37
38#define MTK_PHY_ANARG_RG (0x10)
39#define MTK_PHY_TCLKOFFSET_MASK GENMASK(12, 8)
40
developerc50c2352021-12-01 10:45:35 +080041/* Registers on MDIO_MMD_VEND1 */
developer87c89d12022-08-19 17:46:34 +080042enum {
developerf35532c2022-08-05 18:37:26 +080043 MTK_PHY_MIDDLE_LEVEL_SHAPPER_0TO1 = 0,
44 MTK_PHY_1st_OVERSHOOT_LEVEL_0TO1,
45 MTK_PHY_2nd_OVERSHOOT_LEVEL_0TO1,
46 MTK_PHY_MIDDLE_LEVEL_SHAPPER_1TO0,
47 MTK_PHY_1st_OVERSHOOT_LEVEL_1TO0,
48 MTK_PHY_2nd_OVERSHOOT_LEVEL_1TO0,
49 MTK_PHY_MIDDLE_LEVEL_SHAPPER_0TON1, /* N means negative */
50 MTK_PHY_1st_OVERSHOOT_LEVEL_0TON1,
51 MTK_PHY_2nd_OVERSHOOT_LEVEL_0TON1,
52 MTK_PHY_MIDDLE_LEVEL_SHAPPER_N1TO0,
53 MTK_PHY_1st_OVERSHOOT_LEVEL_N1TO0,
54 MTK_PHY_2nd_OVERSHOOT_LEVEL_N1TO0,
55 MTK_PHY_TX_MLT3_END,
56};
developer02d84422021-12-24 11:48:07 +080057
developer2149cd92023-03-10 19:01:41 +080058#define MTK_PHY_TXVLD_DA_RG (0x12)
developerc50c2352021-12-01 10:45:35 +080059#define MTK_PHY_DA_TX_I2MPB_A_GBE_MASK GENMASK(15, 10)
60#define MTK_PHY_DA_TX_I2MPB_A_TBT_MASK GENMASK(5, 0)
61
developer2149cd92023-03-10 19:01:41 +080062#define MTK_PHY_TX_I2MPB_TEST_MODE_A2 (0x16)
developerc50c2352021-12-01 10:45:35 +080063#define MTK_PHY_DA_TX_I2MPB_A_HBT_MASK GENMASK(15, 10)
64#define MTK_PHY_DA_TX_I2MPB_A_TST_MASK GENMASK(5, 0)
65
developer2149cd92023-03-10 19:01:41 +080066#define MTK_PHY_TX_I2MPB_TEST_MODE_B1 (0x17)
developerc50c2352021-12-01 10:45:35 +080067#define MTK_PHY_DA_TX_I2MPB_B_GBE_MASK GENMASK(13, 8)
68#define MTK_PHY_DA_TX_I2MPB_B_TBT_MASK GENMASK(5, 0)
69
developer2149cd92023-03-10 19:01:41 +080070#define MTK_PHY_TX_I2MPB_TEST_MODE_B2 (0x18)
developerc50c2352021-12-01 10:45:35 +080071#define MTK_PHY_DA_TX_I2MPB_B_HBT_MASK GENMASK(13, 8)
72#define MTK_PHY_DA_TX_I2MPB_B_TST_MASK GENMASK(5, 0)
73
developer2149cd92023-03-10 19:01:41 +080074#define MTK_PHY_TX_I2MPB_TEST_MODE_C1 (0x19)
developerc50c2352021-12-01 10:45:35 +080075#define MTK_PHY_DA_TX_I2MPB_C_GBE_MASK GENMASK(13, 8)
76#define MTK_PHY_DA_TX_I2MPB_C_TBT_MASK GENMASK(5, 0)
77
developer2149cd92023-03-10 19:01:41 +080078#define MTK_PHY_TX_I2MPB_TEST_MODE_C2 (0x20)
developerc50c2352021-12-01 10:45:35 +080079#define MTK_PHY_DA_TX_I2MPB_C_HBT_MASK GENMASK(13, 8)
80#define MTK_PHY_DA_TX_I2MPB_C_TST_MASK GENMASK(5, 0)
81
developer2149cd92023-03-10 19:01:41 +080082#define MTK_PHY_TX_I2MPB_TEST_MODE_D1 (0x21)
developerc50c2352021-12-01 10:45:35 +080083#define MTK_PHY_DA_TX_I2MPB_D_GBE_MASK GENMASK(13, 8)
84#define MTK_PHY_DA_TX_I2MPB_D_TBT_MASK GENMASK(5, 0)
85
developer2149cd92023-03-10 19:01:41 +080086#define MTK_PHY_TX_I2MPB_TEST_MODE_D2 (0x22)
developerc50c2352021-12-01 10:45:35 +080087#define MTK_PHY_DA_TX_I2MPB_D_HBT_MASK GENMASK(13, 8)
88#define MTK_PHY_DA_TX_I2MPB_D_TST_MASK GENMASK(5, 0)
89
developer2149cd92023-03-10 19:01:41 +080090#define MTK_PHY_TANA_CAL_MODE (0xc1)
91#define MTK_PHY_TANA_CAL_MODE_SHIFT (8)
developerc50c2352021-12-01 10:45:35 +080092
developer2149cd92023-03-10 19:01:41 +080093#define MTK_PHY_RXADC_CTRL_RG7 (0xc6)
developer57374032022-10-11 16:43:24 +080094#define MTK_PHY_DA_AD_BUF_BIAS_LP_MASK GENMASK(9, 8)
95
developer2149cd92023-03-10 19:01:41 +080096#define MTK_PHY_RXADC_CTRL_RG9 (0xc8)
97#define MTK_PHY_DA_RX_PSBN_TBT_MASK GENMASK(14, 12)
98#define MTK_PHY_DA_RX_PSBN_HBT_MASK GENMASK(10, 8)
99#define MTK_PHY_DA_RX_PSBN_GBE_MASK GENMASK(6, 4)
100#define MTK_PHY_DA_RX_PSBN_LP_MASK GENMASK(2, 0)
developerc50c2352021-12-01 10:45:35 +0800101
developer2149cd92023-03-10 19:01:41 +0800102#define MTK_PHY_LDO_OUTPUT_V (0xd7)
developerce268312022-12-20 16:26:11 +0800103
developer2149cd92023-03-10 19:01:41 +0800104#define MTK_PHY_RG_ANA_CAL_RG0 (0xdb)
105#define MTK_PHY_RG_CAL_CKINV BIT(12)
106#define MTK_PHY_RG_ANA_CALEN BIT(8)
107#define MTK_PHY_RG_REXT_CALEN BIT(4)
108#define MTK_PHY_RG_ZCALEN_A BIT(0)
developerc50c2352021-12-01 10:45:35 +0800109
developer2149cd92023-03-10 19:01:41 +0800110#define MTK_PHY_RG_ANA_CAL_RG1 (0xdc)
111#define MTK_PHY_RG_ZCALEN_B BIT(12)
112#define MTK_PHY_RG_ZCALEN_C BIT(8)
113#define MTK_PHY_RG_ZCALEN_D BIT(4)
114#define MTK_PHY_RG_TXVOS_CALEN BIT(0)
developerc50c2352021-12-01 10:45:35 +0800115
developer2149cd92023-03-10 19:01:41 +0800116#define MTK_PHY_RG_ANA_CAL_RG2 (0xdd)
117#define MTK_PHY_RG_TXG_CALEN_A BIT(12)
118#define MTK_PHY_RG_TXG_CALEN_B BIT(8)
119#define MTK_PHY_RG_TXG_CALEN_C BIT(4)
120#define MTK_PHY_RG_TXG_CALEN_D BIT(0)
developerc50c2352021-12-01 10:45:35 +0800121
developer2149cd92023-03-10 19:01:41 +0800122#define MTK_PHY_RG_ANA_CAL_RG5 (0xe0)
123#define MTK_PHY_RG_REXT_TRIM_MASK GENMASK(13, 8)
124#define MTK_PHY_RG_ZCAL_CTRL_MASK GENMASK(5, 0)
developerc50c2352021-12-01 10:45:35 +0800125
developer2149cd92023-03-10 19:01:41 +0800126#define MTK_PHY_RG_TX_FILTER (0xfe)
developer6de96aa2022-09-29 16:46:18 +0800127
developer7fbc5262023-03-28 23:44:26 +0800128#define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG120 (0x120)
129#define MTK_PHY_LPI_SIG_EN_LO_THRESH1000_MASK GENMASK(12, 8)
130#define MTK_PHY_LPI_SIG_EN_HI_THRESH1000_MASK GENMASK(4, 0)
131
132#define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG122 (0x122)
133#define MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK GENMASK(7, 0)
134
135#define MTK_PHY_RG_TESTMUX_ADC_CTRL (0x144)
136#define MTK_PHY_RG_TXEN_DIG_MASK GENMASK(5, 5)
137
developer2149cd92023-03-10 19:01:41 +0800138#define MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B (0x172)
developerc50c2352021-12-01 10:45:35 +0800139#define MTK_PHY_CR_TX_AMP_OFFSET_A_MASK GENMASK(13, 8)
140#define MTK_PHY_CR_TX_AMP_OFFSET_B_MASK GENMASK(6, 0)
141
developer2149cd92023-03-10 19:01:41 +0800142#define MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D (0x173)
developerc50c2352021-12-01 10:45:35 +0800143#define MTK_PHY_CR_TX_AMP_OFFSET_C_MASK GENMASK(13, 8)
144#define MTK_PHY_CR_TX_AMP_OFFSET_D_MASK GENMASK(6, 0)
145
developer2149cd92023-03-10 19:01:41 +0800146#define MTK_PHY_RG_AD_CAL_COMP (0x17a)
147#define MTK_PHY_AD_CAL_COMP_OUT_SHIFT (8)
developerc50c2352021-12-01 10:45:35 +0800148
developer2149cd92023-03-10 19:01:41 +0800149#define MTK_PHY_RG_AD_CAL_CLK (0x17b)
150#define MTK_PHY_DA_CAL_CLK BIT(0)
developerc50c2352021-12-01 10:45:35 +0800151
developer2149cd92023-03-10 19:01:41 +0800152#define MTK_PHY_RG_AD_CALIN (0x17c)
153#define MTK_PHY_DA_CALIN_FLAG BIT(0)
developerc50c2352021-12-01 10:45:35 +0800154
developer2149cd92023-03-10 19:01:41 +0800155#define MTK_PHY_RG_DASN_DAC_IN0_A (0x17d)
156#define MTK_PHY_DASN_DAC_IN0_A_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800157
developer2149cd92023-03-10 19:01:41 +0800158#define MTK_PHY_RG_DASN_DAC_IN0_B (0x17e)
159#define MTK_PHY_DASN_DAC_IN0_B_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800160
developer2149cd92023-03-10 19:01:41 +0800161#define MTK_PHY_RG_DASN_DAC_IN0_C (0x17f)
162#define MTK_PHY_DASN_DAC_IN0_C_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800163
developer2149cd92023-03-10 19:01:41 +0800164#define MTK_PHY_RG_DASN_DAC_IN0_D (0x180)
165#define MTK_PHY_DASN_DAC_IN0_D_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800166
developer2149cd92023-03-10 19:01:41 +0800167#define MTK_PHY_RG_DASN_DAC_IN1_A (0x181)
168#define MTK_PHY_DASN_DAC_IN1_A_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800169
developer2149cd92023-03-10 19:01:41 +0800170#define MTK_PHY_RG_DASN_DAC_IN1_B (0x182)
171#define MTK_PHY_DASN_DAC_IN1_B_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800172
developer2149cd92023-03-10 19:01:41 +0800173#define MTK_PHY_RG_DASN_DAC_IN1_C (0x183)
174#define MTK_PHY_DASN_DAC_IN1_C_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800175
developer7fbc5262023-03-28 23:44:26 +0800176#define MTK_PHY_RG_DASN_DAC_IN1_D (0x184)
developer2149cd92023-03-10 19:01:41 +0800177#define MTK_PHY_DASN_DAC_IN1_D_MASK GENMASK(9, 0)
developerc50c2352021-12-01 10:45:35 +0800178
developer7fbc5262023-03-28 23:44:26 +0800179#define MTK_PHY_RG_DEV1E_REG19b (0x19b)
180#define MTK_PHY_BYPASS_DSP_LPI_READY BIT(8)
181
developer2149cd92023-03-10 19:01:41 +0800182#define MTK_PHY_RG_LP_IIR2_K1_L (0x22a)
183#define MTK_PHY_RG_LP_IIR2_K1_U (0x22b)
184#define MTK_PHY_RG_LP_IIR2_K2_L (0x22c)
185#define MTK_PHY_RG_LP_IIR2_K2_U (0x22d)
186#define MTK_PHY_RG_LP_IIR2_K3_L (0x22e)
187#define MTK_PHY_RG_LP_IIR2_K3_U (0x22f)
188#define MTK_PHY_RG_LP_IIR2_K4_L (0x230)
189#define MTK_PHY_RG_LP_IIR2_K4_U (0x231)
190#define MTK_PHY_RG_LP_IIR2_K5_L (0x232)
191#define MTK_PHY_RG_LP_IIR2_K5_U (0x233)
developer75819992023-03-08 20:49:03 +0800192
developer2149cd92023-03-10 19:01:41 +0800193#define MTK_PHY_RG_DEV1E_REG234 (0x234)
194#define MTK_PHY_TR_OPEN_LOOP_EN_MASK GENMASK(0, 0)
195#define MTK_PHY_LPF_X_AVERAGE_MASK GENMASK(7, 4)
developer7fbc5262023-03-28 23:44:26 +0800196#define MTK_PHY_TR_LP_IIR_EEE_EN BIT(12)
developerd2ec38e2022-11-27 01:15:29 +0800197
developer2149cd92023-03-10 19:01:41 +0800198#define MTK_PHY_RG_LPF_CNT_VAL (0x235)
developerd2ec38e2022-11-27 01:15:29 +0800199
developer7fbc5262023-03-28 23:44:26 +0800200#define MTK_PHY_RG_DEV1E_REG238 (0x238)
201#define MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK GENMASK(8, 0)
202#define MTK_PHY_LPI_SLV_SEND_TX_EN BIT(12)
203
204#define MTK_PHY_RG_DEV1E_REG239 (0x239)
205#define MTK_PHY_LPI_SEND_LOC_TIMER_MASK GENMASK(8, 0)
206#define MTK_PHY_LPI_TXPCS_LOC_RCV BIT(12)
207
developer2149cd92023-03-10 19:01:41 +0800208#define MTK_PHY_RG_DEV1E_REG27C (0x27c)
developerd2ec38e2022-11-27 01:15:29 +0800209#define MTK_PHY_VGASTATE_FFE_THR_ST1_MASK GENMASK(12, 8)
developer2149cd92023-03-10 19:01:41 +0800210#define MTK_PHY_RG_DEV1E_REG27D (0x27d)
developerd2ec38e2022-11-27 01:15:29 +0800211#define MTK_PHY_VGASTATE_FFE_THR_ST2_MASK GENMASK(4, 0)
developer68f6e102022-11-22 17:35:00 +0800212
developer7fbc5262023-03-28 23:44:26 +0800213#define MTK_PHY_RG_DEV1E_REG2C7 (0x2c7)
214#define MTK_PHY_MAX_GAIN_MASK GENMASK(4, 0)
215#define MTK_PHY_MIN_GAIN_MASK GENMASK(12, 8)
216
217#define MTK_PHY_RG_DEV1E_REG2D1 (0x2d1)
218#define MTK_PHY_VCO_SLICER_THRESH_BITS_HIGH_EEE_MASK GENMASK(7, 0)
219#define MTK_PHY_LPI_SKIP_SD_SLV_TR BIT(8)
220#define MTK_PHY_LPI_TR_READY BIT(9)
221#define MTK_PHY_LPI_VCO_EEE_STG0_EN BIT(10)
222
223#define MTK_PHY_RG_DEV1E_REG323 (0x323)
224#define MTK_PHY_EEE_WAKE_MAS_INT_DC BIT(0)
225#define MTK_PHY_EEE_WAKE_SLV_INT_DC BIT(4)
226
227#define MTK_PHY_RG_DEV1E_REG324 (0x324)
228#define MTK_PHY_SMI_DETCNT_MAX_MASK GENMASK(5, 0)
229#define MTK_PHY_SMI_DET_MAX_EN BIT(8)
230
231#define MTK_PHY_RG_DEV1E_REG326 (0x326)
232#define MTK_PHY_LPI_MODE_SD_ON BIT(0)
233#define MTK_PHY_RESET_RANDUPD_CNT BIT(1)
234#define MTK_PHY_TREC_UPDATE_ENAB_CLR BIT(2)
235#define MTK_PHY_LPI_QUIT_WAIT_DFE_SIG_DET_OFF BIT(4)
236#define MTK_PHY_TR_READY_SKIP_AFE_WAKEUP BIT(5)
237
developer2149cd92023-03-10 19:01:41 +0800238#define MTK_PHY_LDO_PUMP_EN_PAIRAB (0x502)
239#define MTK_PHY_LDO_PUMP_EN_PAIRCD (0x503)
developer75819992023-03-08 20:49:03 +0800240
developer2149cd92023-03-10 19:01:41 +0800241#define MTK_PHY_DA_TX_R50_PAIR_A (0x53d)
242#define MTK_PHY_DA_TX_R50_PAIR_B (0x53e)
243#define MTK_PHY_DA_TX_R50_PAIR_C (0x53f)
244#define MTK_PHY_DA_TX_R50_PAIR_D (0x540)
developerc50c2352021-12-01 10:45:35 +0800245
246/* Registers on MDIO_MMD_VEND2 */
developer2149cd92023-03-10 19:01:41 +0800247#define MTK_PHY_LED0_ON_CTRL (0x24)
developer23021292022-10-21 19:10:10 +0800248#define MTK_PHY_LED0_ON_MASK GENMASK(6, 0)
developer2149cd92023-03-10 19:01:41 +0800249#define MTK_PHY_LED0_ON_LINK1000 BIT(0)
250#define MTK_PHY_LED0_ON_LINK100 BIT(1)
251#define MTK_PHY_LED0_ON_LINK10 BIT(2)
252#define MTK_PHY_LED0_ON_LINKDOWN BIT(3)
253#define MTK_PHY_LED0_ON_FDX BIT(4) /* Full duplex */
254#define MTK_PHY_LED0_ON_HDX BIT(5) /* Half duplex */
255#define MTK_PHY_LED0_FORCE_ON BIT(6)
256#define MTK_PHY_LED0_POLARITY BIT(14)
257#define MTK_PHY_LED0_ENABLE BIT(15)
developer23021292022-10-21 19:10:10 +0800258
developer2149cd92023-03-10 19:01:41 +0800259#define MTK_PHY_LED0_BLINK_CTRL (0x25)
260#define MTK_PHY_LED0_1000TX BIT(0)
261#define MTK_PHY_LED0_1000RX BIT(1)
262#define MTK_PHY_LED0_100TX BIT(2)
263#define MTK_PHY_LED0_100RX BIT(3)
264#define MTK_PHY_LED0_10TX BIT(4)
265#define MTK_PHY_LED0_10RX BIT(5)
266#define MTK_PHY_LED0_COLLISION BIT(6)
267#define MTK_PHY_LED0_RX_CRC_ERR BIT(7)
268#define MTK_PHY_LED0_RX_IDLE_ERR BIT(8)
269#define MTK_PHY_LED0_FORCE_BLINK BIT(9)
developer8bc5dca2022-10-24 17:15:12 +0800270
developer2149cd92023-03-10 19:01:41 +0800271#define MTK_PHY_ANA_TEST_BUS_CTRL_RG (0x100)
developerc50c2352021-12-01 10:45:35 +0800272#define MTK_PHY_ANA_TEST_MODE_MASK GENMASK(15, 8)
273
developer2149cd92023-03-10 19:01:41 +0800274#define MTK_PHY_RG_DASN_TXT_DMY2 (0x110)
275#define MTK_PHY_TST_DMY2_MASK GENMASK(5, 0)
developerc50c2352021-12-01 10:45:35 +0800276
developer2149cd92023-03-10 19:01:41 +0800277#define MTK_PHY_RG_BG_RASEL (0x115)
278#define MTK_PHY_RG_BG_RASEL_MASK GENMASK(2, 0)
developerc50c2352021-12-01 10:45:35 +0800279
developer2149cd92023-03-10 19:01:41 +0800280/* These macro privides efuse parsing for internal phy. */
281#define EFS_DA_TX_I2MPB_A(x) (((x) >> 0) & GENMASK(5, 0))
282#define EFS_DA_TX_I2MPB_B(x) (((x) >> 6) & GENMASK(5, 0))
283#define EFS_DA_TX_I2MPB_C(x) (((x) >> 12) & GENMASK(5, 0))
284#define EFS_DA_TX_I2MPB_D(x) (((x) >> 18) & GENMASK(5, 0))
285#define EFS_DA_TX_AMP_OFFSET_A(x) (((x) >> 24) & GENMASK(5, 0))
developerc50c2352021-12-01 10:45:35 +0800286
developer2149cd92023-03-10 19:01:41 +0800287#define EFS_DA_TX_AMP_OFFSET_B(x) (((x) >> 0) & GENMASK(5, 0))
288#define EFS_DA_TX_AMP_OFFSET_C(x) (((x) >> 6) & GENMASK(5, 0))
289#define EFS_DA_TX_AMP_OFFSET_D(x) (((x) >> 12) & GENMASK(5, 0))
290#define EFS_DA_TX_R50_A(x) (((x) >> 18) & GENMASK(5, 0))
291#define EFS_DA_TX_R50_B(x) (((x) >> 24) & GENMASK(5, 0))
developerc50c2352021-12-01 10:45:35 +0800292
developer2149cd92023-03-10 19:01:41 +0800293#define EFS_DA_TX_R50_C(x) (((x) >> 0) & GENMASK(5, 0))
294#define EFS_DA_TX_R50_D(x) (((x) >> 6) & GENMASK(5, 0))
295#define EFS_DA_TX_R50_A_10M(x) (((x) >> 12) & GENMASK(5, 0))
296#define EFS_DA_TX_R50_B_10M(x) (((x) >> 18) & GENMASK(5, 0))
developerc50c2352021-12-01 10:45:35 +0800297
developer2149cd92023-03-10 19:01:41 +0800298#define EFS_RG_BG_RASEL(x) (((x) >> 4) & GENMASK(2, 0))
299#define EFS_RG_REXT_TRIM(x) (((x) >> 7) & GENMASK(5, 0))
developerc50c2352021-12-01 10:45:35 +0800300
developer2149cd92023-03-10 19:01:41 +0800301enum {
302 NO_PAIR,
developerc50c2352021-12-01 10:45:35 +0800303 PAIR_A,
304 PAIR_B,
305 PAIR_C,
306 PAIR_D,
developer2149cd92023-03-10 19:01:41 +0800307};
developerc50c2352021-12-01 10:45:35 +0800308
developer23021292022-10-21 19:10:10 +0800309enum {
310 GPHY_PORT0,
311 GPHY_PORT1,
312 GPHY_PORT2,
313 GPHY_PORT3,
314};
315
developer2149cd92023-03-10 19:01:41 +0800316enum calibration_mode {
317 EFUSE_K,
318 SW_K
319};
320
321enum CAL_ITEM {
322 REXT,
323 TX_OFFSET,
324 TX_AMP,
325 TX_R50,
326 TX_VCM
327};
328
329enum CAL_MODE {
developer2149cd92023-03-10 19:01:41 +0800330 EFUSE_M,
331 SW_M
332};
333
developerc50c2352021-12-01 10:45:35 +0800334const u8 mt798x_zcal_to_r50[64] = {
335 7, 8, 9, 9, 10, 10, 11, 11,
336 12, 13, 13, 14, 14, 15, 16, 16,
337 17, 18, 18, 19, 20, 21, 21, 22,
338 23, 24, 24, 25, 26, 27, 28, 29,
339 30, 31, 32, 33, 34, 35, 36, 37,
340 38, 40, 41, 42, 43, 45, 46, 48,
341 49, 51, 52, 54, 55, 57, 59, 61,
342 62, 63, 63, 63, 63, 63, 63, 63
343};
344
345const char pair[4] = {'A', 'B', 'C', 'D'};
346
developer2149cd92023-03-10 19:01:41 +0800347static int mtk_gephy_read_page(struct phy_device *phydev)
348{
349 return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
350}
developerc50c2352021-12-01 10:45:35 +0800351
developer2149cd92023-03-10 19:01:41 +0800352static int mtk_gephy_write_page(struct phy_device *phydev, int page)
353{
354 return __phy_write(phydev, MTK_EXT_PAGE_ACCESS, page);
355}
developerc50c2352021-12-01 10:45:35 +0800356
developer2149cd92023-03-10 19:01:41 +0800357static void mtk_gephy_config_init(struct phy_device *phydev)
358{
359 /* Disable EEE */
360 phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0);
developerc50c2352021-12-01 10:45:35 +0800361
developer2149cd92023-03-10 19:01:41 +0800362 /* Enable HW auto downshift */
363 phy_modify_paged(phydev, MTK_PHY_PAGE_EXTENDED, 0x14, 0, BIT(4));
developerc50c2352021-12-01 10:45:35 +0800364
developer2149cd92023-03-10 19:01:41 +0800365 /* Increase SlvDPSready time */
366 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
367 __phy_write(phydev, 0x10, 0xafae);
368 __phy_write(phydev, 0x12, 0x2f);
369 __phy_write(phydev, 0x10, 0x8fae);
370 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
developerc50c2352021-12-01 10:45:35 +0800371
developer2149cd92023-03-10 19:01:41 +0800372 /* Adjust 100_mse_threshold */
373 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x123, 0xffff);
developerc50c2352021-12-01 10:45:35 +0800374
developer2149cd92023-03-10 19:01:41 +0800375 /* Disable mcc */
376 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0xa6, 0x300);
377}
developerc50c2352021-12-01 10:45:35 +0800378
developer2149cd92023-03-10 19:01:41 +0800379static int mt7530_phy_config_init(struct phy_device *phydev)
developerc50c2352021-12-01 10:45:35 +0800380{
developer2149cd92023-03-10 19:01:41 +0800381 mtk_gephy_config_init(phydev);
382
383 /* Increase post_update_timer */
384 phy_write_paged(phydev, MTK_PHY_PAGE_EXTENDED_3, 0x11, 0x4b);
385
386 return 0;
developerc50c2352021-12-01 10:45:35 +0800387}
388
developer2149cd92023-03-10 19:01:41 +0800389static int mt7531_phy_config_init(struct phy_device *phydev)
developerc50c2352021-12-01 10:45:35 +0800390{
developer2149cd92023-03-10 19:01:41 +0800391 mtk_gephy_config_init(phydev);
392
393 /* PHY link down power saving enable */
394 phy_set_bits(phydev, 0x17, BIT(4));
395 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 0xc6, 0x300);
396
397 /* Set TX Pair delay selection */
398 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404);
399 phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404);
400
401 return 0;
developerc50c2352021-12-01 10:45:35 +0800402}
403
developer2149cd92023-03-10 19:01:41 +0800404#ifdef CONFIG_MEDIATEK_GE_PHY_SOC
405/* One calibration cycle consists of:
developerc50c2352021-12-01 10:45:35 +0800406 * 1.Set DA_CALIN_FLAG high to start calibration. Keep it high
407 * until AD_CAL_COMP is ready to output calibration result.
408 * 2.Wait until DA_CAL_CLK is available.
409 * 3.Fetch AD_CAL_COMP_OUT.
410 */
411static int cal_cycle(struct phy_device *phydev, int devad,
developer2149cd92023-03-10 19:01:41 +0800412 u32 regnum, u16 mask, u16 cal_val)
developerc50c2352021-12-01 10:45:35 +0800413{
414 unsigned long timeout;
415 int reg_val;
416 int ret;
417
418 phy_modify_mmd(phydev, devad, regnum,
developer2149cd92023-03-10 19:01:41 +0800419 mask, cal_val);
420 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CALIN,
421 MTK_PHY_DA_CALIN_FLAG);
developerc50c2352021-12-01 10:45:35 +0800422
423 timeout = jiffies + usecs_to_jiffies(ANALOG_INTERNAL_OPERATION_MAX_US);
developer2149cd92023-03-10 19:01:41 +0800424 do {
425 reg_val = phy_read_mmd(phydev, MDIO_MMD_VEND1,
426 MTK_PHY_RG_AD_CAL_CLK);
427 } while (time_before(jiffies, timeout) && !(reg_val & BIT(0)));
developerc50c2352021-12-01 10:45:35 +0800428
developer2149cd92023-03-10 19:01:41 +0800429 if (!(reg_val & BIT(0))) {
developerc50c2352021-12-01 10:45:35 +0800430 dev_err(&phydev->mdio.dev, "Calibration cycle timeout\n");
431 return -ETIMEDOUT;
432 }
433
developer2149cd92023-03-10 19:01:41 +0800434 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CALIN,
435 MTK_PHY_DA_CALIN_FLAG);
436 ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CAL_COMP) >>
437 MTK_PHY_AD_CAL_COMP_OUT_SHIFT;
developerc50c2352021-12-01 10:45:35 +0800438 dev_dbg(&phydev->mdio.dev, "cal_val: 0x%x, ret: %d\n", cal_val, ret);
439
440 return ret;
441}
442
443static int rext_fill_result(struct phy_device *phydev, u16 *buf)
444{
445 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
developer2149cd92023-03-10 19:01:41 +0800446 MTK_PHY_RG_REXT_TRIM_MASK, buf[0] << 8);
447 phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_BG_RASEL,
448 MTK_PHY_RG_BG_RASEL_MASK, buf[1]);
developerc50c2352021-12-01 10:45:35 +0800449
450 return 0;
451}
452
453static int rext_cal_efuse(struct phy_device *phydev, u32 *buf)
454{
455 u16 rext_cal_val[2];
456
457 rext_cal_val[0] = EFS_RG_REXT_TRIM(buf[3]);
458 rext_cal_val[1] = EFS_RG_BG_RASEL(buf[3]);
459 rext_fill_result(phydev, rext_cal_val);
460
461 return 0;
462}
463
developerc50c2352021-12-01 10:45:35 +0800464static int tx_offset_fill_result(struct phy_device *phydev, u16 *buf)
465{
developer2149cd92023-03-10 19:01:41 +0800466 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B,
developerc50c2352021-12-01 10:45:35 +0800467 MTK_PHY_CR_TX_AMP_OFFSET_A_MASK, buf[0] << 8);
developer2149cd92023-03-10 19:01:41 +0800468 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B,
developerc50c2352021-12-01 10:45:35 +0800469 MTK_PHY_CR_TX_AMP_OFFSET_B_MASK, buf[1]);
developer2149cd92023-03-10 19:01:41 +0800470 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D,
developerc50c2352021-12-01 10:45:35 +0800471 MTK_PHY_CR_TX_AMP_OFFSET_C_MASK, buf[2] << 8);
developer2149cd92023-03-10 19:01:41 +0800472 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D,
developerc50c2352021-12-01 10:45:35 +0800473 MTK_PHY_CR_TX_AMP_OFFSET_D_MASK, buf[3]);
474
475 return 0;
476}
477
478static int tx_offset_cal_efuse(struct phy_device *phydev, u32 *buf)
479{
480 u16 tx_offset_cal_val[4];
481
482 tx_offset_cal_val[0] = EFS_DA_TX_AMP_OFFSET_A(buf[0]);
483 tx_offset_cal_val[1] = EFS_DA_TX_AMP_OFFSET_B(buf[1]);
484 tx_offset_cal_val[2] = EFS_DA_TX_AMP_OFFSET_C(buf[1]);
485 tx_offset_cal_val[3] = EFS_DA_TX_AMP_OFFSET_D(buf[1]);
486
487 tx_offset_fill_result(phydev, tx_offset_cal_val);
488
489 return 0;
490}
491
492static int tx_amp_fill_result(struct phy_device *phydev, u16 *buf)
493{
developerd2ec38e2022-11-27 01:15:29 +0800494 int i;
developer87c89d12022-08-19 17:46:34 +0800495 int bias[16] = {0};
developer2149cd92023-03-10 19:01:41 +0800496 const int vals_9461[16] = { 7, 1, 4, 7,
497 7, 1, 4, 7,
498 7, 1, 4, 7,
499 7, 1, 4, 7 };
500 const int vals_9481[16] = { 10, 6, 6, 10,
501 10, 6, 6, 10,
502 10, 6, 6, 10,
503 10, 6, 6, 10 };
504
505 switch (phydev->drv->phy_id) {
developer043f7b92023-03-13 13:57:36 +0800506 case MTK_GPHY_ID_MT7981:
developer2149cd92023-03-10 19:01:41 +0800507 /* We add some calibration to efuse values
508 * due to board level influence.
509 * GBE: +7, TBT: +1, HBT: +4, TST: +7
510 */
511 memcpy(bias, (const void *)vals_9461, sizeof(bias));
512 for (i = 0; i <= 12; i += 4) {
513 if (likely(buf[i >> 2] + bias[i] >= 32)) {
514 bias[i] -= 13;
515 } else {
516 phy_modify_mmd(phydev, MDIO_MMD_VEND1,
517 0x5c, 0x7 << i, bias[i] << i);
518 bias[i + 1] += 13;
519 bias[i + 2] += 13;
520 bias[i + 3] += 13;
521 }
developer87c89d12022-08-19 17:46:34 +0800522 }
developer2149cd92023-03-10 19:01:41 +0800523 break;
developer043f7b92023-03-13 13:57:36 +0800524 case MTK_GPHY_ID_MT7988:
developer2149cd92023-03-10 19:01:41 +0800525 memcpy(bias, (const void *)vals_9481, sizeof(bias));
526 break;
527 default:
528 break;
developer87c89d12022-08-19 17:46:34 +0800529 }
developerd2ec38e2022-11-27 01:15:29 +0800530
developerdc3e9502022-12-02 18:10:42 +0800531 /* Prevent overflow */
532 for (i = 0; i < 12; i++) {
developer2149cd92023-03-10 19:01:41 +0800533 if (buf[i >> 2] + bias[i] > 63) {
534 buf[i >> 2] = 63;
developerdc3e9502022-12-02 18:10:42 +0800535 bias[i] = 0;
developer2149cd92023-03-10 19:01:41 +0800536 } else if (buf[i >> 2] + bias[i] < 0) {
developerdc3e9502022-12-02 18:10:42 +0800537 /* Bias caused by board design may change in the future.
538 * So check negative cases, too.
539 */
developer2149cd92023-03-10 19:01:41 +0800540 buf[i >> 2] = 0;
developerdc3e9502022-12-02 18:10:42 +0800541 bias[i] = 0;
542 }
543 }
544
developerc50c2352021-12-01 10:45:35 +0800545 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
developer87c89d12022-08-19 17:46:34 +0800546 MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, (buf[0] + bias[0]) << 10);
developerc50c2352021-12-01 10:45:35 +0800547 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
developer87c89d12022-08-19 17:46:34 +0800548 MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0] + bias[1]);
developerc50c2352021-12-01 10:45:35 +0800549 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
developer87c89d12022-08-19 17:46:34 +0800550 MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, (buf[0] + bias[2]) << 10);
developerc50c2352021-12-01 10:45:35 +0800551 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
developer87c89d12022-08-19 17:46:34 +0800552 MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0] + bias[3]);
developerc50c2352021-12-01 10:45:35 +0800553
554 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
developer87c89d12022-08-19 17:46:34 +0800555 MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, (buf[1] + bias[4]) << 8);
developerc50c2352021-12-01 10:45:35 +0800556 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
developer87c89d12022-08-19 17:46:34 +0800557 MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1] + bias[5]);
developerc50c2352021-12-01 10:45:35 +0800558 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
developer87c89d12022-08-19 17:46:34 +0800559 MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, (buf[1] + bias[6]) << 8);
developerc50c2352021-12-01 10:45:35 +0800560 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
developer87c89d12022-08-19 17:46:34 +0800561 MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1] + bias[7]);
developerc50c2352021-12-01 10:45:35 +0800562
563 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
developer87c89d12022-08-19 17:46:34 +0800564 MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, (buf[2] + bias[8]) << 8);
developerc50c2352021-12-01 10:45:35 +0800565 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
developer87c89d12022-08-19 17:46:34 +0800566 MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2] + bias[9]);
developerc50c2352021-12-01 10:45:35 +0800567 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
developer87c89d12022-08-19 17:46:34 +0800568 MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, (buf[2] + bias[10]) << 8);
developerc50c2352021-12-01 10:45:35 +0800569 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
developer87c89d12022-08-19 17:46:34 +0800570 MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2] + bias[11]);
developerc50c2352021-12-01 10:45:35 +0800571
572 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
developer87c89d12022-08-19 17:46:34 +0800573 MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, (buf[3] + bias[12]) << 8);
developerc50c2352021-12-01 10:45:35 +0800574 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
developer87c89d12022-08-19 17:46:34 +0800575 MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3] + bias[13]);
developerc50c2352021-12-01 10:45:35 +0800576 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
developer87c89d12022-08-19 17:46:34 +0800577 MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, (buf[3] + bias[14]) << 8);
developerc50c2352021-12-01 10:45:35 +0800578 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
developer87c89d12022-08-19 17:46:34 +0800579 MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3] + bias[15]);
developerc50c2352021-12-01 10:45:35 +0800580
581 return 0;
582}
583
584static int tx_amp_cal_efuse(struct phy_device *phydev, u32 *buf)
585{
586 u16 tx_amp_cal_val[4];
587
588 tx_amp_cal_val[0] = EFS_DA_TX_I2MPB_A(buf[0]);
589 tx_amp_cal_val[1] = EFS_DA_TX_I2MPB_B(buf[0]);
590 tx_amp_cal_val[2] = EFS_DA_TX_I2MPB_C(buf[0]);
591 tx_amp_cal_val[3] = EFS_DA_TX_I2MPB_D(buf[0]);
592 tx_amp_fill_result(phydev, tx_amp_cal_val);
593
594 return 0;
595}
596
developer2149cd92023-03-10 19:01:41 +0800597static int tx_r50_fill_result(struct phy_device *phydev, u16 tx_r50_cal_val,
598 u8 txg_calen_x)
developerc50c2352021-12-01 10:45:35 +0800599{
developer2149cd92023-03-10 19:01:41 +0800600 int bias = 0;
601 u16 reg, val;
developer87c89d12022-08-19 17:46:34 +0800602
developer2149cd92023-03-10 19:01:41 +0800603 switch (phydev->drv->phy_id) {
developer043f7b92023-03-13 13:57:36 +0800604 case MTK_GPHY_ID_MT7988:
developer2149cd92023-03-10 19:01:41 +0800605 {
606 bias = -2;
607 break;
developerdc3e9502022-12-02 18:10:42 +0800608 }
developer043f7b92023-03-13 13:57:36 +0800609 /* MTK_GPHY_ID_MT7981 enters default case */
developer2149cd92023-03-10 19:01:41 +0800610 default:
611 break;
612 }
613
614 val = clamp_val(bias + tx_r50_cal_val, 0, 63);
615
616 switch (txg_calen_x) {
617 case PAIR_A:
618 reg = MTK_PHY_DA_TX_R50_PAIR_A;
619 break;
620 case PAIR_B:
621 reg = MTK_PHY_DA_TX_R50_PAIR_B;
622 break;
623 case PAIR_C:
624 reg = MTK_PHY_DA_TX_R50_PAIR_C;
625 break;
626 case PAIR_D:
627 reg = MTK_PHY_DA_TX_R50_PAIR_D;
628 break;
developerc50c2352021-12-01 10:45:35 +0800629 }
developer2149cd92023-03-10 19:01:41 +0800630
631 phy_write_mmd(phydev, MDIO_MMD_VEND1, reg, val | val << 8);
632
developerc50c2352021-12-01 10:45:35 +0800633 return 0;
634}
635
636static int tx_r50_cal_efuse(struct phy_device *phydev, u32 *buf,
developer2149cd92023-03-10 19:01:41 +0800637 u8 txg_calen_x)
developerc50c2352021-12-01 10:45:35 +0800638{
developer2149cd92023-03-10 19:01:41 +0800639 u16 tx_r50_cal_val;
developerc50c2352021-12-01 10:45:35 +0800640
developer2149cd92023-03-10 19:01:41 +0800641 switch (txg_calen_x) {
642 case PAIR_A:
643 tx_r50_cal_val = EFS_DA_TX_R50_A(buf[1]);
644 break;
645 case PAIR_B:
646 tx_r50_cal_val = EFS_DA_TX_R50_B(buf[1]);
647 break;
648 case PAIR_C:
649 tx_r50_cal_val = EFS_DA_TX_R50_C(buf[2]);
650 break;
651 case PAIR_D:
652 tx_r50_cal_val = EFS_DA_TX_R50_D(buf[2]);
653 break;
developerc50c2352021-12-01 10:45:35 +0800654 }
655 tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
656
657 return 0;
658}
659
developer2149cd92023-03-10 19:01:41 +0800660static int tx_vcm_cal_sw(struct phy_device *phydev, u8 rg_txreserve_x)
developerc50c2352021-12-01 10:45:35 +0800661{
662 u8 lower_idx, upper_idx, txreserve_val;
663 u8 lower_ret, upper_ret;
664 int ret;
665
666 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
developer2149cd92023-03-10 19:01:41 +0800667 MTK_PHY_RG_ANA_CALEN);
developerc50c2352021-12-01 10:45:35 +0800668 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
developer2149cd92023-03-10 19:01:41 +0800669 MTK_PHY_RG_CAL_CKINV);
developerc50c2352021-12-01 10:45:35 +0800670 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
developer2149cd92023-03-10 19:01:41 +0800671 MTK_PHY_RG_TXVOS_CALEN);
developerc50c2352021-12-01 10:45:35 +0800672
developer2149cd92023-03-10 19:01:41 +0800673 switch (rg_txreserve_x) {
674 case PAIR_A:
675 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
676 MTK_PHY_RG_DASN_DAC_IN0_A,
677 MTK_PHY_DASN_DAC_IN0_A_MASK);
678 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
679 MTK_PHY_RG_DASN_DAC_IN1_A,
680 MTK_PHY_DASN_DAC_IN1_A_MASK);
681 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
682 MTK_PHY_RG_ANA_CAL_RG0,
683 MTK_PHY_RG_ZCALEN_A);
684 break;
685 case PAIR_B:
686 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
687 MTK_PHY_RG_DASN_DAC_IN0_B,
688 MTK_PHY_DASN_DAC_IN0_B_MASK);
689 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
690 MTK_PHY_RG_DASN_DAC_IN1_B,
691 MTK_PHY_DASN_DAC_IN1_B_MASK);
692 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
693 MTK_PHY_RG_ANA_CAL_RG1,
694 MTK_PHY_RG_ZCALEN_B);
695 break;
696 case PAIR_C:
697 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
698 MTK_PHY_RG_DASN_DAC_IN0_C,
699 MTK_PHY_DASN_DAC_IN0_C_MASK);
700 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
701 MTK_PHY_RG_DASN_DAC_IN1_C,
702 MTK_PHY_DASN_DAC_IN1_C_MASK);
703 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
704 MTK_PHY_RG_ANA_CAL_RG1,
705 MTK_PHY_RG_ZCALEN_C);
706 break;
707 case PAIR_D:
708 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
709 MTK_PHY_RG_DASN_DAC_IN0_D,
710 MTK_PHY_DASN_DAC_IN0_D_MASK);
711 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
712 MTK_PHY_RG_DASN_DAC_IN1_D,
713 MTK_PHY_DASN_DAC_IN1_D_MASK);
714 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
715 MTK_PHY_RG_ANA_CAL_RG1,
716 MTK_PHY_RG_ZCALEN_D);
717 break;
718 default:
719 ret = -EINVAL;
720 goto restore;
developerc50c2352021-12-01 10:45:35 +0800721 }
722
723 lower_idx = TXRESERVE_MIN;
724 upper_idx = TXRESERVE_MAX;
725
726 dev_dbg(&phydev->mdio.dev, "Start TX-VCM SW cal.\n");
developer2149cd92023-03-10 19:01:41 +0800727 while ((upper_idx - lower_idx) > 1) {
728 txreserve_val = DIV_ROUND_CLOSEST(lower_idx + upper_idx, 2);
developerc50c2352021-12-01 10:45:35 +0800729 ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
developer2149cd92023-03-10 19:01:41 +0800730 MTK_PHY_DA_RX_PSBN_TBT_MASK |
731 MTK_PHY_DA_RX_PSBN_HBT_MASK |
732 MTK_PHY_DA_RX_PSBN_GBE_MASK |
733 MTK_PHY_DA_RX_PSBN_LP_MASK,
developerc50c2352021-12-01 10:45:35 +0800734 txreserve_val << 12 | txreserve_val << 8 |
735 txreserve_val << 4 | txreserve_val);
developer2149cd92023-03-10 19:01:41 +0800736 if (ret == 1) {
developerc50c2352021-12-01 10:45:35 +0800737 upper_idx = txreserve_val;
developer78aa7b92021-12-29 15:22:10 +0800738 upper_ret = ret;
developer2149cd92023-03-10 19:01:41 +0800739 } else if (ret == 0) {
developerc50c2352021-12-01 10:45:35 +0800740 lower_idx = txreserve_val;
developer78aa7b92021-12-29 15:22:10 +0800741 lower_ret = ret;
developer2149cd92023-03-10 19:01:41 +0800742 } else {
developerc50c2352021-12-01 10:45:35 +0800743 goto restore;
developer2149cd92023-03-10 19:01:41 +0800744 }
developerc50c2352021-12-01 10:45:35 +0800745 }
746
developer2149cd92023-03-10 19:01:41 +0800747 if (lower_idx == TXRESERVE_MIN) {
748 lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
749 MTK_PHY_RXADC_CTRL_RG9,
750 MTK_PHY_DA_RX_PSBN_TBT_MASK |
751 MTK_PHY_DA_RX_PSBN_HBT_MASK |
752 MTK_PHY_DA_RX_PSBN_GBE_MASK |
753 MTK_PHY_DA_RX_PSBN_LP_MASK,
754 lower_idx << 12 | lower_idx << 8 |
755 lower_idx << 4 | lower_idx);
756 ret = lower_ret;
757 } else if (upper_idx == TXRESERVE_MAX) {
758 upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
759 MTK_PHY_RXADC_CTRL_RG9,
760 MTK_PHY_DA_RX_PSBN_TBT_MASK |
761 MTK_PHY_DA_RX_PSBN_HBT_MASK |
762 MTK_PHY_DA_RX_PSBN_GBE_MASK |
763 MTK_PHY_DA_RX_PSBN_LP_MASK,
764 upper_idx << 12 | upper_idx << 8 |
765 upper_idx << 4 | upper_idx);
766 ret = upper_ret;
developer78aa7b92021-12-29 15:22:10 +0800767 }
768 if (ret < 0)
developerc50c2352021-12-01 10:45:35 +0800769 goto restore;
770
developer78aa7b92021-12-29 15:22:10 +0800771 /* We calibrate TX-VCM in different logic. Check upper index and then
772 * lower index. If this calibration is valid, apply lower index's result.
773 */
developer2149cd92023-03-10 19:01:41 +0800774 ret = upper_ret - lower_ret;
developerc50c2352021-12-01 10:45:35 +0800775 if (ret == 1) {
776 ret = 0;
developerb5c76d42022-08-18 15:45:33 +0800777 /* Make sure we use upper_idx in our calibration system */
778 cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
developer2149cd92023-03-10 19:01:41 +0800779 MTK_PHY_DA_RX_PSBN_TBT_MASK |
780 MTK_PHY_DA_RX_PSBN_HBT_MASK |
781 MTK_PHY_DA_RX_PSBN_GBE_MASK |
782 MTK_PHY_DA_RX_PSBN_LP_MASK,
783 upper_idx << 12 | upper_idx << 8 |
784 upper_idx << 4 | upper_idx);
785 dev_info(&phydev->mdio.dev, "TX-VCM SW cal result: 0x%x\n",
786 upper_idx);
787 } else if (lower_idx == TXRESERVE_MIN && upper_ret == 1 &&
788 lower_ret == 1) {
developerc50c2352021-12-01 10:45:35 +0800789 ret = 0;
790 cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
developer2149cd92023-03-10 19:01:41 +0800791 MTK_PHY_DA_RX_PSBN_TBT_MASK |
792 MTK_PHY_DA_RX_PSBN_HBT_MASK |
793 MTK_PHY_DA_RX_PSBN_GBE_MASK |
794 MTK_PHY_DA_RX_PSBN_LP_MASK,
795 lower_idx << 12 | lower_idx << 8 |
796 lower_idx << 4 | lower_idx);
797 dev_warn(&phydev->mdio.dev,
798 "TX-VCM SW cal result at low margin 0x%x\n",
799 lower_idx);
800 } else if (upper_idx == TXRESERVE_MAX && upper_ret == 0 &&
801 lower_ret == 0) {
developerc50c2352021-12-01 10:45:35 +0800802 ret = 0;
developer2149cd92023-03-10 19:01:41 +0800803 dev_warn(&phydev->mdio.dev,
804 "TX-VCM SW cal result at high margin 0x%x\n",
805 upper_idx);
806 } else {
developerc50c2352021-12-01 10:45:35 +0800807 ret = -EINVAL;
developer2149cd92023-03-10 19:01:41 +0800808 }
developerc50c2352021-12-01 10:45:35 +0800809
810restore:
811 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
developer2149cd92023-03-10 19:01:41 +0800812 MTK_PHY_RG_ANA_CALEN);
developerc50c2352021-12-01 10:45:35 +0800813 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
developer2149cd92023-03-10 19:01:41 +0800814 MTK_PHY_RG_TXVOS_CALEN);
developerc50c2352021-12-01 10:45:35 +0800815 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
developer2149cd92023-03-10 19:01:41 +0800816 MTK_PHY_RG_ZCALEN_A);
developerc50c2352021-12-01 10:45:35 +0800817 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
developer2149cd92023-03-10 19:01:41 +0800818 MTK_PHY_RG_ZCALEN_B | MTK_PHY_RG_ZCALEN_C |
819 MTK_PHY_RG_ZCALEN_D);
developerc50c2352021-12-01 10:45:35 +0800820
821 return ret;
822}
823
developerf35532c2022-08-05 18:37:26 +0800824static inline void mt7981_phy_finetune(struct phy_device *phydev)
developer02d84422021-12-24 11:48:07 +0800825{
developerd2ec38e2022-11-27 01:15:29 +0800826 u32 i;
developer2149cd92023-03-10 19:01:41 +0800827
developer02d84422021-12-24 11:48:07 +0800828 /* 100M eye finetune:
829 * Keep middle level of TX MLT3 shapper as default.
830 * Only change TX MLT3 overshoot level here.
831 */
developer2149cd92023-03-10 19:01:41 +0800832 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_0TO1,
833 0x1ce);
834 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_0TO1,
835 0x1c1);
836 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_1TO0,
837 0x20f);
838 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_1TO0,
839 0x202);
840 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_0TON1,
841 0x3d0);
842 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_0TON1,
843 0x3c0);
844 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_N1TO0,
845 0x13);
846 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_N1TO0,
847 0x5);
developerf35532c2022-08-05 18:37:26 +0800848
developer02d84422021-12-24 11:48:07 +0800849 /* TX-AMP finetune:
850 * 100M +4, 1000M +6 to default value.
851 * If efuse values aren't valid, TX-AMP uses the below values.
852 */
853 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG, 0x9824);
developer2149cd92023-03-10 19:01:41 +0800854 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
855 0x9026);
856 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
857 0x2624);
858 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
859 0x2426);
860 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
861 0x2624);
862 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
863 0x2426);
864 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
865 0x2624);
866 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
867 0x2426);
developer68f6e102022-11-22 17:35:00 +0800868
developerd2ec38e2022-11-27 01:15:29 +0800869 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
870 /* EnabRandUpdTrig = 1 */
871 __phy_write(phydev, 0x11, 0x2f00);
872 __phy_write(phydev, 0x12, 0xe);
873 __phy_write(phydev, 0x10, 0x8fb0);
874
developer7fbc5262023-03-28 23:44:26 +0800875 /* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */
876 __phy_write(phydev, 0x11, 0xc71);
developerd2ec38e2022-11-27 01:15:29 +0800877 __phy_write(phydev, 0x12, 0xc);
878 __phy_write(phydev, 0x10, 0x8fae);
879
880 /* NormMseLoThresh = 85 */
881 __phy_write(phydev, 0x11, 0x55a0);
882 __phy_write(phydev, 0x12, 0x0);
883 __phy_write(phydev, 0x10, 0x83aa);
884
885 /* InhibitDisableDfeTail1000 = 1 */
886 __phy_write(phydev, 0x11, 0x2b);
887 __phy_write(phydev, 0x12, 0x0);
888 __phy_write(phydev, 0x10, 0x8f80);
889
developer7fbc5262023-03-28 23:44:26 +0800890 /* SSTrKp1000Slv = 5 */
developerd2ec38e2022-11-27 01:15:29 +0800891 __phy_write(phydev, 0x11, 0xbaef);
892 __phy_write(phydev, 0x12, 0x2e);
893 __phy_write(phydev, 0x10, 0x968c);
894
developer7fbc5262023-03-28 23:44:26 +0800895 /* MrvlTrFix100Kp = 3, MrvlTrFix100Kf = 2,
896 * MrvlTrFix1000Kp = 3, MrvlTrFix1000Kf = 2
897 */
898 __phy_write(phydev, 0x11, 0xd10a);
899 __phy_write(phydev, 0x12, 0x34);
900 __phy_write(phydev, 0x10, 0x8f82);
901 /* TrFreeze = 0 */
902 __phy_write(phydev, 0x11, 0x0);
903 __phy_write(phydev, 0x12, 0x0);
904 __phy_write(phydev, 0x10, 0x9686);
905
developerd2ec38e2022-11-27 01:15:29 +0800906 /* VcoSlicerThreshBitsHigh */
907 __phy_write(phydev, 0x11, 0x5555);
908 __phy_write(phydev, 0x12, 0x55);
909 __phy_write(phydev, 0x10, 0x8ec0);
910
911 /* ResetSyncOffset = 6 */
912 __phy_write(phydev, 0x11, 0x600);
913 __phy_write(phydev, 0x12, 0x0);
914 __phy_write(phydev, 0x10, 0x8fc0);
915
916 /* VgaDecRate = 1 */
917 __phy_write(phydev, 0x11, 0x4c2a);
918 __phy_write(phydev, 0x12, 0x3e);
919 __phy_write(phydev, 0x10, 0x8fa4);
920
developer7fbc5262023-03-28 23:44:26 +0800921 /* FfeUpdGainForce = 4 */
922 __phy_write(phydev, 0x11, 0x240);
923 __phy_write(phydev, 0x12, 0x0);
924 __phy_write(phydev, 0x10, 0x9680);
925
developerd2ec38e2022-11-27 01:15:29 +0800926 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
developerd2ec38e2022-11-27 01:15:29 +0800927 /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9*/
developer68f6e102022-11-22 17:35:00 +0800928 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
developer2149cd92023-03-10 19:01:41 +0800929 MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
930 BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0x9));
developerd2ec38e2022-11-27 01:15:29 +0800931
932 /* rg_tr_lpf_cnt_val = 512 */
933 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LPF_CNT_VAL, 0x200);
934
935 /* IIR2 related */
936 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_L, 0x82);
937 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_U, 0x0);
938 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_L, 0x103);
939 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_U, 0x0);
940 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_L, 0x82);
941 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_U, 0x0);
942 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_L, 0xd177);
943 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_U, 0x3);
944 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_L, 0x2c82);
945 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_U, 0xe);
946
947 /* FFE peaking */
948 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27C,
developer2149cd92023-03-10 19:01:41 +0800949 MTK_PHY_VGASTATE_FFE_THR_ST1_MASK, 0x1b << 8);
developerd2ec38e2022-11-27 01:15:29 +0800950 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27D,
developer2149cd92023-03-10 19:01:41 +0800951 MTK_PHY_VGASTATE_FFE_THR_ST2_MASK, 0x1e);
developerd2ec38e2022-11-27 01:15:29 +0800952
953 /* TX shape */
954 /* 10/100/1000 TX shaper is enabled by default */
955 for (i = 0x202; i < 0x230; i += 2) {
956 if (i == 0x20c || i == 0x218 || i == 0x224)
957 continue;
958 phy_write_mmd(phydev, MDIO_MMD_VEND2, i, 0x2219);
developer2149cd92023-03-10 19:01:41 +0800959 phy_write_mmd(phydev, MDIO_MMD_VEND2, i + 1, 0x23);
developerd2ec38e2022-11-27 01:15:29 +0800960 }
developer7fbc5262023-03-28 23:44:26 +0800961
962 /* Disable LDO pump */
963 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRAB, 0x0);
964 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRCD, 0x0);
965 /* Adjust LDO output voltage */
966 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_OUTPUT_V, 0x2222);
developer02d84422021-12-24 11:48:07 +0800967}
968
developerf35532c2022-08-05 18:37:26 +0800969static inline void mt7988_phy_finetune(struct phy_device *phydev)
970{
developer2149cd92023-03-10 19:01:41 +0800971 u16 val[12] = { 0x0187, 0x01cd, 0x01c8, 0x0182,
972 0x020d, 0x0206, 0x0384, 0x03d0,
973 0x03c6, 0x030a, 0x0011, 0x0005 };
developerf35532c2022-08-05 18:37:26 +0800974 int i;
developerf35532c2022-08-05 18:37:26 +0800975
developer2149cd92023-03-10 19:01:41 +0800976 for (i = 0; i < MTK_PHY_TX_MLT3_END; i++)
developerf35532c2022-08-05 18:37:26 +0800977 phy_write_mmd(phydev, MDIO_MMD_VEND1, i, val[i]);
developer6de96aa2022-09-29 16:46:18 +0800978
developer57374032022-10-11 16:43:24 +0800979 /* TCT finetune */
developer6de96aa2022-09-29 16:46:18 +0800980 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_TX_FILTER, 0x5);
developer57374032022-10-11 16:43:24 +0800981
982 /* Disable TX power saving */
983 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG7,
developer2149cd92023-03-10 19:01:41 +0800984 MTK_PHY_DA_AD_BUF_BIAS_LP_MASK, 0x3 << 8);
developerec2b8552022-10-17 15:30:59 +0800985
developerec2b8552022-10-17 15:30:59 +0800986 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
developerce73ad62022-12-07 22:43:45 +0800987 /* EnabRandUpdTrig = 1 */
988 __phy_write(phydev, 0x11, 0x2f00);
989 __phy_write(phydev, 0x12, 0xe);
990 __phy_write(phydev, 0x10, 0x8fb0);
991
developer7fbc5262023-03-28 23:44:26 +0800992 /* SlvDSPreadyTime = 24, MasDSPreadyTime = 12 */
developerce73ad62022-12-07 22:43:45 +0800993 __phy_write(phydev, 0x11, 0x671);
994 __phy_write(phydev, 0x12, 0xc);
995 __phy_write(phydev, 0x10, 0x8fae);
996
997 /* NormMseLoThresh = 85 */
998 __phy_write(phydev, 0x11, 0x55a0);
developerec2b8552022-10-17 15:30:59 +0800999 __phy_write(phydev, 0x12, 0x0);
developerce73ad62022-12-07 22:43:45 +08001000 __phy_write(phydev, 0x10, 0x83aa);
1001
1002 /* InhibitDisableDfeTail1000 = 1 */
1003 __phy_write(phydev, 0x11, 0x2b);
1004 __phy_write(phydev, 0x12, 0x0);
1005 __phy_write(phydev, 0x10, 0x8f80);
1006
1007 /* SSTr related */
1008 __phy_write(phydev, 0x11, 0xbaef);
1009 __phy_write(phydev, 0x12, 0x2e);
1010 __phy_write(phydev, 0x10, 0x968c);
1011
1012 /* MrvlTrFix100Kp = 3, MrvlTrFix100Kf = 2,
1013 * MrvlTrFix1000Kp = 3, MrvlTrFix1000Kf = 2
1014 */
1015 __phy_write(phydev, 0x11, 0xd10a);
1016 __phy_write(phydev, 0x12, 0x34);
1017 __phy_write(phydev, 0x10, 0x8f82);
1018
1019 /* VcoSlicerThreshBitsHigh */
1020 __phy_write(phydev, 0x11, 0x5555);
1021 __phy_write(phydev, 0x12, 0x55);
1022 __phy_write(phydev, 0x10, 0x8ec0);
1023
developerce268312022-12-20 16:26:11 +08001024 /* ResetSyncOffset = 5 */
1025 __phy_write(phydev, 0x11, 0x500);
developerce73ad62022-12-07 22:43:45 +08001026 __phy_write(phydev, 0x12, 0x0);
1027 __phy_write(phydev, 0x10, 0x8fc0);
developerb5c72b02022-12-21 15:51:07 +08001028 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
developerce73ad62022-12-07 22:43:45 +08001029
developerce268312022-12-20 16:26:11 +08001030 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_2A30);
1031 /* TxClkOffset = 2 */
developerb5c72b02022-12-21 15:51:07 +08001032 __phy_modify(phydev, MTK_PHY_ANARG_RG, MTK_PHY_TCLKOFFSET_MASK,
developer2149cd92023-03-10 19:01:41 +08001033 FIELD_PREP(MTK_PHY_TCLKOFFSET_MASK, 0x2));
developerec2b8552022-10-17 15:30:59 +08001034 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
developerce73ad62022-12-07 22:43:45 +08001035
1036 /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9*/
1037 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
developer2149cd92023-03-10 19:01:41 +08001038 MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
1039 BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0x9));
developerce73ad62022-12-07 22:43:45 +08001040
1041 /* rg_tr_lpf_cnt_val = 512 */
1042 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LPF_CNT_VAL, 0x200);
1043
1044 /* IIR2 related */
1045 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_L, 0x82);
1046 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_U, 0x0);
1047 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_L, 0x103);
1048 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_U, 0x0);
1049 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_L, 0x82);
1050 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_U, 0x0);
1051 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_L, 0xd177);
1052 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_U, 0x3);
1053 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_L, 0x2c82);
1054 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_U, 0xe);
1055
1056 /* FFE peaking */
1057 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27C,
developer2149cd92023-03-10 19:01:41 +08001058 MTK_PHY_VGASTATE_FFE_THR_ST1_MASK, 0x1b << 8);
developerce73ad62022-12-07 22:43:45 +08001059 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27D,
developer2149cd92023-03-10 19:01:41 +08001060 MTK_PHY_VGASTATE_FFE_THR_ST2_MASK, 0x1e);
developerce73ad62022-12-07 22:43:45 +08001061
1062 /* TX shape */
1063 /* 10/100/1000 TX shaper is enabled by default */
1064 for (i = 0x202; i < 0x230; i += 2) {
1065 if (i == 0x20c || i == 0x218 || i == 0x224)
1066 continue;
1067 phy_write_mmd(phydev, MDIO_MMD_VEND2, i, 0x2219);
developer2149cd92023-03-10 19:01:41 +08001068 phy_write_mmd(phydev, MDIO_MMD_VEND2, i + 1, 0x23);
developerce73ad62022-12-07 22:43:45 +08001069 }
developerce268312022-12-20 16:26:11 +08001070
1071 /* Disable LDO pump */
1072 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRAB, 0x0);
1073 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRCD, 0x0);
1074
1075 /* Adjust LDO output voltage */
developerb5c72b02022-12-21 15:51:07 +08001076 phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_OUTPUT_V, 0x2222);
developer2149cd92023-03-10 19:01:41 +08001077}
developer75819992023-03-08 20:49:03 +08001078
developer7fbc5262023-03-28 23:44:26 +08001079static inline void mt798x_phy_eee(struct phy_device *phydev)
1080{
1081 phy_modify_mmd(phydev, MDIO_MMD_VEND1,
1082 MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG120,
1083 MTK_PHY_LPI_SIG_EN_LO_THRESH1000_MASK |
1084 MTK_PHY_LPI_SIG_EN_HI_THRESH1000_MASK,
1085 FIELD_PREP(MTK_PHY_LPI_SIG_EN_LO_THRESH1000_MASK, 0x0) |
1086 FIELD_PREP(MTK_PHY_LPI_SIG_EN_HI_THRESH1000_MASK, 0x14));
1087
1088 phy_modify_mmd(phydev, MDIO_MMD_VEND1,
1089 MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG122,
1090 MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK,
1091 FIELD_PREP(MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK, 0xff));
1092
1093 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
1094 MTK_PHY_RG_TESTMUX_ADC_CTRL, MTK_PHY_RG_TXEN_DIG_MASK);
1095
1096 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
1097 MTK_PHY_RG_DEV1E_REG19b, MTK_PHY_BYPASS_DSP_LPI_READY);
1098
1099 phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
1100 MTK_PHY_RG_DEV1E_REG234, MTK_PHY_TR_LP_IIR_EEE_EN);
1101
1102 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG238,
1103 MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK | MTK_PHY_LPI_SLV_SEND_TX_EN,
1104 FIELD_PREP(MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK, 0x120));
1105
1106 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG239,
1107 MTK_PHY_LPI_SEND_LOC_TIMER_MASK | MTK_PHY_LPI_TXPCS_LOC_RCV,
1108 FIELD_PREP(MTK_PHY_LPI_SEND_LOC_TIMER_MASK, 0x117));
1109
1110 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG2C7,
1111 MTK_PHY_MAX_GAIN_MASK | MTK_PHY_MIN_GAIN_MASK,
1112 FIELD_PREP(MTK_PHY_MAX_GAIN_MASK, 0x8) |
1113 FIELD_PREP(MTK_PHY_MIN_GAIN_MASK, 0x13));
1114
1115 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG2D1,
1116 MTK_PHY_VCO_SLICER_THRESH_BITS_HIGH_EEE_MASK,
1117 FIELD_PREP(MTK_PHY_VCO_SLICER_THRESH_BITS_HIGH_EEE_MASK, 0x33) |
1118 MTK_PHY_LPI_SKIP_SD_SLV_TR | MTK_PHY_LPI_TR_READY |
1119 MTK_PHY_LPI_VCO_EEE_STG0_EN);
1120
1121 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG323,
1122 MTK_PHY_EEE_WAKE_MAS_INT_DC | MTK_PHY_EEE_WAKE_SLV_INT_DC);
1123
1124 phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG324,
1125 MTK_PHY_SMI_DETCNT_MAX_MASK,
1126 FIELD_PREP(MTK_PHY_SMI_DETCNT_MAX_MASK, 0x3f) |
1127 MTK_PHY_SMI_DET_MAX_EN);
1128
1129 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG326,
1130 MTK_PHY_LPI_MODE_SD_ON | MTK_PHY_RESET_RANDUPD_CNT |
1131 MTK_PHY_TREC_UPDATE_ENAB_CLR |
1132 MTK_PHY_LPI_QUIT_WAIT_DFE_SIG_DET_OFF |
1133 MTK_PHY_TR_READY_SKIP_AFE_WAKEUP);
1134
1135 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
1136 /* Regsigdet_sel_1000 = 0 */
1137 __phy_write(phydev, 0x11, 0xb);
1138 __phy_write(phydev, 0x12, 0x0);
1139 __phy_write(phydev, 0x10, 0x9690);
1140
1141 /* REG_EEE_st2TrKf1000 = 3 */
1142 __phy_write(phydev, 0x11, 0x114f);
1143 __phy_write(phydev, 0x12, 0x2);
1144 __phy_write(phydev, 0x10, 0x969a);
1145
1146 /* RegEEE_slv_wake_tr_timer_tar = 6, RegEEE_slv_remtx_timer_tar = 20 */
1147 __phy_write(phydev, 0x11, 0x3028);
1148 __phy_write(phydev, 0x12, 0x0);
1149 __phy_write(phydev, 0x10, 0x969e);
1150
1151 /* RegEEE_slv_wake_int_timer_tar = 8 */
1152 __phy_write(phydev, 0x11, 0x5010);
1153 __phy_write(phydev, 0x12, 0x0);
1154 __phy_write(phydev, 0x10, 0x96a0);
1155
1156 /* RegEEE_trfreeze_timer2 = 586 */
1157 __phy_write(phydev, 0x11, 0x24a);
1158 __phy_write(phydev, 0x12, 0x0);
1159 __phy_write(phydev, 0x10, 0x96a8);
1160
1161 /* RegEEE100Stg1_tar = 16 */
1162 __phy_write(phydev, 0x11, 0x3210);
1163 __phy_write(phydev, 0x12, 0x0);
1164 __phy_write(phydev, 0x10, 0x96b8);
1165
1166 /* REGEEE_wake_slv_tr_wait_dfesigdet_en = 1 */
1167 __phy_write(phydev, 0x11, 0x1463);
1168 __phy_write(phydev, 0x12, 0x0);
1169 __phy_write(phydev, 0x10, 0x96ca);
1170
1171 /* DfeTailEnableVgaThresh1000 = 27 */
1172 __phy_write(phydev, 0x11, 0x36);
1173 __phy_write(phydev, 0x12, 0x0);
1174 __phy_write(phydev, 0x10, 0x8f80);
1175 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
1176
1177 phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_3);
1178 __phy_modify(phydev, MTK_PHY_LPI_REG_14, MTK_PHY_LPI_WAKE_TIMER_1000_MASK,
1179 FIELD_PREP(MTK_PHY_LPI_WAKE_TIMER_1000_MASK, 0x19c));
1180
1181 __phy_modify(phydev, MTK_PHY_LPI_REG_1c, MTK_PHY_SMI_DET_ON_THRESH_MASK,
1182 FIELD_PREP(MTK_PHY_SMI_DET_ON_THRESH_MASK, 0xc));
1183 phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
1184
1185 phy_modify_mmd(phydev, MDIO_MMD_VEND1,
1186 MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG122,
1187 MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK,
1188 FIELD_PREP(MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK, 0xff));
1189}
1190
developer2149cd92023-03-10 19:01:41 +08001191static inline int cal_sw(struct phy_device *phydev, enum CAL_ITEM cal_item,
1192 u8 start_pair, u8 end_pair)
1193{
1194 u8 pair_n;
1195 int ret;
1196
1197 for (pair_n = start_pair; pair_n <= end_pair; pair_n++) {
1198 /* TX_OFFSET & TX_AMP have no SW calibration. */
1199 switch (cal_item) {
developer2149cd92023-03-10 19:01:41 +08001200 case TX_VCM:
1201 ret = tx_vcm_cal_sw(phydev, pair_n);
1202 break;
1203 default:
1204 return -EINVAL;
1205 }
1206 if (ret)
1207 return ret;
1208 }
1209 return 0;
developerf35532c2022-08-05 18:37:26 +08001210}
1211
developer2149cd92023-03-10 19:01:41 +08001212static inline int cal_efuse(struct phy_device *phydev, enum CAL_ITEM cal_item,
1213 u8 start_pair, u8 end_pair, u32 *buf)
1214{
1215 u8 pair_n;
1216 int ret;
1217
1218 for (pair_n = start_pair; pair_n <= end_pair; pair_n++) {
1219 /* TX_VCM has no efuse calibration. */
1220 switch (cal_item) {
1221 case REXT:
1222 ret = rext_cal_efuse(phydev, buf);
1223 break;
1224 case TX_OFFSET:
1225 ret = tx_offset_cal_efuse(phydev, buf);
1226 break;
1227 case TX_AMP:
1228 ret = tx_amp_cal_efuse(phydev, buf);
1229 break;
1230 case TX_R50:
1231 ret = tx_r50_cal_efuse(phydev, buf, pair_n);
1232 break;
1233 default:
1234 return -EINVAL;
1235 }
1236 if (ret)
1237 return ret;
1238 }
1239
1240 return 0;
1241}
1242
1243static int start_cal(struct phy_device *phydev, enum CAL_ITEM cal_item,
developerc7b857b2023-03-28 22:37:02 +08001244 enum CAL_MODE cal_mode, u8 start_pair,
developer2149cd92023-03-10 19:01:41 +08001245 u8 end_pair, u32 *buf)
1246{
developerc7b857b2023-03-28 22:37:02 +08001247 int ret;
developer2149cd92023-03-10 19:01:41 +08001248 char cal_prop[5][20] = { "mediatek,rext", "mediatek,tx_offset",
1249 "mediatek,tx_amp", "mediatek,tx_r50",
1250 "mediatek,tx_vcm" };
developer2149cd92023-03-10 19:01:41 +08001251
1252 switch (cal_mode) {
developer2149cd92023-03-10 19:01:41 +08001253 case EFUSE_M:
developerc7b857b2023-03-28 22:37:02 +08001254 ret = cal_efuse(phydev, cal_item, start_pair,
1255 end_pair, buf);
developer2149cd92023-03-10 19:01:41 +08001256 break;
1257 case SW_M:
developerc7b857b2023-03-28 22:37:02 +08001258 ret = cal_sw(phydev, cal_item, start_pair, end_pair);
developer2149cd92023-03-10 19:01:41 +08001259 break;
1260 default:
1261 return -EINVAL;
1262 }
1263
developerc7b857b2023-03-28 22:37:02 +08001264 if (ret) {
developer2149cd92023-03-10 19:01:41 +08001265 dev_err(&phydev->mdio.dev, "[%s]cal failed\n", cal_prop[cal_item]);
1266 return -EIO;
1267 }
1268
developer2149cd92023-03-10 19:01:41 +08001269 return 0;
1270}
1271
developerf35532c2022-08-05 18:37:26 +08001272static int mt798x_phy_calibration(struct phy_device *phydev)
developerc50c2352021-12-01 10:45:35 +08001273{
developer2149cd92023-03-10 19:01:41 +08001274 int ret = 0;
developerc50c2352021-12-01 10:45:35 +08001275 u32 *buf;
developerc50c2352021-12-01 10:45:35 +08001276 size_t len;
1277 struct nvmem_cell *cell;
1278
1279 if (phydev->interface != PHY_INTERFACE_MODE_GMII)
1280 return -EINVAL;
1281
1282 cell = nvmem_cell_get(&phydev->mdio.dev, "phy-cal-data");
1283 if (IS_ERR(cell)) {
1284 if (PTR_ERR(cell) == -EPROBE_DEFER)
1285 return PTR_ERR(cell);
1286 return 0;
1287 }
1288
1289 buf = (u32 *)nvmem_cell_read(cell, &len);
1290 if (IS_ERR(buf))
1291 return PTR_ERR(buf);
1292 nvmem_cell_put(cell);
1293
developerc7b857b2023-03-28 22:37:02 +08001294 if (!buf[0] || !buf[1] || !buf[2] || !buf[3] || len < 4 * sizeof(u32)) {
1295 dev_err(&phydev->mdio.dev, "invalid efuse data\n");
developerc50c2352021-12-01 10:45:35 +08001296 ret = -EINVAL;
1297 goto out;
1298 }
1299
developerc7b857b2023-03-28 22:37:02 +08001300 ret = start_cal(phydev, REXT, EFUSE_M, NO_PAIR, NO_PAIR, buf);
developer2149cd92023-03-10 19:01:41 +08001301 if (ret)
1302 goto out;
developerc7b857b2023-03-28 22:37:02 +08001303 ret = start_cal(phydev, TX_OFFSET, EFUSE_M, NO_PAIR, NO_PAIR, buf);
developer2149cd92023-03-10 19:01:41 +08001304 if (ret)
1305 goto out;
developerc7b857b2023-03-28 22:37:02 +08001306 ret = start_cal(phydev, TX_AMP, EFUSE_M, NO_PAIR, NO_PAIR, buf);
developer2149cd92023-03-10 19:01:41 +08001307 if (ret)
1308 goto out;
developerc7b857b2023-03-28 22:37:02 +08001309 ret = start_cal(phydev, TX_R50, EFUSE_M, PAIR_A, PAIR_D, buf);
developer2149cd92023-03-10 19:01:41 +08001310 if (ret)
1311 goto out;
developerc7b857b2023-03-28 22:37:02 +08001312 ret = start_cal(phydev, TX_VCM, SW_M, PAIR_A, PAIR_A, buf);
developer2149cd92023-03-10 19:01:41 +08001313 if (ret)
1314 goto out;
developerc50c2352021-12-01 10:45:35 +08001315
1316out:
1317 kfree(buf);
1318 return ret;
1319}
1320
developer68f6e102022-11-22 17:35:00 +08001321static int mt7981_phy_probe(struct phy_device *phydev)
developerf35532c2022-08-05 18:37:26 +08001322{
1323 mt7981_phy_finetune(phydev);
developer7fbc5262023-03-28 23:44:26 +08001324 mt798x_phy_eee(phydev);
developerf35532c2022-08-05 18:37:26 +08001325
1326 return mt798x_phy_calibration(phydev);
1327}
1328
developer68f6e102022-11-22 17:35:00 +08001329static int mt7988_phy_probe(struct phy_device *phydev)
developerf35532c2022-08-05 18:37:26 +08001330{
1331 mt7988_phy_finetune(phydev);
developer7fbc5262023-03-28 23:44:26 +08001332 mt798x_phy_eee(phydev);
developerf35532c2022-08-05 18:37:26 +08001333
1334 return mt798x_phy_calibration(phydev);
1335}
developer2149cd92023-03-10 19:01:41 +08001336#endif
developerf35532c2022-08-05 18:37:26 +08001337
developerc50c2352021-12-01 10:45:35 +08001338static struct phy_driver mtk_gephy_driver[] = {
developerc50c2352021-12-01 10:45:35 +08001339 {
developer043f7b92023-03-13 13:57:36 +08001340 PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7530),
developerc50c2352021-12-01 10:45:35 +08001341 .name = "MediaTek MT7530 PHY",
1342 .config_init = mt7530_phy_config_init,
1343 /* Interrupts are handled by the switch, not the PHY
1344 * itself.
1345 */
1346 .config_intr = genphy_no_config_intr,
1347 .handle_interrupt = genphy_no_ack_interrupt,
1348 .suspend = genphy_suspend,
1349 .resume = genphy_resume,
1350 .read_page = mtk_gephy_read_page,
1351 .write_page = mtk_gephy_write_page,
1352 },
1353 {
developer043f7b92023-03-13 13:57:36 +08001354 PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7531),
developerc50c2352021-12-01 10:45:35 +08001355 .name = "MediaTek MT7531 PHY",
1356 .config_init = mt7531_phy_config_init,
1357 /* Interrupts are handled by the switch, not the PHY
1358 * itself.
1359 */
1360 .config_intr = genphy_no_config_intr,
1361 .handle_interrupt = genphy_no_ack_interrupt,
1362 .suspend = genphy_suspend,
1363 .resume = genphy_resume,
1364 .read_page = mtk_gephy_read_page,
1365 .write_page = mtk_gephy_write_page,
1366 },
developer2149cd92023-03-10 19:01:41 +08001367#ifdef CONFIG_MEDIATEK_GE_PHY_SOC
developerc50c2352021-12-01 10:45:35 +08001368 {
developer043f7b92023-03-13 13:57:36 +08001369 PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7981),
developerf35532c2022-08-05 18:37:26 +08001370 .name = "MediaTek MT7981 PHY",
developer68f6e102022-11-22 17:35:00 +08001371 .probe = mt7981_phy_probe,
developerf35532c2022-08-05 18:37:26 +08001372 .config_intr = genphy_no_config_intr,
1373 .handle_interrupt = genphy_no_ack_interrupt,
1374 .suspend = genphy_suspend,
1375 .resume = genphy_resume,
1376 .read_page = mtk_gephy_read_page,
1377 .write_page = mtk_gephy_write_page,
1378 },
1379 {
developer043f7b92023-03-13 13:57:36 +08001380 PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7988),
developerf35532c2022-08-05 18:37:26 +08001381 .name = "MediaTek MT7988 PHY",
1382 .probe = mt7988_phy_probe,
developerc50c2352021-12-01 10:45:35 +08001383 .config_intr = genphy_no_config_intr,
1384 .handle_interrupt = genphy_no_ack_interrupt,
1385 .suspend = genphy_suspend,
1386 .resume = genphy_resume,
1387 .read_page = mtk_gephy_read_page,
1388 .write_page = mtk_gephy_write_page,
1389 },
developer2149cd92023-03-10 19:01:41 +08001390#endif
developerc50c2352021-12-01 10:45:35 +08001391};
1392
1393module_phy_driver(mtk_gephy_driver);
1394
1395static struct mdio_device_id __maybe_unused mtk_gephy_tbl[] = {
1396 { PHY_ID_MATCH_VENDOR(0x03a29400) },
1397 { }
1398};
1399
1400MODULE_DESCRIPTION("MediaTek Gigabit Ethernet PHY driver");
developer2149cd92023-03-10 19:01:41 +08001401MODULE_AUTHOR("Daniel Golle <daniel@makrotopia.org>");
1402MODULE_AUTHOR("SkyLake Huang <SkyLake.Huang@mediatek.com>");
developerc50c2352021-12-01 10:45:35 +08001403MODULE_AUTHOR("DENG, Qingfang <dqfext@gmail.com>");
1404MODULE_LICENSE("GPL");
1405
1406MODULE_DEVICE_TABLE(mdio, mtk_gephy_tbl);