of_mdio: Abstract a general interface for phy connect
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>
This commit is contained in:
Родитель
4960e4b1e6
Коммит
b786241253
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/of_gpio.h>
|
#include <linux/of_gpio.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_mdio.h>
|
#include <linux/of_mdio.h>
|
||||||
|
#include <linux/of_net.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
||||||
MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
|
MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
|
||||||
|
@ -331,6 +332,41 @@ struct phy_device *of_phy_connect(struct net_device *dev,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_phy_connect);
|
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
|
* of_phy_attach - Attach to a PHY without starting the state machine
|
||||||
* @dev: pointer to net_device claiming the phy
|
* @dev: pointer to net_device claiming the phy
|
||||||
|
|
|
@ -19,6 +19,9 @@ extern struct phy_device *of_phy_connect(struct net_device *dev,
|
||||||
struct device_node *phy_np,
|
struct device_node *phy_np,
|
||||||
void (*hndlr)(struct net_device *),
|
void (*hndlr)(struct net_device *),
|
||||||
u32 flags, phy_interface_t iface);
|
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 phy_device *of_phy_attach(struct net_device *dev,
|
||||||
struct device_node *phy_np, u32 flags,
|
struct device_node *phy_np, u32 flags,
|
||||||
phy_interface_t iface);
|
phy_interface_t iface);
|
||||||
|
@ -52,6 +55,13 @@ static inline struct phy_device *of_phy_connect(struct net_device *dev,
|
||||||
return NULL;
|
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,
|
static inline struct phy_device *of_phy_attach(struct net_device *dev,
|
||||||
struct device_node *phy_np,
|
struct device_node *phy_np,
|
||||||
u32 flags, phy_interface_t iface)
|
u32 flags, phy_interface_t iface)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче