ramips: mt7620: add ephy-disable option to switch driver
authorMichael Pratt <mcpratt@pm.me>
Mon, 31 May 2021 07:56:20 +0000 (03:56 -0400)
committerChuanhong Guo <gch981213@gmail.com>
Wed, 23 Jun 2021 06:22:18 +0000 (14:22 +0800)
Add back the register write to disable internal PHYs
as a separate option in the code that can be set using a DTS property.

Set the option to true by default
when an external mt7530 switch is identified.

This makes the driver more in sync with original SDK code
while keeping the lines separated into different options
to accommodate any board with any PHY layout.

Signed-off-by: Michael Pratt <mcpratt@pm.me>
target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.c
target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.h

index 67f70f286d17b26cf833e2ac32a4a55e98e514c7..ae90f0484daeec2761418799527e0b8055a5eb4a 100644 (file)
@@ -73,7 +73,13 @@ static void mt7620_hw_init(struct mt7620_gsw *gsw)
        /* Enable MIB stats */
        mtk_switch_w32(gsw, mtk_switch_r32(gsw, GSW_REG_MIB_CNT_EN) | (1 << 1), GSW_REG_MIB_CNT_EN);
 
-       if (gsw->ephy_base) {
+       if (gsw->ephy_disable) {
+               mtk_switch_w32(gsw, mtk_switch_r32(gsw, GSW_REG_GPC1) |
+                       (gsw->ephy_base << 16) | (0x1f << 24),
+                       GSW_REG_GPC1);
+
+               pr_info("gsw: internal ephy disabled\n");
+       } else if (gsw->ephy_base) {
                mtk_switch_w32(gsw, mtk_switch_r32(gsw, GSW_REG_GPC1) |
                        (gsw->ephy_base << 16),
                        GSW_REG_GPC1);
@@ -194,13 +200,17 @@ int mtk_gsw_init(struct fe_priv *priv)
        gsw = platform_get_drvdata(pdev);
        priv->soc->swpriv = gsw;
 
+       gsw->ephy_disable = of_property_read_bool(np, "mediatek,ephy-disable");
+
        mdiobus_node = of_get_child_by_name(eth_node, "mdio-bus");
        if (mdiobus_node) {
                for_each_child_of_node(mdiobus_node, phy_node) {
                        id = of_get_property(phy_node, "reg", NULL);
                        if (id && (be32_to_cpu(*id) == 0x1f))
-                               of_node_put(mdiobus_node);
+                               gsw->ephy_disable = true;
                }
+
+               of_node_put(mdiobus_node);
        }
 
        gsw->port4_ephy = !of_property_read_bool(np, "mediatek,port4-gmac");
index 91a0399976da4a4fdab8afc6e68dba0bec62ca27..fde7792c023b820ead453fd1ddeb50f7fbc820a7 100644 (file)
@@ -92,6 +92,7 @@ struct mt7620_gsw {
        struct device           *dev;
        void __iomem            *base;
        int                     irq;
+       bool                    ephy_disable;
        bool                    port4_ephy;
        unsigned long int       autopoll;
        u16                     ephy_base;