diff options
| author | David S. Miller <davem@davemloft.net> | 2019-06-22 19:58:24 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-06-22 19:58:24 -0400 |
| commit | 969b15b002628ca4bb7fa4ee9c2e07bc545d0477 (patch) | |
| tree | afc69d89c4c42d77dc56f347cb5f591cc4ce6380 | |
| parent | b272a0ad730103e84fb735fd0a8cc050cdf7f77c (diff) | |
| parent | 7ef6f6f8d237fa6724108b57d9706cb5069688e4 (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.c | 46 | ||||
| -rw-r--r-- | drivers/net/dsa/mt7530.h | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/mediatek/mtk_eth_soc.c | 38 | ||||
| -rw-r--r-- | drivers/net/ethernet/mediatek/mtk_eth_soc.h | 11 |
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 | |||
| 428 | mt7530_pad_clk_setup(struct dsa_switch *ds, int mode) | 428 | mt7530_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 | ||
| 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 | |||
| 137 | static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth, int speed) | 159 | static 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 | ||
| 2609 | static const struct mtk_soc_data mt7621_data = { | 2639 | static 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 | \ |
