diff options
author | Jonas Karlman <jonas@kwiboo.se> | 2023-05-15 12:59:50 +0300 |
---|---|---|
committer | Kever Yang <kever.yang@rock-chips.com> | 2023-05-17 17:36:18 +0800 |
commit | e74ac44f790fe029b3ff995d3804f71b477312be (patch) | |
tree | c8129e73050a5d6bdba5821e5bf7676b181beaf8 /drivers/phy/phy-uclass.c | |
parent | cdf9010f6e173093d8dfeb4685063d78d35d7842 (diff) | |
download | u-boot-e74ac44f790fe029b3ff995d3804f71b477312be.tar.gz |
phy: Keep balance of counts when ops is missing
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Fixes: 226fce6108fe ("phy: Track power-on and init counts in uclass")
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Diffstat (limited to 'drivers/phy/phy-uclass.c')
-rw-r--r-- | drivers/phy/phy-uclass.c | 80 |
1 files changed, 39 insertions, 41 deletions
diff --git a/drivers/phy/phy-uclass.c b/drivers/phy/phy-uclass.c index 28cc0e6f2b8..629ef3aa3de 100644 --- a/drivers/phy/phy-uclass.c +++ b/drivers/phy/phy-uclass.c @@ -228,24 +228,24 @@ int generic_phy_init(struct phy *phy) if (!generic_phy_valid(phy)) return 0; - ops = phy_dev_ops(phy->dev); - if (!ops->init) - return 0; - counts = phy_get_counts(phy); if (counts->init_count > 0) { counts->init_count++; return 0; } - ret = ops->init(phy); - if (ret) - dev_err(phy->dev, "PHY: Failed to init %s: %d.\n", - phy->dev->name, ret); - else - counts->init_count = 1; + ops = phy_dev_ops(phy->dev); + if (ops->init) { + ret = ops->init(phy); + if (ret) { + dev_err(phy->dev, "PHY: Failed to init %s: %d.\n", + phy->dev->name, ret); + return ret; + } + } + counts->init_count = 1; - return ret; + return 0; } int generic_phy_reset(struct phy *phy) @@ -274,10 +274,6 @@ int generic_phy_exit(struct phy *phy) if (!generic_phy_valid(phy)) return 0; - ops = phy_dev_ops(phy->dev); - if (!ops->exit) - return 0; - counts = phy_get_counts(phy); if (counts->init_count == 0) return 0; @@ -286,14 +282,18 @@ int generic_phy_exit(struct phy *phy) return 0; } - ret = ops->exit(phy); - if (ret) - dev_err(phy->dev, "PHY: Failed to exit %s: %d.\n", - phy->dev->name, ret); - else - counts->init_count = 0; + ops = phy_dev_ops(phy->dev); + if (ops->exit) { + ret = ops->exit(phy); + if (ret) { + dev_err(phy->dev, "PHY: Failed to exit %s: %d.\n", + phy->dev->name, ret); + return ret; + } + } + counts->init_count = 0; - return ret; + return 0; } int generic_phy_power_on(struct phy *phy) @@ -304,10 +304,6 @@ int generic_phy_power_on(struct phy *phy) if (!generic_phy_valid(phy)) return 0; - ops = phy_dev_ops(phy->dev); - if (!ops->power_on) - return 0; - counts = phy_get_counts(phy); if (counts->power_on_count > 0) { counts->power_on_count++; @@ -321,12 +317,15 @@ int generic_phy_power_on(struct phy *phy) return ret; } - ret = ops->power_on(phy); - if (ret) { - dev_err(phy->dev, "PHY: Failed to power on %s: %d.\n", - phy->dev->name, ret); - regulator_set_enable_if_allowed(counts->supply, false); - return ret; + ops = phy_dev_ops(phy->dev); + if (ops->power_on) { + ret = ops->power_on(phy); + if (ret) { + dev_err(phy->dev, "PHY: Failed to power on %s: %d.\n", + phy->dev->name, ret); + regulator_set_enable_if_allowed(counts->supply, false); + return ret; + } } counts->power_on_count = 1; @@ -341,10 +340,6 @@ int generic_phy_power_off(struct phy *phy) if (!generic_phy_valid(phy)) return 0; - ops = phy_dev_ops(phy->dev); - if (!ops->power_off) - return 0; - counts = phy_get_counts(phy); if (counts->power_on_count == 0) return 0; @@ -353,11 +348,14 @@ int generic_phy_power_off(struct phy *phy) return 0; } - ret = ops->power_off(phy); - if (ret) { - dev_err(phy->dev, "PHY: Failed to power off %s: %d.\n", - phy->dev->name, ret); - return ret; + ops = phy_dev_ops(phy->dev); + if (ops->power_off) { + ret = ops->power_off(phy); + if (ret) { + dev_err(phy->dev, "PHY: Failed to power off %s: %d.\n", + phy->dev->name, ret); + return ret; + } } counts->power_on_count = 0; |