stmmac: add fixed-link device-tree support
authorMathieu Olivari <mathieu@codeaurora.org>
Wed, 27 May 2015 18:02:48 +0000 (11:02 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 31 May 2015 00:04:36 +0000 (17:04 -0700)
In case DT is used, this change adds the ability to the stmmac driver to
detect a fixed-link PHY, instanciate it, and use it during
phy_connect().

Fixed link PHYs DT usage is described in:
Documentation/devicetree/bindings/net/fixed-link.txt

Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

index 31c64169f2ec647e47d1429ad2676b50e3966c0a..c46178cf4d5024050c2dd72b4fd5aeb822a23f0b 100644 (file)
@@ -856,7 +856,7 @@ static int stmmac_init_phy(struct net_device *dev)
         * device as well.
         * Note: phydev->phy_id is the result of reading the UID PHY registers.
         */
-       if (phydev->phy_id == 0) {
+       if (!priv->plat->phy_node && phydev->phy_id == 0) {
                phy_disconnect(phydev);
                return -ENODEV;
        }
index 8d23155a1a7e790b8b95c84c995f36adeab5ca63..f3918c7e7eeb373a6736bb5145c33320acbabc53 100644 (file)
@@ -148,6 +148,14 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
        /* If we find a phy-handle property, use it as the PHY */
        plat->phy_node = of_parse_phandle(np, "phy-handle", 0);
 
+       /* If phy-handle is not specified, check if we have a fixed-phy */
+       if (!plat->phy_node && of_phy_is_fixed_link(np)) {
+               if ((of_phy_register_fixed_link(np) < 0))
+                       return -ENODEV;
+
+               plat->phy_node = of_node_get(np);
+       }
+
        /* "snps,phy-addr" is not a standard property. Mark it as deprecated
         * and warn of its use. Remove this when phy node support is added.
         */
@@ -212,8 +220,10 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
        if (of_find_property(np, "snps,pbl", NULL)) {
                dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),
                                       GFP_KERNEL);
-               if (!dma_cfg)
+               if (!dma_cfg) {
+                       of_node_put(np);
                        return -ENOMEM;
+               }
                plat->dma_cfg = dma_cfg;
                of_property_read_u32(np, "snps,pbl", &dma_cfg->pbl);
                dma_cfg->fixed_burst =