Skip to content

Commit

Permalink
of_mdio: Abstract a general interface for phy connect
Browse files Browse the repository at this point in the history
Abstract a general interface "of_phy_get_and_connect"
for PHY connect. User will have no bother with getting
"phy-mode" and "phy-handle" any more.

Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Dongpo Li <lidongpo@hisilicon.com>
Reviewed-by: Jiancheng Xue <xuejiancheng@hisilicon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dongpo Li authored and David S. Miller committed Jul 17, 2016
1 parent 4960e4b commit b786241
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
36 changes: 36 additions & 0 deletions drivers/of/of_mdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/of_mdio.h>
#include <linux/of_net.h>
#include <linux/module.h>

MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
Expand Down Expand Up @@ -331,6 +332,41 @@ struct phy_device *of_phy_connect(struct net_device *dev,
}
EXPORT_SYMBOL(of_phy_connect);

/**
* of_phy_get_and_connect
* - Get phy node and connect to the phy described in the device tree
* @dev: pointer to net_device claiming the phy
* @np: Pointer to device tree node for the net_device claiming the phy
* @hndlr: Link state callback for the network device
*
* If successful, returns a pointer to the phy_device with the embedded
* struct device refcount incremented by one, or NULL on failure. The
* refcount must be dropped by calling phy_disconnect() or phy_detach().
*/
struct phy_device *of_phy_get_and_connect(struct net_device *dev,
struct device_node *np,
void (*hndlr)(struct net_device *))
{
phy_interface_t iface;
struct device_node *phy_np;
struct phy_device *phy;

iface = of_get_phy_mode(np);
if (iface < 0)
return NULL;

phy_np = of_parse_phandle(np, "phy-handle", 0);
if (!phy_np)
return NULL;

phy = of_phy_connect(dev, phy_np, hndlr, 0, iface);

of_node_put(phy_np);

return phy;
}
EXPORT_SYMBOL(of_phy_get_and_connect);

/**
* of_phy_attach - Attach to a PHY without starting the state machine
* @dev: pointer to net_device claiming the phy
Expand Down
10 changes: 10 additions & 0 deletions include/linux/of_mdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ extern struct phy_device *of_phy_connect(struct net_device *dev,
struct device_node *phy_np,
void (*hndlr)(struct net_device *),
u32 flags, phy_interface_t iface);
extern struct phy_device *
of_phy_get_and_connect(struct net_device *dev, struct device_node *np,
void (*hndlr)(struct net_device *));
struct phy_device *of_phy_attach(struct net_device *dev,
struct device_node *phy_np, u32 flags,
phy_interface_t iface);
Expand Down Expand Up @@ -52,6 +55,13 @@ static inline struct phy_device *of_phy_connect(struct net_device *dev,
return NULL;
}

static inline struct phy_device *
of_phy_get_and_connect(struct net_device *dev, struct device_node *np,
void (*hndlr)(struct net_device *))
{
return NULL;
}

static inline struct phy_device *of_phy_attach(struct net_device *dev,
struct device_node *phy_np,
u32 flags, phy_interface_t iface)
Expand Down

0 comments on commit b786241

Please sign in to comment.