diff options
author | Daniel Mack <zonque@gmail.com> | 2014-05-24 03:34:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-29 18:23:18 -0400 |
commit | 8f8382888cbaf6de13046437d41a1c3d1394d51f (patch) | |
tree | c55be762ab32ea47eedfe2b1dfe27a08ea4640d6 /drivers/of | |
parent | 6623b4194459c07859d3e3196c3994fa7be5b88e (diff) |
net: of_mdio: factor out code to parse a phy's 'reg' property
Factor out some logic into of_mdio_parse_addr() so it can be reused
later. While at it, use of_property_read_u32() rather than open-coding
the same logic again.
Signed-off-by: Daniel Mack <zonque@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/of')
-rw-r--r-- | drivers/of/of_mdio.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c index 7c6e277cdd1f..731d3d9052d7 100644 --- a/drivers/of/of_mdio.c +++ b/drivers/of/of_mdio.c | |||
@@ -88,6 +88,27 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio, struct device_node *chi | |||
88 | return 0; | 88 | return 0; |
89 | } | 89 | } |
90 | 90 | ||
91 | static int of_mdio_parse_addr(struct device *dev, const struct device_node *np) | ||
92 | { | ||
93 | u32 addr; | ||
94 | int ret; | ||
95 | |||
96 | ret = of_property_read_u32(np, "reg", &addr); | ||
97 | if (ret < 0) { | ||
98 | dev_err(dev, "%s has invalid PHY address\n", np->full_name); | ||
99 | return ret; | ||
100 | } | ||
101 | |||
102 | /* A PHY must have a reg property in the range [0-31] */ | ||
103 | if (addr >= PHY_MAX_ADDR) { | ||
104 | dev_err(dev, "%s PHY address %i is too large\n", | ||
105 | np->full_name, addr); | ||
106 | return -EINVAL; | ||
107 | } | ||
108 | |||
109 | return addr; | ||
110 | } | ||
111 | |||
91 | /** | 112 | /** |
92 | * of_mdiobus_register - Register mii_bus and create PHYs from the device tree | 113 | * of_mdiobus_register - Register mii_bus and create PHYs from the device tree |
93 | * @mdio: pointer to mii_bus structure | 114 | * @mdio: pointer to mii_bus structure |
@@ -122,19 +143,9 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) | |||
122 | 143 | ||
123 | /* Loop over the child nodes and register a phy_device for each one */ | 144 | /* Loop over the child nodes and register a phy_device for each one */ |
124 | for_each_available_child_of_node(np, child) { | 145 | for_each_available_child_of_node(np, child) { |
125 | /* A PHY must have a reg property in the range [0-31] */ | 146 | addr = of_mdio_parse_addr(&mdio->dev, child); |
126 | paddr = of_get_property(child, "reg", &len); | 147 | if (addr < 0) { |
127 | if (!paddr || len < sizeof(*paddr)) { | ||
128 | scanphys = true; | 148 | scanphys = true; |
129 | dev_err(&mdio->dev, "%s has invalid PHY address\n", | ||
130 | child->full_name); | ||
131 | continue; | ||
132 | } | ||
133 | |||
134 | addr = be32_to_cpup(paddr); | ||
135 | if (addr >= PHY_MAX_ADDR) { | ||
136 | dev_err(&mdio->dev, "%s PHY address %i is too large\n", | ||
137 | child->full_name, addr); | ||
138 | continue; | 149 | continue; |
139 | } | 150 | } |
140 | 151 | ||