aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/dsa/mt7530.c46
-rw-r--r--drivers/net/dsa/mt7530.h4
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
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