On Sun, Jun 28, 2026 at 10:25:23AM +0000, Jonas Karlman wrote: >Add regulator_set_value_clamp() that clamps a requested target voltage >to both caller-provided limits and the regulator constraints before >setting the regulator voltage value. > >Return -EINVAL when the caller limits cannot be satisfied by the >regulator constraints or when the requested range is invalid. > >This helper will initially be used to set vqmmc-supply voltage within an >acceptable range according to SD Standards, i.e. 1.70V-1.95V and >2.7V-3.6V. > >Signed-off-by: Jonas Karlman <[email protected]> >--- > drivers/power/regulator/regulator-uclass.c | 27 ++++++++++++++++++++++ > include/power/regulator.h | 12 ++++++++++ > 2 files changed, 39 insertions(+) > >diff --git a/drivers/power/regulator/regulator-uclass.c >b/drivers/power/regulator/regulator-uclass.c >index 1c7f75a9338c..0f5ba51ad6c2 100644 >--- a/drivers/power/regulator/regulator-uclass.c >+++ b/drivers/power/regulator/regulator-uclass.c >@@ -111,6 +111,33 @@ int regulator_get_suspend_value(struct udevice *dev) > return ops->get_suspend_value(dev); > } > >+int regulator_set_value_clamp(struct udevice *dev, >+ int min_uV, int target_uV, int max_uV) >+{ >+ const struct dm_regulator_ops *ops = dev_get_driver_ops(dev); >+ struct dm_regulator_uclass_plat *uc_pdata; >+ int uV; >+ >+ if (!ops || !ops->set_value) >+ return -ENOSYS; >+ >+ uc_pdata = dev_get_uclass_plat(dev); >+ if (uc_pdata->min_uV != -ENODATA && max_uV < uc_pdata->min_uV) >+ return -EINVAL; >+ if (uc_pdata->max_uV != -ENODATA && min_uV > uc_pdata->max_uV) >+ return -EINVAL; >+ if (min_uV > max_uV) >+ return -EINVAL; >+ >+ if (uc_pdata->min_uV != -ENODATA) >+ min_uV = max(min_uV, uc_pdata->min_uV); >+ if (uc_pdata->max_uV != -ENODATA) >+ max_uV = min(max_uV, uc_pdata->max_uV); >+ uV = clamp(target_uV, min_uV, max_uV); >+ >+ return regulator_set_value(dev, uV); >+} >+ > /* > * To be called with at most caution as there is no check > * before setting the actual voltage value. >diff --git a/include/power/regulator.h b/include/power/regulator.h >index 4011fb1d254b..a48bb3a5a1db 100644 >--- a/include/power/regulator.h >+++ b/include/power/regulator.h >@@ -315,6 +315,18 @@ int regulator_set_suspend_value(struct udevice *dev, int >uV); > */ > int regulator_get_suspend_value(struct udevice *dev); > >+/** >+ * regulator_set_value_clamp: set clamped microvoltage value of a given >regulator >+ * >+ * @dev - pointer to the regulator device >+ * @min_uV - the minimum output value to set [micro Volts] >+ * @target_uV - the target output value to set [micro Volts] >+ * @max_uV - the maximum output value to set [micro Volts] >+ * Return: - 0 on success or -errno val if fails >+ */ >+int regulator_set_value_clamp(struct udevice *dev, >+ int min_uV, int target_uV, int max_uV);
A static inline stub in regulator.h #else block is required. Thanks, Peng

