1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * OF helpers for the MDIO (Ethernet PHY) API 4 * 5 * Copyright (c) 2009 Secret Lab Technologies, Ltd. 6 */ 7 8 #ifndef __LINUX_OF_MDIO_H 9 #define __LINUX_OF_MDIO_H 10 11 #include <linux/device.h> 12 #include <linux/phy.h> 13 #include <linux/of.h> 14 15 #if IS_ENABLED(CONFIG_OF_MDIO) 16 bool of_mdiobus_child_is_phy(struct device_node *child); 17 int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np); 18 int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio, 19 struct device_node *np); 20 struct phy_device *of_phy_find_device(struct device_node *phy_np); 21 struct phy_device * 22 of_phy_connect(struct net_device *dev, struct device_node *phy_np, 23 void (*hndlr)(struct net_device *), u32 flags, 24 phy_interface_t iface); 25 struct phy_device * 26 of_phy_get_and_connect(struct net_device *dev, struct device_node *np, 27 void (*hndlr)(struct net_device *)); 28 struct phy_device * 29 of_phy_attach(struct net_device *dev, struct device_node *phy_np, 30 u32 flags, phy_interface_t iface); 31 32 struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); 33 int of_phy_register_fixed_link(struct device_node *np); 34 void of_phy_deregister_fixed_link(struct device_node *np); 35 bool of_phy_is_fixed_link(struct device_node *np); 36 int of_mdiobus_phy_device_register(struct mii_bus *mdio, struct phy_device *phy, 37 struct device_node *child, u32 addr); 38 39 static inline int of_mdio_parse_addr(struct device *dev, 40 const struct device_node *np) 41 { 42 u32 addr; 43 int ret; 44 45 ret = of_property_read_u32(np, "reg", &addr); 46 if (ret < 0) { 47 dev_err(dev, "%s has invalid PHY address\n", np->full_name); 48 return ret; 49 } 50 51 /* A PHY must have a reg property in the range [0-31] */ 52 if (addr >= PHY_MAX_ADDR) { 53 dev_err(dev, "%s PHY address %i is too large\n", 54 np->full_name, addr); 55 return -EINVAL; 56 } 57 58 return addr; 59 } 60 61 #else /* CONFIG_OF_MDIO */ 62 static inline bool of_mdiobus_child_is_phy(struct device_node *child) 63 { 64 return false; 65 } 66 67 static inline int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) 68 { 69 /* 70 * Fall back to the non-DT function to register a bus. 71 * This way, we don't have to keep compat bits around in drivers. 72 */ 73 74 return mdiobus_register(mdio); 75 } 76 77 static inline struct phy_device *of_phy_find_device(struct device_node *phy_np) 78 { 79 return NULL; 80 } 81 82 static inline struct phy_device *of_phy_connect(struct net_device *dev, 83 struct device_node *phy_np, 84 void (*hndlr)(struct net_device *), 85 u32 flags, phy_interface_t iface) 86 { 87 return NULL; 88 } 89 90 static inline struct phy_device * 91 of_phy_get_and_connect(struct net_device *dev, struct device_node *np, 92 void (*hndlr)(struct net_device *)) 93 { 94 return NULL; 95 } 96 97 static inline struct phy_device *of_phy_attach(struct net_device *dev, 98 struct device_node *phy_np, 99 u32 flags, phy_interface_t iface) 100 { 101 return NULL; 102 } 103 104 static inline struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np) 105 { 106 return NULL; 107 } 108 109 static inline int of_mdio_parse_addr(struct device *dev, 110 const struct device_node *np) 111 { 112 return -ENOSYS; 113 } 114 static inline int of_phy_register_fixed_link(struct device_node *np) 115 { 116 return -ENOSYS; 117 } 118 static inline void of_phy_deregister_fixed_link(struct device_node *np) 119 { 120 } 121 static inline bool of_phy_is_fixed_link(struct device_node *np) 122 { 123 return false; 124 } 125 126 static inline int of_mdiobus_phy_device_register(struct mii_bus *mdio, 127 struct phy_device *phy, 128 struct device_node *child, u32 addr) 129 { 130 return -ENOSYS; 131 } 132 #endif 133 134 135 #endif /* __LINUX_OF_MDIO_H */ 136