Messages in this thread Patch in this message | | | From | Benjamin Bara <> | Date | Tue, 20 Jun 2023 22:03:00 +0200 | Subject | [PATCH RFC v4 07/13] regulator: find active protections during initialization |
| |
From: Benjamin Bara <benjamin.bara@skidata.com>
It can happen that monitors are activated before the kernel is started, e.g. by bootloader or by OTP. If monitoring workarounds are active on a regulator, the core shouldn't perform the state changes without applying the workaround to the regulator. Therefore, warn the user already during initialization that the device-tree should be adapted.
Warning can be fixed by enabling (or disabling) monitoring in the DT, e.g.: regulator-uv-protection-microvolt = <1>; or regulator-ov-error-microvolt = <0>;
Constraints regarding the monitoring of a regulator can usually be found in the docu.
Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com> --- drivers/regulator/core.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index ca5d6ba889dc..9bddab17450e 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1564,6 +1564,47 @@ static int set_machine_constraints(struct regulator_dev *rdev) } } + /* + * When the core is in charge of handling monitoring workarounds, + * it is essential to know if a monitor is already active during + * initialization. + */ + if (rdev->desc->mon_disable_reg_disabled || + rdev->desc->mon_disable_reg_set_higher || + rdev->desc->mon_disable_reg_set_lower || + rdev->desc->mon_unsupported_reg_modes) { + unsigned int monitor_state = REGULATOR_MONITOR_NONE; + + ret = ops->get_active_protections(rdev, &monitor_state); + if (ret) + return ret; + + if (!rdev->constraints->over_voltage_detection && + (monitor_state & REGULATOR_MONITOR_OVER_VOLTAGE)) { + rdev_err(rdev, "dt unaware of active %s monitor!\n", + "over-voltage"); + return -EINVAL; + } + if (!rdev->constraints->under_voltage_detection && + (monitor_state & REGULATOR_MONITOR_UNDER_VOLTAGE)) { + rdev_err(rdev, "dt unaware of active %s monitor!\n", + "under-voltage"); + return -EINVAL; + } + if (!rdev->constraints->over_current_detection && + (monitor_state & REGULATOR_MONITOR_OVER_CURRENT)) { + rdev_err(rdev, "dt unaware of active %s monitor!\n", + "over-current"); + return -EINVAL; + } + if (!rdev->constraints->over_temp_detection && + (monitor_state & REGULATOR_MONITOR_OVER_TEMPERATURE)) { + rdev_err(rdev, "dt unaware of active %s monitor!\n", + "over-temperature"); + return -EINVAL; + } + } + if (rdev->constraints->over_current_detection) ret = handle_notify_limits(rdev, ops->set_over_current_protection, -- 2.34.1
| |