[][kernel][mt7988][eth][Update register of mdio-bus for gphycalibration in DSA]

[Description]
Change register of mdio-bus from gbus to slave_mii_bus.

[Release-log]
N/A


Change-Id: Icadaeed161fedbd336dee9940b61bdca800a68d5
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6623821
Build: srv_hbgsm110
diff --git a/target/linux/mediatek/patches-5.4/750-add-mdio-bus-for-gphy-calibration.patch b/target/linux/mediatek/patches-5.4/750-add-mdio-bus-for-gphy-calibration.patch
new file mode 100755
index 0000000..e3efa34
--- /dev/null
+++ b/target/linux/mediatek/patches-5.4/750-add-mdio-bus-for-gphy-calibration.patch
@@ -0,0 +1,133 @@
+Index: linux-5.4.215/drivers/net/dsa/mt7530.c
+===================================================================
+--- linux-5.4.215.orig/drivers/net/dsa/mt7530.c
++++ linux-5.4.215/drivers/net/dsa/mt7530.c
+@@ -847,6 +847,117 @@ mt7531_ind_phy_write(struct dsa_switch *
+ 	return ret;
+ }
+
++static int mt753x_mdio_read(struct mii_bus *bus, int addr, int regnum)
++{
++	struct mt7530_priv *priv = bus->priv;
++	struct mt7530_dummy_poll p;
++	int ret;
++	u32 val;
++
++	INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
++
++	mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
++
++	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
++				 !(val & MT7531_PHY_ACS_ST), 20, 100000);
++	if (ret < 0) {
++		dev_err(priv->dev, "poll timeout\n");
++		goto out;
++	}
++
++	val = MT7531_MDIO_CL22_READ | MT7531_MDIO_PHY_ADDR(addr) |
++		  MT7531_MDIO_REG_ADDR(regnum);
++
++	mt7530_mii_write(priv, MT7531_PHY_IAC, val | MT7531_PHY_ACS_ST);
++
++	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
++				 !(val & MT7531_PHY_ACS_ST), 20, 100000);
++	if (ret < 0) {
++		dev_err(priv->dev, "poll timeout\n");
++		goto out;
++	}
++
++	ret = val & MT7531_MDIO_RW_DATA_MASK;
++out:
++	mutex_unlock(&priv->bus->mdio_lock);
++
++	return ret;
++}
++
++static int mt753x_mdio_write(struct mii_bus *bus, int addr, int regnum, u16 val)
++{
++	struct mt7530_priv *priv = bus->priv;
++	struct mt7530_dummy_poll p;
++	int ret;
++	u32 reg;
++
++	INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
++
++	mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
++
++	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
++				 !(reg & MT7531_PHY_ACS_ST), 20, 100000);
++	if (ret < 0) {
++		dev_err(priv->dev, "poll timeout\n");
++		goto out;
++	}
++
++	reg = MT7531_MDIO_CL22_WRITE | MT7531_MDIO_PHY_ADDR(addr) |
++		  MT7531_MDIO_REG_ADDR(regnum) | val;
++
++	mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
++
++	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
++				 !(reg & MT7531_PHY_ACS_ST), 20, 100000);
++	if (ret < 0) {
++		dev_err(priv->dev, "poll timeout\n");
++		goto out;
++	}
++
++out:
++	mutex_unlock(&priv->bus->mdio_lock);
++
++	return ret;
++}
++
++static int mt753x_setup_mdio(struct dsa_switch *ds)
++{
++	struct mt7530_priv *priv = ds->priv;
++	struct device_node *mdio_np;
++	int ret;
++
++	mdio_np = of_get_compatible_child(priv->dev->of_node, "mediatek,dsa-slave-mdio");
++	if (!mdio_np) {
++		dev_err(priv->dev, "no MDIO bus node\n");
++		return -ENODEV;
++	}
++
++	priv->ds->slave_mii_bus = devm_mdiobus_alloc(priv->dev);
++	if (!priv->ds->slave_mii_bus) {
++		ret = -ENOMEM;
++		goto err_put_node;
++	}
++	priv->ds->slave_mii_bus->name = "mediatek,dsa-slave-mdio";
++	priv->ds->slave_mii_bus->priv = priv;
++	priv->ds->slave_mii_bus->parent = priv->dev;
++	priv->ds->slave_mii_bus->phy_mask = ~priv->ds->phys_mii_mask;
++	priv->ds->slave_mii_bus->read = mt753x_mdio_read;
++	priv->ds->slave_mii_bus->write = mt753x_mdio_write;
++	snprintf(priv->ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d.%d",
++		 priv->ds->dst->index, priv->ds->index);
++	priv->ds->slave_mii_bus->dev.of_node = mdio_np;
++
++	ret = of_mdiobus_register(priv->ds->slave_mii_bus, mdio_np);
++	if (ret)
++		dev_err(priv->dev, "unable to register MDIO bus %s\n",
++			priv->ds->slave_mii_bus->id);
++
++err_put_node:
++	of_node_put(mdio_np);
++
++	return ret;
++}
++
+ static void
+ mt7530_get_strings(struct dsa_switch *ds, int port, u32 stringset,
+ 		   uint8_t *data)
+@@ -2694,6 +2805,10 @@ mt7988_setup(struct dsa_switch *ds)
+ 	if (ret < 0)
+ 		return ret;
+
++	ret = mt753x_setup_mdio(ds);
++	if (ret < 0)
++		dev_err(priv->dev, "mt753x_setup_mdio failed\n");
++
+ 	return 0;
+ }
+
diff --git a/target/linux/mediatek/patches-5.4/750-add-mdio-bus-for-phy-node.patch b/target/linux/mediatek/patches-5.4/750-add-mdio-bus-for-phy-node.patch
deleted file mode 100644
index 5a130b1..0000000
--- a/target/linux/mediatek/patches-5.4/750-add-mdio-bus-for-phy-node.patch
+++ /dev/null
@@ -1,165 +0,0 @@
-Index: linux-5.4.203/drivers/net/dsa/mt7530.c
-===================================================================
---- linux-5.4.203.orig/drivers/net/dsa/mt7530.c
-+++ linux-5.4.203/drivers/net/dsa/mt7530.c
-@@ -847,6 +847,132 @@ mt7531_ind_phy_write(struct dsa_switch *
- 	return ret;
- }
-
-+static int mt753x_mdio_read(struct mii_bus *bus, int addr, int regnum)
-+{
-+	struct mt7530_priv *priv = bus->priv;
-+	struct mt7530_dummy_poll p;
-+	int ret;
-+	u32 val;
-+
-+	INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
-+
-+	mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
-+
-+	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-+				 !(val & MT7531_PHY_ACS_ST), 20, 100000);
-+	if (ret < 0) {
-+		dev_err(priv->dev, "poll timeout\n");
-+		goto out;
-+	}
-+
-+	val = MT7531_MDIO_CL22_READ | MT7531_MDIO_PHY_ADDR(addr) |
-+		  MT7531_MDIO_REG_ADDR(regnum);
-+
-+	mt7530_mii_write(priv, MT7531_PHY_IAC, val | MT7531_PHY_ACS_ST);
-+
-+	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-+				 !(val & MT7531_PHY_ACS_ST), 20, 100000);
-+	if (ret < 0) {
-+		dev_err(priv->dev, "poll timeout\n");
-+		goto out;
-+	}
-+
-+	ret = val & MT7531_MDIO_RW_DATA_MASK;
-+out:
-+	mutex_unlock(&priv->bus->mdio_lock);
-+
-+	return ret;
-+}
-+
-+static int mt753x_mdio_write(struct mii_bus *bus, int addr, int regnum, u16 val)
-+{
-+	struct mt7530_priv *priv = bus->priv;
-+	struct mt7530_dummy_poll p;
-+	int ret;
-+	u32 reg;
-+
-+	INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
-+
-+	mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
-+
-+	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
-+				 !(reg & MT7531_PHY_ACS_ST), 20, 100000);
-+	if (ret < 0) {
-+		dev_err(priv->dev, "poll timeout\n");
-+		goto out;
-+	}
-+
-+	reg = MT7531_MDIO_CL22_WRITE | MT7531_MDIO_PHY_ADDR(addr) |
-+		  MT7531_MDIO_REG_ADDR(regnum) | val;
-+
-+	mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
-+
-+	ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
-+				 !(reg & MT7531_PHY_ACS_ST), 20, 100000);
-+	if (ret < 0) {
-+		dev_err(priv->dev, "poll timeout\n");
-+		goto out;
-+	}
-+
-+out:
-+	mutex_unlock(&priv->bus->mdio_lock);
-+
-+	return ret;
-+}
-+
-+static int mt753x_mdio_init(struct mt7530_priv *priv)
-+{
-+	struct device_node *dn;
-+	struct device_node *mii_np;
-+	int ret;
-+
-+	dn = priv->dev->of_node;
-+
-+	mii_np = of_get_child_by_name(dn, "mdio-bus");
-+	if (!mii_np) {
-+		ret = -ENODEV;
-+		goto err_put_node;
-+	}
-+
-+	if (!of_device_is_available(mii_np)) {
-+		ret = -ENODEV;
-+		goto err_put_node;
-+	}
-+
-+	priv->gbus = devm_mdiobus_alloc(priv->dev);
-+	if (!priv->gbus) {
-+		ret = -ENOMEM;
-+		goto err_put_node;
-+	}
-+	priv->gbus->name = "mt753x_mdio";
-+	priv->gbus->read = mt753x_mdio_read;
-+	priv->gbus->write = mt753x_mdio_write;
-+	priv->gbus->priv = priv;
-+	priv->gbus->parent = priv->dev;
-+
-+	if(snprintf(priv->gbus->id, MII_BUS_ID_SIZE, "%s@%s", mii_np->name, dn->name) < 0) {
-+		ret = -ENOMEM;
-+		goto err_put_node;
-+	}
-+
-+	ret = of_mdiobus_register(priv->gbus, mii_np);
-+	if (ret)
-+		priv->gbus = NULL;
-+
-+err_put_node:
-+	of_node_put(mii_np);
-+
-+	return ret;
-+}
-+
-+static void mt753x_mdio_exit(struct mt7530_priv *priv)
-+{
-+	if (!priv->gbus)
-+		return;
-+
-+	mdiobus_unregister(priv->gbus);
-+}
-+
- static void
- mt7530_get_strings(struct dsa_switch *ds, int port, u32 stringset,
- 		   uint8_t *data)
-@@ -2892,6 +3018,7 @@ mt7530_probe(struct mdio_device *mdiodev
- 		return ret;
- 	}
- 	mt7530_nl_init(&priv);
-+	mt753x_mdio_init(priv);
-
- 	return 0;
- }
-@@ -2919,6 +3046,7 @@ mt7530_remove(struct mdio_device *mdiode
- 		iounmap(priv->base);
-
- 	mt7530_nl_exit();
-+	mt753x_mdio_exit(priv);
- }
-
- static struct mdio_driver mt7530_mdio_driver = {
-Index: linux-5.4.203/drivers/net/dsa/mt7530.h
-===================================================================
---- linux-5.4.203.orig/drivers/net/dsa/mt7530.h
-+++ linux-5.4.203/drivers/net/dsa/mt7530.h
-@@ -730,6 +730,7 @@ struct mt7530_priv {
- 	struct device		*dev;
- 	struct dsa_switch	*ds;
- 	struct mii_bus		*bus;
-+	struct mii_bus		*gbus;
- 	struct reset_control	*rstc;
- 	struct regulator	*core_pwr;
- 	struct regulator	*io_pwr;