Merge branch 'altera_tse'

Walter Lozano says:

====================
Altera TSE with no PHY

In some scenarios there is no PHY chip present, for example in optical links.
This serie of patches moves PHY get addr and MDIO create to a new function and
avoids PHY and MDIO probing in these cases.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2014-10-05 21:39:58 -04:00
commit f13909cdab

View File

@ -728,6 +728,44 @@ static struct phy_device *connect_local_phy(struct net_device *dev)
return phydev; return phydev;
} }
static int altera_tse_phy_get_addr_mdio_create(struct net_device *dev)
{
struct altera_tse_private *priv = netdev_priv(dev);
struct device_node *np = priv->device->of_node;
int ret = 0;
priv->phy_iface = of_get_phy_mode(np);
/* Avoid get phy addr and create mdio if no phy is present */
if (!priv->phy_iface)
return 0;
/* try to get PHY address from device tree, use PHY autodetection if
* no valid address is given
*/
if (of_property_read_u32(priv->device->of_node, "phy-addr",
&priv->phy_addr)) {
priv->phy_addr = POLL_PHY;
}
if (!((priv->phy_addr == POLL_PHY) ||
((priv->phy_addr >= 0) && (priv->phy_addr < PHY_MAX_ADDR)))) {
netdev_err(dev, "invalid phy-addr specified %d\n",
priv->phy_addr);
return -ENODEV;
}
/* Create/attach to MDIO bus */
ret = altera_tse_mdio_create(dev,
atomic_add_return(1, &instance_count));
if (ret)
return -ENODEV;
return 0;
}
/* Initialize driver's PHY state, and attach to the PHY /* Initialize driver's PHY state, and attach to the PHY
*/ */
static int init_phy(struct net_device *dev) static int init_phy(struct net_device *dev)
@ -736,6 +774,10 @@ static int init_phy(struct net_device *dev)
struct phy_device *phydev; struct phy_device *phydev;
struct device_node *phynode; struct device_node *phynode;
/* Avoid init phy in case of no phy present */
if (!priv->phy_iface)
return 0;
priv->oldlink = 0; priv->oldlink = 0;
priv->oldspeed = 0; priv->oldspeed = 0;
priv->oldduplex = -1; priv->oldduplex = -1;
@ -1231,7 +1273,6 @@ static int altera_tse_probe(struct platform_device *pdev)
struct resource *dma_res; struct resource *dma_res;
struct altera_tse_private *priv; struct altera_tse_private *priv;
const unsigned char *macaddr; const unsigned char *macaddr;
struct device_node *np = pdev->dev.of_node;
void __iomem *descmap; void __iomem *descmap;
const struct of_device_id *of_id = NULL; const struct of_device_id *of_id = NULL;
@ -1408,26 +1449,8 @@ static int altera_tse_probe(struct platform_device *pdev)
else else
eth_hw_addr_random(ndev); eth_hw_addr_random(ndev);
priv->phy_iface = of_get_phy_mode(np); /* get phy addr and create mdio */
ret = altera_tse_phy_get_addr_mdio_create(ndev);
/* try to get PHY address from device tree, use PHY autodetection if
* no valid address is given
*/
if (of_property_read_u32(pdev->dev.of_node, "phy-addr",
&priv->phy_addr)) {
priv->phy_addr = POLL_PHY;
}
if (!((priv->phy_addr == POLL_PHY) ||
((priv->phy_addr >= 0) && (priv->phy_addr < PHY_MAX_ADDR)))) {
dev_err(&pdev->dev, "invalid phy-addr specified %d\n",
priv->phy_addr);
goto err_free_netdev;
}
/* Create/attach to MDIO bus */
ret = altera_tse_mdio_create(ndev,
atomic_add_return(1, &instance_count));
if (ret) if (ret)
goto err_free_netdev; goto err_free_netdev;