[PATCH v2 3/4] regulator: core: Call set_over_voltage_protection() if OVP limit is fixed after setting new voltage
From: Paul Louvel
Date: Tue Oct 27 2026 - 05:45:05 EST
The over-voltage protection limit is defined as a microvolt offset from
the voltage configured on the regulator, and the hardware is programmed
with this limit once, at regulator registration.
Some devices cannot be configured with an offset because their OVP
threshold is a fixed value. For such devices, the protection must be
reprogrammed every time the output voltage changes.
Introduce a new 'fixed_ovp' member in struct regulator_desc to tell the
core that the registered regulator is such a device. The
set_over_voltage_protection() callback is then called after the
slew-rate delay, so that the protection is never programmed before the
output voltage has settled.
Signed-off-by: Paul Louvel <paul.louvel@xxxxxxxxxxx>
---
drivers/regulator/core.c | 10 ++++++++++
include/linux/regulator/driver.h | 4 ++++
2 files changed, 14 insertions(+)
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 14422cfe80e2..b1cabe50ac25 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -4014,6 +4014,16 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
(void *)data);
}
+ if (old_uV != best_val) {
+ if (rdev->desc->fixed_ovp && ops->set_over_voltage_protection) {
+ ret = handle_notify_limits(
+ rdev, ops->set_over_voltage_protection,
+ &rdev->constraints->over_voltage_limits);
+ if (ret == -EOPNOTSUPP)
+ ret = 0;
+ }
+ }
+
out:
trace_regulator_set_voltage_complete(rdev_get_name(rdev), best_val);
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h
index 8a0f3aebdade..248fd8565abc 100644
--- a/include/linux/regulator/driver.h
+++ b/include/linux/regulator/driver.h
@@ -311,6 +311,9 @@ enum regulator_type {
* @vsel_range_mask: Mask for register bitfield used for range selector
* @range_applied_by_vsel: A flag to indicate that changes to vsel_range_reg
* are only effective after vsel_reg is written
+ * @fixed_ovp: A flag to indicate that over voltage protection is set with
+ * hardcoded value, and need to be set each time
+ * when a new voltage is set.
* @vsel_reg: Register for selector when using ``regulator_map_*_voltage_*``
* @vsel_reg_oversize: Indicates that the vsel_reg spans on two registers
* @vsel_mask: Mask for register bitfield used for selector
@@ -405,6 +408,7 @@ struct regulator_desc {
unsigned int vsel_range_reg;
unsigned int vsel_range_mask;
bool range_applied_by_vsel;
+ bool fixed_ovp;
unsigned int vsel_reg;
bool vsel_reg_oversize;
unsigned int vsel_mask;
--
2.56.0