diff options
| -rw-r--r-- | drivers/net/dsa/mt7530.c | 46 | ||||
| -rw-r--r-- | drivers/net/dsa/mt7530.h | 4 |
2 files changed, 40 insertions, 10 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 |
