]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
power: regulator: Trigger probe of regulators which are always-on or boot-on
authorMarek Vasut <marex@denx.de>
Thu, 26 Sep 2024 23:14:12 +0000 (01:14 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 1 Oct 2024 01:19:07 +0000 (19:19 -0600)
In case a regulator DT node contains regulator-always-on or regulator-boot-on
property, make sure the regulator gets correctly configured by U-Boot on start
up. Unconditionally probe such regulator drivers. This is a preparatory patch
for introduction of .regulator_post_probe() which would trigger the regulator
configuration.

Parsing of regulator-always-on and regulator-boot-on DT property has been
moved to regulator_post_bind() as the information is required early, the
rest of the DT parsing has been kept in regulator_pre_probe() to avoid
slowing down the boot process.

Signed-off-by: Marek Vasut <marex@denx.de>
drivers/power/regulator/regulator-uclass.c
test/dm/panel.c
test/dm/regulator.c

index 009229002920d26b28362af369823d00afc08b85..1a970004540a1e17b667d86d4cb7623eb8736e78 100644 (file)
@@ -439,6 +439,8 @@ static int regulator_post_bind(struct udevice *dev)
        const char *property = "regulator-name";
 
        uc_pdata = dev_get_uclass_plat(dev);
+       uc_pdata->always_on = dev_read_bool(dev, "regulator-always-on");
+       uc_pdata->boot_on = dev_read_bool(dev, "regulator-boot-on");
 
        /* Regulator's mandatory constraint */
        uc_pdata->name = dev_read_string(dev, property);
@@ -450,13 +452,21 @@ static int regulator_post_bind(struct udevice *dev)
                        return -EINVAL;
        }
 
-       if (regulator_name_is_unique(dev, uc_pdata->name))
-               return 0;
+       if (!regulator_name_is_unique(dev, uc_pdata->name)) {
+               debug("'%s' of dev: '%s', has nonunique value: '%s\n",
+                     property, dev->name, uc_pdata->name);
+               return -EINVAL;
+       }
 
-       debug("'%s' of dev: '%s', has nonunique value: '%s\n",
-             property, dev->name, uc_pdata->name);
+       /*
+        * In case the regulator has regulator-always-on or
+        * regulator-boot-on DT property, trigger probe() to
+        * configure its default state during startup.
+        */
+       if (uc_pdata->always_on || uc_pdata->boot_on)
+               dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND);
 
-       return -EINVAL;
+       return 0;
 }
 
 static int regulator_pre_probe(struct udevice *dev)
@@ -479,8 +489,6 @@ static int regulator_pre_probe(struct udevice *dev)
                                                -ENODATA);
        uc_pdata->max_uA = dev_read_u32_default(dev, "regulator-max-microamp",
                                                -ENODATA);
-       uc_pdata->always_on = dev_read_bool(dev, "regulator-always-on");
-       uc_pdata->boot_on = dev_read_bool(dev, "regulator-boot-on");
        uc_pdata->ramp_delay = dev_read_u32_default(dev, "regulator-ramp-delay",
                                                    0);
        uc_pdata->force_off = dev_read_bool(dev, "regulator-force-boot-off");
index ce835c96ed0f2206e9de9fc4ddb0b5cd60baf4b0..ec85a9b1e6e8451af40c40e929bbdc0d51ac26a0 100644 (file)
@@ -33,7 +33,7 @@ static int dm_test_panel(struct unit_test_state *uts)
        ut_assertok(sandbox_pwm_get_config(pwm, 0, &period_ns, &duty_ns,
                                           &enable, &polarity));
        ut_asserteq(false, enable);
-       ut_asserteq(false, regulator_get_enable(reg));
+       ut_asserteq(true, regulator_get_enable(reg));
 
        ut_assertok(panel_enable_backlight(dev));
        ut_assertok(sandbox_pwm_get_config(pwm, 0, &period_ns, &duty_ns,
index 532bbd8237618a447e2cb6c4bbc0f51c4386df65..449748ad52f2f68b17c62a90d29d4a65327b4064 100644 (file)
@@ -186,7 +186,7 @@ int dm_test_power_regulator_set_enable_if_allowed(struct unit_test_state *uts)
 
        /* Get BUCK1 - always on regulator */
        platname = regulator_names[BUCK1][PLATNAME];
-       ut_assertok(regulator_autoset_by_name(platname, &dev_autoset));
+       ut_asserteq(-EALREADY, regulator_autoset_by_name(platname, &dev_autoset));
        ut_assertok(regulator_get_by_platname(platname, &dev));
 
        /* Try disabling always-on regulator */
@@ -288,7 +288,7 @@ static int dm_test_power_regulator_autoset(struct unit_test_state *uts)
         * Expected output state: uV=1200000; uA=200000; output enabled
         */
        platname = regulator_names[BUCK1][PLATNAME];
-       ut_assertok(regulator_autoset_by_name(platname, &dev_autoset));
+       ut_asserteq(-EALREADY, regulator_autoset_by_name(platname, &dev_autoset));
 
        /* Check, that the returned device is proper */
        ut_assertok(regulator_get_by_platname(platname, &dev));