* [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors
@ 2023-04-05 5:29 Benjamin Bara
2023-04-05 5:29 ` [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers Benjamin Bara
` (3 more replies)
0 siblings, 4 replies; 12+ messages in thread
From: Benjamin Bara @ 2023-04-05 5:29 UTC (permalink / raw)
To: Support Opensource, Liam Girdwood, Mark Brown, Lee Jones,
Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Matti Vaittinen, Benjamin Bara
Hi!
Follow-up for my last patch regarding the disabling of unrequired
voltage monitors. We use the PWR_OK functionality, which asserts GP_FB2
if every monitored voltage is in range. This patch should provide the
possibility to deactivate a voltage monitor from the DT if the regulator
might be disabled during run time. For this purpose, the regulator
notification support is used:
https://lore.kernel.org/all/cover.1622628333.git.matti.vaittinen@fi.rohmeurope.com/
v1: https://lore.kernel.org/all/20220713124958.3094505-1-bbara93@gmail.com/
v2:
- reworked solution, based on Adam Thomson's feedback
---
Benjamin Bara (3):
regulator: da9063: add voltage monitoring registers
regulator: da9063: implement basic XVP setter
dt-bindings: mfd: dlg,da9063: document XVP
.../devicetree/bindings/mfd/dlg,da9063.yaml | 16 ++-
drivers/regulator/da9063-regulator.c | 129 ++++++++++++++++-----
include/linux/mfd/da9063/registers.h | 23 ++++
3 files changed, 138 insertions(+), 30 deletions(-)
---
base-commit: 7e364e56293bb98cae1b55fd835f5991c4e96e7d
change-id: 20230403-da9063-disable-unused-15836e2f4539
Best regards,
--
Benjamin Bara <benjamin.bara@skidata.com>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers
2023-04-05 5:29 [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Benjamin Bara
@ 2023-04-05 5:29 ` Benjamin Bara
2023-04-05 7:29 ` Matti Vaittinen
2023-04-05 5:29 ` [PATCH v2 2/3] regulator: da9063: implement basic XVP setter Benjamin Bara
` (2 subsequent siblings)
3 siblings, 1 reply; 12+ messages in thread
From: Benjamin Bara @ 2023-04-05 5:29 UTC (permalink / raw)
To: Support Opensource, Liam Girdwood, Mark Brown, Lee Jones,
Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Matti Vaittinen, Benjamin Bara
From: Benjamin Bara <benjamin.bara@skidata.com>
Add the definitions for the registers responsible for voltage
monitoring. Add a voltage monitor enable bitfield per regulator.
Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
---
drivers/regulator/da9063-regulator.c | 29 +++++++++++++++++++++++++++++
include/linux/mfd/da9063/registers.h | 23 +++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c
index 82f52a2a031a..1c720fc595b3 100644
--- a/drivers/regulator/da9063-regulator.c
+++ b/drivers/regulator/da9063-regulator.c
@@ -83,6 +83,9 @@ struct da9063_regulator_info {
/* DA9063 event detection bit */
struct reg_field oc_event;
+
+ /* DA9063 voltage monitor bit */
+ struct reg_field vmon;
};
/* Macros for LDO */
@@ -148,6 +151,7 @@ struct da9063_regulator {
struct regmap_field *suspend;
struct regmap_field *sleep;
struct regmap_field *suspend_sleep;
+ struct regmap_field *vmon;
};
/* Encapsulates all information for the regulators driver */
@@ -581,36 +585,42 @@ static const struct da9063_regulator_info da9063_regulator_info[] = {
da9063_buck_a_limits,
DA9063_REG_BUCK_ILIM_C, DA9063_BCORE1_ILIM_MASK),
DA9063_BUCK_COMMON_FIELDS(BCORE1),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BCORE1_MON_EN),
},
{
DA9063_BUCK(DA9063, BCORE2, 300, 10, 1570,
da9063_buck_a_limits,
DA9063_REG_BUCK_ILIM_C, DA9063_BCORE2_ILIM_MASK),
DA9063_BUCK_COMMON_FIELDS(BCORE2),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BCORE2_MON_EN),
},
{
DA9063_BUCK(DA9063, BPRO, 530, 10, 1800,
da9063_buck_a_limits,
DA9063_REG_BUCK_ILIM_B, DA9063_BPRO_ILIM_MASK),
DA9063_BUCK_COMMON_FIELDS(BPRO),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BPRO_MON_EN),
},
{
DA9063_BUCK(DA9063, BMEM, 800, 20, 3340,
da9063_buck_b_limits,
DA9063_REG_BUCK_ILIM_A, DA9063_BMEM_ILIM_MASK),
DA9063_BUCK_COMMON_FIELDS(BMEM),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BMEM_MON_EN),
},
{
DA9063_BUCK(DA9063, BIO, 800, 20, 3340,
da9063_buck_b_limits,
DA9063_REG_BUCK_ILIM_A, DA9063_BIO_ILIM_MASK),
DA9063_BUCK_COMMON_FIELDS(BIO),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BIO_MON_EN),
},
{
DA9063_BUCK(DA9063, BPERI, 800, 20, 3340,
da9063_buck_b_limits,
DA9063_REG_BUCK_ILIM_B, DA9063_BPERI_ILIM_MASK),
DA9063_BUCK_COMMON_FIELDS(BPERI),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BPERI_MON_EN),
},
{
DA9063_BUCK(DA9063, BCORES_MERGED, 300, 10, 1570,
@@ -618,6 +628,7 @@ static const struct da9063_regulator_info da9063_regulator_info[] = {
DA9063_REG_BUCK_ILIM_C, DA9063_BCORE1_ILIM_MASK),
/* BCORES_MERGED uses the same register fields as BCORE1 */
DA9063_BUCK_COMMON_FIELDS(BCORE1),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BCORE1_MON_EN),
},
{
DA9063_BUCK(DA9063, BMEM_BIO_MERGED, 800, 20, 3340,
@@ -625,47 +636,59 @@ static const struct da9063_regulator_info da9063_regulator_info[] = {
DA9063_REG_BUCK_ILIM_A, DA9063_BMEM_ILIM_MASK),
/* BMEM_BIO_MERGED uses the same register fields as BMEM */
DA9063_BUCK_COMMON_FIELDS(BMEM),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BMEM_MON_EN),
},
{
DA9063_LDO(DA9063, LDO3, 900, 20, 3440),
.oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO3_LIM),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO3_MON_EN),
},
{
DA9063_LDO(DA9063, LDO7, 900, 50, 3600),
.oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO7_LIM),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO7_MON_EN),
},
{
DA9063_LDO(DA9063, LDO8, 900, 50, 3600),
.oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO8_LIM),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO8_MON_EN),
},
{
DA9063_LDO(DA9063, LDO9, 950, 50, 3600),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_3, DA9063_LDO9_MON_EN),
},
{
DA9063_LDO(DA9063, LDO11, 900, 50, 3600),
.oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO11_LIM),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_3, DA9063_LDO11_MON_EN),
},
/* The following LDOs are present only on DA9063, not on DA9063L */
{
DA9063_LDO(DA9063, LDO1, 600, 20, 1860),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO1_MON_EN),
},
{
DA9063_LDO(DA9063, LDO2, 600, 20, 1860),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO2_MON_EN),
},
{
DA9063_LDO(DA9063, LDO4, 900, 20, 3440),
.oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO4_LIM),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO4_MON_EN),
},
{
DA9063_LDO(DA9063, LDO5, 900, 50, 3600),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO5_MON_EN),
},
{
DA9063_LDO(DA9063, LDO6, 900, 50, 3600),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO6_MON_EN),
},
{
DA9063_LDO(DA9063, LDO10, 900, 50, 3600),
+ .vmon = BFIELD(DA9063_BB_REG_MON_REG_3, DA9063_LDO10_MON_EN),
},
};
@@ -932,6 +955,12 @@ static int da9063_regulator_probe(struct platform_device *pdev)
if (IS_ERR(regl->suspend_sleep))
return PTR_ERR(regl->suspend_sleep);
}
+ if (regl->info->vmon.reg) {
+ regl->vmon = devm_regmap_field_alloc(&pdev->dev,
+ da9063->regmap, regl->info->vmon);
+ if (IS_ERR(regl->vmon))
+ return PTR_ERR(regl->vmon);
+ }
/* Register regulator */
memset(&config, 0, sizeof(config));
diff --git a/include/linux/mfd/da9063/registers.h b/include/linux/mfd/da9063/registers.h
index 6e0f66a2e727..7b8364bd08a0 100644
--- a/include/linux/mfd/da9063/registers.h
+++ b/include/linux/mfd/da9063/registers.h
@@ -1040,6 +1040,29 @@
/* DA9063_REG_CONFIG_J (addr=0x10F) */
#define DA9063_TWOWIRE_TO 0x40
+/* DA9063_REG_MON_REG_2 (addr=0x115) */
+#define DA9063_LDO1_MON_EN 0x01
+#define DA9063_LDO2_MON_EN 0x02
+#define DA9063_LDO3_MON_EN 0x04
+#define DA9063_LDO4_MON_EN 0x08
+#define DA9063_LDO5_MON_EN 0x10
+#define DA9063_LDO6_MON_EN 0x20
+#define DA9063_LDO7_MON_EN 0x40
+#define DA9063_LDO8_MON_EN 0x80
+
+/* DA9063_REG_MON_REG_3 (addr=0x116) */
+#define DA9063_LDO9_MON_EN 0x01
+#define DA9063_LDO10_MON_EN 0x02
+#define DA9063_LDO11_MON_EN 0x04
+
+/* DA9063_REG_MON_REG_4 (addr=0x117) */
+#define DA9063_BCORE1_MON_EN 0x04
+#define DA9063_BCORE2_MON_EN 0x08
+#define DA9063_BPRO_MON_EN 0x10
+#define DA9063_BIO_MON_EN 0x20
+#define DA9063_BMEM_MON_EN 0x40
+#define DA9063_BPERI_MON_EN 0x80
+
/* DA9063_REG_MON_REG_5 (addr=0x116) */
#define DA9063_MON_A8_IDX_MASK 0x07
#define DA9063_MON_A8_IDX_NONE 0x00
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 2/3] regulator: da9063: implement basic XVP setter
2023-04-05 5:29 [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Benjamin Bara
2023-04-05 5:29 ` [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers Benjamin Bara
@ 2023-04-05 5:29 ` Benjamin Bara
2023-04-05 7:42 ` Matti Vaittinen
2023-04-05 10:52 ` Mark Brown
2023-04-05 5:29 ` [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP Benjamin Bara
2023-04-05 15:30 ` [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Lee Jones
3 siblings, 2 replies; 12+ messages in thread
From: Benjamin Bara @ 2023-04-05 5:29 UTC (permalink / raw)
To: Support Opensource, Liam Girdwood, Mark Brown, Lee Jones,
Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Matti Vaittinen, Benjamin Bara
From: Benjamin Bara <benjamin.bara@skidata.com>
Allow to en- and disable voltage monitoring from the device tree.
Consider that the da9063 only monitors UV *and* OV together, so both
must be en- or disabled.
Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
---
drivers/regulator/da9063-regulator.c | 100 +++++++++++++++++++++++++----------
1 file changed, 72 insertions(+), 28 deletions(-)
diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c
index 1c720fc595b3..000fa0daef18 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_set_xvp(struct regulator_dev *rdev, int lim_uV, int severity, bool enable)
+{
+ struct da9063_regulator *regl = rdev_get_drvdata(rdev);
+ struct device *dev = regl->hw->dev;
+
+ dev_dbg(dev, "%s: lim: %d, sev: %d, en: %d\n", regl->desc.name, lim_uV, severity, enable);
+
+ /*
+ * only support enable and disable.
+ * the da9063 offers a GPIO (GP_FB2) which is unasserted if an XV happens.
+ * therefore ignore severity here, as there might be handlers in hardware.
+ */
+ if (lim_uV)
+ return -EINVAL;
+
+ return regmap_field_write(regl->vmon, enable ? 1 : 0);
+}
+
static int da9063_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
{
struct da9063_regulator *regl = rdev_get_drvdata(rdev);
@@ -545,37 +563,41 @@ static int da9063_buck_get_current_limit(struct regulator_dev *rdev)
}
static const struct regulator_ops da9063_buck_ops = {
- .enable = regulator_enable_regmap,
- .disable = regulator_disable_regmap,
- .is_enabled = regulator_is_enabled_regmap,
- .get_voltage_sel = regulator_get_voltage_sel_regmap,
- .set_voltage_sel = regulator_set_voltage_sel_regmap,
- .list_voltage = regulator_list_voltage_linear,
- .set_current_limit = da9063_buck_set_current_limit,
- .get_current_limit = da9063_buck_get_current_limit,
- .set_mode = da9063_buck_set_mode,
- .get_mode = da9063_buck_get_mode,
- .get_status = da9063_buck_get_status,
- .set_suspend_voltage = da9063_set_suspend_voltage,
- .set_suspend_enable = da9063_suspend_enable,
- .set_suspend_disable = da9063_suspend_disable,
- .set_suspend_mode = da9063_buck_set_suspend_mode,
+ .enable = regulator_enable_regmap,
+ .disable = regulator_disable_regmap,
+ .is_enabled = regulator_is_enabled_regmap,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
+ .set_voltage_sel = regulator_set_voltage_sel_regmap,
+ .list_voltage = regulator_list_voltage_linear,
+ .set_current_limit = da9063_buck_set_current_limit,
+ .get_current_limit = da9063_buck_get_current_limit,
+ .set_mode = da9063_buck_set_mode,
+ .get_mode = da9063_buck_get_mode,
+ .get_status = da9063_buck_get_status,
+ .set_suspend_voltage = da9063_set_suspend_voltage,
+ .set_suspend_enable = da9063_suspend_enable,
+ .set_suspend_disable = da9063_suspend_disable,
+ .set_suspend_mode = da9063_buck_set_suspend_mode,
+ .set_over_voltage_protection = da9063_set_xvp,
+ .set_under_voltage_protection = da9063_set_xvp,
};
static const struct regulator_ops da9063_ldo_ops = {
- .enable = regulator_enable_regmap,
- .disable = regulator_disable_regmap,
- .is_enabled = regulator_is_enabled_regmap,
- .get_voltage_sel = regulator_get_voltage_sel_regmap,
- .set_voltage_sel = regulator_set_voltage_sel_regmap,
- .list_voltage = regulator_list_voltage_linear,
- .set_mode = da9063_ldo_set_mode,
- .get_mode = da9063_ldo_get_mode,
- .get_status = da9063_ldo_get_status,
- .set_suspend_voltage = da9063_set_suspend_voltage,
- .set_suspend_enable = da9063_suspend_enable,
- .set_suspend_disable = da9063_suspend_disable,
- .set_suspend_mode = da9063_ldo_set_suspend_mode,
+ .enable = regulator_enable_regmap,
+ .disable = regulator_disable_regmap,
+ .is_enabled = regulator_is_enabled_regmap,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
+ .set_voltage_sel = regulator_set_voltage_sel_regmap,
+ .list_voltage = regulator_list_voltage_linear,
+ .set_mode = da9063_ldo_set_mode,
+ .get_mode = da9063_ldo_get_mode,
+ .get_status = da9063_ldo_get_status,
+ .set_suspend_voltage = da9063_set_suspend_voltage,
+ .set_suspend_enable = da9063_suspend_enable,
+ .set_suspend_disable = da9063_suspend_disable,
+ .set_suspend_mode = da9063_ldo_set_suspend_mode,
+ .set_over_voltage_protection = da9063_set_xvp,
+ .set_under_voltage_protection = da9063_set_xvp,
};
/* Info of regulators for DA9063 */
@@ -749,6 +771,23 @@ static const struct regulator_init_data *da9063_get_regulator_initdata(
return NULL;
}
+static int da9063_check_xvp_constraints(struct regulator_config *config)
+{
+ struct da9063_regulator *regl = config->driver_data;
+ const struct regulation_constraints *constr = &config->init_data->constraints;
+ const struct notification_limit *uv_l = &constr->under_voltage_limits;
+ const struct notification_limit *ov_l = &constr->over_voltage_limits;
+
+ /* make sure that both UV/OV protections are either enabled or disabled */
+ if (uv_l->prot != ov_l->prot || uv_l->err != ov_l->err || uv_l->warn != ov_l->warn) {
+ dev_err(config->dev, "%s: regulator-uv-X-microvolt != regulator-ov-X-microvolt\n",
+ regl->desc.name);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static struct of_regulator_match da9063_matches[] = {
[DA9063_ID_BCORE1] = { .name = "bcore1" },
[DA9063_ID_BCORE2] = { .name = "bcore2" },
@@ -970,6 +1009,11 @@ static int da9063_regulator_probe(struct platform_device *pdev)
if (da9063_reg_matches)
config.of_node = da9063_reg_matches[id].of_node;
config.regmap = da9063->regmap;
+
+ ret = da9063_check_xvp_constraints(&config);
+ if (ret)
+ return ret;
+
regl->rdev = devm_regulator_register(&pdev->dev, ®l->desc,
&config);
if (IS_ERR(regl->rdev)) {
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP
2023-04-05 5:29 [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Benjamin Bara
2023-04-05 5:29 ` [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers Benjamin Bara
2023-04-05 5:29 ` [PATCH v2 2/3] regulator: da9063: implement basic XVP setter Benjamin Bara
@ 2023-04-05 5:29 ` Benjamin Bara
2023-04-05 5:33 ` Krzysztof Kozlowski
2023-04-05 7:43 ` Matti Vaittinen
2023-04-05 15:30 ` [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Lee Jones
3 siblings, 2 replies; 12+ messages in thread
From: Benjamin Bara @ 2023-04-05 5:29 UTC (permalink / raw)
To: Support Opensource, Liam Girdwood, Mark Brown, Lee Jones,
Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Matti Vaittinen, Benjamin Bara
From: Benjamin Bara <benjamin.bara@skidata.com>
Document that the da9063 only provides UVP *and* OVP in one, and
therefore requires both configured. Add an example for clarification.
Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
---
Documentation/devicetree/bindings/mfd/dlg,da9063.yaml | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/mfd/dlg,da9063.yaml b/Documentation/devicetree/bindings/mfd/dlg,da9063.yaml
index e8e74e91070c..e9d5ab418dd2 100644
--- a/Documentation/devicetree/bindings/mfd/dlg,da9063.yaml
+++ b/Documentation/devicetree/bindings/mfd/dlg,da9063.yaml
@@ -12,6 +12,10 @@ maintainers:
description: |
For device-tree bindings of other sub-modules refer to the binding documents
under the respective sub-system directories.
+ Using regulator-uv-X-microvolt and regulator-ov-X-microvolt requires special
+ handling: First, when GP_FB2 is used, it must be ensured that there is no
+ moment where all voltage monitors are disabled. Next, as da9063 only supports
+ UV *and* OV monitoring, both must be set.
properties:
compatible:
@@ -121,11 +125,19 @@ examples:
regulator-max-microamp = <2000000>;
regulator-boot-on;
};
+ ldo6 {
+ /* UNUSED */
+ regulator-name = "LDO_6";
+ regulator-uv-protection-microvolt = <0>;
+ regulator-ov-protection-microvolt = <0>;
+ };
ldo11 {
regulator-name = "LDO_11";
regulator-min-microvolt = <900000>;
- regulator-max-microvolt = <3600000>;
- regulator-boot-on;
+ regulator-max-microvolt = <900000>;
+ regulator-uv-protection-microvolt = <1>;
+ regulator-ov-protection-microvolt = <1>;
+ regulator-always-on;
};
};
};
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP
2023-04-05 5:29 ` [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP Benjamin Bara
@ 2023-04-05 5:33 ` Krzysztof Kozlowski
2023-04-05 7:43 ` Matti Vaittinen
1 sibling, 0 replies; 12+ messages in thread
From: Krzysztof Kozlowski @ 2023-04-05 5:33 UTC (permalink / raw)
To: Benjamin Bara, Support Opensource, Liam Girdwood, Mark Brown,
Lee Jones, Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Matti Vaittinen, Benjamin Bara
On 05/04/2023 07:29, Benjamin Bara wrote:
> From: Benjamin Bara <benjamin.bara@skidata.com>
>
> Document that the da9063 only provides UVP *and* OVP in one, and
> therefore requires both configured. Add an example for clarification.
>
> Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers
2023-04-05 5:29 ` [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers Benjamin Bara
@ 2023-04-05 7:29 ` Matti Vaittinen
2023-04-05 8:04 ` Benjamin Bara
0 siblings, 1 reply; 12+ messages in thread
From: Matti Vaittinen @ 2023-04-05 7:29 UTC (permalink / raw)
To: Benjamin Bara, Support Opensource, Liam Girdwood, Mark Brown,
Lee Jones, Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Benjamin Bara
Hi Benjamin,
On 4/5/23 08:29, Benjamin Bara wrote:
> From: Benjamin Bara <benjamin.bara@skidata.com>
>
> Add the definitions for the registers responsible for voltage
> monitoring. Add a voltage monitor enable bitfield per regulator.
>
> Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
> ---
> drivers/regulator/da9063-regulator.c | 29 +++++++++++++++++++++++++++++
> include/linux/mfd/da9063/registers.h | 23 +++++++++++++++++++++++
> 2 files changed, 52 insertions(+)
>
> diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c
> index 82f52a2a031a..1c720fc595b3 100644
> --- a/drivers/regulator/da9063-regulator.c
> +++ b/drivers/regulator/da9063-regulator.c
...
>
> @@ -932,6 +955,12 @@ static int da9063_regulator_probe(struct platform_device *pdev)
> if (IS_ERR(regl->suspend_sleep))
> return PTR_ERR(regl->suspend_sleep);
> }
> + if (regl->info->vmon.reg) {
Just a very minor thing - wouldn't this check be better as:
if (regl->info->vmon.mask) ?
We may have device(s) where 0 is a valid reg. However, mask 0 is
probably not making sense - unless I misunderstand something?
Well, I guess the reg 0 is not valid for vmon on currently supported
ICs, and it probably is unlikely that would happen on a future device
either. Still, treating register 0 as 'not initialized' always feels a
tad bad for me if it can be avoided. So, perhaps consider this if you
re-spin for some other reason - but I don't think this is by any means
crucial.
FWIW:
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
> + regl->vmon = devm_regmap_field_alloc(&pdev->dev,
> + da9063->regmap, regl->info->vmon);
> + if (IS_ERR(regl->vmon))
> + return PTR_ERR(regl->vmon);
> + }
>
--
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland
~~ When things go utterly wrong vim users can always type :help! ~~
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/3] regulator: da9063: implement basic XVP setter
2023-04-05 5:29 ` [PATCH v2 2/3] regulator: da9063: implement basic XVP setter Benjamin Bara
@ 2023-04-05 7:42 ` Matti Vaittinen
2023-04-05 10:52 ` Mark Brown
1 sibling, 0 replies; 12+ messages in thread
From: Matti Vaittinen @ 2023-04-05 7:42 UTC (permalink / raw)
To: Benjamin Bara, Support Opensource, Liam Girdwood, Mark Brown,
Lee Jones, Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Benjamin Bara
On 4/5/23 08:29, Benjamin Bara wrote:
> From: Benjamin Bara <benjamin.bara@skidata.com>
>
> Allow to en- and disable voltage monitoring from the device tree.
> Consider that the da9063 only monitors UV *and* OV together, so both
> must be en- or disabled.
>
> Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
> ---
> drivers/regulator/da9063-regulator.c | 100 +++++++++++++++++++++++++----------
> 1 file changed, 72 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c
> index 1c720fc595b3..000fa0daef18 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_set_xvp(struct regulator_dev *rdev, int lim_uV, int severity, bool enable)
> +{
> + struct da9063_regulator *regl = rdev_get_drvdata(rdev);
> + struct device *dev = regl->hw->dev;
> +
> + dev_dbg(dev, "%s: lim: %d, sev: %d, en: %d\n", regl->desc.name, lim_uV, severity, enable);
> +
> + /*
> + * only support enable and disable.
> + * the da9063 offers a GPIO (GP_FB2) which is unasserted if an XV happens.
> + * therefore ignore severity here, as there might be handlers in hardware.
> + */
> + if (lim_uV)
> + return -EINVAL;
> +
> + return regmap_field_write(regl->vmon, enable ? 1 : 0);
> +}
> +
> static int da9063_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
> {
> struct da9063_regulator *regl = rdev_get_drvdata(rdev);
> @@ -545,37 +563,41 @@ static int da9063_buck_get_current_limit(struct regulator_dev *rdev)
> }
>
> static const struct regulator_ops da9063_buck_ops = {
> - .enable = regulator_enable_regmap,
> - .disable = regulator_disable_regmap,
> - .is_enabled = regulator_is_enabled_regmap,
> - .get_voltage_sel = regulator_get_voltage_sel_regmap,
> - .set_voltage_sel = regulator_set_voltage_sel_regmap,
> - .list_voltage = regulator_list_voltage_linear,
> - .set_current_limit = da9063_buck_set_current_limit,
> - .get_current_limit = da9063_buck_get_current_limit,
> - .set_mode = da9063_buck_set_mode,
> - .get_mode = da9063_buck_get_mode,
> - .get_status = da9063_buck_get_status,
> - .set_suspend_voltage = da9063_set_suspend_voltage,
> - .set_suspend_enable = da9063_suspend_enable,
> - .set_suspend_disable = da9063_suspend_disable,
> - .set_suspend_mode = da9063_buck_set_suspend_mode,
> + .enable = regulator_enable_regmap,
> + .disable = regulator_disable_regmap,
> + .is_enabled = regulator_is_enabled_regmap,
> + .get_voltage_sel = regulator_get_voltage_sel_regmap,
> + .set_voltage_sel = regulator_set_voltage_sel_regmap,
> + .list_voltage = regulator_list_voltage_linear,
> + .set_current_limit = da9063_buck_set_current_limit,
> + .get_current_limit = da9063_buck_get_current_limit,
> + .set_mode = da9063_buck_set_mode,
> + .get_mode = da9063_buck_get_mode,
> + .get_status = da9063_buck_get_status,
> + .set_suspend_voltage = da9063_set_suspend_voltage,
> + .set_suspend_enable = da9063_suspend_enable,
> + .set_suspend_disable = da9063_suspend_disable,
> + .set_suspend_mode = da9063_buck_set_suspend_mode,
> + .set_over_voltage_protection = da9063_set_xvp,
> + .set_under_voltage_protection = da9063_set_xvp,
> };
>
> static const struct regulator_ops da9063_ldo_ops = {
> - .enable = regulator_enable_regmap,
> - .disable = regulator_disable_regmap,
> - .is_enabled = regulator_is_enabled_regmap,
> - .get_voltage_sel = regulator_get_voltage_sel_regmap,
> - .set_voltage_sel = regulator_set_voltage_sel_regmap,
> - .list_voltage = regulator_list_voltage_linear,
> - .set_mode = da9063_ldo_set_mode,
> - .get_mode = da9063_ldo_get_mode,
> - .get_status = da9063_ldo_get_status,
> - .set_suspend_voltage = da9063_set_suspend_voltage,
> - .set_suspend_enable = da9063_suspend_enable,
> - .set_suspend_disable = da9063_suspend_disable,
> - .set_suspend_mode = da9063_ldo_set_suspend_mode,
> + .enable = regulator_enable_regmap,
> + .disable = regulator_disable_regmap,
> + .is_enabled = regulator_is_enabled_regmap,
> + .get_voltage_sel = regulator_get_voltage_sel_regmap,
> + .set_voltage_sel = regulator_set_voltage_sel_regmap,
> + .list_voltage = regulator_list_voltage_linear,
> + .set_mode = da9063_ldo_set_mode,
> + .get_mode = da9063_ldo_get_mode,
> + .get_status = da9063_ldo_get_status,
> + .set_suspend_voltage = da9063_set_suspend_voltage,
> + .set_suspend_enable = da9063_suspend_enable,
> + .set_suspend_disable = da9063_suspend_disable,
> + .set_suspend_mode = da9063_ldo_set_suspend_mode,
> + .set_over_voltage_protection = da9063_set_xvp,
> + .set_under_voltage_protection = da9063_set_xvp,
> };
During my recent visit in the IIO territory I was told to by Jonathan to
drop the 'pretty indenting' of structs like this. I think this shows
well why - when longer members are added, it's hard to see from the diff
what actually changed. So, if you re-spin and unless Mark has another
opinion, maybe drop the tabs - in my eyes this does not do much for the
readability.
Well, IMO this is definitely not something that would require a re-spin
- and it may be others disagree with me on this. So, FWIW:
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
Yours,
-- Matti
--
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland
~~ When things go utterly wrong vim users can always type :help! ~~
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP
2023-04-05 5:29 ` [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP Benjamin Bara
2023-04-05 5:33 ` Krzysztof Kozlowski
@ 2023-04-05 7:43 ` Matti Vaittinen
1 sibling, 0 replies; 12+ messages in thread
From: Matti Vaittinen @ 2023-04-05 7:43 UTC (permalink / raw)
To: Benjamin Bara, Support Opensource, Liam Girdwood, Mark Brown,
Lee Jones, Rob Herring, Krzysztof Kozlowski, Steve Twiss
Cc: DLG-Adam.Thomson.Opensource, linux-kernel, devicetree,
Benjamin Bara
On 4/5/23 08:29, Benjamin Bara wrote:
> From: Benjamin Bara <benjamin.bara@skidata.com>
>
> Document that the da9063 only provides UVP *and* OVP in one, and
> therefore requires both configured. Add an example for clarification.
>
> Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com>
> ---
> Documentation/devicetree/bindings/mfd/dlg,da9063.yaml | 16 ++++++++++++++--
> 1 file changed, 14 insertions(+), 2 deletions(-)
>
--
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland
~~ When things go utterly wrong vim users can always type :help! ~~
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers
2023-04-05 7:29 ` Matti Vaittinen
@ 2023-04-05 8:04 ` Benjamin Bara
0 siblings, 0 replies; 12+ messages in thread
From: Benjamin Bara @ 2023-04-05 8:04 UTC (permalink / raw)
To: mazziesaccount
Cc: DLG-Adam.Thomson.Opensource, bbara93, benjamin.bara, broonie,
devicetree, krzysztof.kozlowski+dt, lee, lgirdwood, linux-kernel,
robh+dt, stwiss.opensource, support.opensource
Thank you for the feedback!
On Wed, 5 Apr 2023 at 09:29, Matti Vaittinen <mazziesaccount@gmail.com> wrote:
> Just a very minor thing - wouldn't this check be better as:
> if (regl->info->vmon.mask) ?
> We may have device(s) where 0 is a valid reg. However, mask 0 is
> probably not making sense - unless I misunderstand something?
This config is specific to the da9063. On this IC, register 0 is used for
PAGE_CON (control register). The registers relevant for voltage monitoring are
on 0x115-0x117. So IMHO this should be fine.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/3] regulator: da9063: implement basic XVP setter
2023-04-05 5:29 ` [PATCH v2 2/3] regulator: da9063: implement basic XVP setter Benjamin Bara
2023-04-05 7:42 ` Matti Vaittinen
@ 2023-04-05 10:52 ` Mark Brown
2023-04-05 14:08 ` Benjamin Bara
1 sibling, 1 reply; 12+ messages in thread
From: Mark Brown @ 2023-04-05 10:52 UTC (permalink / raw)
To: Benjamin Bara
Cc: Support Opensource, Liam Girdwood, Lee Jones, Rob Herring,
Krzysztof Kozlowski, Steve Twiss, DLG-Adam.Thomson.Opensource,
linux-kernel, devicetree, Matti Vaittinen, Benjamin Bara
[-- Attachment #1: Type: text/plain, Size: 1010 bytes --]
On Wed, Apr 05, 2023 at 07:29:08AM +0200, Benjamin Bara wrote:
> From: Benjamin Bara <benjamin.bara@skidata.com>
>
> Allow to en- and disable voltage monitoring from the device tree.
> Consider that the da9063 only monitors UV *and* OV together, so both
> must be en- or disabled.
I have no idea what a "basic XVP setter" is and this isn't super
enlightening. Is VP supposed to mean voltage protection or something?
> + /* make sure that both UV/OV protections are either enabled or disabled */
> + if (uv_l->prot != ov_l->prot || uv_l->err != ov_l->err || uv_l->warn != ov_l->warn) {
> + dev_err(config->dev, "%s: regulator-uv-X-microvolt != regulator-ov-X-microvolt\n",
> + regl->desc.name);
> + return -EINVAL;
I'm not sure that a user is going to figure out that this refers to the
protection levels, there's no hint as to what the X might be and the
error suggests that both the under and over voltage protection limits
must be have the same value, not just both be provided.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/3] regulator: da9063: implement basic XVP setter
2023-04-05 10:52 ` Mark Brown
@ 2023-04-05 14:08 ` Benjamin Bara
0 siblings, 0 replies; 12+ messages in thread
From: Benjamin Bara @ 2023-04-05 14:08 UTC (permalink / raw)
To: broonie
Cc: DLG-Adam.Thomson.Opensource, bbara93, benjamin.bara, devicetree,
krzysztof.kozlowski+dt, lee, lgirdwood, linux-kernel,
mazziesaccount, robh+dt, stwiss.opensource, support.opensource
Thank you for the feedback!
On Wed, 5 Apr 2023 at 12:52, Mark Brown <broonie@kernel.org> wrote:
> I have no idea what a "basic XVP setter" is and this isn't super
> enlightening. Is VP supposed to mean voltage protection or something?
Yes, but basically this series handles just the monitoring part. The
"protection part" is happening in hardware (at least on our board). So I will
reword "XVP" to "voltage monitoring" in the next version.
> I'm not sure that a user is going to figure out that this refers to the
> protection levels, there's no hint as to what the X might be and the error
> suggests that both the under and over voltage protection limits must be have
> the same value, not just both be provided.
I will split up the "catch-all" into an error per severity, like:
"error-microvolt: value must be equal for uv and ov!"
I will also ensure that there is only one severity set per regulator.
Additionally, will also adapt the docu: if the voltage monitor should be
changed, uv and ov must be set to the same severity and value.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors
2023-04-05 5:29 [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Benjamin Bara
` (2 preceding siblings ...)
2023-04-05 5:29 ` [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP Benjamin Bara
@ 2023-04-05 15:30 ` Lee Jones
3 siblings, 0 replies; 12+ messages in thread
From: Lee Jones @ 2023-04-05 15:30 UTC (permalink / raw)
To: Benjamin Bara
Cc: Support Opensource, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Steve Twiss, DLG-Adam.Thomson.Opensource,
linux-kernel, devicetree, Matti Vaittinen, Benjamin Bara
On Wed, 05 Apr 2023, Benjamin Bara wrote:
> Hi!
>
> Follow-up for my last patch regarding the disabling of unrequired
> voltage monitors. We use the PWR_OK functionality, which asserts GP_FB2
> if every monitored voltage is in range. This patch should provide the
> possibility to deactivate a voltage monitor from the DT if the regulator
> might be disabled during run time. For this purpose, the regulator
> notification support is used:
> https://lore.kernel.org/all/cover.1622628333.git.matti.vaittinen@fi.rohmeurope.com/
>
> v1: https://lore.kernel.org/all/20220713124958.3094505-1-bbara93@gmail.com/
>
> v2:
> - reworked solution, based on Adam Thomson's feedback
>
> ---
> Benjamin Bara (3):
> regulator: da9063: add voltage monitoring registers
> regulator: da9063: implement basic XVP setter
> dt-bindings: mfd: dlg,da9063: document XVP
>
> .../devicetree/bindings/mfd/dlg,da9063.yaml | 16 ++-
> drivers/regulator/da9063-regulator.c | 129 ++++++++++++++++-----
> include/linux/mfd/da9063/registers.h | 23 ++++
> 3 files changed, 138 insertions(+), 30 deletions(-)
I'll handle this set once Mark is happy.
> ---
> base-commit: 7e364e56293bb98cae1b55fd835f5991c4e96e7d
> change-id: 20230403-da9063-disable-unused-15836e2f4539
>
> Best regards,
> --
> Benjamin Bara <benjamin.bara@skidata.com>
>
--
Lee Jones [李琼斯]
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2023-04-05 15:31 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-05 5:29 [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Benjamin Bara
2023-04-05 5:29 ` [PATCH v2 1/3] regulator: da9063: add voltage monitoring registers Benjamin Bara
2023-04-05 7:29 ` Matti Vaittinen
2023-04-05 8:04 ` Benjamin Bara
2023-04-05 5:29 ` [PATCH v2 2/3] regulator: da9063: implement basic XVP setter Benjamin Bara
2023-04-05 7:42 ` Matti Vaittinen
2023-04-05 10:52 ` Mark Brown
2023-04-05 14:08 ` Benjamin Bara
2023-04-05 5:29 ` [PATCH v2 3/3] dt-bindings: mfd: dlg,da9063: document XVP Benjamin Bara
2023-04-05 5:33 ` Krzysztof Kozlowski
2023-04-05 7:43 ` Matti Vaittinen
2023-04-05 15:30 ` [PATCH v2 0/3] regulator: da9063: disable unused voltage monitors Lee Jones
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.