Commit fd33b244 authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by David S. Miller

net: mv643xx_eth: Fetch the phy connection type from DT

The MAC is capable of RGMII mode and that is probably a more typical
connection type than GMII today (eg it is used by Marvell Reference
designs for several SOCs). Let DT users specify the standard

   phy-connection-type = "rgmii-id";

On a phy node.
Signed-off-by: default avatarJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ad601339
...@@ -49,6 +49,7 @@ Optional port properties: ...@@ -49,6 +49,7 @@ Optional port properties:
and and
- phy-handle: See ethernet.txt file in the same directory. - phy-handle: See ethernet.txt file in the same directory.
- phy-mode: See ethernet.txt file in the same directory.
or or
......
...@@ -2968,6 +2968,22 @@ static void set_params(struct mv643xx_eth_private *mp, ...@@ -2968,6 +2968,22 @@ static void set_params(struct mv643xx_eth_private *mp,
mp->txq_count = pd->tx_queue_count ? : 1; mp->txq_count = pd->tx_queue_count ? : 1;
} }
static int get_phy_mode(struct mv643xx_eth_private *mp)
{
struct device *dev = mp->dev->dev.parent;
int iface = -1;
if (dev->of_node)
iface = of_get_phy_mode(dev->of_node);
/* Historical default if unspecified. We could also read/write
* the interface state in the PSC1
*/
if (iface < 0)
iface = PHY_INTERFACE_MODE_GMII;
return iface;
}
static struct phy_device *phy_scan(struct mv643xx_eth_private *mp, static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,
int phy_addr) int phy_addr)
{ {
...@@ -2994,7 +3010,7 @@ static struct phy_device *phy_scan(struct mv643xx_eth_private *mp, ...@@ -2994,7 +3010,7 @@ static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,
"orion-mdio-mii", addr); "orion-mdio-mii", addr);
phydev = phy_connect(mp->dev, phy_id, mv643xx_eth_adjust_link, phydev = phy_connect(mp->dev, phy_id, mv643xx_eth_adjust_link,
PHY_INTERFACE_MODE_GMII); get_phy_mode(mp));
if (!IS_ERR(phydev)) { if (!IS_ERR(phydev)) {
phy_addr_set(mp, addr); phy_addr_set(mp, addr);
break; break;
...@@ -3090,6 +3106,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev) ...@@ -3090,6 +3106,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
if (!dev) if (!dev)
return -ENOMEM; return -ENOMEM;
SET_NETDEV_DEV(dev, &pdev->dev);
mp = netdev_priv(dev); mp = netdev_priv(dev);
platform_set_drvdata(pdev, mp); platform_set_drvdata(pdev, mp);
...@@ -3129,7 +3146,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev) ...@@ -3129,7 +3146,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
if (pd->phy_node) { if (pd->phy_node) {
mp->phy = of_phy_connect(mp->dev, pd->phy_node, mp->phy = of_phy_connect(mp->dev, pd->phy_node,
mv643xx_eth_adjust_link, 0, mv643xx_eth_adjust_link, 0,
PHY_INTERFACE_MODE_GMII); get_phy_mode(mp));
if (!mp->phy) if (!mp->phy)
err = -ENODEV; err = -ENODEV;
else else
...@@ -3187,8 +3204,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev) ...@@ -3187,8 +3204,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
dev->priv_flags |= IFF_UNICAST_FLT; dev->priv_flags |= IFF_UNICAST_FLT;
dev->gso_max_segs = MV643XX_MAX_TSO_SEGS; dev->gso_max_segs = MV643XX_MAX_TSO_SEGS;
SET_NETDEV_DEV(dev, &pdev->dev);
if (mp->shared->win_protect) if (mp->shared->win_protect)
wrl(mp, WINDOW_PROTECT(mp->port_num), mp->shared->win_protect); wrl(mp, WINDOW_PROTECT(mp->port_num), mp->shared->win_protect);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment