diff options
author | David Daney <david.daney@cavium.com> | 2012-06-27 03:33:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-28 00:23:24 -0400 |
commit | 6bd47ac2e434611e52027155438d7b4ad3c76bdb (patch) | |
tree | dde981a0e2592d9cbe13f56dd2a6db69744fbb9b /drivers/of/of_mdio.c | |
parent | ac28b9f8cd66d6bc54f8063df59e99abd62173a4 (diff) |
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: David Daney <david.daney@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/of/of_mdio.c')
-rw-r--r-- | drivers/of/of_mdio.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c index 6c24cad322df..8e6c25f35040 100644 --- a/drivers/of/of_mdio.c +++ b/drivers/of/of_mdio.c | |||
@@ -57,6 +57,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) | |||
57 | const __be32 *paddr; | 57 | const __be32 *paddr; |
58 | u32 addr; | 58 | u32 addr; |
59 | int len; | 59 | int len; |
60 | bool is_c45; | ||
60 | 61 | ||
61 | /* A PHY must have a reg property in the range [0-31] */ | 62 | /* A PHY must have a reg property in the range [0-31] */ |
62 | paddr = of_get_property(child, "reg", &len); | 63 | paddr = of_get_property(child, "reg", &len); |
@@ -79,11 +80,18 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) | |||
79 | mdio->irq[addr] = PHY_POLL; | 80 | mdio->irq[addr] = PHY_POLL; |
80 | } | 81 | } |
81 | 82 | ||
82 | phy = get_phy_device(mdio, addr, false); | 83 | is_c45 = of_device_is_compatible(child, |
84 | "ethernet-phy-ieee802.3-c45"); | ||
85 | phy = get_phy_device(mdio, addr, is_c45); | ||
86 | |||
83 | if (!phy || IS_ERR(phy)) { | 87 | if (!phy || IS_ERR(phy)) { |
84 | dev_err(&mdio->dev, "error probing PHY at address %i\n", | 88 | phy = phy_device_create(mdio, addr, 0, false, NULL); |
85 | addr); | 89 | if (!phy || IS_ERR(phy)) { |
86 | continue; | 90 | dev_err(&mdio->dev, |
91 | "error creating PHY at address %i\n", | ||
92 | addr); | ||
93 | continue; | ||
94 | } | ||
87 | } | 95 | } |
88 | 96 | ||
89 | /* Associate the OF node with the device structure so it | 97 | /* Associate the OF node with the device structure so it |