aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-06-22 19:58:24 -0400
committerDavid S. Miller <davem@davemloft.net>2019-06-22 19:58:24 -0400
commit969b15b002628ca4bb7fa4ee9c2e07bc545d0477 (patch)
treeafc69d89c4c42d77dc56f347cb5f591cc4ce6380
parentb272a0ad730103e84fb735fd0a8cc050cdf7f77c (diff)
parent7ef6f6f8d237fa6724108b57d9706cb5069688e4 (diff)
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" <frank-w@public-files.de> Acked-by: Sean Wang <sean.wang@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/dsa/mt7530.c46
-rw-r--r--drivers/net/dsa/mt7530.h4
-rw-r--r--drivers/net/ethernet/mediatek/mtk_eth_soc.c38
-rw-r--r--drivers/net/ethernet/mediatek/mtk_eth_soc.h11
4 files changed, 85 insertions, 14 deletions
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index c7d352da5448..3181e95586d6 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -428,24 +428,48 @@ static int
428mt7530_pad_clk_setup(struct dsa_switch *ds, int mode) 428mt7530_pad_clk_setup(struct dsa_switch *ds, int mode)
429{ 429{
430 struct mt7530_priv *priv = ds->priv; 430 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 }
432 441
433 switch (mode) { 442 switch (mode) {
434 case PHY_INTERFACE_MODE_RGMII: 443 case PHY_INTERFACE_MODE_RGMII:
435 trgint = 0; 444 trgint = 0;
445 /* PLL frequency: 125MHz */
436 ncpo1 = 0x0c80; 446 ncpo1 = 0x0c80;
437 ssc_delta = 0x87;
438 break; 447 break;
439 case PHY_INTERFACE_MODE_TRGMII: 448 case PHY_INTERFACE_MODE_TRGMII:
440 trgint = 1; 449 trgint = 1;
441 ncpo1 = 0x1400; 450 if (priv->id == ID_MT7621) {
442 ssc_delta = 0x57; 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 }
443 break; 462 break;
444 default: 463 default:
445 dev_err(priv->dev, "xMII mode %d not supported\n", mode); 464 dev_err(priv->dev, "xMII mode %d not supported\n", mode);
446 return -EINVAL; 465 return -EINVAL;
447 } 466 }
448 467
468 if (xtal == HWTRAP_XTAL_25MHZ)
469 ssc_delta = 0x57;
470 else
471 ssc_delta = 0x87;
472
449 mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK, 473 mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK,
450 P6_INTF_MODE(trgint)); 474 P6_INTF_MODE(trgint));
451 475
@@ -507,7 +531,9 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, int mode)
507 mt7530_rmw(priv, MT7530_TRGMII_RD(i), 531 mt7530_rmw(priv, MT7530_TRGMII_RD(i),
508 RD_TAP_MASK, RD_TAP(16)); 532 RD_TAP_MASK, RD_TAP(16));
509 else 533 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);
511 537
512 return 0; 538 return 0;
513} 539}
@@ -613,13 +639,13 @@ static void mt7530_adjust_link(struct dsa_switch *ds, int port,
613 struct mt7530_priv *priv = ds->priv; 639 struct mt7530_priv *priv = ds->priv;
614 640
615 if (phy_is_pseudo_fixed_link(phydev)) { 641 if (phy_is_pseudo_fixed_link(phydev)) {
616 if (priv->id == ID_MT7530) { 642 dev_dbg(priv->dev, "phy-mode for master device = %x\n",
617 dev_dbg(priv->dev, "phy-mode for master device = %x\n", 643 phydev->interface);
618 phydev->interface);
619 644
620 /* Setup TX circuit incluing relevant PAD and driving */ 645 /* Setup TX circuit incluing relevant PAD and driving */
621 mt7530_pad_clk_setup(ds, phydev->interface); 646 mt7530_pad_clk_setup(ds, phydev->interface);
622 647
648 if (priv->id == ID_MT7530) {
623 /* Setup RX circuit, relevant PAD and driving on the 649 /* Setup RX circuit, relevant PAD and driving on the
624 * host which must be placed after the setup on the 650 * host which must be placed after the setup on the
625 * device side is all finished. 651 * device side is all finished.
diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
index 4331429969fa..bfac90f48102 100644
--- a/drivers/net/dsa/mt7530.h
+++ b/drivers/net/dsa/mt7530.h
@@ -244,6 +244,10 @@ enum mt7530_vlan_port_attr {
244 244
245/* Register for hw trap status */ 245/* Register for hw trap status */
246#define MT7530_HWTRAP 0x7800 246#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))
247 251
248/* Register for hw trap modification */ 252/* Register for hw trap modification */
249#define MT7530_MHWTRAP 0x7804 253#define MT7530_MHWTRAP 0x7804
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index f27efe4110cc..066712f2e985 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -134,6 +134,28 @@ static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg)
134 return _mtk_mdio_read(eth, phy_addr, phy_reg); 134 return _mtk_mdio_read(eth, phy_addr, phy_reg);
135} 135}
136 136
137static 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
137static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth, int speed) 159static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth, int speed)
138{ 160{
139 u32 val; 161 u32 val;
@@ -183,9 +205,17 @@ static void mtk_phy_link_adjust(struct net_device *dev)
183 break; 205 break;
184 } 206 }
185 207
186 if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_GMAC1_TRGMII) && 208 if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_GMAC1_TRGMII) && !mac->id) {
187 !mac->id && !mac->trgmii) 209 if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII_MT7621_CLK)) {
188 mtk_gmac0_rgmii_adjust(mac->hw, dev->phydev->speed); 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 }
189 219
190 if (dev->phydev->link) 220 if (dev->phydev->link)
191 mcr |= MAC_MCR_FORCE_LINK; 221 mcr |= MAC_MCR_FORCE_LINK;
@@ -2607,7 +2637,7 @@ static const struct mtk_soc_data mt2701_data = {
2607}; 2637};
2608 2638
2609static const struct mtk_soc_data mt7621_data = { 2639static const struct mtk_soc_data mt7621_data = {
2610 .caps = MTK_SHARED_INT, 2640 .caps = MT7621_CAPS,
2611 .required_clks = MT7621_CLKS_BITMAP, 2641 .required_clks = MT7621_CLKS_BITMAP,
2612 .required_pctl = false, 2642 .required_pctl = false,
2613}; 2643};
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
index 85e3144f1af5..876ce6798709 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -363,6 +363,10 @@
363#define MT7622_ETH 7622 363#define MT7622_ETH 7622
364#define MT7621_ETH 7621 364#define MT7621_ETH 7621
365 365
366/* ethernet system control register */
367#define ETHSYS_SYSCFG 0x10
368#define SYSCFG_DRAM_TYPE_DDR2 BIT(4)
369
366/* ethernet subsystem config register */ 370/* ethernet subsystem config register */
367#define ETHSYS_SYSCFG0 0x14 371#define ETHSYS_SYSCFG0 0x14
368#define SYSCFG0_GE_MASK 0x3 372#define SYSCFG0_GE_MASK 0x3
@@ -377,6 +381,9 @@
377/* ethernet subsystem clock register */ 381/* ethernet subsystem clock register */
378#define ETHSYS_CLKCFG0 0x2c 382#define ETHSYS_CLKCFG0 0x2c
379#define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11) 383#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)
380 387
381/* ethernet reset control register */ 388/* ethernet reset control register */
382#define ETHSYS_RSTCTRL 0x34 389#define ETHSYS_RSTCTRL 0x34
@@ -616,6 +623,7 @@ enum mtk_eth_path {
616#define MTK_SHARED_SGMII BIT(7) 623#define MTK_SHARED_SGMII BIT(7)
617#define MTK_HWLRO BIT(8) 624#define MTK_HWLRO BIT(8)
618#define MTK_SHARED_INT BIT(9) 625#define MTK_SHARED_INT BIT(9)
626#define MTK_TRGMII_MT7621_CLK BIT(10)
619 627
620/* Supported path present on SoCs */ 628/* Supported path present on SoCs */
621#define MTK_PATH_BIT(x) BIT((x) + 10) 629#define MTK_PATH_BIT(x) BIT((x) + 10)
@@ -667,6 +675,9 @@ enum mtk_eth_path {
667 675
668#define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x)) 676#define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x))
669 677
678#define MT7621_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_TRGMII | \
679 MTK_GMAC2_RGMII | MTK_SHARED_INT | MTK_TRGMII_MT7621_CLK)
680
670#define MT7622_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_SGMII | MTK_GMAC2_RGMII | \ 681#define MT7622_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_SGMII | MTK_GMAC2_RGMII | \
671 MTK_GMAC2_SGMII | MTK_GDM1_ESW | \ 682 MTK_GMAC2_SGMII | MTK_GDM1_ESW | \
672 MTK_MUX_GDM1_TO_GMAC1_ESW | \ 683 MTK_MUX_GDM1_TO_GMAC1_ESW | \