Commit 6bd47ac2 authored by David Daney's avatar David Daney Committed by David S. Miller

netdev/phy/of: Handle IEEE802.3 clause 45 Ethernet PHYs in of_mdiobus_register()

Define two new "compatible" values for Ethernet
PHYs. "ethernet-phy-ieee802.3-c22" and "ethernet-phy-ieee802.3-c45"
are used to indicate a PHY uses the corresponding protocol.

If a PHY is "compatible" with "ethernet-phy-ieee802.3-c45", we
indicate this so that get_phy_device() can properly probe the device.

If get_phy_device() fails, it was probably due to failing the probe of
the PHY identifier registers.  Since we have the device tree telling
us the PHY exists, go ahead and add it anyhow with a phy_id of zero.
There may be a driver match based on the "compatible" property.
Signed-off-by: default avatarDavid Daney <david.daney@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ac28b9f8
...@@ -14,10 +14,20 @@ Required properties: ...@@ -14,10 +14,20 @@ Required properties:
- linux,phandle : phandle for this node; likely referenced by an - linux,phandle : phandle for this node; likely referenced by an
ethernet controller node. ethernet controller node.
Optional Properties:
- compatible: Compatible list, may contain
"ethernet-phy-ieee802.3-c22" or "ethernet-phy-ieee802.3-c45" for
PHYs that implement IEEE802.3 clause 22 or IEEE802.3 clause 45
specifications. If neither of these are specified, the default is to
assume clause 22. The compatible list may also contain other
elements.
Example: Example:
ethernet-phy@0 { ethernet-phy@0 {
linux,phandle = <2452000> compatible = "ethernet-phy-ieee802.3-c22";
linux,phandle = <2452000>;
interrupt-parent = <40000>; interrupt-parent = <40000>;
interrupts = <35 1>; interrupts = <35 1>;
reg = <0>; reg = <0>;
......
...@@ -57,6 +57,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) ...@@ -57,6 +57,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
const __be32 *paddr; const __be32 *paddr;
u32 addr; u32 addr;
int len; int len;
bool is_c45;
/* A PHY must have a reg property in the range [0-31] */ /* A PHY must have a reg property in the range [0-31] */
paddr = of_get_property(child, "reg", &len); paddr = of_get_property(child, "reg", &len);
...@@ -79,12 +80,19 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) ...@@ -79,12 +80,19 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
mdio->irq[addr] = PHY_POLL; mdio->irq[addr] = PHY_POLL;
} }
phy = get_phy_device(mdio, addr, false); is_c45 = of_device_is_compatible(child,
"ethernet-phy-ieee802.3-c45");
phy = get_phy_device(mdio, addr, is_c45);
if (!phy || IS_ERR(phy)) {
phy = phy_device_create(mdio, addr, 0, false, NULL);
if (!phy || IS_ERR(phy)) { if (!phy || IS_ERR(phy)) {
dev_err(&mdio->dev, "error probing PHY at address %i\n", dev_err(&mdio->dev,
"error creating PHY at address %i\n",
addr); addr);
continue; continue;
} }
}
/* Associate the OF node with the device structure so it /* Associate the OF node with the device structure so it
* can be looked up later */ * can be looked up later */
......
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