diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c index 7182bcc90b..5b1f574e86 100644 --- a/drivers/power/regulator/regulator-uclass.c +++ b/drivers/power/regulator/regulator-uclass.c @@ -244,6 +244,20 @@ int device_get_supply_regulator(struct udevice *dev, const char *supply_name, supply_name, devp); } +static int regulator_init_suspend(struct udevice *dev) +{ + struct dm_regulator_uclass_platdata *uc_pdata; + int ret; + + uc_pdata = dev_get_uclass_platdata(dev); + + ret = regulator_set_suspend_enable(dev, uc_pdata->suspend_on); + if (!ret && uc_pdata->suspend_on) + return regulator_set_suspend_value(dev, uc_pdata->suspend_uV); + + return 0; +} + int regulator_autoset(struct udevice *dev) { struct dm_regulator_uclass_platdata *uc_pdata; @@ -254,16 +268,6 @@ int regulator_autoset(struct udevice *dev) if (uc_pdata->ramp_delay != -ENODATA) regulator_set_ramp_delay(dev, uc_pdata->ramp_delay); - /* - * Suspend configure is not necessary and should not influence normal - * configure, so that we set "ret=0" even failed here. - */ - ret = regulator_set_suspend_enable(dev, uc_pdata->suspend_on); - if (!ret && uc_pdata->suspend_on) - regulator_set_suspend_value(dev, uc_pdata->suspend_uV); - else - ret = 0; - if (!uc_pdata->always_on && !uc_pdata->boot_on) return -EMEDIUMTYPE; @@ -464,6 +468,31 @@ static int regulator_pre_probe(struct udevice *dev) return 0; } +int regulators_enable_state_mem(bool verbose) +{ + struct udevice *dev; + struct uclass *uc; + int ret; + + ret = uclass_get(UCLASS_REGULATOR, &uc); + if (ret) + return ret; + for (uclass_first_device(UCLASS_REGULATOR, &dev); + dev; + uclass_next_device(&dev)) { + ret = regulator_init_suspend(dev); + + if (ret == -EMEDIUMTYPE) + ret = 0; + if (verbose) + regulator_show(dev, ret); + if (ret == -ENOSYS) + ret = 0; + } + + return ret; +} + int regulators_enable_boot_on(bool verbose) { struct udevice *dev; @@ -477,6 +506,7 @@ int regulators_enable_boot_on(bool verbose) dev; uclass_next_device(&dev)) { ret = regulator_autoset(dev); + if (ret == -EMEDIUMTYPE) ret = 0; if (verbose) diff --git a/include/power/regulator.h b/include/power/regulator.h index 8e5f7c855d..a6a942bb90 100644 --- a/include/power/regulator.h +++ b/include/power/regulator.h @@ -394,23 +394,11 @@ int regulator_set_mode(struct udevice *dev, int mode_id); int regulators_enable_boot_on(bool verbose); /** - * regulator_autoset: setup the voltage/current on a regulator + * regulators_enable_state_mem() - enable regulators state mem configure * - * The setup depends on constraints found in device's uclass's platform data - * (struct dm_regulator_uclass_platdata): - * - * - Enable - will set - if any of: 'always_on' or 'boot_on' is set to true, - * or if both are unset, then the function returns - * - Voltage value - will set - if '.min_uV' and '.max_uV' values are equal - * - Current limit - will set - if '.min_uA' and '.max_uA' values are equal - * - * The function returns on the first-encountered error. - * - * @platname - expected string for dm_regulator_uclass_platdata .name field - * @devp - returned pointer to the regulator device - if non-NULL passed - * @return: 0 on success or negative value of errno. + * This sets regulator-state-mem state for all regulators ; */ -int regulator_autoset(struct udevice *dev); +int regulators_enable_state_mem(bool verbose); /** * regulator_autoset_by_name: setup the regulator given by its uclass's