From: Marco Felsch <m.felsch@pengutronix.de>
To: support.opensource@diasemi.com, lee.jones@linaro.org,
robh+dt@kernel.org, linus.walleij@linaro.org,
bgolaszewski@baylibre.com, joel@jms.id.au, andrew@aj.id.au,
lgirdwood@gmail.com, broonie@kernel.org
Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-gpio@vger.kernel.org, linux-aspeed@lists.ozlabs.org,
linux-arm-kernel@lists.infradead.org, kernel@pengutronix.de
Subject: [PATCH v3 6/6] regulator: da9062: add gpio based regulator dis-/enable support
Date: Fri, 29 Nov 2019 18:25:37 +0100 [thread overview]
Message-ID: <20191129172537.31410-7-m.felsch@pengutronix.de> (raw)
In-Reply-To: <20191129172537.31410-1-m.felsch@pengutronix.de>
Each regulator can be enabeld/disabled by the internal pmic state
machine or by a gpio input signal. Typically the OTP configures the
regulators to be enabled/disabled on a specific sequence number which is
most the time fine. Sometimes we need to reconfigure that due to a PCB
bug. This patch adds the support to disable/enable the regulator based
on a gpio input signal.
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
v3:
- add comment on reg_field
- append ena_gpi to da9062_regulator_info instead of insert it in the
middle
---
drivers/regulator/da9062-regulator.c | 88 +++++++++++++++++++++++++++-
1 file changed, 86 insertions(+), 2 deletions(-)
diff --git a/drivers/regulator/da9062-regulator.c b/drivers/regulator/da9062-regulator.c
index 6117e631236b..79b08029282a 100644
--- a/drivers/regulator/da9062-regulator.c
+++ b/drivers/regulator/da9062-regulator.c
@@ -62,8 +62,13 @@ struct da9062_regulator_info {
* vsel_gpi:
* The input port which is used by a regulator to select between
* voltage-a/b settings.
+ *
+ * ena_gpi:
+ * The input port which is used by a regulator to en-/disable its
+ * output.
*/
struct reg_field vsel_gpi;
+ struct reg_field ena_gpi;
};
/* Single regulator settings */
@@ -78,6 +83,7 @@ struct da9062_regulator {
struct regmap_field *sleep;
struct regmap_field *suspend_sleep;
struct regmap_field *vsel_gpi;
+ struct regmap_field *ena_gpi;
};
/* Encapsulates all information for the regulators driver */
@@ -423,7 +429,10 @@ static int da9062_config_gpi(struct device_node *np,
goto free;
}
- ret = regmap_field_write(regl->vsel_gpi, nr);
+ if (!strncmp(gpi_id, "ena", 3))
+ ret = regmap_field_write(regl->ena_gpi, nr);
+ else
+ ret = regmap_field_write(regl->vsel_gpi, nr);
free:
kfree(prop);
@@ -436,7 +445,13 @@ static int da9062_parse_dt(struct device_node *np,
const struct regulator_desc *desc,
struct regulator_config *cfg)
{
- return da9062_config_gpi(np, desc, cfg, "vsel");
+ int error;
+
+ error = da9062_config_gpi(np, desc, cfg, "vsel");
+ if (error)
+ return error;
+
+ return da9062_config_gpi(np, desc, cfg, "ena");
}
/* DA9061 Regulator information */
@@ -481,6 +496,10 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VBUCK1_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VBUCK1_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_BUCK1_CONT,
+ __builtin_ffs((int)DA9062AA_BUCK1_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_BUCK1_GPI_MASK) - 1),
},
{
.desc.id = DA9061_ID_BUCK2,
@@ -522,6 +541,10 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VBUCK3_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VBUCK3_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_BUCK3_CONT,
+ __builtin_ffs((int)DA9062AA_BUCK3_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_BUCK3_GPI_MASK) - 1),
},
{
.desc.id = DA9061_ID_BUCK3,
@@ -563,6 +586,10 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VBUCK4_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VBUCK4_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_BUCK4_CONT,
+ __builtin_ffs((int)DA9062AA_BUCK4_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_BUCK4_GPI_MASK) - 1),
},
{
.desc.id = DA9061_ID_LDO1,
@@ -597,6 +624,10 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO1_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO1_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO1_CONT,
+ __builtin_ffs((int)DA9062AA_LDO1_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO1_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO1_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -635,6 +666,10 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO2_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO2_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO2_CONT,
+ __builtin_ffs((int)DA9062AA_LDO2_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO2_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO2_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -673,6 +708,10 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO3_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO3_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO3_CONT,
+ __builtin_ffs((int)DA9062AA_LDO3_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO3_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO3_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -711,6 +750,10 @@ static const struct da9062_regulator_info local_da9061_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO4_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO4_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO4_CONT,
+ __builtin_ffs((int)DA9062AA_LDO4_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO4_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO4_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -760,6 +803,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VBUCK1_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VBUCK1_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_BUCK1_CONT,
+ __builtin_ffs((int)DA9062AA_BUCK1_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_BUCK1_GPI_MASK) - 1),
},
{
.desc.id = DA9062_ID_BUCK2,
@@ -801,6 +848,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VBUCK2_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VBUCK2_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_BUCK2_CONT,
+ __builtin_ffs((int)DA9062AA_BUCK2_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_BUCK2_GPI_MASK) - 1),
},
{
.desc.id = DA9062_ID_BUCK3,
@@ -842,6 +893,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VBUCK3_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VBUCK3_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_BUCK3_CONT,
+ __builtin_ffs((int)DA9062AA_BUCK3_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_BUCK3_GPI_MASK) - 1),
},
{
.desc.id = DA9062_ID_BUCK4,
@@ -883,6 +938,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VBUCK4_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VBUCK4_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_BUCK4_CONT,
+ __builtin_ffs((int)DA9062AA_BUCK4_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_BUCK4_GPI_MASK) - 1),
},
{
.desc.id = DA9062_ID_LDO1,
@@ -917,6 +976,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO1_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO1_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO1_CONT,
+ __builtin_ffs((int)DA9062AA_LDO1_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO1_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO1_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -955,6 +1018,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO2_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO2_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO2_CONT,
+ __builtin_ffs((int)DA9062AA_LDO2_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO2_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO2_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -993,6 +1060,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO3_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO3_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO3_CONT,
+ __builtin_ffs((int)DA9062AA_LDO3_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO3_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO3_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -1031,6 +1102,10 @@ static const struct da9062_regulator_info local_da9062_regulator_info[] = {
__builtin_ffs((int)DA9062AA_VLDO4_GPI_MASK) - 1,
sizeof(unsigned int) * 8 -
__builtin_clz(DA9062AA_VLDO4_GPI_MASK) - 1),
+ .ena_gpi = REG_FIELD(DA9062AA_LDO4_CONT,
+ __builtin_ffs((int)DA9062AA_LDO4_GPI_MASK) - 1,
+ sizeof(unsigned int) * 8 -
+ __builtin_clz(DA9062AA_LDO4_GPI_MASK) - 1),
.oc_event = REG_FIELD(DA9062AA_STATUS_D,
__builtin_ffs((int)DA9062AA_LDO4_ILIM_MASK) - 1,
sizeof(unsigned int) * 8 -
@@ -1160,6 +1235,15 @@ static int da9062_regulator_probe(struct platform_device *pdev)
return PTR_ERR(regl->vsel_gpi);
}
+ if (regl->info->ena_gpi.reg) {
+ regl->ena_gpi = devm_regmap_field_alloc(
+ &pdev->dev,
+ chip->regmap,
+ regl->info->ena_gpi);
+ if (IS_ERR(regl->ena_gpi))
+ return PTR_ERR(regl->ena_gpi);
+ }
+
/* Register regulator */
memset(&config, 0, sizeof(config));
config.dev = chip->dev;
--
2.20.1
next prev parent reply other threads:[~2019-11-29 17:26 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-29 17:25 [PATCH v3 0/6] DA9062 PMIC features Marco Felsch
2019-11-29 17:25 ` [PATCH v3 1/6] gpio: treewide rename gpio_chip_hwgpio to gpiod_to_offset Marco Felsch
2019-12-02 2:59 ` Andrew Jeffery
2019-11-29 17:25 ` [PATCH v3 2/6] gpio: make gpiod_to_offset() available for other users Marco Felsch
2019-12-02 3:00 ` Andrew Jeffery
2019-11-29 17:25 ` [PATCH v3 3/6] dt-bindings: mfd: da9062: add regulator voltage selection documentation Marco Felsch
2019-12-04 13:46 ` Mark Brown
2019-12-10 9:41 ` Marco Felsch
2019-12-11 16:14 ` Adam Thomson
2019-12-11 17:09 ` Marco Felsch
2019-12-12 15:08 ` Linus Walleij
2019-12-12 15:55 ` Marco Felsch
2019-12-12 16:10 ` Mark Brown
2019-12-12 16:21 ` Marco Felsch
2019-12-12 16:51 ` Mark Brown
2019-12-16 8:55 ` Marco Felsch
2019-12-16 11:44 ` Mark Brown
2019-12-17 7:35 ` Marco Felsch
2019-12-17 12:58 ` Mark Brown
2020-01-07 8:36 ` Marco Felsch
2020-01-07 13:09 ` Mark Brown
2020-01-07 13:38 ` Marco Felsch
2020-01-14 15:43 ` Mark Brown
2019-12-16 16:32 ` Adam Thomson
2019-12-17 9:00 ` Marco Felsch
2019-12-17 9:12 ` Marco Felsch
2019-12-17 9:53 ` Adam Thomson
2019-12-17 12:31 ` Marco Felsch
2019-12-17 13:13 ` Adam Thomson
2019-12-16 16:32 ` Adam Thomson
2019-12-16 12:28 ` Linus Walleij
2019-11-29 17:25 ` [PATCH v3 4/6] regulator: da9062: add voltage selection gpio support Marco Felsch
2019-11-29 17:25 ` [PATCH v3 5/6] dt-bindings: mfd: da9062: add regulator gpio enable/disable documentation Marco Felsch
2019-12-13 22:23 ` Rob Herring
2019-12-16 16:31 ` Lee Jones
2019-11-29 17:25 ` Marco Felsch [this message]
2019-12-02 11:44 ` [PATCH v3 0/6] DA9062 PMIC features Linus Walleij
2019-12-02 12:04 ` Lee Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191129172537.31410-7-m.felsch@pengutronix.de \
--to=m.felsch@pengutronix.de \
--cc=andrew@aj.id.au \
--cc=bgolaszewski@baylibre.com \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=joel@jms.id.au \
--cc=kernel@pengutronix.de \
--cc=lee.jones@linaro.org \
--cc=lgirdwood@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-aspeed@lists.ozlabs.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh+dt@kernel.org \
--cc=support.opensource@diasemi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).