ramips: mt7620: move mt7620_mdio_mode() to ethernet driver
authorMichael Pratt <mcpratt@pm.me>
Sun, 30 May 2021 06:02:47 +0000 (02:02 -0400)
committerChuanhong Guo <gch981213@gmail.com>
Wed, 23 Jun 2021 06:22:18 +0000 (14:22 +0800)
The function mt7620_mdio_mode is only called once
and both the function and mdio_mode block have been named incorrectly,
leading to confusion and useless commits.

These lines in the mdio_mode block of mt7620_hw_init
are only intended for boards with an external mt7530 switch.
(see commit 194ca6127ee18cd3a95da4d03f02e43b5428c0bb)

Therefore, move lines from mdio_mode to the place in soc_mt7620.c
where the type of mt7530 switch is identified,
and move lines from mt7620_mdio_mode to a main function.

mt7620_mdio_mode was called from mt7620_gsw_init
where the priv struct is available,
so the lines must stay in mt7620_gsw_init function.

In order to keep things as simple as possible,
keep the DTS property related function calls together,
by moving them from mt7620_gsw_probe to init.

Remove the now useless DTS properties and extra phy nodes.

Fixes: 5a6229a93df8 ("ramips: remove superfluous & confusing DT binding")
Fixes: b85fe43ec8c4 ("ramips: mt7620: add force use of mdio-mode")
Signed-off-by: Michael Pratt <mcpratt@pm.me>
target/linux/ramips/dts/mt7620a_edimax_ew-747x.dtsi
target/linux/ramips/dts/mt7620a_engenius_esr600.dts
target/linux/ramips/dts/mt7620a_lava_lr-25g001.dts
target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.c
target/linux/ramips/files/drivers/net/ethernet/ralink/soc_mt7620.c

index 5cb8451547a63a1cd42da84392f1243af9e7424f..6060fd99a6539782491f2b36341080adced94ad4 100644 (file)
 
        mtd-mac-address = <&factory 0x4>;
 
-       mediatek,mdio-mode = <1>;
-
        phy-reset-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
        phy-reset-duration = <30>;
 
