aboutsummaryrefslogtreecommitdiff
path: root/drivers/phy/phy-uclass.c
diff options
context:
space:
mode:
authorAngus Ainslie2022-02-03 10:08:38 -0800
committerSimon Glass2022-02-22 10:05:44 -0700
commit606a14ba2f0e01cf7aefe4924d17b5dfda27d1de (patch)
tree0b7c3d8d3528438dde2b1e70049555717270c1eb /drivers/phy/phy-uclass.c
parent6a0b5f8b9caa0c8e3a39ed8c979cfdbbf66b1841 (diff)
phy: phy-uclass: check the parents for phys
The port/hub leaf nodes don't contain the phy definitions in some dts files so check the parents. Signed-off-by: Angus Ainslie <angus@akkea.ca> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/phy/phy-uclass.c')
-rw-r--r--drivers/phy/phy-uclass.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/phy/phy-uclass.c b/drivers/phy/phy-uclass.c
index 49e2ec25c28..8b84da3ce0d 100644
--- a/drivers/phy/phy-uclass.c
+++ b/drivers/phy/phy-uclass.c
@@ -354,23 +354,31 @@ int generic_phy_configure(struct phy *phy, void *params)
int generic_phy_get_bulk(struct udevice *dev, struct phy_bulk *bulk)
{
int i, ret, count;
+ struct udevice *phydev = dev;
bulk->count = 0;
/* Return if no phy declared */
- if (!dev_read_prop(dev, "phys", NULL))
- return 0;
+ if (!dev_read_prop(dev, "phys", NULL)) {
+ phydev = dev->parent;
+ if (!dev_read_prop(phydev, "phys", NULL)) {
+ pr_err("%s : no phys property\n", __func__);
+ return 0;
+ }
+ }
- count = dev_count_phandle_with_args(dev, "phys", "#phy-cells", 0);
- if (count < 1)
+ count = dev_count_phandle_with_args(phydev, "phys", "#phy-cells", 0);
+ if (count < 1) {
+ pr_err("%s : no phys found %d\n", __func__, count);
return count;
+ }
- bulk->phys = devm_kcalloc(dev, count, sizeof(struct phy), GFP_KERNEL);
+ bulk->phys = devm_kcalloc(phydev, count, sizeof(struct phy), GFP_KERNEL);
if (!bulk->phys)
return -ENOMEM;
for (i = 0; i < count; i++) {
- ret = generic_phy_get_by_index(dev, i, &bulk->phys[i]);
+ ret = generic_phy_get_by_index(phydev, i, &bulk->phys[i]);
if (ret) {
pr_err("Failed to get PHY%d for %s\n", i, dev->name);
return ret;