[PATCH 3/3] regulator: 88pm886: Add Vbus regulator

From: Duje Mihanović

Date: Tue May 26 2026 - 15:19:04 EST


From: Duje Mihanović <duje@xxxxxxxxxxxxxxxxx>

Add support for the PMIC's Vbus regulator. This regulator is mandatory
for USB OTG support on boards using the PMIC.

Signed-off-by: Duje Mihanović <duje@xxxxxxxxxxxxxxxxx>
---
drivers/regulator/88pm886-regulator.c | 27 +++++++++++++++++++++++++++
include/linux/mfd/88pm886.h | 7 +++++++
2 files changed, 34 insertions(+)

diff --git a/drivers/regulator/88pm886-regulator.c b/drivers/regulator/88pm886-regulator.c
index a38bd4f312b7..039822e86ec8 100644
--- a/drivers/regulator/88pm886-regulator.c
+++ b/drivers/regulator/88pm886-regulator.c
@@ -4,6 +4,7 @@
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>
+#include <linux/units.h>

#include <linux/mfd/88pm886.h>

@@ -337,6 +338,25 @@ static struct regulator_desc pm886_regulators[] = {
},
};

+static const struct linear_range pm886_vbus_volt_ranges[] = {
+ REGULATOR_LINEAR_RANGE(3750000, 0, 7, 250000)
+};
+
+static struct regulator_desc pm886_vbus_regulator = {
+ .name = "vbus",
+ .regulators_node = "regulators",
+ .of_match = "vbus",
+ .ops = &pm886_buck_ops,
+ .type = REGULATOR_VOLTAGE,
+ .n_voltages = 8,
+ .linear_ranges = pm886_vbus_volt_ranges,
+ .n_linear_ranges = ARRAY_SIZE(pm886_vbus_volt_ranges),
+ .vsel_reg = PM886_REG_BOOST_CONFIG1,
+ .vsel_mask = PM886_REG_BOOST_MASK,
+ .enable_reg = PM886_REG_BATTERY_CONFIG1,
+ .enable_mask = PM886_REG_VBUS_EN,
+};
+
static int pm886_regulator_probe(struct platform_device *pdev)
{
struct pm886_chip *chip = dev_get_drvdata(pdev->dev.parent);
@@ -369,6 +389,13 @@ static int pm886_regulator_probe(struct platform_device *pdev)
"Failed to register %s\n", rdesc->name);
}

+ rcfg.regmap = chip->regmap_battery;
+ rdesc = &pm886_vbus_regulator;
+ rdev = devm_regulator_register(dev, rdesc, &rcfg);
+ if (IS_ERR(rdev))
+ return dev_err_probe(dev, PTR_ERR(rdev),
+ "Failed to register %s\n", rdesc->name);
+
return 0;
}

diff --git a/include/linux/mfd/88pm886.h b/include/linux/mfd/88pm886.h
index 2c24dd3032ab..9e96d2cb92f5 100644
--- a/include/linux/mfd/88pm886.h
+++ b/include/linux/mfd/88pm886.h
@@ -2,6 +2,7 @@
#ifndef __MFD_88PM886_H
#define __MFD_88PM886_H

+#include <linux/bits.h>
#include <linux/i2c.h>
#include <linux/regmap.h>

@@ -130,6 +131,12 @@
#define PM886_GPADC_INDEX_TO_BIAS_uA(i) (1 + (i) * 5)

/* Battery block register definitions */
+#define PM886_REG_BATTERY_CONFIG1 0x28
+#define PM886_REG_VBUS_EN BIT(7)
+
+#define PM886_REG_BOOST_CONFIG1 0x6b
+#define PM886_REG_BOOST_MASK GENMASK(2, 0)
+
#define PM886_REG_CLS_CONFIG1 0x71

struct pm886_chip {

--
2.54.0