generic-phy: add generic_phy_get_by_node()

Add generic_phy_get_by_node() to get a PHY phandle from a node instead
of a udevice.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
[narmstrong: fixed by including ofnode.h in generic-phy.h]
This commit is contained in:
Neil Armstrong 2020-03-30 11:27:23 +02:00
parent c8ccca921a
commit c2b9aa98bf
2 changed files with 40 additions and 5 deletions

View file

@ -31,20 +31,20 @@ static int generic_phy_xlate_offs_flags(struct phy *phy,
return 0; return 0;
} }
int generic_phy_get_by_index(struct udevice *dev, int index, int generic_phy_get_by_node(ofnode node, int index, struct phy *phy)
struct phy *phy)
{ {
struct ofnode_phandle_args args; struct ofnode_phandle_args args;
struct phy_ops *ops; struct phy_ops *ops;
struct udevice *phydev; struct udevice *phydev;
int i, ret; int i, ret;
debug("%s(dev=%p, index=%d, phy=%p)\n", __func__, dev, index, phy); debug("%s(node=%s, index=%d, phy=%p)\n",
__func__, ofnode_get_name(node), index, phy);
assert(phy); assert(phy);
phy->dev = NULL; phy->dev = NULL;
ret = dev_read_phandle_with_args(dev, "phys", "#phy-cells", 0, index, ret = ofnode_parse_phandle_with_args(node, "phys", "#phy-cells", 0,
&args); index, &args);
if (ret) { if (ret) {
debug("%s: dev_read_phandle_with_args failed: err=%d\n", debug("%s: dev_read_phandle_with_args failed: err=%d\n",
__func__, ret); __func__, ret);
@ -90,6 +90,12 @@ err:
return ret; return ret;
} }
int generic_phy_get_by_index(struct udevice *dev, int index,
struct phy *phy)
{
return generic_phy_get_by_node(dev_ofnode(dev), index, phy);
}
int generic_phy_get_by_name(struct udevice *dev, const char *phy_name, int generic_phy_get_by_name(struct udevice *dev, const char *phy_name,
struct phy *phy) struct phy *phy)
{ {

View file

@ -7,6 +7,8 @@
#ifndef __GENERIC_PHY_H #ifndef __GENERIC_PHY_H
#define __GENERIC_PHY_H #define __GENERIC_PHY_H
#include <dm/ofnode.h>
struct ofnode_phandle_args; struct ofnode_phandle_args;
/** /**
@ -193,6 +195,33 @@ int generic_phy_power_off(struct phy *phy);
int generic_phy_get_by_index(struct udevice *user, int index, int generic_phy_get_by_index(struct udevice *user, int index,
struct phy *phy); struct phy *phy);
/**
* generic_phy_get_by_node() - Get a PHY device by integer index on ofnode
*
* @node: the device node
* @index: The index in the list of available PHYs
* @phy: A pointer to the PHY port
*
* This looks up a PHY device for a client device based on its ofnode and on
* its position in the list of the possible PHYs.
*
* example:
* usb1: usb_otg_ss@xxx {
* compatible = "xxx";
* reg = <xxx>;
* .
* .
* phys = <&usb2_phy>, <&usb3_phy>;
* .
* .
* };
* the USB2 phy can be accessed by passing index '0' and the USB3 phy can
* be accessed by passing index '1'
*
* @return 0 if OK, or a negative error code
*/
int generic_phy_get_by_node(ofnode node, int index, struct phy *phy);
/** /**
* generic_phy_get_by_name() - Get a PHY device by its name. * generic_phy_get_by_name() - Get a PHY device by its name.
* *