]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
phy: Fix generic_setup_phy() return value on power on failure
authorJonas Karlman <jonas@kwiboo.se>
Thu, 31 Aug 2023 23:07:08 +0000 (23:07 +0000)
committerTom Rini <trini@konsulko.com>
Wed, 13 Sep 2023 19:52:21 +0000 (15:52 -0400)
generic_phy_exit() typically return 0 for a struct phy that has been
initialized with a generic_phy_init() call.

generic_setup_phy() returns the value from a generic_phy_exit() call
when generic_phy_power_on() fails. This hides the failed state of the
power_on ops from the caller of generic_setup_phy().

Fix this by ignoring the return value of the generic_phy_exit() call and
return the value from the generic_phy_power_on() call.

Fixes: 84e561407a5f ("phy: Add generic_{setup,shutdown}_phy() helpers")
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
drivers/phy/phy-uclass.c
test/dm/phy.c

index 7d707c022934223f393507a9f055e6372dd5d33a..d745e7babc12f10e87e4d6b638cac2e50bdd2f2a 100644 (file)
@@ -526,7 +526,7 @@ int generic_setup_phy(struct udevice *dev, struct phy *phy, int index)
 
                ret = generic_phy_power_on(phy);
                if (ret)
-                       ret = generic_phy_exit(phy);
+                       generic_phy_exit(phy);
        }
 
        return ret;
index 2abd27b22d6df2f0e521e05de269912d955a8bcd..4da4841f40f79e3d8ca6eecf5ffb7a890dbbd805 100644 (file)
@@ -234,3 +234,27 @@ static int dm_test_phy_multi_exit(struct unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_phy_multi_exit, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
+static int dm_test_phy_setup(struct unit_test_state *uts)
+{
+       struct phy phy;
+       struct udevice *parent;
+
+       ut_assertok(uclass_get_device_by_name(UCLASS_SIMPLE_BUS,
+                                             "gen_phy_user", &parent));
+
+       /* normal */
+       ut_assertok(generic_setup_phy(parent, &phy, 0));
+       ut_assertok(generic_shutdown_phy(&phy));
+
+       /* power_off fail with -EIO */
+       ut_assertok(generic_setup_phy(parent, &phy, 1));
+       ut_asserteq(-EIO, generic_shutdown_phy(&phy));
+
+       /* power_on fail with -EIO */
+       ut_asserteq(-EIO, generic_setup_phy(parent, &phy, 2));
+       ut_assertok(generic_shutdown_phy(&phy));
+
+       return 0;
+}
+DM_TEST(dm_test_phy_setup, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);