net: mvpp2: mdio device per port

Current code forces all ports on a given Ethernet device to use the same
mdio device. In practice different ports might be wired to separate mdio
devices. Move the mdio device from the container struct mvpp2 to the per
port struct mvpp2_port.

Cc: Ken Ma <make@marvell.com>
Cc: Stefan Chulski <stefanc@marvell.com>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Reviewed-by: Stefan Roese <sr@denx.de>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
index 23c4da8..bcc6fe9 100644
--- a/drivers/net/mvpp2.c
+++ b/drivers/net/mvpp2.c
@@ -897,7 +897,6 @@
 	void __iomem *base;
 	void __iomem *lms_base;
 	void __iomem *iface_base;
-	void __iomem *mdio_base;
 
 	void __iomem *mpcs_base;
 	void __iomem *xpcs_base;
@@ -928,8 +927,6 @@
 	/* Maximum number of RXQs per port */
 	unsigned int max_port_rxqs;
 
-	struct mii_dev *bus;
-
 	int probe_done;
 	u8 num_ports;
 };
@@ -955,6 +952,7 @@
 
 	/* Per-port registers' base address */
 	void __iomem *base;
+	void __iomem *mdio_base;
 
 	struct mvpp2_rx_queue **rxqs;
 	struct mvpp2_tx_queue **txqs;
@@ -977,6 +975,7 @@
 	phy_interface_t phy_interface;
 	int phy_node;
 	int phyaddr;
+	struct mii_dev *bus;
 #ifdef CONFIG_DM_GPIO
 	struct gpio_desc phy_reset_gpio;
 	struct gpio_desc phy_tx_disable_gpio;
@@ -4500,7 +4499,7 @@
 	struct phy_device *phy_dev;
 
 	if (!port->init || port->link == 0) {
-		phy_dev = phy_connect(port->priv->bus, port->phyaddr, dev,
+		phy_dev = phy_connect(port->bus, port->phyaddr, dev,
 				      port->phy_interface);
 		port->phy_dev = phy_dev;
 		if (!phy_dev) {
@@ -4710,6 +4709,12 @@
 	u32 phyaddr = 0;
 	int phy_mode = -1;
 
+	/* Default mdio_base from the same eth base */
+	if (port->priv->hw_version == MVPP21)
+		port->mdio_base = port->priv->lms_base + MVPP21_SMI;
+	else
+		port->mdio_base = port->priv->iface_base + MVPP22_SMI;
+
 	phy_node = fdtdec_lookup_phandle(gd->fdt_blob, port_node, "phy");
 
 	if (phy_node > 0) {
@@ -4722,19 +4727,11 @@
 			return -1;
 		}
 
-		/* TODO: This WA for mdio issue. U-boot 2017 don't have
-		 * mdio driver and on MACHIATOBin board ports from CP1
-		 * connected to mdio on CP0.
-		 * WA is to get mdio address from phy handler parent
-		 * base address. WA should be removed after
-		 * mdio driver implementation.
-		 */
-
 		phy_ofnode = ofnode_get_parent(offset_to_ofnode(phy_node));
 		phy_base = ofnode_get_addr(phy_ofnode);
-		port->priv->mdio_base = (void *)phy_base;
+		port->mdio_base = (void *)phy_base;
 
-		if (port->priv->mdio_base < 0) {
+		if (port->mdio_base < 0) {
 			dev_err(&pdev->dev, "could not find mdio base address\n");
 			return -1;
 		}
@@ -5056,7 +5053,7 @@
 
 /* SMI / MDIO functions */
 
-static int smi_wait_ready(struct mvpp2 *priv)
+static int smi_wait_ready(struct mvpp2_port *priv)
 {
 	u32 timeout = MVPP2_SMI_TIMEOUT;
 	u32 smi_reg;
@@ -5081,7 +5078,7 @@
  */
 static int mpp2_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
 {
-	struct mvpp2 *priv = bus->priv;
+	struct mvpp2_port *priv = bus->priv;
 	u32 smi_reg;
 	u32 timeout;
 
@@ -5136,7 +5133,7 @@
 static int mpp2_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
 			   u16 value)
 {
-	struct mvpp2 *priv = bus->priv;
+	struct mvpp2_port *priv = bus->priv;
 	u32 smi_reg;
 
 	/* check parameters */
@@ -5335,7 +5332,6 @@
 static int mvpp2_base_probe(struct udevice *dev)
 {
 	struct mvpp2 *priv = dev_get_priv(dev);
-	struct mii_dev *bus;
 	void *bd_space;
 	u32 size = 0;
 	int i;
@@ -5394,15 +5390,11 @@
 		priv->lms_base = (void *)devfdt_get_addr_index(dev, 1);
 		if (IS_ERR(priv->lms_base))
 			return PTR_ERR(priv->lms_base);
-
-		priv->mdio_base = priv->lms_base + MVPP21_SMI;
 	} else {
 		priv->iface_base = (void *)devfdt_get_addr_index(dev, 1);
 		if (IS_ERR(priv->iface_base))
 			return PTR_ERR(priv->iface_base);
 
-		priv->mdio_base = priv->iface_base + MVPP22_SMI;
-
 		/* Store common base addresses for all ports */
 		priv->mpcs_base = priv->iface_base + MVPP22_MPCS;
 		priv->xpcs_base = priv->iface_base + MVPP22_XPCS;
@@ -5414,26 +5406,14 @@
 	else
 		priv->max_port_rxqs = 32;
 
-	/* Finally create and register the MDIO bus driver */
-	bus = mdio_alloc();
-	if (!bus) {
-		printf("Failed to allocate MDIO bus\n");
-		return -ENOMEM;
-	}
-
-	bus->read = mpp2_mdio_read;
-	bus->write = mpp2_mdio_write;
-	snprintf(bus->name, sizeof(bus->name), dev->name);
-	bus->priv = (void *)priv;
-	priv->bus = bus;
-
-	return mdio_register(bus);
+	return 0;
 }
 
 static int mvpp2_probe(struct udevice *dev)
 {
 	struct mvpp2_port *port = dev_get_priv(dev);
 	struct mvpp2 *priv = dev_get_priv(dev->parent);
+	struct mii_dev *bus;
 	int err;
 
 	/* Only call the probe function for the parent once */
@@ -5442,6 +5422,23 @@
 
 	port->priv = dev_get_priv(dev->parent);
 
+	/* Create and register the MDIO bus driver */
+	bus = mdio_alloc();
+	if (!bus) {
+		printf("Failed to allocate MDIO bus\n");
+		return -ENOMEM;
+	}
+
+	bus->read = mpp2_mdio_read;
+	bus->write = mpp2_mdio_write;
+	snprintf(bus->name, sizeof(bus->name), dev->name);
+	bus->priv = (void *)port;
+	port->bus = bus;
+
+	err = mdio_register(bus);
+	if (err)
+		return err;
+
 	err = phy_info_parse(dev, port);
 	if (err)
 		return err;