File tree Expand file tree Collapse file tree 3 files changed +47
-0
lines changed Expand file tree Collapse file tree 3 files changed +47
-0
lines changed Original file line number Diff line number Diff line change @@ -300,6 +300,12 @@ struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
300
300
if (IS_ERR (phydev ) || phydev == NULL )
301
301
return phydev ;
302
302
303
+ /*
304
+ * For DT, see if the auto-probed phy has a correspoding child
305
+ * in the bus node, and set the of_node pointer in this case.
306
+ */
307
+ of_mdiobus_link_phydev (bus , phydev );
308
+
303
309
err = phy_device_register (phydev );
304
310
if (err ) {
305
311
phy_device_free (phydev );
Original file line number Diff line number Diff line change @@ -183,6 +183,39 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
183
183
}
184
184
EXPORT_SYMBOL (of_mdiobus_register );
185
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
+
186
219
/* Helper function for of_phy_find_device */
187
220
static int of_phy_match (struct device * dev , void * phy_np )
188
221
{
Original file line number Diff line number Diff line change @@ -25,6 +25,9 @@ struct phy_device *of_phy_attach(struct net_device *dev,
25
25
26
26
extern struct mii_bus * of_mdio_find_bus (struct device_node * mdio_np );
27
27
28
+ extern void of_mdiobus_link_phydev (struct mii_bus * mdio ,
29
+ struct phy_device * phydev );
30
+
28
31
#else /* CONFIG_OF */
29
32
static inline int of_mdiobus_register (struct mii_bus * mdio , struct device_node * np )
30
33
{
@@ -60,6 +63,11 @@ static inline struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np)
60
63
{
61
64
return NULL ;
62
65
}
66
+
67
+ static inline void of_mdiobus_link_phydev (struct mii_bus * mdio ,
68
+ struct phy_device * phydev )
69
+ {
70
+ }
63
71
#endif /* CONFIG_OF */
64
72
65
73
#if defined(CONFIG_OF ) && defined(CONFIG_FIXED_PHY )
You can’t perform that action at this time.
0 commit comments