Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.5-rc4 456 lines 12 kB view raw
1/* 2 * OF helpers for the MDIO (Ethernet PHY) API 3 * 4 * Copyright (c) 2009 Secret Lab Technologies, Ltd. 5 * 6 * This file is released under the GPLv2 7 * 8 * This file provides helper functions for extracting PHY device information 9 * out of the OpenFirmware device tree and using it to populate an mii_bus. 10 */ 11 12#include <linux/kernel.h> 13#include <linux/device.h> 14#include <linux/netdevice.h> 15#include <linux/err.h> 16#include <linux/phy.h> 17#include <linux/phy_fixed.h> 18#include <linux/of.h> 19#include <linux/of_gpio.h> 20#include <linux/of_irq.h> 21#include <linux/of_mdio.h> 22#include <linux/module.h> 23 24MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); 25MODULE_LICENSE("GPL"); 26 27/* Extract the clause 22 phy ID from the compatible string of the form 28 * ethernet-phy-idAAAA.BBBB */ 29static int of_get_phy_id(struct device_node *device, u32 *phy_id) 30{ 31 struct property *prop; 32 const char *cp; 33 unsigned int upper, lower; 34 35 of_property_for_each_string(device, "compatible", prop, cp) { 36 if (sscanf(cp, "ethernet-phy-id%4x.%4x", &upper, &lower) == 2) { 37 *phy_id = ((upper & 0xFFFF) << 16) | (lower & 0xFFFF); 38 return 0; 39 } 40 } 41 return -EINVAL; 42} 43 44static int of_mdiobus_register_phy(struct mii_bus *mdio, struct device_node *child, 45 u32 addr) 46{ 47 struct phy_device *phy; 48 bool is_c45; 49 int rc; 50 u32 phy_id; 51 52 is_c45 = of_device_is_compatible(child, 53 "ethernet-phy-ieee802.3-c45"); 54 55 if (!is_c45 && !of_get_phy_id(child, &phy_id)) 56 phy = phy_device_create(mdio, addr, phy_id, 0, NULL); 57 else 58 phy = get_phy_device(mdio, addr, is_c45); 59 if (!phy || IS_ERR(phy)) 60 return 1; 61 62 rc = irq_of_parse_and_map(child, 0); 63 if (rc > 0) { 64 phy->irq = rc; 65 mdio->irq[addr] = rc; 66 } else { 67 phy->irq = mdio->irq[addr]; 68 } 69 70 if (of_property_read_bool(child, "broken-turn-around")) 71 mdio->phy_ignore_ta_mask |= 1 << addr; 72 73 /* Associate the OF node with the device structure so it 74 * can be looked up later */ 75 of_node_get(child); 76 phy->mdio.dev.of_node = child; 77 78 /* All data is now stored in the phy struct; 79 * register it */ 80 rc = phy_device_register(phy); 81 if (rc) { 82 phy_device_free(phy); 83 of_node_put(child); 84 return 1; 85 } 86 87 dev_dbg(&mdio->dev, "registered phy %s at address %i\n", 88 child->name, addr); 89 90 return 0; 91} 92 93static int of_mdiobus_register_device(struct mii_bus *mdio, 94 struct device_node *child, 95 u32 addr) 96{ 97 struct mdio_device *mdiodev; 98 int rc; 99 100 mdiodev = mdio_device_create(mdio, addr); 101 if (!mdiodev || IS_ERR(mdiodev)) 102 return 1; 103 104 /* Associate the OF node with the device structure so it 105 * can be looked up later. 106 */ 107 of_node_get(child); 108 mdiodev->dev.of_node = child; 109 110 /* All data is now stored in the mdiodev struct; register it. */ 111 rc = mdio_device_register(mdiodev); 112 if (rc) { 113 mdio_device_free(mdiodev); 114 of_node_put(child); 115 return 1; 116 } 117 118 dev_dbg(&mdio->dev, "registered mdio device %s at address %i\n", 119 child->name, addr); 120 121 return 0; 122} 123 124int of_mdio_parse_addr(struct device *dev, const struct device_node *np) 125{ 126 u32 addr; 127 int ret; 128 129 ret = of_property_read_u32(np, "reg", &addr); 130 if (ret < 0) { 131 dev_err(dev, "%s has invalid PHY address\n", np->full_name); 132 return ret; 133 } 134 135 /* A PHY must have a reg property in the range [0-31] */ 136 if (addr >= PHY_MAX_ADDR) { 137 dev_err(dev, "%s PHY address %i is too large\n", 138 np->full_name, addr); 139 return -EINVAL; 140 } 141 142 return addr; 143} 144EXPORT_SYMBOL(of_mdio_parse_addr); 145 146/* The following is a list of PHY compatible strings which appear in 147 * some DTBs. The compatible string is never matched against a PHY 148 * driver, so is pointless. We only expect devices which are not PHYs 149 * to have a compatible string, so they can be matched to an MDIO 150 * driver. Encourage users to upgrade their DT blobs to remove these. 151 */ 152static const struct of_device_id whitelist_phys[] = { 153 { .compatible = "brcm,40nm-ephy" }, 154 { .compatible = "marvell,88E1111", }, 155 { .compatible = "marvell,88e1116", }, 156 { .compatible = "marvell,88e1118", }, 157 { .compatible = "marvell,88e1145", }, 158 { .compatible = "marvell,88e1149r", }, 159 { .compatible = "marvell,88e1310", }, 160 { .compatible = "marvell,88E1510", }, 161 { .compatible = "marvell,88E1514", }, 162 { .compatible = "moxa,moxart-rtl8201cp", }, 163 {} 164}; 165 166/* 167 * Return true if the child node is for a phy. It must either: 168 * o Compatible string of "ethernet-phy-idX.X" 169 * o Compatible string of "ethernet-phy-ieee802.3-c45" 170 * o Compatible string of "ethernet-phy-ieee802.3-c22" 171 * o In the white list above (and issue a warning) 172 * o No compatibility string 173 * 174 * A device which is not a phy is expected to have a compatible string 175 * indicating what sort of device it is. 176 */ 177static bool of_mdiobus_child_is_phy(struct device_node *child) 178{ 179 u32 phy_id; 180 181 if (of_get_phy_id(child, &phy_id) != -EINVAL) 182 return true; 183 184 if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c45")) 185 return true; 186 187 if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c22")) 188 return true; 189 190 if (of_match_node(whitelist_phys, child)) { 191 pr_warn(FW_WARN 192 "%s: Whitelisted compatible string. Please remove\n", 193 child->full_name); 194 return true; 195 } 196 197 if (!of_find_property(child, "compatible", NULL)) 198 return true; 199 200 return false; 201} 202 203/** 204 * of_mdiobus_register - Register mii_bus and create PHYs from the device tree 205 * @mdio: pointer to mii_bus structure 206 * @np: pointer to device_node of MDIO bus. 207 * 208 * This function registers the mii_bus structure and registers a phy_device 209 * for each child node of @np. 210 */ 211int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) 212{ 213 struct device_node *child; 214 const __be32 *paddr; 215 bool scanphys = false; 216 int addr, rc; 217 218 /* Mask out all PHYs from auto probing. Instead the PHYs listed in 219 * the device tree are populated after the bus has been registered */ 220 mdio->phy_mask = ~0; 221 222 mdio->dev.of_node = np; 223 224 /* Register the MDIO bus */ 225 rc = mdiobus_register(mdio); 226 if (rc) 227 return rc; 228 229 /* Loop over the child nodes and register a phy_device for each phy */ 230 for_each_available_child_of_node(np, child) { 231 addr = of_mdio_parse_addr(&mdio->dev, child); 232 if (addr < 0) { 233 scanphys = true; 234 continue; 235 } 236 237 if (of_mdiobus_child_is_phy(child)) 238 of_mdiobus_register_phy(mdio, child, addr); 239 else 240 of_mdiobus_register_device(mdio, child, addr); 241 } 242 243 if (!scanphys) 244 return 0; 245 246 /* auto scan for PHYs with empty reg property */ 247 for_each_available_child_of_node(np, child) { 248 /* Skip PHYs with reg property set */ 249 paddr = of_get_property(child, "reg", NULL); 250 if (paddr) 251 continue; 252 253 for (addr = 0; addr < PHY_MAX_ADDR; addr++) { 254 /* skip already registered PHYs */ 255 if (mdiobus_is_registered_device(mdio, addr)) 256 continue; 257 258 /* be noisy to encourage people to set reg property */ 259 dev_info(&mdio->dev, "scan phy %s at address %i\n", 260 child->name, addr); 261 262 if (of_mdiobus_child_is_phy(child)) 263 of_mdiobus_register_phy(mdio, child, addr); 264 } 265 } 266 267 return 0; 268} 269EXPORT_SYMBOL(of_mdiobus_register); 270 271/* Helper function for of_phy_find_device */ 272static int of_phy_match(struct device *dev, void *phy_np) 273{ 274 return dev->of_node == phy_np; 275} 276 277/** 278 * of_phy_find_device - Give a PHY node, find the phy_device 279 * @phy_np: Pointer to the phy's device tree node 280 * 281 * If successful, returns a pointer to the phy_device with the embedded 282 * struct device refcount incremented by one, or NULL on failure. 283 */ 284struct phy_device *of_phy_find_device(struct device_node *phy_np) 285{ 286 struct device *d; 287 struct mdio_device *mdiodev; 288 289 if (!phy_np) 290 return NULL; 291 292 d = bus_find_device(&mdio_bus_type, NULL, phy_np, of_phy_match); 293 if (d) { 294 mdiodev = to_mdio_device(d); 295 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) 296 return to_phy_device(d); 297 } 298 299 return NULL; 300} 301EXPORT_SYMBOL(of_phy_find_device); 302 303/** 304 * of_phy_connect - Connect to the phy described in the device tree 305 * @dev: pointer to net_device claiming the phy 306 * @phy_np: Pointer to device tree node for the PHY 307 * @hndlr: Link state callback for the network device 308 * @iface: PHY data interface type 309 * 310 * If successful, returns a pointer to the phy_device with the embedded 311 * struct device refcount incremented by one, or NULL on failure. The 312 * refcount must be dropped by calling phy_disconnect() or phy_detach(). 313 */ 314struct phy_device *of_phy_connect(struct net_device *dev, 315 struct device_node *phy_np, 316 void (*hndlr)(struct net_device *), u32 flags, 317 phy_interface_t iface) 318{ 319 struct phy_device *phy = of_phy_find_device(phy_np); 320 int ret; 321 322 if (!phy) 323 return NULL; 324 325 phy->dev_flags = flags; 326 327 ret = phy_connect_direct(dev, phy, hndlr, iface); 328 329 /* refcount is held by phy_connect_direct() on success */ 330 put_device(&phy->mdio.dev); 331 332 return ret ? NULL : phy; 333} 334EXPORT_SYMBOL(of_phy_connect); 335 336/** 337 * of_phy_attach - Attach to a PHY without starting the state machine 338 * @dev: pointer to net_device claiming the phy 339 * @phy_np: Node pointer for the PHY 340 * @flags: flags to pass to the PHY 341 * @iface: PHY data interface type 342 * 343 * If successful, returns a pointer to the phy_device with the embedded 344 * struct device refcount incremented by one, or NULL on failure. The 345 * refcount must be dropped by calling phy_disconnect() or phy_detach(). 346 */ 347struct phy_device *of_phy_attach(struct net_device *dev, 348 struct device_node *phy_np, u32 flags, 349 phy_interface_t iface) 350{ 351 struct phy_device *phy = of_phy_find_device(phy_np); 352 int ret; 353 354 if (!phy) 355 return NULL; 356 357 ret = phy_attach_direct(dev, phy, flags, iface); 358 359 /* refcount is held by phy_attach_direct() on success */ 360 put_device(&phy->mdio.dev); 361 362 return ret ? NULL : phy; 363} 364EXPORT_SYMBOL(of_phy_attach); 365 366#if defined(CONFIG_FIXED_PHY) 367/* 368 * of_phy_is_fixed_link() and of_phy_register_fixed_link() must 369 * support two DT bindings: 370 * - the old DT binding, where 'fixed-link' was a property with 5 371 * cells encoding various informations about the fixed PHY 372 * - the new DT binding, where 'fixed-link' is a sub-node of the 373 * Ethernet device. 374 */ 375bool of_phy_is_fixed_link(struct device_node *np) 376{ 377 struct device_node *dn; 378 int len, err; 379 const char *managed; 380 381 /* New binding */ 382 dn = of_get_child_by_name(np, "fixed-link"); 383 if (dn) { 384 of_node_put(dn); 385 return true; 386 } 387 388 err = of_property_read_string(np, "managed", &managed); 389 if (err == 0 && strcmp(managed, "auto") != 0) 390 return true; 391 392 /* Old binding */ 393 if (of_get_property(np, "fixed-link", &len) && 394 len == (5 * sizeof(__be32))) 395 return true; 396 397 return false; 398} 399EXPORT_SYMBOL(of_phy_is_fixed_link); 400 401int of_phy_register_fixed_link(struct device_node *np) 402{ 403 struct fixed_phy_status status = {}; 404 struct device_node *fixed_link_node; 405 const __be32 *fixed_link_prop; 406 int link_gpio; 407 int len, err; 408 struct phy_device *phy; 409 const char *managed; 410 411 err = of_property_read_string(np, "managed", &managed); 412 if (err == 0) { 413 if (strcmp(managed, "in-band-status") == 0) { 414 /* status is zeroed, namely its .link member */ 415 phy = fixed_phy_register(PHY_POLL, &status, -1, np); 416 return IS_ERR(phy) ? PTR_ERR(phy) : 0; 417 } 418 } 419 420 /* New binding */ 421 fixed_link_node = of_get_child_by_name(np, "fixed-link"); 422 if (fixed_link_node) { 423 status.link = 1; 424 status.duplex = of_property_read_bool(fixed_link_node, 425 "full-duplex"); 426 if (of_property_read_u32(fixed_link_node, "speed", &status.speed)) 427 return -EINVAL; 428 status.pause = of_property_read_bool(fixed_link_node, "pause"); 429 status.asym_pause = of_property_read_bool(fixed_link_node, 430 "asym-pause"); 431 link_gpio = of_get_named_gpio_flags(fixed_link_node, 432 "link-gpios", 0, NULL); 433 of_node_put(fixed_link_node); 434 if (link_gpio == -EPROBE_DEFER) 435 return -EPROBE_DEFER; 436 437 phy = fixed_phy_register(PHY_POLL, &status, link_gpio, np); 438 return IS_ERR(phy) ? PTR_ERR(phy) : 0; 439 } 440 441 /* Old binding */ 442 fixed_link_prop = of_get_property(np, "fixed-link", &len); 443 if (fixed_link_prop && len == (5 * sizeof(__be32))) { 444 status.link = 1; 445 status.duplex = be32_to_cpu(fixed_link_prop[1]); 446 status.speed = be32_to_cpu(fixed_link_prop[2]); 447 status.pause = be32_to_cpu(fixed_link_prop[3]); 448 status.asym_pause = be32_to_cpu(fixed_link_prop[4]); 449 phy = fixed_phy_register(PHY_POLL, &status, -1, np); 450 return IS_ERR(phy) ? PTR_ERR(phy) : 0; 451 } 452 453 return -ENODEV; 454} 455EXPORT_SYMBOL(of_phy_register_fixed_link); 456#endif