@@ -88,6 +88,27 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio, struct device_node *chi
88
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
113
* of_mdiobus_register - Register mii_bus and create PHYs from the device tree
93
114
* @mdio: pointer to mii_bus structure
@@ -102,7 +123,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
102
123
const __be32 * paddr ;
103
124
u32 addr ;
104
125
bool scanphys = false;
105
- int rc , i , len ;
126
+ int rc , i ;
106
127
107
128
/* Mask out all PHYs from auto probing. Instead the PHYs listed in
108
129
* the device tree are populated after the bus has been registered */
@@ -122,19 +143,9 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
122
143
123
144
/* Loop over the child nodes and register a phy_device for each one */
124
145
for_each_available_child_of_node (np , child ) {
125
- /* A PHY must have a reg property in the range [0-31] */
126
- paddr = of_get_property (child , "reg" , & len );
127
- if (!paddr || len < sizeof (* paddr )) {
146
+ addr = of_mdio_parse_addr (& mdio -> dev , child );
147
+ if (addr < 0 ) {
128
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
149
continue ;
139
150
}
140
151
@@ -149,7 +160,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
149
160
/* auto scan for PHYs with empty reg property */
150
161
for_each_available_child_of_node (np , child ) {
151
162
/* Skip PHYs with reg property set */
152
- paddr = of_get_property (child , "reg" , & len );
163
+ paddr = of_get_property (child , "reg" , NULL );
153
164
if (paddr )
154
165
continue ;
155
166
@@ -172,6 +183,39 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
172
183
}
173
184
EXPORT_SYMBOL (of_mdiobus_register );
174
185
186
+ /**
187
+ * of_mdiobus_link_phydev - Find a device node for a phy
188
+ * @mdio: pointer to mii_bus structure
189
+ * @phydev: phydev for which the of_node pointer should be set
190
+ *
191
+ * Walk the list of subnodes of a mdio bus and look for a node that matches the
192
+ * phy's address with its 'reg' property. If found, set the of_node pointer for
193
+ * the phy. This allows auto-probed pyh devices to be supplied with information
194
+ * passed in via DT.
195
+ */
196
+ void of_mdiobus_link_phydev (struct mii_bus * mdio ,
197
+ struct phy_device * phydev )
198
+ {
199
+ struct device * dev = & phydev -> dev ;
200
+ struct device_node * child ;
201
+
202
+ if (dev -> of_node || !mdio -> dev .of_node )
203
+ return ;
204
+
205
+ for_each_available_child_of_node (mdio -> dev .of_node , child ) {
206
+ int addr ;
207
+
208
+ addr = of_mdio_parse_addr (& mdio -> dev , child );
209
+ if (addr < 0 )
210
+ continue ;
211
+
212
+ if (addr == phydev -> addr ) {
213
+ dev -> of_node = child ;
214
+ return ;
215
+ }
216
+ }
217
+ }
218
+
175
219
/* Helper function for of_phy_find_device */
176
220
static int of_phy_match (struct device * dev , void * phy_np )
177
221
{
0 commit comments