[PATCH 1/4] power: regulator: Add helper to set voltage within an acceptable range
Peng Fan
peng.fan at oss.nxp.com
Mon Jun 29 07:21:11 CEST 2026
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 <jonas at kwiboo.se>
>---
> 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
More information about the U-Boot
mailing list