Skip to content

Commit 969b15b

Browse files
committed
Merge branch 'net-mediatek-Add-MT7621-TRGMII-mode-support'
René van Dorst says: ==================== net: mediatek: Add MT7621 TRGMII mode support Like many other mediatek SOCs, the MT7621 SOC and the internal MT7530 switch both supports TRGMII mode. MT7621 TRGMII speed is fix 1200MBit. v1->v2: - Fix breakage on non MT7621 SOC - Support 25MHz and 40MHz XTAL as MT7530 clocksource ==================== Tested-by: "Frank Wunderlich" <[email protected]> Acked-by: Sean Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
2 parents b272a0a + 7ef6f6f commit 969b15b

File tree

4 files changed

+85
-14
lines changed

4 files changed

+85
-14
lines changed

drivers/net/dsa/mt7530.c

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -428,24 +428,48 @@ static int
428428
mt7530_pad_clk_setup(struct dsa_switch *ds, int mode)
429429
{
430430
struct mt7530_priv *priv = ds->priv;
431-
u32 ncpo1, ssc_delta, trgint, i;
431+
u32 ncpo1, ssc_delta, trgint, i, xtal;
432+
433+
xtal = mt7530_read(priv, MT7530_MHWTRAP) & HWTRAP_XTAL_MASK;
434+
435+
if (xtal == HWTRAP_XTAL_20MHZ) {
436+
dev_err(priv->dev,
437+
"%s: MT7530 with a 20MHz XTAL is not supported!\n",
438+
__func__);
439+
return -EINVAL;
440+
}
432441

433442
switch (mode) {
434443
case PHY_INTERFACE_MODE_RGMII:
435444
trgint = 0;
445+
/* PLL frequency: 125MHz */
436446
ncpo1 = 0x0c80;
437-
ssc_delta = 0x87;
438447
break;
439448
case PHY_INTERFACE_MODE_TRGMII:
440449
trgint = 1;
441-
ncpo1 = 0x1400;
442-
ssc_delta = 0x57;
450+
if (priv->id == ID_MT7621) {
451+
/* PLL frequency: 150MHz: 1.2GBit */
452+
if (xtal == HWTRAP_XTAL_40MHZ)
453+
ncpo1 = 0x0780;
454+
if (xtal == HWTRAP_XTAL_25MHZ)
455+
ncpo1 = 0x0a00;
456+
} else { /* PLL frequency: 250MHz: 2.0Gbit */
457+
if (xtal == HWTRAP_XTAL_40MHZ)
458+
ncpo1 = 0x0c80;
459+
if (xtal == HWTRAP_XTAL_25MHZ)
460+
ncpo1 = 0x1400;
461+
}
443462
break;
444463
default:
445464
dev_err(priv->dev, "xMII mode %d not supported\n", mode);
446465
return -EINVAL;
447466
}
448467

468+
if (xtal == HWTRAP_XTAL_25MHZ)
469+
ssc_delta = 0x57;
470+
else
471+
ssc_delta = 0x87;
472+
449473
mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK,
450474
P6_INTF_MODE(trgint));
451475

@@ -507,7 +531,9 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, int mode)
507531
mt7530_rmw(priv, MT7530_TRGMII_RD(i),
508532
RD_TAP_MASK, RD_TAP(16));
509533
else
510-
mt7623_trgmii_set(priv, GSW_INTF_MODE, INTF_MODE_TRGMII);
534+
if (priv->id != ID_MT7621)
535+
mt7623_trgmii_set(priv, GSW_INTF_MODE,
536+
INTF_MODE_TRGMII);
511537

