From: Duje Mihanović <[email protected]>

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ć <[email protected]>
---
 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


Reply via email to