net: mvpp2: fix lookup of mdio registers base address
authorBaruch Siach <baruch@tkos.co.il>
Wed, 21 Nov 2018 11:05:33 +0000 (13:05 +0200)
committerJoe Hershberger <joe.hershberger@ni.com>
Thu, 24 Jan 2019 17:35:27 +0000 (11:35 -0600)
Current mdio base lookup code relies on a 'reg' property at the upper CP
node. There is no 'reg' property there in current DT files of Armada
CP110. Use ofnode_get_addr() instead since it provides proper DT address
translation.

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>
drivers/net/mvpp2.c

index 9b3ab25..23c4da8 100644 (file)
@@ -4705,21 +4705,22 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
 {
        int port_node = dev_of_offset(dev);
        const char *phy_mode_str;
-       int phy_node, mdio_off, cp_node;
+       int phy_node;
        u32 id;
        u32 phyaddr = 0;
        int phy_mode = -1;
-       phys_addr_t mdio_addr;
 
        phy_node = fdtdec_lookup_phandle(gd->fdt_blob, port_node, "phy");
 
        if (phy_node > 0) {
+               ofnode phy_ofnode;
+               fdt_addr_t phy_base;
+
                phyaddr = fdtdec_get_int(gd->fdt_blob, phy_node, "reg", 0);
                if (phyaddr < 0) {
                        dev_err(&pdev->dev, "could not find phy address\n");
                        return -1;
                }
-               mdio_off = fdt_parent_offset(gd->fdt_blob, phy_node);
 
                /* TODO: This WA for mdio issue. U-boot 2017 don't have
                 * mdio driver and on MACHIATOBin board ports from CP1
@@ -4728,14 +4729,10 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
                 * base address. WA should be removed after
                 * mdio driver implementation.
                 */
-               mdio_addr = fdtdec_get_uint(gd->fdt_blob,
-                                           mdio_off, "reg", 0);
-
-               cp_node = fdt_parent_offset(gd->fdt_blob, mdio_off);
-               mdio_addr |= fdt_get_base_address((void *)gd->fdt_blob,
-                                                 cp_node);
 
-               port->priv->mdio_base = (void *)mdio_addr;
+               phy_ofnode = ofnode_get_parent(offset_to_ofnode(phy_node));
+               phy_base = ofnode_get_addr(phy_ofnode);
+               port->priv->mdio_base = (void *)phy_base;
 
                if (port->priv->mdio_base < 0) {
                        dev_err(&pdev->dev, "could not find mdio base address\n");