root/drivers/of/of_mdio.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. of_get_phy_id
  2. of_mdiobus_register_phy
  3. of_mdiobus_register_device
  4. of_mdiobus_child_is_phy
  5. of_mdiobus_register
  6. of_phy_find_device
  7. of_phy_connect
  8. of_phy_get_and_connect
  9. of_phy_attach
  10. of_phy_is_fixed_link
  11. of_phy_register_fixed_link
  12. of_phy_deregister_fixed_link

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

/* [<][>][^][v][top][bottom][index][help] */