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