blob: 4cfb0efb50a866cac7fa023b62be4b7d114db5b8 [file] [log] [blame]
developerfd40db22021-04-29 10:08:25 +08001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2018 MediaTek Inc.
4 * Author: Zhanguo Ju <zhanguo.ju@mediatek.com>
5 */
6
7#include <linux/kernel.h>
8#include <linux/delay.h>
9#include <linux/hrtimer.h>
developer2cdaeb12022-10-04 20:25:05 +080010#include <linux/of_platform.h>
11#include <linux/mfd/syscon.h>
12#include <linux/regmap.h>
13#include <linux/of_address.h>
developerfd40db22021-04-29 10:08:25 +080014
15#include "mt753x.h"
16#include "mt753x_regs.h"
17
18/* MT7531 registers */
19#define SGMII_REG_BASE 0x5000
20#define SGMII_REG_PORT_BASE 0x1000
21#define SGMII_REG(p, r) (SGMII_REG_BASE + \
22 (p) * SGMII_REG_PORT_BASE + (r))
23#define PCS_CONTROL_1(p) SGMII_REG(p, 0x00)
24#define SGMII_MODE(p) SGMII_REG(p, 0x20)
25#define QPHY_PWR_STATE_CTRL(p) SGMII_REG(p, 0xe8)
26#define ANA_CKBG(p) SGMII_REG(p, 0x100)
27#define ANA_DA_FORCE_MODE1(p) SGMII_REG(p, 0x110)
28#define PHYA_CTRL_SIGNAL3(p) SGMII_REG(p, 0x128)
29#define PHYA_ANA_SYSPLL(p) SGMII_REG(p, 0x158)
30
31/* Fields of PCS_CONTROL_1 */
32#define SGMII_LINK_STATUS BIT(18)
33#define SGMII_AN_ENABLE BIT(12)
34#define SGMII_AN_RESTART BIT(9)
35
36/* Fields of SGMII_MODE */
37#define SGMII_REMOTE_FAULT_DIS BIT(8)
38#define SGMII_IF_MODE_FORCE_DUPLEX BIT(4)
39#define SGMII_IF_MODE_FORCE_SPEED_S 0x2
40#define SGMII_IF_MODE_FORCE_SPEED_M 0x0c
41#define SGMII_IF_MODE_ADVERT_AN BIT(1)
42
43/* Values of SGMII_IF_MODE_FORCE_SPEED */
44#define SGMII_IF_MODE_FORCE_SPEED_10 0
45#define SGMII_IF_MODE_FORCE_SPEED_100 1
46#define SGMII_IF_MODE_FORCE_SPEED_1000 2
47
48/* Fields of QPHY_PWR_STATE_CTRL */
49#define PHYA_PWD BIT(4)
50
51/* Fields of ANA_CKBG */
52#define SSUSB_PLL_SSC_EN BIT(21)
53
54/* Fields of ANA_DA_FORCE_MODE1 */
55#define FORCE_PLL_SSC_EN BIT(30)
56
57/* Fields of PHYA_CTRL_SIGNAL3 */
58#define RG_TPHY_SPEED_S 2
59#define RG_TPHY_SPEED_M 0x0c
60
61/* Values of RG_TPHY_SPEED */
62#define RG_TPHY_SPEED_1000 0
63#define RG_TPHY_SPEED_2500 1
64
65/* Fields of PHYA_ANA_SYSPLL */
66#define RG_VUSB10_ON BIT(29)
67
68/* Unique fields of (M)HWSTRAP for MT7531 */
69#define XTAL_FSEL_S 7
70#define XTAL_FSEL_M BIT(7)
71#define PHY_EN BIT(6)
72#define CHG_STRAP BIT(8)
73
74/* Efuse Register Define */
75#define GBE_EFUSE 0x7bc8
76#define GBE_SEL_EFUSE_EN BIT(0)
77
78/* PHY ENABLE Register bitmap define */
79#define PHY_DEV1F 0x1f
80#define PHY_DEV1F_REG_44 0x44
81#define PHY_DEV1F_REG_104 0x104
82#define PHY_DEV1F_REG_10A 0x10a
83#define PHY_DEV1F_REG_10B 0x10b
84#define PHY_DEV1F_REG_10C 0x10c
85#define PHY_DEV1F_REG_10D 0x10d
86#define PHY_DEV1F_REG_268 0x268
87#define PHY_DEV1F_REG_269 0x269
88#define PHY_DEV1F_REG_26A 0x26A
89#define PHY_DEV1F_REG_403 0x403
90
91/* Fields of PHY_DEV1F_REG_403 */
92#define GBE_EFUSE_SETTING BIT(3)
93#define PHY_EN_BYPASS_MODE BIT(4)
94#define POWER_ON_OFF BIT(5)
95#define PHY_PLL_M GENMASK(9, 8)
96#define PHY_PLL_SEL(x) (((x) << 8) & GENMASK(9, 8))
97
98/* PHY EEE Register bitmap of define */
99#define PHY_DEV07 0x07
100#define PHY_DEV07_REG_03C 0x3c
101
102/* PHY Extend Register 0x14 bitmap of define */
103#define PHY_EXT_REG_14 0x14
104
105/* Fields of PHY_EXT_REG_14 */
106#define PHY_EN_DOWN_SHFIT BIT(4)
107
108/* PHY Extend Register 0x17 bitmap of define */
109#define PHY_EXT_REG_17 0x17
110
111/* Fields of PHY_EXT_REG_17 */
112#define PHY_LINKDOWN_POWER_SAVING_EN BIT(4)
113
114/* PHY PMA Register 0x17 bitmap of define */
115#define SLV_DSP_READY_TIME_S 15
116#define SLV_DSP_READY_TIME_M (0xff << SLV_DSP_READY_TIME_S)
117
118/* PHY PMA Register 0x18 bitmap of define */
119#define ENABLE_RANDOM_UPDATE_TRIGGER BIT(8)
120
121/* PHY DEV 0x1e Register bitmap of define */
122#define PHY_DEV1E 0x1e
123#define PHY_TX_MLT3_BASE 0x0
124#define PHY_DEV1E_REG_13 0x13
125#define PHY_DEV1E_REG_14 0x14
126#define PHY_DEV1E_REG_41 0x41
127#define PHY_DEV1E_REG_A6 0xa6
128#define PHY_DEV1E_REG_0C6 0x0c6
129#define PHY_DEV1E_REG_0FE 0x0fe
130#define PHY_DEV1E_REG_123 0x123
131#define PHY_DEV1E_REG_141 0x141
132#define PHY_DEV1E_REG_189 0x189
133#define PHY_DEV1E_REG_234 0x234
134
developer432b8c02023-08-09 16:33:49 +0800135#define PHY_DEV1E_REG_2C7 0x2c7
136#define MTK_PHY_MAX_GAIN_MASK GENMASK(4, 0)
137#define MTK_PHY_MIN_GAIN_MASK GENMASK(12, 8)
138
developerfd40db22021-04-29 10:08:25 +0800139/* Fields of PHY_DEV1E_REG_0C6 */
140#define PHY_POWER_SAVING_S 8
141#define PHY_POWER_SAVING_M 0x300
142#define PHY_POWER_SAVING_TX 0x0
143
144/* Fields of PHY_DEV1E_REG_189 */
145#define DESCRAMBLER_CLEAR_EN 0x1
146
147/* Fields of PHY_DEV1E_REG_234 */
148#define TR_OPEN_LOOP_EN BIT(0)
149
150/* Port debug count register */
151#define DBG_CNT_BASE 0x3018
152#define DBG_CNT_PORT_BASE 0x100
153#define DBG_CNT(p) (DBG_CNT_BASE + \
154 (p) * DBG_CNT_PORT_BASE)
155#define DIS_CLR BIT(31)
156
157/* Values of XTAL_FSEL_S */
158#define XTAL_40MHZ 0
159#define XTAL_25MHZ 1
160
161#define PLLGP_EN 0x7820
162#define EN_COREPLL BIT(2)
163#define SW_CLKSW BIT(1)
164#define SW_PLLGP BIT(0)
165
166#define PLLGP_CR0 0x78a8
167#define RG_COREPLL_EN BIT(22)
168#define RG_COREPLL_POSDIV_S 23
169#define RG_COREPLL_POSDIV_M 0x3800000
170#define RG_COREPLL_SDM_PCW_S 1
171#define RG_COREPLL_SDM_PCW_M 0x3ffffe
172#define RG_COREPLL_SDM_PCW_CHG BIT(0)
173
174/* TOP Signals Status Register */
175#define TOP_SIG_SR 0x780c
176#define PAD_MCM_SMI_EN BIT(0)
177#define PAD_DUAL_SGMII_EN BIT(1)
178
179/* RGMII and SGMII PLL clock */
180#define ANA_PLLGP_CR2 0x78b0
181#define ANA_PLLGP_CR5 0x78bc
182
183/* GPIO mode define */
184#define GPIO_MODE_REGS(x) (0x7c0c + (((x) / 8) * 4))
185#define GPIO_MODE_S 4
186
187/* GPIO GROUP IOLB SMT0 Control */
188#define SMT0_IOLB 0x7f04
189#define SMT_IOLB_5_SMI_MDC_EN BIT(5)
190
191/* Unique fields of PMCR for MT7531 */
192#define FORCE_MODE_EEE1G BIT(25)
193#define FORCE_MODE_EEE100 BIT(26)
194#define FORCE_MODE_TX_FC BIT(27)
195#define FORCE_MODE_RX_FC BIT(28)
196#define FORCE_MODE_DPX BIT(29)
197#define FORCE_MODE_SPD BIT(30)
198#define FORCE_MODE_LNK BIT(31)
199#define FORCE_MODE BIT(15)
200
201#define CHIP_REV 0x781C
202#define CHIP_NAME_S 16
203#define CHIP_NAME_M 0xffff0000
204#define CHIP_REV_S 0
205#define CHIP_REV_M 0x0f
206#define CHIP_REV_E1 0x0
207
208#define CLKGEN_CTRL 0x7500
209#define CLK_SKEW_OUT_S 8
210#define CLK_SKEW_OUT_M 0x300
211#define CLK_SKEW_IN_S 6
212#define CLK_SKEW_IN_M 0xc0
213#define RXCLK_NO_DELAY BIT(5)
214#define TXCLK_NO_REVERSE BIT(4)
215#define GP_MODE_S 1
216#define GP_MODE_M 0x06
217#define GP_CLK_EN BIT(0)
218
219#define CPGC_CTRL 0xB0
220#define COL_EN BIT(0)
221#define COL_CLK_EN BIT(1)
222#define COL_RST_N BIT(2)
223#define COL_BUSY BIT(3)
224
225/* Values of GP_MODE */
226#define GP_MODE_RGMII 0
227#define GP_MODE_MII 1
228#define GP_MODE_REV_MII 2
229
230/* Values of CLK_SKEW_IN */
231#define CLK_SKEW_IN_NO_CHANGE 0
232#define CLK_SKEW_IN_DELAY_100PPS 1
233#define CLK_SKEW_IN_DELAY_200PPS 2
234#define CLK_SKEW_IN_REVERSE 3
235
236/* Values of CLK_SKEW_OUT */
237#define CLK_SKEW_OUT_NO_CHANGE 0
238#define CLK_SKEW_OUT_DELAY_100PPS 1
239#define CLK_SKEW_OUT_DELAY_200PPS 2
240#define CLK_SKEW_OUT_REVERSE 3
241
242/* Proprietory Control Register of Internal Phy device 0x1e */
243#define RXADC_CONTROL_3 0xc2
244#define RXADC_LDO_CONTROL_2 0xd3
245
246/* Proprietory Control Register of Internal Phy device 0x1f */
247#define TXVLD_DA_271 0x271
248#define TXVLD_DA_272 0x272
249#define TXVLD_DA_273 0x273
250
251/* gpio pinmux pins and functions define */
252static int gpio_int_pins[] = {0};
253static int gpio_int_funcs[] = {1};
254static int gpio_mdc_pins[] = {11, 20};
255static int gpio_mdc_funcs[] = {2, 2};
256static int gpio_mdio_pins[] = {12, 21};
257static int gpio_mdio_funcs[] = {2, 2};
258
259static int mt7531_set_port_sgmii_force_mode(struct gsw_mt753x *gsw, u32 port,
260 struct mt753x_port_cfg *port_cfg)
261{
262 u32 speed, port_base, val;
263 ktime_t timeout;
264 u32 timeout_us;
265
266 if (port < 5 || port >= MT753X_NUM_PORTS) {
267 dev_info(gsw->dev, "port %d is not a SGMII port\n", port);
268 return -EINVAL;
269 }
270
271 port_base = port - 5;
272
273 switch (port_cfg->speed) {
274 case MAC_SPD_1000:
275 speed = RG_TPHY_SPEED_1000;
276 break;
277 case MAC_SPD_2500:
278 speed = RG_TPHY_SPEED_2500;
279 break;
280 default:
281 dev_info(gsw->dev, "invalid SGMII speed idx %d for port %d\n",
282 port_cfg->speed, port);
283
284 speed = RG_TPHY_SPEED_1000;
285 }
286
287 /* Step 1: Speed select register setting */
288 val = mt753x_reg_read(gsw, PHYA_CTRL_SIGNAL3(port_base));
289 val &= ~RG_TPHY_SPEED_M;
290 val |= speed << RG_TPHY_SPEED_S;
291 mt753x_reg_write(gsw, PHYA_CTRL_SIGNAL3(port_base), val);
292
293 /* Step 2 : Disable AN */
294 val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
295 val &= ~SGMII_AN_ENABLE;
296 mt753x_reg_write(gsw, PCS_CONTROL_1(port_base), val);
297
298 /* Step 3: SGMII force mode setting */
299 val = mt753x_reg_read(gsw, SGMII_MODE(port_base));
300 val &= ~SGMII_IF_MODE_ADVERT_AN;
301 val &= ~SGMII_IF_MODE_FORCE_SPEED_M;
302 val |= SGMII_IF_MODE_FORCE_SPEED_1000 << SGMII_IF_MODE_FORCE_SPEED_S;
303 val |= SGMII_IF_MODE_FORCE_DUPLEX;
304 /* For sgmii force mode, 0 is full duplex and 1 is half duplex */
305 if (port_cfg->duplex)
306 val &= ~SGMII_IF_MODE_FORCE_DUPLEX;
307
308 mt753x_reg_write(gsw, SGMII_MODE(port_base), val);
309
310 /* Step 4: XXX: Disable Link partner's AN and set force mode */
311
312 /* Step 5: XXX: Special setting for PHYA ==> reserved for flexible */
313
314 /* Step 6 : Release PHYA power down state */
315 val = mt753x_reg_read(gsw, QPHY_PWR_STATE_CTRL(port_base));
316 val &= ~PHYA_PWD;
317 mt753x_reg_write(gsw, QPHY_PWR_STATE_CTRL(port_base), val);
318
319 /* Step 7 : Polling SGMII_LINK_STATUS */
320 timeout_us = 2000000;
321 timeout = ktime_add_us(ktime_get(), timeout_us);
322 while (1) {
323 val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
324 val &= SGMII_LINK_STATUS;
325
326 if (val)
327 break;
328
329 if (ktime_compare(ktime_get(), timeout) > 0)
330 return -ETIMEDOUT;
331 }
332
333 return 0;
334}
335
336static int mt7531_set_port_sgmii_an_mode(struct gsw_mt753x *gsw, u32 port,
337 struct mt753x_port_cfg *port_cfg)
338{
339 u32 speed, port_base, val;
340 ktime_t timeout;
341 u32 timeout_us;
342
343 if (port < 5 || port >= MT753X_NUM_PORTS) {
344 dev_info(gsw->dev, "port %d is not a SGMII port\n", port);
345 return -EINVAL;
346 }
347
348 port_base = port - 5;
349
350 switch (port_cfg->speed) {
351 case MAC_SPD_1000:
352 speed = RG_TPHY_SPEED_1000;
353 break;
354 case MAC_SPD_2500:
355 speed = RG_TPHY_SPEED_2500;
356 break;
357 default:
358 dev_info(gsw->dev, "invalid SGMII speed idx %d for port %d\n",
359 port_cfg->speed, port);
360
361 speed = RG_TPHY_SPEED_1000;
362 }
363
364 /* Step 1: Speed select register setting */
365 val = mt753x_reg_read(gsw, PHYA_CTRL_SIGNAL3(port_base));
366 val &= ~RG_TPHY_SPEED_M;
367 val |= speed << RG_TPHY_SPEED_S;
368 mt753x_reg_write(gsw, PHYA_CTRL_SIGNAL3(port_base), val);
369
370 /* Step 2: Remote fault disable */
371 val = mt753x_reg_read(gsw, SGMII_MODE(port));
372 val |= SGMII_REMOTE_FAULT_DIS;
373 mt753x_reg_write(gsw, SGMII_MODE(port), val);
374
375 /* Step 3: Setting Link partner's AN enable = 1 */
376
377 /* Step 4: Setting Link partner's device ability for speed/duplex */
378
379 /* Step 5: AN re-start */
380 val = mt753x_reg_read(gsw, PCS_CONTROL_1(port));
381 val |= SGMII_AN_RESTART;
382 mt753x_reg_write(gsw, PCS_CONTROL_1(port), val);
383
384 /* Step 6: Special setting for PHYA ==> reserved for flexible */
385
386 /* Step 7 : Polling SGMII_LINK_STATUS */
387 timeout_us = 2000000;
388 timeout = ktime_add_us(ktime_get(), timeout_us);
389 while (1) {
390 val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
391 val &= SGMII_LINK_STATUS;
392
393 if (val)
394 break;
395
396 if (ktime_compare(ktime_get(), timeout) > 0)
397 return -ETIMEDOUT;
398 }
399
400 return 0;
401}
402
403static void mt7531_sgmii_ssc(struct gsw_mt753x *gsw, u32 port, int enable)
404{
405 u32 val;
406 u32 port_base = port - 5;
407
408 if (enable) {
409 val = mt753x_reg_read(gsw, ANA_CKBG(port_base));
410 val |= SSUSB_PLL_SSC_EN;
411 mt753x_reg_write(gsw, ANA_CKBG(port_base), val);
412
413 val = mt753x_reg_read(gsw, ANA_DA_FORCE_MODE1(port_base));
414 val |= FORCE_PLL_SSC_EN;
415 mt753x_reg_write(gsw, ANA_DA_FORCE_MODE1(port_base), val);
416 } else {
417 val = mt753x_reg_read(gsw, ANA_CKBG(port_base));
418 val &= ~SSUSB_PLL_SSC_EN;
419 mt753x_reg_write(gsw, ANA_CKBG(port_base), val);
420
421 val = mt753x_reg_read(gsw, ANA_DA_FORCE_MODE1(port_base));
422 val &= ~FORCE_PLL_SSC_EN;
423 mt753x_reg_write(gsw, ANA_DA_FORCE_MODE1(port_base), val);
424 }
425}
426
427static int mt7531_set_port_rgmii(struct gsw_mt753x *gsw, u32 port)
428{
429 u32 val;
430
431 if (port != 5) {
432 dev_info(gsw->dev, "RGMII mode is not available for port %d\n",
433 port);
434 return -EINVAL;
435 }
436
437 val = mt753x_reg_read(gsw, CLKGEN_CTRL);
438 val |= GP_CLK_EN;
439 val &= ~GP_MODE_M;
440 val |= GP_MODE_RGMII << GP_MODE_S;
441 val |= TXCLK_NO_REVERSE;
442 val |= RXCLK_NO_DELAY;
443 val &= ~CLK_SKEW_IN_M;
444 val |= CLK_SKEW_IN_NO_CHANGE << CLK_SKEW_IN_S;
445 val &= ~CLK_SKEW_OUT_M;
446 val |= CLK_SKEW_OUT_NO_CHANGE << CLK_SKEW_OUT_S;
447 mt753x_reg_write(gsw, CLKGEN_CTRL, val);
448
449 return 0;
450}
451
452static int mt7531_mac_port_setup(struct gsw_mt753x *gsw, u32 port,
453 struct mt753x_port_cfg *port_cfg)
454{
455 u32 pmcr;
456 u32 speed;
457
458 if (port < 5 || port >= MT753X_NUM_PORTS) {
459 dev_info(gsw->dev, "port %d is not a MAC port\n", port);
460 return -EINVAL;
461 }
462
463 if (port_cfg->enabled) {
464 pmcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
465 MAC_MODE | MAC_TX_EN | MAC_RX_EN |
466 BKOFF_EN | BACKPR_EN;
467
468 if (port_cfg->force_link) {
469 /* PMCR's speed field 0x11 is reserved,
470 * sw should set 0x10
471 */
472 speed = port_cfg->speed;
473 if (port_cfg->speed == MAC_SPD_2500)
474 speed = MAC_SPD_1000;
475
476 pmcr |= FORCE_MODE_LNK | FORCE_LINK |
477 FORCE_MODE_SPD | FORCE_MODE_DPX |
478 FORCE_MODE_RX_FC | FORCE_MODE_TX_FC |
479 FORCE_RX_FC | FORCE_TX_FC |
480 (speed << FORCE_SPD_S);
481
482 if (port_cfg->duplex)
483 pmcr |= FORCE_DPX;
484 }
485 } else {
486 pmcr = FORCE_MODE_LNK;
487 }
488
489 switch (port_cfg->phy_mode) {
490 case PHY_INTERFACE_MODE_RGMII:
491 mt7531_set_port_rgmii(gsw, port);
492 break;
493 case PHY_INTERFACE_MODE_SGMII:
494 if (port_cfg->force_link)
495 mt7531_set_port_sgmii_force_mode(gsw, port, port_cfg);
496 else
497 mt7531_set_port_sgmii_an_mode(gsw, port, port_cfg);
498
499 mt7531_sgmii_ssc(gsw, port, port_cfg->ssc_on);
500 break;
501 default:
502 if (port_cfg->enabled)
503 dev_info(gsw->dev, "%s is not supported by port %d\n",
504 phy_modes(port_cfg->phy_mode), port);
505
506 pmcr = FORCE_MODE_LNK;
507 }
508
509 mt753x_reg_write(gsw, PMCR(port), pmcr);
510
511 return 0;
512}
513
514static void mt7531_core_pll_setup(struct gsw_mt753x *gsw)
515{
516 u32 val;
517 u32 top_sig;
518 u32 hwstrap;
519 u32 xtal;
520
521 val = mt753x_reg_read(gsw, CHIP_REV);
522 top_sig = mt753x_reg_read(gsw, TOP_SIG_SR);
523 hwstrap = mt753x_reg_read(gsw, HWSTRAP);
524 if ((val & CHIP_REV_M) > 0)
525 xtal = (top_sig & PAD_MCM_SMI_EN) ? XTAL_40MHZ : XTAL_25MHZ;
526 else
527 xtal = (hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S;
528
529 /* dump HW strap and XTAL */
530 dev_info(gsw->dev, "HWSTRAP=0x%x XTAL=%dMHz\n", hwstrap,
531 (xtal == XTAL_25MHZ) ? 25 : 40);
532
533 /* Only BE needs additional setting */
534 if (top_sig & PAD_DUAL_SGMII_EN)
535 return;
536
537 /* Disable Port5 SGMII clearly */
538 val = mt753x_reg_read(gsw, PHYA_ANA_SYSPLL(0));
539 val &= ~RG_VUSB10_ON;
540 mt753x_reg_write(gsw, PHYA_ANA_SYSPLL(0), val);
541
542 switch (xtal) {
543 case XTAL_25MHZ:
544 /* Step 1 : Disable MT7531 COREPLL */
545 val = mt753x_reg_read(gsw, PLLGP_EN);
546 val &= ~EN_COREPLL;
547 mt753x_reg_write(gsw, PLLGP_EN, val);
548
549 /* Step 2: switch to XTAL output */
550 val = mt753x_reg_read(gsw, PLLGP_EN);
551 val |= SW_CLKSW;
552 mt753x_reg_write(gsw, PLLGP_EN, val);
553
554 val = mt753x_reg_read(gsw, PLLGP_CR0);
555 val &= ~RG_COREPLL_EN;
556 mt753x_reg_write(gsw, PLLGP_CR0, val);
557
558 /* Step 3: disable PLLGP and enable program PLLGP */
559 val = mt753x_reg_read(gsw, PLLGP_EN);
560 val |= SW_PLLGP;
561 mt753x_reg_write(gsw, PLLGP_EN, val);
562
563 /* Step 4: program COREPLL output frequency to 500MHz */
564 val = mt753x_reg_read(gsw, PLLGP_CR0);
565 val &= ~RG_COREPLL_POSDIV_M;
566 val |= 2 << RG_COREPLL_POSDIV_S;
567 mt753x_reg_write(gsw, PLLGP_CR0, val);
568 usleep_range(25, 35);
569
570 val = mt753x_reg_read(gsw, PLLGP_CR0);
571 val &= ~RG_COREPLL_SDM_PCW_M;
572 val |= 0x140000 << RG_COREPLL_SDM_PCW_S;
573 mt753x_reg_write(gsw, PLLGP_CR0, val);
574
575 /* Set feedback divide ratio update signal to high */
576 val = mt753x_reg_read(gsw, PLLGP_CR0);
577 val |= RG_COREPLL_SDM_PCW_CHG;
578 mt753x_reg_write(gsw, PLLGP_CR0, val);
579 /* Wait for at least 16 XTAL clocks */
580 usleep_range(10, 20);
581
582 /* Step 5: set feedback divide ratio update signal to low */
583 val = mt753x_reg_read(gsw, PLLGP_CR0);
584 val &= ~RG_COREPLL_SDM_PCW_CHG;
585 mt753x_reg_write(gsw, PLLGP_CR0, val);
586
587 /* Enable 325M clock for SGMII */
588 mt753x_reg_write(gsw, ANA_PLLGP_CR5, 0xad0000);
589
590 /* Enable 250SSC clock for RGMII */
591 mt753x_reg_write(gsw, ANA_PLLGP_CR2, 0x4f40000);
592
593 /* Step 6: Enable MT7531 PLL */
594 val = mt753x_reg_read(gsw, PLLGP_CR0);
595 val |= RG_COREPLL_EN;
596 mt753x_reg_write(gsw, PLLGP_CR0, val);
597
598 val = mt753x_reg_read(gsw, PLLGP_EN);
599 val |= EN_COREPLL;
600 mt753x_reg_write(gsw, PLLGP_EN, val);
601 usleep_range(25, 35);
602
603 break;
604 case XTAL_40MHZ:
605 /* Step 1 : Disable MT7531 COREPLL */
606 val = mt753x_reg_read(gsw, PLLGP_EN);
607 val &= ~EN_COREPLL;
608 mt753x_reg_write(gsw, PLLGP_EN, val);
609
610 /* Step 2: switch to XTAL output */
611 val = mt753x_reg_read(gsw, PLLGP_EN);
612 val |= SW_CLKSW;
613 mt753x_reg_write(gsw, PLLGP_EN, val);
614
615 val = mt753x_reg_read(gsw, PLLGP_CR0);
616 val &= ~RG_COREPLL_EN;
617 mt753x_reg_write(gsw, PLLGP_CR0, val);
618
619 /* Step 3: disable PLLGP and enable program PLLGP */
620 val = mt753x_reg_read(gsw, PLLGP_EN);
621 val |= SW_PLLGP;
622 mt753x_reg_write(gsw, PLLGP_EN, val);
623
624 /* Step 4: program COREPLL output frequency to 500MHz */
625 val = mt753x_reg_read(gsw, PLLGP_CR0);
626 val &= ~RG_COREPLL_POSDIV_M;
627 val |= 2 << RG_COREPLL_POSDIV_S;
628 mt753x_reg_write(gsw, PLLGP_CR0, val);
629 usleep_range(25, 35);
630
631 val = mt753x_reg_read(gsw, PLLGP_CR0);
632 val &= ~RG_COREPLL_SDM_PCW_M;
633 val |= 0x190000 << RG_COREPLL_SDM_PCW_S;
634 mt753x_reg_write(gsw, PLLGP_CR0, val);
635
636 /* Set feedback divide ratio update signal to high */
637 val = mt753x_reg_read(gsw, PLLGP_CR0);
638 val |= RG_COREPLL_SDM_PCW_CHG;
639 mt753x_reg_write(gsw, PLLGP_CR0, val);
640 /* Wait for at least 16 XTAL clocks */
641 usleep_range(10, 20);
642
643 /* Step 5: set feedback divide ratio update signal to low */
644 val = mt753x_reg_read(gsw, PLLGP_CR0);
645 val &= ~RG_COREPLL_SDM_PCW_CHG;
646 mt753x_reg_write(gsw, PLLGP_CR0, val);
647
648 /* Enable 325M clock for SGMII */
649 mt753x_reg_write(gsw, ANA_PLLGP_CR5, 0xad0000);
650
651 /* Enable 250SSC clock for RGMII */
652 mt753x_reg_write(gsw, ANA_PLLGP_CR2, 0x4f40000);
653
654 /* Step 6: Enable MT7531 PLL */
655 val = mt753x_reg_read(gsw, PLLGP_CR0);
656 val |= RG_COREPLL_EN;
657 mt753x_reg_write(gsw, PLLGP_CR0, val);
658
659 val = mt753x_reg_read(gsw, PLLGP_EN);
660 val |= EN_COREPLL;
661 mt753x_reg_write(gsw, PLLGP_EN, val);
662 usleep_range(25, 35);
663 break;
664 }
665}
666
667static int mt7531_internal_phy_calibration(struct gsw_mt753x *gsw)
668{
669 return 0;
670}
671
672static int mt7531_sw_detect(struct gsw_mt753x *gsw, struct chip_rev *crev)
673{
674 u32 rev, topsig;
675
676 rev = mt753x_reg_read(gsw, CHIP_REV);
677
678 if (((rev & CHIP_NAME_M) >> CHIP_NAME_S) == MT7531) {
679 if (crev) {
680 topsig = mt753x_reg_read(gsw, TOP_SIG_SR);
681
682 crev->rev = rev & CHIP_REV_M;
683 crev->name = topsig & PAD_DUAL_SGMII_EN ?
684 "MT7531AE" : "MT7531BE";
685 }
686
687 return 0;
688 }
689
690 return -ENODEV;
691}
692
developer2cdaeb12022-10-04 20:25:05 +0800693static int mt7988_sw_detect(struct gsw_mt753x *gsw, struct chip_rev *crev)
694{
695 const char *model;
696 struct device_node *np;
697
698 np = of_find_compatible_node(NULL, NULL, "mediatek,mt7988-switch");
699 if (!np)
700 return -ENODEV;
701
702 of_node_put(np);
703
704 crev->rev = 0;
705 crev->name = "MT7988";
706 gsw->direct_access = true;
707
708 return 0;
709}
710
developerfd40db22021-04-29 10:08:25 +0800711static void pinmux_set_mux_7531(struct gsw_mt753x *gsw, u32 pin, u32 mode)
712{
713 u32 val;
714
715 val = mt753x_reg_read(gsw, GPIO_MODE_REGS(pin));
716 val &= ~(0xf << (pin & 7) * GPIO_MODE_S);
717 val |= mode << (pin & 7) * GPIO_MODE_S;
718 mt753x_reg_write(gsw, GPIO_MODE_REGS(pin), val);
719}
720
721static int mt7531_set_gpio_pinmux(struct gsw_mt753x *gsw)
722{
723 u32 group = 0;
724 struct device_node *np = gsw->dev->of_node;
725
726 /* Set GPIO 0 interrupt mode */
727 pinmux_set_mux_7531(gsw, gpio_int_pins[0], gpio_int_funcs[0]);
728
729 of_property_read_u32(np, "mediatek,mdio_master_pinmux", &group);
730
731 /* group = 0: do nothing, 1: 1st group (AE), 2: 2nd group (BE) */
732 if (group > 0 && group <= 2) {
733 group--;
734 pinmux_set_mux_7531(gsw, gpio_mdc_pins[group],
735 gpio_mdc_funcs[group]);
736 pinmux_set_mux_7531(gsw, gpio_mdio_pins[group],
737 gpio_mdio_funcs[group]);
738 }
739
740 return 0;
741}
742
743static void mt7531_phy_pll_setup(struct gsw_mt753x *gsw)
744{
745 u32 hwstrap;
746 u32 val;
747
748 val = mt753x_reg_read(gsw, CHIP_REV);
749 if ((val & CHIP_REV_M) > 0)
750 return;
751
752 hwstrap = mt753x_reg_read(gsw, HWSTRAP);
753
754 switch ((hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S) {
755 case XTAL_25MHZ:
756 /* disable pll auto calibration */
757 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_104, 0x608);
758
759 /* change pll sel */
760 val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
761 PHY_DEV1F_REG_403);
762 val &= ~(PHY_PLL_M);
763 val |= PHY_PLL_SEL(3);
764 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
765
766 /* set divider ratio */
767 gsw->mmd_write(gsw, 0, PHY_DEV1F,
768 PHY_DEV1F_REG_10A, 0x1009);
769
770 /* set divider ratio */
771 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10B, 0x7c6);
772
773 /* capacitance and resistance adjustment */
774 gsw->mmd_write(gsw, 0, PHY_DEV1F,
775 PHY_DEV1F_REG_10C, 0xa8be);
776
777 break;
778 case XTAL_40MHZ:
779 /* disable pll auto calibration */
780 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_104, 0x608);
781
782 /* change pll sel */
783 val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
784 PHY_DEV1F_REG_403);
785 val &= ~(PHY_PLL_M);
786 val |= PHY_PLL_SEL(3);
787 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
788
789 /* set divider ratio */
790 gsw->mmd_write(gsw, 0, PHY_DEV1F,
791 PHY_DEV1F_REG_10A, 0x1018);
792
793 /* set divider ratio */
794 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10B, 0xc676);
795
796 /* capacitance and resistance adjustment */
797 gsw->mmd_write(gsw, 0, PHY_DEV1F,
798 PHY_DEV1F_REG_10C, 0xd8be);
799 break;
800 }
801
802 /* power down pll. additional delay is not required via mdio access */
803 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10D, 0x10);
804
805 /* power up pll */
806 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10D, 0x14);
807}
808
809/* 12 registers for TX_MLT3 waveform tuning.
810 * 012 345 678 9ab
811 * 1 __
812 * _/ \_
813 * 0_/ \
814 * \_ _/
815 * -1 \__/
816 */
817static void mt7531_phy_100m_eye_diag_setting(struct gsw_mt753x *gsw, u32 port)
818{
819 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x0, 0x187);
820 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x1, 0x1c9);
821 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x2, 0x1c6);
822 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x3, 0x182);
823 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x4, 0x208);
824 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x5, 0x205);
825 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x6, 0x384);
826 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x7, 0x3cb);
827 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x8, 0x3c4);
828 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0x9, 0x30a);
829 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0xa, 0x00b);
830 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_TX_MLT3_BASE + 0xb, 0x002);
831}
832
833static void mt7531_phy_setting(struct gsw_mt753x *gsw)
834{
835 int i;
836 u32 val;
837
838 for (i = 0; i < MT753X_NUM_PHYS; i++) {
developerf05be262022-12-22 16:16:16 +0800839 mt7531_phy_100m_eye_diag_setting(gsw, i);
developerfd40db22021-04-29 10:08:25 +0800840
841 /* Enable HW auto downshift */
842 gsw->mii_write(gsw, i, 0x1f, 0x1);
843 val = gsw->mii_read(gsw, i, PHY_EXT_REG_14);
844 val |= PHY_EN_DOWN_SHFIT;
845 gsw->mii_write(gsw, i, PHY_EXT_REG_14, val);
846
847 /* Decrease SlvDPSready time */
848 val = mt753x_tr_read(gsw, i, PMA_CH, PMA_NOD, PMA_17);
849 val &= ~SLV_DSP_READY_TIME_M;
850 val |= 0xc << SLV_DSP_READY_TIME_S;
851 mt753x_tr_write(gsw, i, PMA_CH, PMA_NOD, PMA_17, val);
852
853 /* Enable Random Update Mechanism */
854 val = mt753x_tr_read(gsw, i, PMA_CH, PMA_NOD, PMA_18);
855 val |= ENABLE_RANDOM_UPDATE_TRIGGER;
856 mt753x_tr_write(gsw, i, PMA_CH, PMA_NOD, PMA_18, val);
857
858 /* PHY link down power saving enable */
859 val = gsw->mii_read(gsw, i, PHY_EXT_REG_17);
860 val |= PHY_LINKDOWN_POWER_SAVING_EN;
861 gsw->mii_write(gsw, i, PHY_EXT_REG_17, val);
862
developerf05be262022-12-22 16:16:16 +0800863 val = gsw->mmd_read(gsw, i, PHY_DEV1E,
864 PHY_DEV1E_REG_0C6);
865 val &= ~PHY_POWER_SAVING_M;
866 val |= PHY_POWER_SAVING_TX << PHY_POWER_SAVING_S;
867 gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_0C6,
868 val);
developerfd40db22021-04-29 10:08:25 +0800869
870 /* Timing Recovery for GbE slave mode */
871 mt753x_tr_write(gsw, i, PMA_CH, PMA_NOD, PMA_01, 0x6fb90a);
872 mt753x_tr_write(gsw, i, DSP_CH, DSP_NOD, DSP_06, 0x2ebaef);
873 val = gsw->mmd_read(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_234);
874 val |= TR_OPEN_LOOP_EN;
875 gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_234, val);
876
877 /* Enable Asymmetric Pause Capability */
878 val = gsw->mii_read(gsw, i, MII_ADVERTISE);
879 val |= ADVERTISE_PAUSE_ASYM;
880 gsw->mii_write(gsw, i, MII_ADVERTISE, val);
developer432b8c02023-08-09 16:33:49 +0800881
882 /* Adjust RX min/max gain to fix CH395 100Mbps link up fail */
883 gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_2C7,
884 FIELD_PREP(MTK_PHY_MAX_GAIN_MASK, 0x8) |
885 FIELD_PREP(MTK_PHY_MIN_GAIN_MASK, 0x13));
developerfd40db22021-04-29 10:08:25 +0800886 }
887}
888
889static void mt7531_adjust_line_driving(struct gsw_mt753x *gsw, u32 port)
890{
891 /* For ADC timing margin window for LDO calibration */
892 gsw->mmd_write(gsw, port, PHY_DEV1E, RXADC_LDO_CONTROL_2, 0x2222);
893
894 /* Adjust AD sample timing */
895 gsw->mmd_write(gsw, port, PHY_DEV1E, RXADC_CONTROL_3, 0x4444);
896
897 /* Adjust Line driver current for different mode */
898 gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_271, 0x2ca5);
899
900 /* Adjust Line driver current for different mode */
901 gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_272, 0xc6b);
902
903 /* Adjust Line driver gain for 10BT from 1000BT calibration result */
904 gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_273, 0x3000);
905
906 /* Adjust RX Echo path filter */
developerf05be262022-12-22 16:16:16 +0800907 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_0FE, 0x2);
developerfd40db22021-04-29 10:08:25 +0800908
909 /* Adjust RX HVGA bias current */
910 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_41, 0x3333);
911
912 /* Adjust TX class AB driver 1 */
913 gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_268, 0x384);
914
915 /* Adjust TX class AB driver 2 */
916 gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_269, 0x1114);
917
918 /* Adjust DAC delay for TX Pairs */
919 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_13, 0x404);
920 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_14, 0x404);
921
922 /* Adjust DAC digital delay for TX Delay */
923 gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_44, 0xc0);
924
925 /* Adjust Line driver compensation cap for stability concern due to
926 * increase current.
927 */
928 gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_26A, 0x3333);
929}
930
931static void mt7531_eee_setting(struct gsw_mt753x *gsw, u32 port)
932{
933 u32 val;
934
935 /* Disable EEE */
936 gsw->mmd_write(gsw, port, PHY_DEV07, PHY_DEV07_REG_03C, 0);
937
938 /* Disable generate signal to clear the scramble_lock when lpi mode */
939 val = gsw->mmd_read(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_189);
940 val &= ~DESCRAMBLER_CLEAR_EN;
941 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_189, val);
942
943 /* Roll back EEE Slave Mode */
944 gsw->mmd_write(gsw, port, 0x1e, 0x2d1, 0);
945 mt753x_tr_write(gsw, port, DSP_CH, DSP_NOD, DSP_08, 0x1b);
946 mt753x_tr_write(gsw, port, DSP_CH, DSP_NOD, DSP_0f, 0);
947 mt753x_tr_write(gsw, port, DSP_CH, DSP_NOD, DSP_10, 0x5000);
948
949 /* Adjust 100_mse_threshold */
950 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_123, 0xffff);
951
952 /* Disable mcc */
953 gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_A6, 0x300);
954}
955
956static void mt7531_afifo_reset(struct gsw_mt753x *gsw, int enable)
957{
958 int p;
959 u32 val;
960
961 if (enable) {
962 for (p = 0; p < MT753X_NUM_PORTS; p++) {
963 val = mt753x_reg_read(gsw, DBG_CNT(p));
964 val &= ~DIS_CLR;
965 mt753x_reg_write(gsw, DBG_CNT(p), val);
966 }
967 } else {
968 for (p = 0; p < MT753X_NUM_PORTS; p++) {
969 val = mt753x_reg_read(gsw, DBG_CNT(p));
970 val |= DIS_CLR;
971 mt753x_reg_write(gsw, DBG_CNT(p), val);
972 }
973 }
974}
975
976static int mt7531_sw_init(struct gsw_mt753x *gsw)
977{
978 int i;
979 u32 val;
980
981 gsw->phy_base = (gsw->smi_addr + 1) & MT753X_SMI_ADDR_MASK;
982
983 gsw->mii_read = mt753x_mii_read;
984 gsw->mii_write = mt753x_mii_write;
985 gsw->mmd_read = mt753x_mmd_read;
986 gsw->mmd_write = mt753x_mmd_write;
987
developer2cdaeb12022-10-04 20:25:05 +0800988 gsw->hw_phy_cal = of_property_read_bool(gsw->dev->of_node,
989 "mediatek,hw_phy_cal");
developerfd40db22021-04-29 10:08:25 +0800990
991 for (i = 0; i < MT753X_NUM_PHYS; i++) {
992 val = gsw->mii_read(gsw, i, MII_BMCR);
993 val |= BMCR_ISOLATE;
994 gsw->mii_write(gsw, i, MII_BMCR, val);
995 }
996
997 /* Force MAC link down before reset */
998 mt753x_reg_write(gsw, PMCR(5), FORCE_MODE_LNK);
999 mt753x_reg_write(gsw, PMCR(6), FORCE_MODE_LNK);
1000
1001 /* Switch soft reset */
1002 mt753x_reg_write(gsw, SYS_CTRL, SW_SYS_RST | SW_REG_RST);
developer2cdaeb12022-10-04 20:25:05 +08001003 udelay(20);
developerfd40db22021-04-29 10:08:25 +08001004
1005 /* Enable MDC input Schmitt Trigger */
1006 val = mt753x_reg_read(gsw, SMT0_IOLB);
1007 mt753x_reg_write(gsw, SMT0_IOLB, val | SMT_IOLB_5_SMI_MDC_EN);
1008
1009 /* Set 7531 gpio pinmux */
1010 mt7531_set_gpio_pinmux(gsw);
1011
1012 mt7531_core_pll_setup(gsw);
developer2cdaeb12022-10-04 20:25:05 +08001013
developerfd40db22021-04-29 10:08:25 +08001014 mt7531_mac_port_setup(gsw, 5, &gsw->port5_cfg);
1015 mt7531_mac_port_setup(gsw, 6, &gsw->port6_cfg);
1016
1017 /* Global mac control settings */
1018 mt753x_reg_write(gsw, GMACCR,
1019 (15 << MTCC_LMT_S) | (15 << MAX_RX_JUMBO_S) |
1020 RX_PKT_LEN_MAX_JUMBO);
1021
1022 /* Enable Collision Poll */
1023 val = mt753x_reg_read(gsw, CPGC_CTRL);
1024 val |= COL_CLK_EN;
1025 mt753x_reg_write(gsw, CPGC_CTRL, val);
1026 val |= COL_RST_N;
1027 mt753x_reg_write(gsw, CPGC_CTRL, val);
1028 val |= COL_EN;
1029 mt753x_reg_write(gsw, CPGC_CTRL, val);
1030
1031 /* Disable AFIFO reset for extra short IPG */
1032 mt7531_afifo_reset(gsw, 0);
1033
1034 return 0;
1035}
1036
developer2cdaeb12022-10-04 20:25:05 +08001037static int mt7988_sw_init(struct gsw_mt753x *gsw)
1038{
1039 struct device_node *switch_node = NULL;
1040 struct platform_device *pdev;
1041 int i;
1042 u32 val;
1043 u32 pmcr;
1044 u32 speed;
1045
developera48549f2022-12-29 17:34:13 +08001046 pdev = container_of(gsw->dev, struct platform_device, dev);
developer2cdaeb12022-10-04 20:25:05 +08001047 switch_node = of_find_node_by_name(NULL, "switch0");
1048 if (switch_node == NULL) {
1049 dev_err(&pdev->dev, "switch node invaild\n");
1050 return -ENOENT;
1051 }
1052
1053 gsw->base = of_iomap(switch_node, 0);
1054 if (IS_ERR(gsw->base)) {
1055 dev_err(&pdev->dev, "switch ioremap failed\n");
1056 return -EIO;
1057 }
1058
developer2cdaeb12022-10-04 20:25:05 +08001059 gsw->sysctrl_base = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1060 "mediatek,sysctrl");
1061 if (IS_ERR(gsw->sysctrl_base)) {
1062 dev_err(&pdev->dev, "no sysctl regmap found\n");
1063 return -ENODEV;
1064 }
1065
1066 /* reset control */
1067 regmap_write(gsw->sysctrl_base, ETH_RESET, 0x200);
1068 udelay(20);
1069 regmap_write(gsw->sysctrl_base, ETH_RESET, 0);
1070 udelay(20);
1071
1072 gsw->phy_base = (gsw->smi_addr + 1) & MT753X_SMI_ADDR_MASK;
1073
1074 gsw->mii_read = mt753x_mii_read;
1075 gsw->mii_write = mt753x_mii_write;
1076 gsw->mmd_read = mt753x_mmd_read;
1077 gsw->mmd_write = mt753x_mmd_write;
1078
developer2cdaeb12022-10-04 20:25:05 +08001079 speed = MAC_SPD_1000;
1080 pmcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
1081 MAC_MODE | MAC_TX_EN | MAC_RX_EN | BKOFF_EN |
1082 BACKPR_EN | FORCE_MODE_LNK | FORCE_LINK | FORCE_MODE_SPD |
1083 FORCE_MODE_DPX | FORCE_MODE_RX_FC | FORCE_MODE_TX_FC |
1084 FORCE_RX_FC | FORCE_TX_FC | (speed << FORCE_SPD_S) | FORCE_DPX;
1085
1086 mt753x_reg_write(gsw, PMCR(6), pmcr);
1087
1088 /* Global mac control settings */
1089 mt753x_reg_write(gsw, GMACCR,
1090 (15 << MTCC_LMT_S) | (15 << MAX_RX_JUMBO_S) |
1091 RX_PKT_LEN_MAX_JUMBO);
1092
1093 /* Enable Collision Poll */
1094 val = mt753x_reg_read(gsw, CPGC_CTRL);
1095 val |= COL_CLK_EN;
1096 mt753x_reg_write(gsw, CPGC_CTRL, val);
1097 val |= COL_RST_N;
1098 mt753x_reg_write(gsw, CPGC_CTRL, val);
1099 val |= COL_EN;
1100 mt753x_reg_write(gsw, CPGC_CTRL, val);
1101
1102 /* Disable AFIFO reset for extra short IPG */
1103 mt7531_afifo_reset(gsw, 0);
1104
developer2cdaeb12022-10-04 20:25:05 +08001105 return 0;
1106}
1107
developerfd40db22021-04-29 10:08:25 +08001108static int mt7531_sw_post_init(struct gsw_mt753x *gsw)
1109{
1110 int i;
1111 u32 val;
1112
1113 /* Let internal PHYs only Tx constant data in configure stage. */
1114 for (i = 0; i < MT753X_NUM_PHYS; i++)
1115 gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_141, 0x200);
1116
1117 /* Internal PHYs might be enabled by HW Bootstrapping, or bootloader.
1118 * Turn off PHYs before setup PHY PLL.
1119 */
1120 val = gsw->mmd_read(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403);
1121 val |= PHY_EN_BYPASS_MODE;
1122 val |= POWER_ON_OFF;
1123 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
1124
developerf05be262022-12-22 16:16:16 +08001125 mt7531_phy_pll_setup(gsw);
developerfd40db22021-04-29 10:08:25 +08001126
1127 /* Enable Internal PHYs before phy setting */
1128 val = gsw->mmd_read(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403);
1129 val |= PHY_EN_BYPASS_MODE;
1130 val &= ~POWER_ON_OFF;
1131 gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
1132
1133 mt7531_phy_setting(gsw);
1134
1135 for (i = 0; i < MT753X_NUM_PHYS; i++) {
1136 val = gsw->mii_read(gsw, i, MII_BMCR);
1137 val &= ~BMCR_ISOLATE;
1138 gsw->mii_write(gsw, i, MII_BMCR, val);
1139 }
1140
1141 for (i = 0; i < MT753X_NUM_PHYS; i++) {
1142 mt7531_adjust_line_driving(gsw, i);
1143 mt7531_eee_setting(gsw, i);
1144 }
1145
1146 /* Restore internal PHYs normal Tx function after configure stage. */
1147 for (i = 0; i < MT753X_NUM_PHYS; i++)
1148 gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_141, 0x0);
1149
developerf05be262022-12-22 16:16:16 +08001150 mt7531_internal_phy_calibration(gsw);
developer2cdaeb12022-10-04 20:25:05 +08001151
1152 /* PHY force slave disable, restart AN*/
1153 for (i = 0; i < MT753X_NUM_PHYS; i++) {
1154 gsw->mii_write(gsw, i, MII_CTRL1000, 0x200);
1155 gsw->mii_write(gsw, i, MII_BMCR, 0x1240);
1156 }
developerfd40db22021-04-29 10:08:25 +08001157
1158 return 0;
1159}
1160
1161struct mt753x_sw_id mt7531_id = {
1162 .model = MT7531,
1163 .detect = mt7531_sw_detect,
1164 .init = mt7531_sw_init,
1165 .post_init = mt7531_sw_post_init
1166};
1167
developer2cdaeb12022-10-04 20:25:05 +08001168struct mt753x_sw_id mt7988_id = {
1169 .model = MT7988,
1170 .detect = mt7988_sw_detect,
1171 .init = mt7988_sw_init,
developer2cdaeb12022-10-04 20:25:05 +08001172};
1173
developerfd40db22021-04-29 10:08:25 +08001174MODULE_LICENSE("GPL");
1175MODULE_AUTHOR("Zhanguo Ju <zhanguo.ju@mediatek.com>");
1176MODULE_DESCRIPTION("Driver for MediaTek MT753x Gigabit Switch");