index 2f0f9b256e953d86fb07117e431d3b4b1132fda7..ea895ac6eab5121192e752569f5924b1d96ee321 100644 (file)
 
        mdio-bus {
                status = "okay";
-               mediatek,mdio-mode;
 
                ethernet-phy@0 {
                        reg = <0>;
index ee845c7b5ecda713bf37e4cc07b8ce3eae01c5e4..41d69d009b0c52e777cae20c92c14bf74836aee8 100644 (file)
 
        mdio-bus {
                status = "okay";
-               mediatek,mdio-mode = <1>;
 
-               phy0: ethernet-phy@0 {
+               ethernet-phy@0 {
                        reg = <0>;
                        phy-mode = "rgmii";
                        qca,ar8327-initvals = <
                                0x94 0x00000000 /* PORT6_STATUS */
                        >;
                };
-
-               phy1: ethernet-phy@1 {
-                       reg = <1>;
-                       phy-mode = "rgmii";
-               };
-
-               phy2: ethernet-phy@2 {
-                       reg = <2>;
-                       phy-mode = "rgmii";
-               };
-
-               phy3: ethernet-phy@3 {
-                       reg = <3>;
-                       phy-mode = "rgmii";
-               };
-
-               phy4: ethernet-phy@4 {
-                       reg = <4>;
-                       phy-mode = "rgmii";
-               };
        };
 };
 
index 54b8b204ebf87ec449750c3932267a540150bb15..67f70f286d17b26cf833e2ac32a4a55e98e514c7 100644 (file)
@@ -61,31 +61,7 @@ static irqreturn_t gsw_interrupt_mt7620(int irq, void *_priv)
        return IRQ_HANDLED;
 }
 
-static int mt7620_mdio_mode(struct device_node *eth_node)
-{
-       struct device_node *phy_node, *mdiobus_node;
-       const __be32 *id;
-       int ret = 0;
-
-       mdiobus_node = of_get_child_by_name(eth_node, "mdio-bus");
-
-       if (mdiobus_node) {
-               if (of_property_read_bool(mdiobus_node, "mediatek,mdio-mode"))
-                       ret = 1;
-
-               for_each_child_of_node(mdiobus_node, phy_node) {
-                       id = of_get_property(phy_node, "reg", NULL);
-                       if (id && (be32_to_cpu(*id) == 0x1f))
-                               ret = 1;
-               }
-
-               of_node_put(mdiobus_node);
-       }
-
-       return ret;
-}
-
-static void mt7620_hw_init(struct mt7620_gsw *gsw, int mdio_mode)
+static void mt7620_hw_init(struct mt7620_gsw *gsw)
 {
        u32 i;
        u32 val;
@@ -97,20 +73,6 @@ static void mt7620_hw_init(struct mt7620_gsw *gsw, int mdio_mode)
        /* Enable MIB stats */
        mtk_switch_w32(gsw, mtk_switch_r32(gsw, GSW_REG_MIB_CNT_EN) | (1 << 1), GSW_REG_MIB_CNT_EN);
 
-       if (mdio_mode) {
-               /* set MT7530 central align */
-               val = mt7530_mdio_r32(gsw, 0x7830);
-               val &= ~BIT(0);
-               val |= BIT(1);
-               mt7530_mdio_w32(gsw, 0x7830, val);
-
-               val = mt7530_mdio_r32(gsw, 0x7a40);
-               val &= ~BIT(30);
-               mt7530_mdio_w32(gsw, 0x7a40, val);
-
-               mt7530_mdio_w32(gsw, 0x7a78, 0x855);
-       }
-
        if (gsw->ephy_base) {
                mtk_switch_w32(gsw, mtk_switch_r32(gsw, GSW_REG_GPC1) |
                        (gsw->ephy_base << 16),
@@ -215,9 +177,13 @@ MODULE_DEVICE_TABLE(of, mediatek_gsw_match);
 
 int mtk_gsw_init(struct fe_priv *priv)
 {
+       struct device_node *eth_node = priv->dev->of_node;
+       struct device_node *phy_node, *mdiobus_node;
        struct device_node *np = priv->switch_np;
        struct platform_device *pdev = of_find_device_by_node(np);
        struct mt7620_gsw *gsw;
+       const __be32 *id;
+       u8 val;
 
        if (!pdev)
                return -ENODEV;
@@ -228,7 +194,23 @@ int mtk_gsw_init(struct fe_priv *priv)
        gsw = platform_get_drvdata(pdev);
        priv->soc->swpriv = gsw;
 
-       mt7620_hw_init(gsw, mt7620_mdio_mode(priv->dev->of_node));
+       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->port4_ephy = !of_property_read_bool(np, "mediatek,port4-gmac");
+
+       if (of_property_read_u8(np, "mediatek,ephy-base", &val) == 0)
+               gsw->ephy_base = val;
+       else
+               gsw->ephy_base = 0;
+
+       mt7620_hw_init(gsw);
 
        if (gsw->irq) {
                request_irq(gsw->irq, gsw_interrupt_mt7620, 0,
@@ -243,8 +225,6 @@ static int mt7620_gsw_probe(struct platform_device *pdev)
 {
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        struct mt7620_gsw *gsw;
-       struct device_node *np = pdev->dev.of_node;
-       u8 val;
 
        gsw = devm_kzalloc(&pdev->dev, sizeof(struct mt7620_gsw), GFP_KERNEL);
        if (!gsw)
@@ -256,13 +236,6 @@ static int mt7620_gsw_probe(struct platform_device *pdev)
 
        gsw->dev = &pdev->dev;
 
-       gsw->port4_ephy = !of_property_read_bool(np, "mediatek,port4-gmac");
-
-       if (of_property_read_u8(np, "mediatek,ephy-base", &val) == 0)
-               gsw->ephy_base = val;
-       else
-               gsw->ephy_base = 0;
-
        gsw->irq = platform_get_irq(pdev, 0);
 
        platform_set_drvdata(pdev, gsw);
index acd735093258fdaf74cf89db1ab29512d9439f22..4d012afa14343029c12682cac85bd1ab0086af85 100644 (file)
@@ -82,11 +82,26 @@ static const u16 mt7620_reg_table[FE_REG_COUNT] = {
 static int mt7620_gsw_config(struct fe_priv *priv)
 {
        struct mt7620_gsw *gsw = (struct mt7620_gsw *) priv->soc->swpriv;
+       u32 val;
 
        /* is the mt7530 internal or external */
        if (priv->mii_bus && mdiobus_get_phy(priv->mii_bus, 0x1f)) {
                mt7530_probe(priv->dev, gsw->base, NULL, 0);
                mt7530_probe(priv->dev, NULL, priv->mii_bus, 1);
+
+               /* magic values from original SDK */
+               val = mt7530_mdio_r32(gsw, 0x7830);
+               val &= ~BIT(0);
+               val |= BIT(1);
+               mt7530_mdio_w32(gsw, 0x7830, val);
+
+               val = mt7530_mdio_r32(gsw, 0x7a40);
+               val &= ~BIT(30);
+               mt7530_mdio_w32(gsw, 0x7a40, val);
+
+               mt7530_mdio_w32(gsw, 0x7a78, 0x855);
+
+               pr_info("mt7530: mdio central align\n");
        } else {
                mt7530_probe(priv->dev, gsw->base, NULL, 1);
        }