diff options
-rw-r--r-- | doc/device-tree-bindings/net/fsl-tsec-phy.txt | 21 | ||||
-rw-r--r-- | drivers/net/tsec.c | 13 | ||||
-rw-r--r-- | include/tsec.h | 1 |
3 files changed, 34 insertions, 1 deletions
diff --git a/doc/device-tree-bindings/net/fsl-tsec-phy.txt b/doc/device-tree-bindings/net/fsl-tsec-phy.txt index dbe91aa..c5bf48c 100644 --- a/doc/device-tree-bindings/net/fsl-tsec-phy.txt +++ b/doc/device-tree-bindings/net/fsl-tsec-phy.txt @@ -41,3 +41,24 @@ Example: reg = <0>; }; }; + +* TBI Internal MDIO bus + +As of this writing, every tsec is associated with an internal TBI PHY. +This PHY is accessed through the local MDIO bus. These buses are defined +similarly to the mdio buses. The TBI PHYs underneath them are similar to +normal PHYs, but the reg property is considered instructive, rather than +descriptive. The reg property should be chosen so it doesn't interfere +with other PHYs on the bus. The TBI PHYs are referred to by a "tbi-handle" +property under the tsec node, which has a similar meaning of "phy-handle". + +Example: + ethernet@24000 { + phy-handle = <&tbi1>; + }; + + mdio@24520 { + tbi1: tbi-phy@1f { + reg = <0x1f>; + }; + }; diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c index 18b44f6..025e7a7 100644 --- a/drivers/net/tsec.c +++ b/drivers/net/tsec.c @@ -658,7 +658,7 @@ static int init_phy(struct tsec_private *priv) supported |= SUPPORTED_1000baseT_Full; /* Assign a Physical address to the TBI */ - out_be32(®s->tbipa, CONFIG_SYS_TBIPA_VALUE); + out_be32(®s->tbipa, priv->tbiaddr); priv->interface = tsec_get_interface(priv); @@ -707,6 +707,7 @@ static int tsec_initialize(bd_t *bis, struct tsec_info_struct *tsec_info) priv->phyregs_sgmii = tsec_info->miiregs_sgmii; priv->phyaddr = tsec_info->phyaddr; + priv->tbiaddr = CONFIG_SYS_TBIPA_VALUE; priv->flags = tsec_info->flags; sprintf(dev->name, tsec_info->devname); @@ -801,6 +802,16 @@ int tsec_probe(struct udevice *dev) return -ENOENT; } + offset = fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset, + "tbi-handle"); + if (offset > 0) { + reg = fdtdec_get_int(gd->fdt_blob, offset, "reg", + CONFIG_SYS_TBIPA_VALUE); + priv->tbiaddr = reg; + } else { + priv->tbiaddr = CONFIG_SYS_TBIPA_VALUE; + } + phy_mode = fdt_getprop(gd->fdt_blob, dev->of_offset, "phy-connection-type", NULL); if (phy_mode) diff --git a/include/tsec.h b/include/tsec.h index 88ce964..fb27edf 100644 --- a/include/tsec.h +++ b/include/tsec.h @@ -402,6 +402,7 @@ struct tsec_private { phy_interface_t interface; struct mii_dev *bus; uint phyaddr; + uint tbiaddr; char mii_devname[16]; u32 flags; uint rx_idx; /* index of the current RX buffer */ |