Add support to bind the regulators/child nodes with the pmic.
Also adds the pmic i2c based read/write functions to access pmic
registers.

Signed-off-by: Svyatoslav Ryhel <clamo...@gmail.com>
Reviewed-by: Simon Glass <s...@chromium.org>
---
 doc/device-tree-bindings/pmic/tps80031.txt | 76 ++++++++++++++++++++
 drivers/power/pmic/Kconfig                 | 11 +++
 drivers/power/pmic/Makefile                |  1 +
 drivers/power/pmic/tps80031.c              | 82 ++++++++++++++++++++++
 include/power/tps80031.h                   | 45 ++++++++++++
 5 files changed, 215 insertions(+)
 create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
 create mode 100644 drivers/power/pmic/tps80031.c
 create mode 100644 include/power/tps80031.h

diff --git a/doc/device-tree-bindings/pmic/tps80031.txt 
b/doc/device-tree-bindings/pmic/tps80031.txt
new file mode 100644
index 0000000000..577e6de1c1
--- /dev/null
+++ b/doc/device-tree-bindings/pmic/tps80031.txt
@@ -0,0 +1,76 @@
+Texas Instruments, TPS80031/TPS80032 PMIC
+
+This device uses two drivers:
+- drivers/power/pmic/tps80031.c (for parent device)
+- drivers/power/regulator/tps80031_regulator.c (for child regulators)
+
+This chapter describes the binding info for the PMIC driver and regulators.
+
+Required properties for PMIC:
+- compatible: "ti,tps80031" or "ti,tps80032"
+- reg: 0x48
+
+With those two properties, the pmic device can be used for read/write only.
+To bind each regulator, the optional regulators subnode should exists.
+
+Optional subnode:
+- name: regulators (subnode list of each device's regulator)
+
+Regulators subnode contains set on supported regulators.
+
+Required properties:
+- regulator-name: used for regulator uclass platform data '.name',
+
+List of supported regulator nodes names for tps80031/tps80032:
+- smps1, smps2, smps3, smps4, smps5
+- ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7, ldoln, ldousb
+
+SMPS5 in Linux 3.1.10 is referred as vio, but datasheet clearly names it SMPS5.
+
+Optional:
+- regulator-min-microvolt: minimum allowed Voltage to set
+- regulator-max-microvolt: minimum allowed Voltage to set
+- regulator-always-on: regulator should be never disabled
+- regulator-boot-on: regulator should be enabled by the bootloader
+
+Example:
+
+tps80032@48 {
+       compatible = "ti,tps80032";
+       reg = <0x48>;
+
+       regulators {
+               smps1 {
+                       regulator-name = "vdd_cpu";
+                       regulator-min-microvolt = <800000>;
+                       regulator-max-microvolt = <1250000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+               };
+
+               ...
+
+               smps5 {
+                       regulator-name = "vdd_1v8_gen";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+               };
+
+               ldo1 {
+                       regulator-name = "avdd_dsi_csi";
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-boot-on;
+               };
+
+               ...
+
+               ldousb {
+                       regulator-name = "avdd_usb";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+               };
+       };
+};
diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
index 54665d7e2b..454a6e0cf8 100644
--- a/drivers/power/pmic/Kconfig
+++ b/drivers/power/pmic/Kconfig
@@ -351,6 +351,17 @@ config DM_PMIC_TPS65910
        DC-DC converter, 8 LDOs and a RTC. This driver binds the SMPS and LDO
        pmic children.
 
+config DM_PMIC_TPS80031
+       bool "Enable driver for Texas Instruments TPS80031/TPS80032 PMIC"
+       ---help---
+       This config enables implementation of driver-model pmic uclass features
+       for TPS80031/TPS80032 PMICs. The driver implements read/write 
operations.
+       This is a Power Management IC with a decent set of peripherals from 
which
+       5 Buck Converters refered as Switched-mode power supply (SMPS), 11 
General-
+       Purpose Low-Dropout Voltage Regulators (LDO), USB OTG Module, Real-Time
+       Clock (RTC) with Timer and Alarm Wake-Up, Two Digital PWM Outputs and 
more
+       with I2C Compatible Interface. PMIC occupies 4 I2C addresses.
+
 config PMIC_STPMIC1
        bool "Enable support for STMicroelectronics STPMIC1 PMIC"
        depends on DM_I2C
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index 414a9d8225..55ee614364 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -27,6 +27,7 @@ obj-$(CONFIG_$(SPL_)PMIC_RN5T567) += rn5t567.o
 obj-$(CONFIG_PMIC_TPS65090) += tps65090.o
 obj-$(CONFIG_PMIC_S5M8767) += s5m8767.o
 obj-$(CONFIG_DM_PMIC_TPS65910) += pmic_tps65910_dm.o
+obj-$(CONFIG_$(SPL_)DM_PMIC_TPS80031) += tps80031.o
 obj-$(CONFIG_$(SPL_)PMIC_PALMAS) += palmas.o
 obj-$(CONFIG_$(SPL_)PMIC_LP873X) += lp873x.o
 obj-$(CONFIG_$(SPL_)PMIC_LP87565) += lp87565.o
diff --git a/drivers/power/pmic/tps80031.c b/drivers/power/pmic/tps80031.c
new file mode 100644
index 0000000000..6b36ebbf7d
--- /dev/null
+++ b/drivers/power/pmic/tps80031.c
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamo...@gmail.com>
+ */
+
+#include <dm.h>
+#include <dm/lists.h>
+#include <power/pmic.h>
+#include <power/tps80031.h>
+
+static const struct pmic_child_info pmic_children_info[] = {
+       { .prefix = "ldo", .driver = TPS80031_LDO_DRIVER },
+       { .prefix = "smps", .driver = TPS80031_SMPS_DRIVER },
+       { },
+};
+
+static int tps80031_write(struct udevice *dev, uint reg, const uint8_t *buff,
+                         int len)
+{
+       int ret;
+
+       ret = dm_i2c_write(dev, reg, buff, len);
+       if (ret) {
+               log_debug("write error to device: %p register: %#x!\n", dev, 
reg);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int tps80031_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
+{
+       int ret;
+
+       ret = dm_i2c_read(dev, reg, buff, len);
+       if (ret) {
+               log_debug("read error from device: %p register: %#x!\n", dev, 
reg);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int tps80031_bind(struct udevice *dev)
+{
+       ofnode regulators_node;
+       int children;
+
+       regulators_node = dev_read_subnode(dev, "regulators");
+       if (!ofnode_valid(regulators_node)) {
+               log_err("%s regulators subnode not found!\n", dev->name);
+               return -ENXIO;
+       }
+
+       debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
+
+       children = pmic_bind_children(dev, regulators_node, pmic_children_info);
+       if (!children)
+               log_err("%s - no child found\n", dev->name);
+
+       /* Always return success for this device */
+       return 0;
+}
+
+static struct dm_pmic_ops tps80031_ops = {
+       .read = tps80031_read,
+       .write = tps80031_write,
+};
+
+static const struct udevice_id tps80031_ids[] = {
+       { .compatible = "ti,tps80031" },
+       { .compatible = "ti,tps80032" },
+       { }
+};
+
+U_BOOT_DRIVER(pmic_tps80031) = {
+       .name = "tps80031_pmic",
+       .id = UCLASS_PMIC,
+       .of_match = tps80031_ids,
+       .bind = tps80031_bind,
+       .ops = &tps80031_ops,
+};
diff --git a/include/power/tps80031.h b/include/power/tps80031.h
new file mode 100644
index 0000000000..c80692a8af
--- /dev/null
+++ b/include/power/tps80031.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamo...@gmail.com>
+ */
+
+#ifndef _TPS80031_H_
+#define _TPS80031_H_
+
+#define TPS80031_LDO_NUM               9
+#define TPS80031_SMPS_NUM              5
+
+/* Drivers name */
+#define TPS80031_LDO_DRIVER            "tps80031_ldo"
+#define TPS80031_SMPS_DRIVER           "tps80031_smps"
+
+#define TPS80031_SMPS_OFFSET           0xe0
+#define TPS80031_OFFSET_FLAG           BIT(0)
+
+#define REGULATOR_STATUS_MASK          0x3
+#define REGULATOR_MODE_ON              0x1
+
+/* Switched-Mode Power Supply Regulator calculations */
+#define SMPS_VOLT_MASK                 0x3f
+#define SMPS_VOLT_LINEAR_HEX           0x39
+#define SMPS_VOLT_NLINEAR_HEX          0x3a
+#define SMPS_VOLT_LINEAR               1300000
+#define SMPS_VOLT_BASE                 600000
+#define SMPS_VOLT_BASE_OFFSET          700000
+
+/* Low-Dropout Linear (LDO) Regulator calculations */
+#define LDO_VOLT_MASK                  0x3f
+#define LDO_VOLT_MAX_HEX               0x18
+#define LDO_VOLT_MIN_HEX               0x01
+#define LDO_VOLT_MAX                   3360000
+#define LDO_VOLT_MIN                   1018000
+#define LDO_VOLT_BASE                  916000
+
+/* register groups */
+enum {
+       CTRL,
+       VOLT,
+       OFFSET,
+};
+
+#endif /* _TPS80031_H_ */
-- 
2.39.2

Reply via email to