Re: [PATCH v5 4/6] regulator: Add support for QCOM PMIC VBUS booster

2020-07-03 Thread Mark Brown
On Thu, Jul 02, 2020 at 06:51:00PM -0700, Wesley Cheng wrote:
> Some Qualcomm PMICs have the capability to source the VBUS output to
> connected peripherals.  This driver will register a regulator to the
> regulator list to enable or disable this source by an external driver.

Please do not submit new versions of already applied patches, please
submit incremental updates to the existing code.  Modifying existing
commits creates problems for other users building on top of those
commits so it's best practice to only change pubished git commits if
absolutely essential.


signature.asc
Description: PGP signature


[PATCH v5 4/6] regulator: Add support for QCOM PMIC VBUS booster

2020-07-02 Thread Wesley Cheng
Some Qualcomm PMICs have the capability to source the VBUS output to
connected peripherals.  This driver will register a regulator to the
regulator list to enable or disable this source by an external driver.

Signed-off-by: Wesley Cheng 
---
 drivers/regulator/Kconfig   | 10 +++
 drivers/regulator/Makefile  |  1 +
 drivers/regulator/qcom_usb_vbus-regulator.c | 97 +
 3 files changed, 108 insertions(+)
 create mode 100644 drivers/regulator/qcom_usb_vbus-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 074a2ef55943..273d85a45263 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -797,6 +797,16 @@ config REGULATOR_QCOM_SPMI
  Qualcomm SPMI PMICs as a module. The module will be named
  "qcom_spmi-regulator".
 
+config REGULATOR_QCOM_USB_VBUS
+   tristate "Qualcomm USB Vbus regulator driver"
+   depends on SPMI || COMPILE_TEST
+   help
+ If you say yes to this option, support will be included for the
+ regulator used to enable the VBUS output.
+
+ Say M here if you want to include support for enabling the VBUS output
+ as a module. The module will be named "qcom_usb_vbus_regulator".
+
 config REGULATOR_RC5T583
tristate "RICOH RC5T583 Power regulators"
depends on MFD_RC5T583
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index c0d6b96ebd78..cbab28aa7b56 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -89,6 +89,7 @@ obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o
 obj-$(CONFIG_REGULATOR_QCOM_RPMH) += qcom-rpmh-regulator.o
 obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o
 obj-$(CONFIG_REGULATOR_QCOM_SPMI) += qcom_spmi-regulator.o
+obj-$(CONFIG_REGULATOR_QCOM_USB_VBUS) += qcom_usb_vbus-regulator.o
 obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o
 obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o
 obj-$(CONFIG_REGULATOR_PV88060) += pv88060-regulator.o
diff --git a/drivers/regulator/qcom_usb_vbus-regulator.c 
b/drivers/regulator/qcom_usb_vbus-regulator.c
new file mode 100644
index ..342d92373598
--- /dev/null
+++ b/drivers/regulator/qcom_usb_vbus-regulator.c
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Qualcomm PMIC VBUS output regulator driver
+//
+// Copyright (c) 2020, The Linux Foundation. All rights reserved.
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define CMD_OTG0x40
+#define OTG_EN BIT(0)
+#define OTG_CFG0x53
+#define OTG_EN_SRC_CFG BIT(1)
+
+static const struct regulator_ops qcom_usb_vbus_reg_ops = {
+   .enable = regulator_enable_regmap,
+   .disable = regulator_disable_regmap,
+   .is_enabled = regulator_is_enabled_regmap,
+};
+
+static struct regulator_desc qcom_usb_vbus_rdesc = {
+   .name = "usb_vbus",
+   .ops = _usb_vbus_reg_ops,
+   .owner = THIS_MODULE,
+   .type = REGULATOR_VOLTAGE,
+};
+
+static int qcom_usb_vbus_regulator_probe(struct platform_device *pdev)
+{
+   struct device *dev = >dev;
+   struct regulator_dev *rdev;
+   struct regmap *regmap;
+   struct regulator_config config = { };
+   struct regulator_init_data *init_data;
+   int ret;
+   u32 base;
+
+   ret = of_property_read_u32(dev->of_node, "reg", );
+   if (ret < 0) {
+   dev_err(dev, "no base address found\n");
+   return ret;
+   }
+
+   regmap = dev_get_regmap(dev->parent, NULL);
+   if (regmap) {
+   dev_err(dev, "Failed to get regmap\n");
+   return -ENOENT;
+   }
+
+   init_data = of_get_regulator_init_data(dev, dev->of_node,
+  _usb_vbus_rdesc);
+   if (!init_data)
+   return -ENOMEM;
+
+   qcom_usb_vbus_rdesc.enable_reg = base + CMD_OTG;
+   qcom_usb_vbus_rdesc.enable_mask = OTG_EN;
+   config.dev = dev;
+   config.init_data = init_data;
+   config.regmap = regmap;
+
+   rdev = devm_regulator_register(dev, _usb_vbus_rdesc, );
+   if (IS_ERR(rdev)) {
+   ret = PTR_ERR(rdev);
+   dev_err(dev, "not able to register vbus reg %d\n", ret);
+   return ret;
+   }
+
+   /* Disable HW logic for VBUS enable */
+   regmap_update_bits(regmap, base + OTG_CFG, OTG_EN_SRC_CFG, 0);
+
+   return 0;
+}
+
+static const struct of_device_id qcom_usb_vbus_regulator_match[] = {
+   { .compatible = "qcom,pm8150b-vbus-reg" },
+   { }
+};
+MODULE_DEVICE_TABLE(of, qcom_usb_vbus_regulator_match);
+
+static struct platform_driver qcom_usb_vbus_regulator_driver = {
+   .driver = {
+   .name   = "qcom-usb-vbus-regulator",
+   .of_match_table = qcom_usb_vbus_regulator_match,
+