512538
return 0;
513539
}
@@ -613,13 +639,13 @@ static void mt7530_adjust_link(struct dsa_switch *ds, int port,
613639
struct mt7530_priv *priv = ds->priv;
614640

615641
if (phy_is_pseudo_fixed_link(phydev)) {
616-
if (priv->id == ID_MT7530) {
617-
dev_dbg(priv->dev, "phy-mode for master device = %x\n",
618-
phydev->interface);
642+
dev_dbg(priv->dev, "phy-mode for master device = %x\n",
643+
phydev->interface);
619644

620-
/* Setup TX circuit incluing relevant PAD and driving */
621-
mt7530_pad_clk_setup(ds, phydev->interface);
645+
/* Setup TX circuit incluing relevant PAD and driving */
646+
mt7530_pad_clk_setup(ds, phydev->interface);
622647

648+
if (priv->id == ID_MT7530) {
623649
/* Setup RX circuit, relevant PAD and driving on the
624650
* host which must be placed after the setup on the
625651
* device side is all finished.

drivers/net/dsa/mt7530.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,10 @@ enum mt7530_vlan_port_attr {
244244

245245
/* Register for hw trap status */
246246
#define MT7530_HWTRAP 0x7800
247+
#define HWTRAP_XTAL_MASK (BIT(10) | BIT(9))
248+
#define HWTRAP_XTAL_25MHZ (BIT(10) | BIT(9))
249+
#define HWTRAP_XTAL_40MHZ (BIT(10))
250+
#define HWTRAP_XTAL_20MHZ (BIT(9))
247251

248252
/* Register for hw trap modification */
249253
#define MT7530_MHWTRAP 0x7804

drivers/net/ethernet/mediatek/mtk_eth_soc.c

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,28 @@ static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg)
134134
return _mtk_mdio_read(eth, phy_addr, phy_reg);
135135
}
136136

137+
static int mt7621_gmac0_rgmii_adjust(struct mtk_eth *eth,
138+
phy_interface_t interface)
139+
{
140+
u32 val;
141+
142+
/* Check DDR memory type. Currently DDR2 is not supported. */
143+
regmap_read(eth->ethsys, ETHSYS_SYSCFG, &val);
144+
if (val & SYSCFG_DRAM_TYPE_DDR2) {
145+
dev_err(eth->dev,
146+
"TRGMII mode with DDR2 memory is not supported!\n");
147+
return -EOPNOTSUPP;
148+
}
149+
150+
val = (interface == PHY_INTERFACE_MODE_TRGMII) ?
151+
ETHSYS_TRGMII_MT7621_DDR_PLL : 0;
152+
153+
regmap_update_bits(eth->ethsys, ETHSYS_CLKCFG0,
154+
ETHSYS_TRGMII_MT7621_MASK, val);
155+
156+
return 0;
157+
}
158+
137159
static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth, int speed)
138160
{
139161
u32 val;
@@ -183,9 +205,17 @@ static void mtk_phy_link_adjust(struct net_device *dev)
183205
break;
184206
}
185207

186-
if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_GMAC1_TRGMII) &&
187-
!mac->id && !mac->trgmii)
188-
mtk_gmac0_rgmii_adjust(mac->hw, dev->phydev->speed);
208+
if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_GMAC1_TRGMII) && !mac->id) {
209+
if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII_MT7621_CLK)) {
210+
if (mt7621_gmac0_rgmii_adjust(mac->hw,
211+
dev->phydev->interface))
212+
return;
213+
} else {
214+
if (!mac->trgmii)
215+
mtk_gmac0_rgmii_adjust(mac->hw,
216+
dev->phydev->speed);
217+
}
218+
}
189219

190220
if (dev->phydev->link)
191221
mcr |= MAC_MCR_FORCE_LINK;
@@ -2607,7 +2637,7 @@ static const struct mtk_soc_data mt2701_data = {
26072637
};
26082638

26092639
static const struct mtk_soc_data mt7621_data = {
2610-
.caps = MTK_SHARED_INT,
2640+
.caps = MT7621_CAPS,
26112641
.required_clks = MT7621_CLKS_BITMAP,
26122642
.required_pctl = false,
26132643
};

drivers/net/ethernet/mediatek/mtk_eth_soc.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,10 @@
363363
#define MT7622_ETH 7622
364364
#define MT7621_ETH 7621
365365

366+
/* ethernet system control register */
367+
#define ETHSYS_SYSCFG 0x10
368+
#define SYSCFG_DRAM_TYPE_DDR2 BIT(4)
369+
366370
/* ethernet subsystem config register */
367371
#define ETHSYS_SYSCFG0 0x14
368372
#define SYSCFG0_GE_MASK 0x3
@@ -377,6 +381,9 @@
377381
/* ethernet subsystem clock register */
378382
#define ETHSYS_CLKCFG0 0x2c
379383
#define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11)
384+
#define ETHSYS_TRGMII_MT7621_MASK (BIT(5) | BIT(6))
385+
#define ETHSYS_TRGMII_MT7621_APLL BIT(6)
386+
#define ETHSYS_TRGMII_MT7621_DDR_PLL BIT(5)
380387

381388
/* ethernet reset control register */
382389
#define ETHSYS_RSTCTRL 0x34
@@ -616,6 +623,7 @@ enum mtk_eth_path {
616623
#define MTK_SHARED_SGMII BIT(7)
617624
#define MTK_HWLRO BIT(8)
618625
#define MTK_SHARED_INT BIT(9)
626+
#define MTK_TRGMII_MT7621_CLK BIT(10)
619627

620628
/* Supported path present on SoCs */
621629
#define MTK_PATH_BIT(x) BIT((x) + 10)
@@ -667,6 +675,9 @@ enum mtk_eth_path {
667675

668676
#define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x))
669677

678+
#define MT7621_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_TRGMII | \
679+
MTK_GMAC2_RGMII | MTK_SHARED_INT | MTK_TRGMII_MT7621_CLK)
680+
670681
#define MT7622_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_SGMII | MTK_GMAC2_RGMII | \
671682
MTK_GMAC2_SGMII | MTK_GDM1_ESW | \
672683
MTK_MUX_GDM1_TO_GMAC1_ESW | \

0 commit comments

Comments
 (0)