[PATCH RFC v4 03/13] regulator: da9063: implement get_active_protections()

From: Benjamin Bara
Date: Tue Jun 20 2023 - 16:03:51 EST


From: Benjamin Bara <benjamin.bara@xxxxxxxxxxx>

Implement the new get_active_protections() op. This helps to find out if
a monitor is enabled and the DT is unaware of it. This could result to
an invalid state, as the !PWR_OK state might be triggered if the
regulator is turned off while the monitor stays active.

Signed-off-by: Benjamin Bara <benjamin.bara@xxxxxxxxxxx>
---
drivers/regulator/da9063-regulator.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)

diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c
index 308ad63fcf78..071b368f154f 100644
--- a/drivers/regulator/da9063-regulator.c
+++ b/drivers/regulator/da9063-regulator.c
@@ -207,6 +207,24 @@ static const unsigned int da9063_bmem_bio_merged_limits[] = {
4600000, 4800000, 5000000, 5200000, 5400000, 5600000, 5800000, 6000000
};

+static int da9063_get_xvp(struct regulator_dev *rdev, unsigned int *state)
+{
+ struct da9063_regulator *regl = rdev_get_drvdata(rdev);
+ unsigned int val;
+ int ret;
+
+ ret = regmap_field_read(regl->vmon, &val);
+ if (ret)
+ return ret;
+
+ *state = REGULATOR_MONITOR_NONE;
+ if (val)
+ *state = REGULATOR_MONITOR_OVER_VOLTAGE |
+ REGULATOR_MONITOR_UNDER_VOLTAGE;
+
+ return 0;
+}
+
static int da9063_set_xvp(struct regulator_dev *rdev, int lim_uV, int severity, bool enable)
{
struct da9063_regulator *regl = rdev_get_drvdata(rdev);
@@ -580,6 +598,7 @@ static const struct regulator_ops da9063_buck_ops = {
.set_suspend_mode = da9063_buck_set_suspend_mode,
.set_over_voltage_protection = da9063_set_xvp,
.set_under_voltage_protection = da9063_set_xvp,
+ .get_active_protections = da9063_get_xvp,
};

static const struct regulator_ops da9063_ldo_ops = {
@@ -598,6 +617,7 @@ static const struct regulator_ops da9063_ldo_ops = {
.set_suspend_mode = da9063_ldo_set_suspend_mode,
.set_over_voltage_protection = da9063_set_xvp,
.set_under_voltage_protection = da9063_set_xvp,
+ .get_active_protections = da9063_get_xvp,
};

/* Info of regulators for DA9063 */

--
2.34.1