Commit f8b7b50c authored by Ivan Mikhaylov's avatar Ivan Mikhaylov Committed by Jakub Kicinski
Browse files

net: ftgmac100: add handling of mdio/phy nodes for ast2400/2500



phy-handle can't be handled well for ast2400/2500 which has an embedded
MDIO controller. Add ftgmac100_mdio_setup for ast2400/2500 and initialize
PHYs from mdio child node with of_mdiobus_register.

Signed-off-by: default avatarIvan Mikhaylov <i.mikhaylov@yadro.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 68ed78b5
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -1631,6 +1631,7 @@ static int ftgmac100_setup_mdio(struct net_device *netdev)
	struct ftgmac100 *priv = netdev_priv(netdev);
	struct platform_device *pdev = to_platform_device(priv->dev);
	struct device_node *np = pdev->dev.of_node;
	struct device_node *mdio_np;
	int i, err = 0;
	u32 reg;

@@ -1662,12 +1663,16 @@ static int ftgmac100_setup_mdio(struct net_device *netdev)
	for (i = 0; i < PHY_MAX_ADDR; i++)
		priv->mii_bus->irq[i] = PHY_POLL;

	err = mdiobus_register(priv->mii_bus);
	mdio_np = of_get_child_by_name(np, "mdio");

	err = of_mdiobus_register(priv->mii_bus, mdio_np);
	if (err) {
		dev_err(priv->dev, "Cannot register MDIO bus!\n");
		goto err_register_mdiobus;
	}

	of_node_put(mdio_np);

	return 0;

err_register_mdiobus:
@@ -1835,11 +1840,22 @@ static int ftgmac100_probe(struct platform_device *pdev)
	} else if (np && of_get_property(np, "phy-handle", NULL)) {
		struct phy_device *phy;

		/* Support "mdio"/"phy" child nodes for ast2400/2500 with
		 * an embedded MDIO controller. Automatically scan the DTS for
		 * available PHYs and register them.
		 */
		if (of_device_is_compatible(np, "aspeed,ast2400-mac") ||
		    of_device_is_compatible(np, "aspeed,ast2500-mac")) {
			err = ftgmac100_setup_mdio(netdev);
			if (err)
				goto err_setup_mdio;
		}

		phy = of_phy_get_and_connect(priv->netdev, np,
					     &ftgmac100_adjust_link);
		if (!phy) {
			dev_err(&pdev->dev, "Failed to connect to phy\n");
			goto err_setup_mdio;
			goto err_phy_connect;
		}

		/* Indicate that we support PAUSE frames (see comment in