stmmac: add phy-handle support to the platform layer
On stmmac driver, PHY specification in device-tree was done using the non-standard property "snps,phy-addr". Specifying a PHY on a different MDIO bus that the one within the stmmac controller doesn't seem to be possible when device-tree is used. This change adds support for the phy-handle property, as specified in Documentation/devicetree/bindings/net/ethernet.txt. Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
f7b81d67d0
Коммит
5790cf3c00
|
@ -52,6 +52,7 @@
|
|||
#include "stmmac_ptp.h"
|
||||
#include "stmmac.h"
|
||||
#include <linux/reset.h>
|
||||
#include <linux/of_mdio.h>
|
||||
|
||||
#define STMMAC_ALIGN(x) L1_CACHE_ALIGN(x)
|
||||
|
||||
|
@ -816,18 +817,25 @@ static int stmmac_init_phy(struct net_device *dev)
|
|||
priv->speed = 0;
|
||||
priv->oldduplex = -1;
|
||||
|
||||
if (priv->plat->phy_bus_name)
|
||||
snprintf(bus_id, MII_BUS_ID_SIZE, "%s-%x",
|
||||
priv->plat->phy_bus_name, priv->plat->bus_id);
|
||||
else
|
||||
snprintf(bus_id, MII_BUS_ID_SIZE, "stmmac-%x",
|
||||
priv->plat->bus_id);
|
||||
if (priv->plat->phy_node) {
|
||||
phydev = of_phy_connect(dev, priv->plat->phy_node,
|
||||
&stmmac_adjust_link, 0, interface);
|
||||
} else {
|
||||
if (priv->plat->phy_bus_name)
|
||||
snprintf(bus_id, MII_BUS_ID_SIZE, "%s-%x",
|
||||
priv->plat->phy_bus_name, priv->plat->bus_id);
|
||||
else
|
||||
snprintf(bus_id, MII_BUS_ID_SIZE, "stmmac-%x",
|
||||
priv->plat->bus_id);
|
||||
|
||||
snprintf(phy_id_fmt, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, bus_id,
|
||||
priv->plat->phy_addr);
|
||||
pr_debug("stmmac_init_phy: trying to attach to %s\n", phy_id_fmt);
|
||||
snprintf(phy_id_fmt, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, bus_id,
|
||||
priv->plat->phy_addr);
|
||||
pr_debug("stmmac_init_phy: trying to attach to %s\n",
|
||||
phy_id_fmt);
|
||||
|
||||
phydev = phy_connect(dev, phy_id_fmt, &stmmac_adjust_link, interface);
|
||||
phydev = phy_connect(dev, phy_id_fmt, &stmmac_adjust_link,
|
||||
interface);
|
||||
}
|
||||
|
||||
if (IS_ERR(phydev)) {
|
||||
pr_err("%s: Could not attach to PHY\n", dev->name);
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/of_net.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_mdio.h>
|
||||
|
||||
#include "stmmac.h"
|
||||
#include "stmmac_platform.h"
|
||||
|
@ -144,13 +145,16 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
|
|||
/* Default to phy auto-detection */
|
||||
plat->phy_addr = -1;
|
||||
|
||||
/* If we find a phy-handle property, use it as the PHY */
|
||||
plat->phy_node = of_parse_phandle(np, "phy-handle", 0);
|
||||
|
||||
/* "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.
|
||||
*/
|
||||
if (of_property_read_u32(np, "snps,phy-addr", &plat->phy_addr) == 0)
|
||||
dev_warn(&pdev->dev, "snps,phy-addr property is deprecated\n");
|
||||
|
||||
if (plat->phy_bus_name)
|
||||
if (plat->phy_node || plat->phy_bus_name)
|
||||
plat->mdio_bus_data = NULL;
|
||||
else
|
||||
plat->mdio_bus_data =
|
||||
|
|
|
@ -99,6 +99,7 @@ struct plat_stmmacenet_data {
|
|||
int phy_addr;
|
||||
int interface;
|
||||
struct stmmac_mdio_bus_data *mdio_bus_data;
|
||||
struct device_node *phy_node;
|
||||
struct stmmac_dma_cfg *dma_cfg;
|
||||
int clk_csr;
|
||||
int has_gmac;
|
||||
|
|
Загрузка…
Ссылка в новой задаче