|
@@ -53,7 +53,8 @@ static const struct mtk_ethtool_stats {
|
|
|
};
|
|
|
|
|
|
static const char * const mtk_clks_source_name[] = {
|
|
|
- "ethif", "esw", "gp1", "gp2", "trgpll"
|
|
|
+ "ethif", "esw", "gp0", "gp1", "gp2", "trgpll", "sgmii_tx250m",
|
|
|
+ "sgmii_rx250m", "sgmii_cdr_ref", "sgmii_cdr_fb", "sgmii_ck", "eth2pll"
|
|
|
};
|
|
|
|
|
|
void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg)
|
|
@@ -163,6 +164,47 @@ static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth, int speed)
|
|
|
mtk_w32(eth, val, TRGMII_TCK_CTRL);
|
|
|
}
|
|
|
|
|
|
+static void mtk_gmac_sgmii_hw_setup(struct mtk_eth *eth, int mac_id)
|
|
|
+{
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ /* Setup the link timer and QPHY power up inside SGMIISYS */
|
|
|
+ regmap_write(eth->sgmiisys, SGMSYS_PCS_LINK_TIMER,
|
|
|
+ SGMII_LINK_TIMER_DEFAULT);
|
|
|
+
|
|
|
+ regmap_read(eth->sgmiisys, SGMSYS_SGMII_MODE, &val);
|
|
|
+ val |= SGMII_REMOTE_FAULT_DIS;
|
|
|
+ regmap_write(eth->sgmiisys, SGMSYS_SGMII_MODE, val);
|
|
|
+
|
|
|
+ regmap_read(eth->sgmiisys, SGMSYS_PCS_CONTROL_1, &val);
|
|
|
+ val |= SGMII_AN_RESTART;
|
|
|
+ regmap_write(eth->sgmiisys, SGMSYS_PCS_CONTROL_1, val);
|
|
|
+
|
|
|
+ regmap_read(eth->sgmiisys, SGMSYS_QPHY_PWR_STATE_CTRL, &val);
|
|
|
+ val &= ~SGMII_PHYA_PWD;
|
|
|
+ regmap_write(eth->sgmiisys, SGMSYS_QPHY_PWR_STATE_CTRL, val);
|
|
|
+
|
|
|
+ /* Determine MUX for which GMAC uses the SGMII interface */
|
|
|
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_DUAL_GMAC_SHARED_SGMII)) {
|
|
|
+ regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val);
|
|
|
+ val &= ~SYSCFG0_SGMII_MASK;
|
|
|
+ val |= !mac_id ? SYSCFG0_SGMII_GMAC1 : SYSCFG0_SGMII_GMAC2;
|
|
|
+ regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
|
|
|
+
|
|
|
+ dev_info(eth->dev, "setup shared sgmii for gmac=%d\n",
|
|
|
+ mac_id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Setup the GMAC1 going through SGMII path when SoC also support
|
|
|
+ * ESW on GMAC1
|
|
|
+ */
|
|
|
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_GMAC1_ESW | MTK_GMAC1_SGMII) &&
|
|
|
+ !mac_id) {
|
|
|
+ mtk_w32(eth, 0, MTK_MAC_MISC);
|
|
|
+ dev_info(eth->dev, "setup gmac1 going through sgmii");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void mtk_phy_link_adjust(struct net_device *dev)
|
|
|
{
|
|
|
struct mtk_mac *mac = netdev_priv(dev);
|
|
@@ -270,6 +312,7 @@ static int mtk_phy_connect(struct net_device *dev)
|
|
|
if (!np)
|
|
|
return -ENODEV;
|
|
|
|
|
|
+ mac->ge_mode = 0;
|
|
|
switch (of_get_phy_mode(np)) {
|
|
|
case PHY_INTERFACE_MODE_TRGMII:
|
|
|
mac->trgmii = true;
|
|
@@ -277,7 +320,10 @@ static int mtk_phy_connect(struct net_device *dev)
|
|
|
case PHY_INTERFACE_MODE_RGMII_RXID:
|
|
|
case PHY_INTERFACE_MODE_RGMII_ID:
|
|
|
case PHY_INTERFACE_MODE_RGMII:
|
|
|
- mac->ge_mode = 0;
|
|
|
+ break;
|
|
|
+ case PHY_INTERFACE_MODE_SGMII:
|
|
|
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII))
|
|
|
+ mtk_gmac_sgmii_hw_setup(eth, mac->id);
|
|
|
break;
|
|
|
case PHY_INTERFACE_MODE_MII:
|
|
|
mac->ge_mode = 1;
|
|
@@ -2423,6 +2469,7 @@ static int mtk_get_chip_id(struct mtk_eth *eth, u32 *chip_id)
|
|
|
static bool mtk_is_hwlro_supported(struct mtk_eth *eth)
|
|
|
{
|
|
|
switch (eth->chip_id) {
|
|
|
+ case MT7622_ETH:
|
|
|
case MT7623_ETH:
|
|
|
return true;
|
|
|
}
|
|
@@ -2462,6 +2509,16 @@ static int mtk_probe(struct platform_device *pdev)
|
|
|
return PTR_ERR(eth->ethsys);
|
|
|
}
|
|
|
|
|
|
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) {
|
|
|
+ eth->sgmiisys =
|
|
|
+ syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
|
|
+ "mediatek,sgmiisys");
|
|
|
+ if (IS_ERR(eth->sgmiisys)) {
|
|
|
+ dev_err(&pdev->dev, "no sgmiisys regmap found\n");
|
|
|
+ return PTR_ERR(eth->sgmiisys);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
eth->pctl = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
|
|
"mediatek,pctl");
|
|
|
if (IS_ERR(eth->pctl)) {
|
|
@@ -2595,6 +2652,11 @@ static const struct mtk_soc_data mt2701_data = {
|
|
|
.required_clks = MT7623_CLKS_BITMAP
|
|
|
};
|
|
|
|
|
|
+static const struct mtk_soc_data mt7622_data = {
|
|
|
+ .caps = MTK_DUAL_GMAC_SHARED_SGMII | MTK_GMAC1_ESW,
|
|
|
+ .required_clks = MT7622_CLKS_BITMAP
|
|
|
+};
|
|
|
+
|
|
|
static const struct mtk_soc_data mt7623_data = {
|
|
|
.caps = MTK_GMAC1_TRGMII,
|
|
|
.required_clks = MT7623_CLKS_BITMAP
|
|
@@ -2602,6 +2664,7 @@ static const struct mtk_soc_data mt7623_data = {
|
|
|
|
|
|
const struct of_device_id of_mtk_match[] = {
|
|
|
{ .compatible = "mediatek,mt2701-eth", .data = &mt2701_data},
|
|
|
+ { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data},
|
|
|
{ .compatible = "mediatek,mt7623-eth", .data = &mt7623_data},
|
|
|
{},
|
|
|
};
|