All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
@ 2023-07-14 16:16 ` Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 1/6] power: pmic: add the base max77663 pmic support Svyatoslav Ryhel
                     ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-14 16:16 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

Patch set adds basic support for PMICs used in many Tegra 3 devices.
All PMIC drivers are based on datasheets provided by vendors.
Implemented API include regulator set/get voltage enable/disable and
basic PMIC r/w capabilities.

Drivers were tested by me on LG P895 (max77663), HTC One X (TPS80032)
and ASUS TF300T (tps65911). Calculations and behavior were correct,
predictable and reproducible.

Svyatoslav Ryhel (6):
  power: pmic: add the base max77663 pmic support
  power: regulator: max77663: add regulator support
  power: pmic: add the base TPS80031 PMIC support
  power: regulator: tps80031: add regulator support
  power: pmic: tps65910: add TPS65911 PMIC support
  power: regulator: tps65911: add regulator support

 doc/device-tree-bindings/pmic/max77663.txt   |  84 +++++
 doc/device-tree-bindings/pmic/tps65911.txt   |  78 ++++
 doc/device-tree-bindings/pmic/tps80031.txt   |  76 ++++
 drivers/power/pmic/Kconfig                   |  12 +
 drivers/power/pmic/Makefile                  |   2 +
 drivers/power/pmic/max77663.c                |  81 ++++
 drivers/power/pmic/pmic_tps65910_dm.c        |  26 +-
 drivers/power/pmic/tps80031.c                |  82 ++++
 drivers/power/regulator/Kconfig              |  24 ++
 drivers/power/regulator/Makefile             |   3 +
 drivers/power/regulator/max77663_regulator.c | 362 ++++++++++++++++++
 drivers/power/regulator/tps65911_regulator.c | 375 +++++++++++++++++++
 drivers/power/regulator/tps80031_regulator.c | 296 +++++++++++++++
 include/power/max77663.h                     |  40 ++
 include/power/tps65910_pmic.h                |  47 +++
 include/power/tps80031.h                     |  42 +++
 16 files changed, 1627 insertions(+), 3 deletions(-)
 create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
 create mode 100644 doc/device-tree-bindings/pmic/tps65911.txt
 create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
 create mode 100644 drivers/power/pmic/max77663.c
 create mode 100644 drivers/power/pmic/tps80031.c
 create mode 100644 drivers/power/regulator/max77663_regulator.c
 create mode 100644 drivers/power/regulator/tps65911_regulator.c
 create mode 100644 drivers/power/regulator/tps80031_regulator.c
 create mode 100644 include/power/max77663.h
 create mode 100644 include/power/tps80031.h

-- 
2.39.2


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v1 1/6] power: pmic: add the base max77663 pmic support
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
@ 2023-07-14 16:16   ` Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 2/6] power: regulator: max77663: add regulator support Svyatoslav Ryhel
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-14 16:16 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

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 <clamor95@gmail.com>
---
 doc/device-tree-bindings/pmic/max77663.txt | 84 ++++++++++++++++++++++
 drivers/power/pmic/Kconfig                 |  6 ++
 drivers/power/pmic/Makefile                |  1 +
 drivers/power/pmic/max77663.c              | 81 +++++++++++++++++++++
 include/power/max77663.h                   | 40 +++++++++++
 5 files changed, 212 insertions(+)
 create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
 create mode 100644 drivers/power/pmic/max77663.c
 create mode 100644 include/power/max77663.h

diff --git a/doc/device-tree-bindings/pmic/max77663.txt b/doc/device-tree-bindings/pmic/max77663.txt
new file mode 100644
index 0000000000..ddb7d3eb14
--- /dev/null
+++ b/doc/device-tree-bindings/pmic/max77663.txt
@@ -0,0 +1,84 @@
+MAXIM, MAX77663 PMIC
+
+This device uses two drivers:
+- drivers/power/pmic/max77663.c (for parent device)
+- drivers/power/regulator/max77663_regulator.c (for child regulators)
+
+This chapter describes the binding info for the PMIC driver and regulators.
+
+Required properties for PMIC:
+- compatible: "maxim,max77663"
+- reg: usually 0x1c or 0x3c
+
+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 max77663:
+- sd0, sd1, sd2, sd3, ldo0, ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7, ldo8
+
+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
+
+Linux driver binding for this driver is compatible.
+
+Example:
+
+max77663@1c {
+	compatible = "maxim,max77663";
+	reg = <0x1c>;
+
+	regulators {
+		sd0 {
+			regulator-name = "vdd_cpu";
+			regulator-min-microvolt = <800000>;
+			regulator-max-microvolt = <1250000>;
+			regulator-always-on;
+			regulator-boot-on;
+		};
+
+		...
+
+		ldo0 {
+			regulator-name = "avdd_pll";
+			regulator-min-microvolt = <1200000>;
+			regulator-max-microvolt = <1200000>;
+		};
+
+		...
+
+		ldo2 {
+			regulator-name = "avdd_usb";
+			regulator-min-microvolt = <3300000>;
+			regulator-max-microvolt = <3300000>;
+			regulator-always-on;
+			regulator-boot-on;
+		};
+
+		ldo3 {
+			regulator-name = "vdd_sdmmc3";
+			regulator-min-microvolt = <3000000>;
+			regulator-max-microvolt = <3000000>;
+			regulator-always-on;
+			regulator-boot-on;
+		};
+
+		...
+
+		ldo8 {
+			regulator-name = "avdd_dsi_csi";
+			regulator-min-microvolt = <1200000>;
+			regulator-max-microvolt = <1200000>;
+		};
+	};
+};
diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
index 176fb07c65..abea0fe4ed 100644
--- a/drivers/power/pmic/Kconfig
+++ b/drivers/power/pmic/Kconfig
@@ -184,6 +184,12 @@ config SPL_DM_PMIC_PFUZE100
 	This config enables implementation of driver-model pmic uclass features
 	for PMIC PFUZE100 in SPL. The driver implements read/write operations.
 
+config DM_PMIC_MAX77663
+	bool "Enable Driver Model for PMIC MAX77663"
+	---help---
+	This config enables implementation of driver-model pmic uclass features
+	for PMIC MAX77663. The driver implements read/write operations.
+
 config DM_PMIC_MAX77686
 	bool "Enable Driver Model for PMIC MAX77686"
 	---help---
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index 0b3b3d62d0..414a9d8225 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -6,6 +6,7 @@
 obj-$(CONFIG_$(SPL_TPL_)DM_PMIC) += pmic-uclass.o
 obj-$(CONFIG_$(SPL_)DM_PMIC_FAN53555) += fan53555.o
 obj-$(CONFIG_$(SPL_)DM_PMIC_DA9063) += da9063.o
+obj-$(CONFIG_$(SPL_)DM_PMIC_MAX77663) += max77663.o
 obj-$(CONFIG_DM_PMIC_MAX77686) += max77686.o
 obj-$(CONFIG_DM_PMIC_MAX8998) += max8998.o
 obj-$(CONFIG_DM_PMIC_MC34708) += mc34708.o
diff --git a/drivers/power/pmic/max77663.c b/drivers/power/pmic/max77663.c
new file mode 100644
index 0000000000..fa70d2d936
--- /dev/null
+++ b/drivers/power/pmic/max77663.c
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <errno.h>
+#include <dm.h>
+#include <i2c.h>
+#include <log.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/max77663.h>
+#include <dm/device.h>
+
+static const struct pmic_child_info pmic_children_info[] = {
+	{ .prefix = "ldo", .driver = MAX77663_LDO_DRIVER },
+	{ .prefix = "sd", .driver = MAX77663_SD_DRIVER },
+	{ },
+};
+
+static int max77663_write(struct udevice *dev, uint reg, const uint8_t *buff,
+			  int len)
+{
+	if (dm_i2c_write(dev, reg, buff, len)) {
+		log_err("write error to device: %p register: %#x!\n", dev, reg);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int max77663_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
+{
+	if (dm_i2c_read(dev, reg, buff, len)) {
+		log_err("read error from device: %p register: %#x!\n", dev, reg);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int max77663_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 max77663_ops = {
+	.read	= max77663_read,
+	.write	= max77663_write,
+};
+
+static const struct udevice_id max77663_ids[] = {
+	{ .compatible = "maxim,max77663" },
+	{ }
+};
+
+U_BOOT_DRIVER(pmic_max77663) = {
+	.name = "max77663_pmic",
+	.id = UCLASS_PMIC,
+	.of_match = max77663_ids,
+	.bind = max77663_bind,
+	.ops = &max77663_ops,
+};
diff --git a/include/power/max77663.h b/include/power/max77663.h
new file mode 100644
index 0000000000..53a0976346
--- /dev/null
+++ b/include/power/max77663.h
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#ifndef _MAX77663_H_
+#define _MAX77663_H_
+
+#define MAX77663_LDO_NUM		9
+#define MAX77663_SD_NUM			5
+
+/* Drivers name */
+#define MAX77663_LDO_DRIVER		"max77663_ldo"
+#define MAX77663_SD_DRIVER		"max77663_sd"
+
+#define	MAX77663_SD_STATUS_MASK		0x30
+
+#define	MAX77663_SD0_VOLT_MAX_HEX	0x40
+#define	MAX77663_SD1_VOLT_MAX_HEX	0X4C
+#define	MAX77663_SD_VOLT_MAX_HEX	0XFF
+#define	MAX77663_SD_VOLT_MIN_HEX	0x02
+
+#define	MAX77663_SD0_VOLT_MAX		1400000
+#define	MAX77663_SD1_VOLT_MAX		1550000
+#define	MAX77663_SD_VOLT_MAX		3787500
+#define	MAX77663_SD_VOLT_MIN		625000
+
+#define	MAX77663_SD_VOLT_BASE		600000
+
+#define MAX77663_LDO_STATUS_MASK	0xC0
+#define MAX77663_LDO_VOLT_MASK		0x3F
+#define MAX77663_LDO_VOLT_MAX_HEX	0x3F
+
+#define MAX77663_LDO01_VOLT_MAX		2375000
+#define MAX77663_LDO4_VOLT_MAX		1587500
+#define MAX77663_LDO_VOLT_MAX		3950000
+
+#define	MAX77663_LDO_VOLT_BASE		800000
+
+#endif /* _MAX77663_H_ */
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 2/6] power: regulator: max77663: add regulator support
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 1/6] power: pmic: add the base max77663 pmic support Svyatoslav Ryhel
@ 2023-07-14 16:16   ` Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 3/6] power: pmic: add the base TPS80031 PMIC support Svyatoslav Ryhel
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-14 16:16 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

The driver provides regulator set/get voltage
enable/disable functions for MAXIM MAX77663 PMICs.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 drivers/power/regulator/Kconfig              |   8 +
 drivers/power/regulator/Makefile             |   1 +
 drivers/power/regulator/max77663_regulator.c | 362 +++++++++++++++++++
 3 files changed, 371 insertions(+)
 create mode 100644 drivers/power/regulator/max77663_regulator.c

diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig
index eb5aa38c1c..571debd54e 100644
--- a/drivers/power/regulator/Kconfig
+++ b/drivers/power/regulator/Kconfig
@@ -141,6 +141,14 @@ config SPL_REGULATOR_PWM
 	  This config enables implementation of driver-model regulator uclass
 	  features for PWM regulators in SPL.
 
+config DM_REGULATOR_MAX77663
+	bool "Enable Driver Model for REGULATOR MAX77663"
+	depends on DM_REGULATOR && DM_PMIC_MAX77663
+	---help---
+	This config enables implementation of driver-model regulator uclass
+	features for REGULATOR MAX77663. The driver implements get/set api for:
+	value and enable.
+
 config DM_REGULATOR_MAX77686
 	bool "Enable Driver Model for REGULATOR MAX77686"
 	depends on DM_REGULATOR && DM_PMIC_MAX77686
diff --git a/drivers/power/regulator/Makefile b/drivers/power/regulator/Makefile
index d9e0cd5949..8d73169b50 100644
--- a/drivers/power/regulator/Makefile
+++ b/drivers/power/regulator/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_REGULATOR_AS3722)	+= as3722_regulator.o
 obj-$(CONFIG_$(SPL_)REGULATOR_AXP) += axp_regulator.o
 obj-$(CONFIG_$(SPL_)REGULATOR_AXP_USB_POWER) += axp_usb_power.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_DA9063) += da9063.o
+obj-$(CONFIG_$(SPL_)DM_REGULATOR_MAX77663) += max77663_regulator.o
 obj-$(CONFIG_DM_REGULATOR_MAX77686) += max77686.o
 obj-$(CONFIG_DM_REGULATOR_NPCM8XX) += npcm8xx_regulator.o
 obj-$(CONFIG_$(SPL_)DM_PMIC_PFUZE100) += pfuze100.o
diff --git a/drivers/power/regulator/max77663_regulator.c b/drivers/power/regulator/max77663_regulator.c
new file mode 100644
index 0000000000..80501d2792
--- /dev/null
+++ b/drivers/power/regulator/max77663_regulator.c
@@ -0,0 +1,362 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <errno.h>
+#include <dm.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/max77663.h>
+
+/* fist row is control registers, second is voltage registers */
+static const char max77663_sd_reg[][MAX77663_SD_NUM] = {
+	{ 0x1d, 0x1e, 0x1f, 0x20, 0x21 },
+	{ 0x16, 0x17, 0x18, 0x19, 0x2a },
+};
+
+static const char max77663_ldo_reg[MAX77663_LDO_NUM] = {
+	0x23, 0x25, 0x27, 0x29, 0x2b, 0x2d, 0x2f, 0x31, 0x33
+};
+
+static int max77663_sd_enable(struct udevice *dev, int op, bool *enable)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->ctrl_reg;
+	int ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		if (ret & MAX77663_SD_STATUS_MASK)
+			*enable = true;
+		else
+			*enable = false;
+
+		return 0;
+	} else if (op == PMIC_OP_SET) {
+		ret &= ~(MAX77663_SD_STATUS_MASK);
+
+		if (*enable)
+			ret |= MAX77663_SD_STATUS_MASK;
+
+		ret = pmic_reg_write(dev->parent, adr, ret);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int max77663_sd_volt2hex(int sd, int uV)
+{
+	switch (sd) {
+	case 0:
+		/* SD0 has max voltage 1.4V */
+		if (uV > MAX77663_SD0_VOLT_MAX)
+			return -EINVAL;
+		break;
+	case 1:
+		/* SD1 has max voltage 1.55V */
+		if (uV > MAX77663_SD1_VOLT_MAX)
+			return -EINVAL;
+		break;
+	default:
+		/* SD2 and SD3 have max voltage 3.79V */
+		if (uV > MAX77663_SD_VOLT_MAX)
+			return -EINVAL;
+		break;
+	};
+
+	if (uV < MAX77663_SD_VOLT_MIN)
+		uV = MAX77663_SD_VOLT_MIN;
+
+	return (uV - MAX77663_SD_VOLT_BASE) / 12500;
+}
+
+static int max77663_sd_hex2volt(int sd, int hex)
+{
+	switch (sd) {
+	case 0:
+		/* SD0 has max voltage 1.4V */
+		if (hex > MAX77663_SD0_VOLT_MAX_HEX)
+			return -EINVAL;
+		break;
+	case 1:
+		/* SD1 has max voltage 1.55V */
+		if (hex > MAX77663_SD1_VOLT_MAX_HEX)
+			return -EINVAL;
+		break;
+	default:
+		/* SD2 and SD3 have max voltage 3.79V */
+		if (hex > MAX77663_SD_VOLT_MAX_HEX)
+			return -EINVAL;
+		break;
+	};
+
+	if (hex < MAX77663_SD_VOLT_MIN_HEX)
+		hex = MAX77663_SD_VOLT_MIN_HEX;
+
+	return MAX77663_SD_VOLT_BASE + hex * 12500;
+}
+
+static int max77663_sd_val(struct udevice *dev, int op, int *uV)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->volt_reg;
+	int id = dev->driver_data;
+	int ret;
+
+	if (op == PMIC_OP_GET) {
+		ret = pmic_reg_read(dev->parent, adr);
+		if (ret < 0)
+			return ret;
+
+		*uV = 0;
+
+		ret = max77663_sd_hex2volt(id, ret);
+		if (ret < 0)
+			return ret;
+		*uV = ret;
+
+		return 0;
+	}
+
+	/* SD regulators use entire register for voltage */
+	ret = max77663_sd_volt2hex(id, *uV);
+	if (ret < 0)
+		return ret;
+
+	return pmic_reg_write(dev->parent, adr, ret);
+}
+
+static int max77663_sd_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+
+	uc_pdata->type = REGULATOR_TYPE_BUCK;
+	uc_pdata->ctrl_reg = max77663_sd_reg[0][dev->driver_data];
+	uc_pdata->volt_reg = max77663_sd_reg[1][dev->driver_data];
+
+	regulator_autoset(dev);
+
+	return 0;
+}
+
+static int sd_get_value(struct udevice *dev)
+{
+	int uV;
+	int ret;
+
+	ret = max77663_sd_val(dev, PMIC_OP_GET, &uV);
+	if (ret)
+		return ret;
+
+	return uV;
+}
+
+static int sd_set_value(struct udevice *dev, int uV)
+{
+	return max77663_sd_val(dev, PMIC_OP_SET, &uV);
+}
+
+static int sd_get_enable(struct udevice *dev)
+{
+	bool enable = false;
+	int ret;
+
+	ret = max77663_sd_enable(dev, PMIC_OP_GET, &enable);
+	if (ret)
+		return ret;
+
+	return enable;
+}
+
+static int sd_set_enable(struct udevice *dev, bool enable)
+{
+	return max77663_sd_enable(dev, PMIC_OP_SET, &enable);
+}
+
+static const struct dm_regulator_ops max77663_sd_ops = {
+	.get_value  = sd_get_value,
+	.set_value  = sd_set_value,
+	.get_enable = sd_get_enable,
+	.set_enable = sd_set_enable,
+};
+
+U_BOOT_DRIVER(max77663_sd) = {
+	.name = MAX77663_SD_DRIVER,
+	.id = UCLASS_REGULATOR,
+	.ops = &max77663_sd_ops,
+	.probe = max77663_sd_probe,
+};
+
+static int max77663_ldo_enable(struct udevice *dev, int op, bool *enable)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->ctrl_reg;
+	int ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		if (ret & MAX77663_LDO_STATUS_MASK)
+			*enable = true;
+		else
+			*enable = false;
+
+		return 0;
+	} else if (op == PMIC_OP_SET) {
+		ret &= ~(MAX77663_LDO_STATUS_MASK);
+
+		if (*enable)
+			ret |= MAX77663_LDO_STATUS_MASK;
+
+		ret = pmic_reg_write(dev->parent, adr, ret);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int max77663_ldo_volt2hex(int ldo, int uV)
+{
+	switch (ldo) {
+	case 0:
+	case 1:
+		if (uV > MAX77663_LDO01_VOLT_MAX)
+			return -EINVAL;
+
+		return (uV - MAX77663_LDO_VOLT_BASE) / 25000;
+	case 4:
+		if (uV > MAX77663_LDO4_VOLT_MAX)
+			return -EINVAL;
+
+		return (uV - MAX77663_LDO_VOLT_BASE) / 12500;
+	default:
+		if (uV > MAX77663_LDO_VOLT_MAX)
+			return -EINVAL;
+
+		return (uV - MAX77663_LDO_VOLT_BASE) / 50000;
+	};
+}
+
+static int max77663_ldo_hex2volt(int ldo, int hex)
+{
+	if (hex > MAX77663_LDO_VOLT_MAX_HEX)
+		return -EINVAL;
+
+	switch (ldo) {
+	case 0:
+	case 1:
+		return (hex * 25000) + MAX77663_LDO_VOLT_BASE;
+	case 4:
+		return (hex * 12500) + MAX77663_LDO_VOLT_BASE;
+	default:
+		return (hex * 50000) + MAX77663_LDO_VOLT_BASE;
+	};
+}
+
+static int max77663_ldo_val(struct udevice *dev, int op, int *uV)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->ctrl_reg;
+	int id = dev->driver_data;
+	int hex, ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		*uV = 0;
+
+		ret = max77663_ldo_hex2volt(id, ret & MAX77663_LDO_VOLT_MASK);
+		if (ret < 0)
+			return ret;
+
+		*uV = ret;
+		return 0;
+	}
+
+	hex = max77663_ldo_volt2hex(id, *uV);
+	if (hex < 0)
+		return hex;
+
+	ret &= ~(MAX77663_LDO_VOLT_MASK);
+
+	return pmic_reg_write(dev->parent, adr, ret | hex);
+}
+
+static int max77663_ldo_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+
+	uc_pdata->type = REGULATOR_TYPE_LDO;
+	uc_pdata->ctrl_reg = max77663_ldo_reg[dev->driver_data];
+
+	regulator_autoset(dev);
+
+	return 0;
+}
+
+static int ldo_get_value(struct udevice *dev)
+{
+	int uV;
+	int ret;
+
+	ret = max77663_ldo_val(dev, PMIC_OP_GET, &uV);
+	if (ret)
+		return ret;
+
+	return uV;
+}
+
+static int ldo_set_value(struct udevice *dev, int uV)
+{
+	return max77663_ldo_val(dev, PMIC_OP_SET, &uV);
+}
+
+static int ldo_get_enable(struct udevice *dev)
+{
+	bool enable = false;
+	int ret;
+
+	ret = max77663_ldo_enable(dev, PMIC_OP_GET, &enable);
+	if (ret)
+		return ret;
+
+	return enable;
+}
+
+static int ldo_set_enable(struct udevice *dev, bool enable)
+{
+	return max77663_ldo_enable(dev, PMIC_OP_SET, &enable);
+}
+
+static const struct dm_regulator_ops max77663_ldo_ops = {
+	.get_value  = ldo_get_value,
+	.set_value  = ldo_set_value,
+	.get_enable = ldo_get_enable,
+	.set_enable = ldo_set_enable,
+};
+
+U_BOOT_DRIVER(max77663_ldo) = {
+	.name = MAX77663_LDO_DRIVER,
+	.id = UCLASS_REGULATOR,
+	.ops = &max77663_ldo_ops,
+	.probe = max77663_ldo_probe,
+};
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 3/6] power: pmic: add the base TPS80031 PMIC support
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 1/6] power: pmic: add the base max77663 pmic support Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 2/6] power: regulator: max77663: add regulator support Svyatoslav Ryhel
@ 2023-07-14 16:16   ` Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 4/6] power: regulator: tps80031: add regulator support Svyatoslav Ryhel
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-14 16:16 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

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 <clamor95@gmail.com>
---
 doc/device-tree-bindings/pmic/tps80031.txt | 76 ++++++++++++++++++++
 drivers/power/pmic/Kconfig                 |  6 ++
 drivers/power/pmic/Makefile                |  1 +
 drivers/power/pmic/tps80031.c              | 82 ++++++++++++++++++++++
 include/power/tps80031.h                   | 42 +++++++++++
 5 files changed, 207 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 abea0fe4ed..d25fe1ce0d 100644
--- a/drivers/power/pmic/Kconfig
+++ b/drivers/power/pmic/Kconfig
@@ -347,6 +347,12 @@ 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---
+	The TPS80031/TPS80032 are PMIC's containing several LDOs, SMPS.
+	This driver binds the pmic children.
+
 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..b5f9370860
--- /dev/null
+++ b/drivers/power/pmic/tps80031.c
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <errno.h>
+#include <dm.h>
+#include <i2c.h>
+#include <log.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/tps80031.h>
+#include <dm/device.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)
+{
+	if (dm_i2c_write(dev, reg, buff, len)) {
+		log_err("write error to device: %p register: %#x!\n", dev, reg);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int tps80031_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
+{
+	if (dm_i2c_read(dev, reg, buff, len)) {
+		log_err("read error from device: %p register: %#x!\n", dev, reg);
+		return -EIO;
+	}
+
+	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..f514db910b
--- /dev/null
+++ b/include/power/tps80031.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@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(3)
+
+#define	TPS80031_REGULATOR_STATUS_MASK	0x3
+#define	TPS80031_REGULATOR_MODE_ON	0x1
+
+#define TPS80031_SMPS_VOLT_MASK		0x3F
+#define TPS80031_SMPS_VOLT_MAX_HEX	0x39
+#define TPS80031_SMPS_VOLT_MAX		1400000
+#define TPS80031_SMPS_VOLT_BASE		600000
+#define TPS80031_SMPS_VOLT_BASE_OFFSET	700000
+
+#define TPS80031_LDO_VOLT_MASK		0x3F
+#define TPS80031_LDO_VOLT_MAX_HEX	0x18
+#define TPS80031_LDO_VOLT_MIN_HEX	0x01
+#define TPS80031_LDO_VOLT_MAX		3360000
+#define TPS80031_LDO_VOLT_MIN		1018000
+#define TPS80031_LDO_VOLT_BASE		916000
+
+/* register groups */
+enum {
+	CTRL,
+	VOLT,
+	OFFSET,
+};
+
+#endif /* _TPS80031_H_ */
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 4/6] power: regulator: tps80031: add regulator support
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
                     ` (2 preceding siblings ...)
  2023-07-14 16:16   ` [PATCH v1 3/6] power: pmic: add the base TPS80031 PMIC support Svyatoslav Ryhel
@ 2023-07-14 16:16   ` Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 5/6] power: pmic: tps65910: add TPS65911 PMIC support Svyatoslav Ryhel
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-14 16:16 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

The driver provides regulator set/get voltage enable/disable
functions for TI TPS80031/TPS80032 PMICs.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 drivers/power/regulator/Kconfig              |   8 +
 drivers/power/regulator/Makefile             |   1 +
 drivers/power/regulator/tps80031_regulator.c | 296 +++++++++++++++++++
 3 files changed, 305 insertions(+)
 create mode 100644 drivers/power/regulator/tps80031_regulator.c

diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig
index 571debd54e..f297e408cd 100644
--- a/drivers/power/regulator/Kconfig
+++ b/drivers/power/regulator/Kconfig
@@ -355,6 +355,14 @@ config DM_REGULATOR_TPS62360
 	implements the get/set api for value only, as the power line is
 	always on.
 
+config DM_REGULATOR_TPS80031
+	bool "Enable driver for TPS80031/TPS80032 PMIC regulators"
+	depends on DM_PMIC_TPS80031
+	---help---
+	This enables implementation of driver-model regulator uclass
+	features for TPS80031/TPS80032 PMICs. The driver implements
+	get/set api for: value and enable.
+
 config DM_REGULATOR_STPMIC1
 	bool "Enable driver for STPMIC1 regulators"
 	depends on DM_REGULATOR && PMIC_STPMIC1
diff --git a/drivers/power/regulator/Makefile b/drivers/power/regulator/Makefile
index 8d73169b50..3ef55dc534 100644
--- a/drivers/power/regulator/Makefile
+++ b/drivers/power/regulator/Makefile
@@ -33,6 +33,7 @@ obj-$(CONFIG_$(SPL_)DM_REGULATOR_LP87565) += lp87565_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_STM32_VREFBUF) += stm32-vrefbuf.o
 obj-$(CONFIG_DM_REGULATOR_TPS65910) += tps65910_regulator.o
 obj-$(CONFIG_DM_REGULATOR_TPS62360) += tps62360_regulator.o
+obj-$(CONFIG_$(SPL_)DM_REGULATOR_TPS80031) += tps80031_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_STPMIC1) += stpmic1.o
 obj-$(CONFIG_DM_REGULATOR_TPS65941) += tps65941_regulator.o
 obj-$(CONFIG_DM_REGULATOR_SCMI) += scmi_regulator.o
diff --git a/drivers/power/regulator/tps80031_regulator.c b/drivers/power/regulator/tps80031_regulator.c
new file mode 100644
index 0000000000..c970f5a92d
--- /dev/null
+++ b/drivers/power/regulator/tps80031_regulator.c
@@ -0,0 +1,296 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <errno.h>
+#include <dm.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/tps80031.h>
+
+static const char tps80031_smps_reg[][TPS80031_SMPS_NUM] = {
+	{   0x54,   0x5a,   0x66,   0x42,   0x48 },
+	{   0x56,   0x5c,   0x68,   0x44,   0x4a },
+	{ BIT(3), BIT(4), BIT(6), BIT(0), BIT(1) },
+};
+
+static const char tps80031_ldo_reg[][TPS80031_LDO_NUM] = {
+	{ 0x9e, 0x86, 0x8e, 0x8a, 0x9a, 0x92, 0xa6, 0x96, 0xa2 },
+	{ 0x9f, 0x87, 0x8f, 0x8b, 0x9b, 0x93, 0xa7, 0x97, 0xa3 },
+};
+
+static int tps80031_regulator_enable(struct udevice *dev, int op, bool *enable)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->ctrl_reg;
+	int ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		if (ret & TPS80031_REGULATOR_MODE_ON)
+			*enable = true;
+		else
+			*enable = false;
+
+		return 0;
+	} else if (op == PMIC_OP_SET) {
+		ret &= ~(TPS80031_REGULATOR_STATUS_MASK);
+
+		if (*enable)
+			ret |= TPS80031_REGULATOR_MODE_ON;
+
+		ret = pmic_reg_write(dev->parent, adr, ret);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int tps80031_get_enable(struct udevice *dev)
+{
+	bool enable = false;
+	int ret;
+
+	ret = tps80031_regulator_enable(dev, PMIC_OP_GET, &enable);
+	if (ret)
+		return ret;
+
+	return enable;
+}
+
+static int tps80031_set_enable(struct udevice *dev, bool enable)
+{
+	return tps80031_regulator_enable(dev, PMIC_OP_SET, &enable);
+}
+
+static int tps80031_ldo_volt2hex(int uV)
+{
+	if (uV > TPS80031_LDO_VOLT_MAX)
+		return -EINVAL;
+
+	if (uV < TPS80031_LDO_VOLT_MIN)
+		uV = TPS80031_LDO_VOLT_MIN;
+
+	return DIV_ROUND_UP(uV - TPS80031_LDO_VOLT_BASE, 102000);
+}
+
+static int tps80031_ldo_hex2volt(int hex)
+{
+	if (hex > TPS80031_LDO_VOLT_MAX_HEX)
+		return -EINVAL;
+
+	if (hex < TPS80031_LDO_VOLT_MIN_HEX)
+		hex = TPS80031_LDO_VOLT_MIN_HEX;
+
+	return TPS80031_LDO_VOLT_BASE + hex * 102000;
+}
+
+static int tps80031_ldo_val(struct udevice *dev, int op, int *uV)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->volt_reg;
+	int hex, ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		*uV = 0;
+
+		ret = tps80031_ldo_hex2volt(ret & TPS80031_LDO_VOLT_MASK);
+		if (ret < 0)
+			return ret;
+
+		*uV = ret;
+		return 0;
+	}
+
+	hex = tps80031_ldo_volt2hex(*uV);
+	if (hex < 0)
+		return hex;
+
+	ret &= ~TPS80031_LDO_VOLT_MASK;
+
+	return pmic_reg_write(dev->parent, adr, ret | hex);
+}
+
+static int tps80031_ldo_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+
+	uc_pdata->type = REGULATOR_TYPE_LDO;
+
+	if (dev->driver_data) {
+		u8 idx = dev->driver_data - 1;
+
+		uc_pdata->ctrl_reg = tps80031_ldo_reg[CTRL][idx];
+		uc_pdata->volt_reg = tps80031_ldo_reg[VOLT][idx];
+	} else {
+		/* check for ldoln and ldousb cases */
+		if (!strcmp("ldoln", dev->name)) {
+			uc_pdata->ctrl_reg = tps80031_ldo_reg[CTRL][7];
+			uc_pdata->volt_reg = tps80031_ldo_reg[VOLT][7];
+		} else if (!strcmp("ldousb", dev->name)) {
+			uc_pdata->ctrl_reg = tps80031_ldo_reg[CTRL][8];
+			uc_pdata->volt_reg = tps80031_ldo_reg[VOLT][8];
+		}
+	}
+
+	regulator_autoset(dev);
+
+	return 0;
+}
+
+static int ldo_get_value(struct udevice *dev)
+{
+	int uV;
+	int ret;
+
+	ret = tps80031_ldo_val(dev, PMIC_OP_GET, &uV);
+	if (ret)
+		return ret;
+
+	return uV;
+}
+
+static int ldo_set_value(struct udevice *dev, int uV)
+{
+	return tps80031_ldo_val(dev, PMIC_OP_SET, &uV);
+}
+
+static const struct dm_regulator_ops tps80031_ldo_ops = {
+	.get_value  = ldo_get_value,
+	.set_value  = ldo_set_value,
+	.get_enable = tps80031_get_enable,
+	.set_enable = tps80031_set_enable,
+};
+
+U_BOOT_DRIVER(tps80031_ldo) = {
+	.name = TPS80031_LDO_DRIVER,
+	.id = UCLASS_REGULATOR,
+	.ops = &tps80031_ldo_ops,
+	.probe = tps80031_ldo_probe,
+};
+
+static int tps80031_smps_volt2hex(u32 base, int uV)
+{
+	if (uV > TPS80031_LDO_VOLT_MAX)
+		return -EINVAL;
+
+	if (uV < base)
+		return 1;
+
+	return DIV_ROUND_UP(uV - base, 12500);
+}
+
+static int tps80031_smps_hex2volt(u32 base, int hex)
+{
+	if (hex > TPS80031_LDO_VOLT_MAX_HEX)
+		return -EINVAL;
+
+	if (!hex)
+		return 0;
+
+	return base + hex * 12500;
+}
+
+static int tps80031_smps_val(struct udevice *dev, int op, int *uV)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->volt_reg;
+	int base, hex, ret;
+
+	/* If offset flag was set then base voltage is higher */
+	if (uc_pdata->flags & TPS80031_OFFSET_FLAG)
+		base = TPS80031_SMPS_VOLT_BASE_OFFSET;
+	else
+		base = TPS80031_SMPS_VOLT_BASE;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		*uV = 0;
+
+		ret = tps80031_smps_hex2volt(base, ret & TPS80031_SMPS_VOLT_MASK);
+		if (ret < 0)
+			return ret;
+
+		*uV = ret;
+		return 0;
+	}
+
+	hex = tps80031_smps_volt2hex(base, *uV);
+	if (hex < 0)
+		return hex;
+
+	ret &= ~TPS80031_SMPS_VOLT_MASK;
+
+	return pmic_reg_write(dev->parent, adr, ret | hex);
+}
+
+static int tps80031_smps_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	int idx = dev->driver_data - 1;
+	int ret;
+
+	uc_pdata->type = REGULATOR_TYPE_BUCK;
+
+	uc_pdata->ctrl_reg = tps80031_smps_reg[CTRL][idx];
+	uc_pdata->volt_reg = tps80031_smps_reg[VOLT][idx];
+
+	/* Determine if smps regulator uses higher voltage */
+	ret = pmic_reg_read(dev->parent, TPS80031_SMPS_OFFSET);
+	if (ret & tps80031_smps_reg[OFFSET][idx])
+		uc_pdata->flags |= TPS80031_OFFSET_FLAG;
+
+	regulator_autoset(dev);
+
+	return 0;
+}
+
+static int smps_get_value(struct udevice *dev)
+{
+	int uV;
+	int ret;
+
+	ret = tps80031_smps_val(dev, PMIC_OP_GET, &uV);
+	if (ret)
+		return ret;
+
+	return uV;
+}
+
+static int smps_set_value(struct udevice *dev, int uV)
+{
+	return tps80031_smps_val(dev, PMIC_OP_SET, &uV);
+}
+
+static const struct dm_regulator_ops tps80031_smps_ops = {
+	.get_value  = smps_get_value,
+	.set_value  = smps_set_value,
+	.get_enable = tps80031_get_enable,
+	.set_enable = tps80031_set_enable,
+};
+
+U_BOOT_DRIVER(tps80031_smps) = {
+	.name = TPS80031_SMPS_DRIVER,
+	.id = UCLASS_REGULATOR,
+	.ops = &tps80031_smps_ops,
+	.probe = tps80031_smps_probe,
+};
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 5/6] power: pmic: tps65910: add TPS65911 PMIC support
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
                     ` (3 preceding siblings ...)
  2023-07-14 16:16   ` [PATCH v1 4/6] power: regulator: tps80031: add regulator support Svyatoslav Ryhel
@ 2023-07-14 16:16   ` Svyatoslav Ryhel
  2023-07-14 16:16   ` [PATCH v1 6/6] power: regulator: tps65911: add regulator support Svyatoslav Ryhel
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-14 16:16 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

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 <clamor95@gmail.com>
---
 doc/device-tree-bindings/pmic/tps65911.txt | 78 ++++++++++++++++++++++
 drivers/power/pmic/pmic_tps65910_dm.c      | 26 +++++++-
 include/power/tps65910_pmic.h              | 47 +++++++++++++
 3 files changed, 148 insertions(+), 3 deletions(-)
 create mode 100644 doc/device-tree-bindings/pmic/tps65911.txt

diff --git a/doc/device-tree-bindings/pmic/tps65911.txt b/doc/device-tree-bindings/pmic/tps65911.txt
new file mode 100644
index 0000000000..29270efbfe
--- /dev/null
+++ b/doc/device-tree-bindings/pmic/tps65911.txt
@@ -0,0 +1,78 @@
+Texas Instruments, TPS65911 PMIC
+
+This device uses two drivers:
+- drivers/power/pmic/tps65910.c (for parent device)
+- drivers/power/regulator/tps65911_regulator.c (for child regulators)
+
+This chapter describes the binding info for the PMIC driver and regulators.
+
+Required properties for PMIC:
+- compatible: "ti,tps65911"
+- reg: 0x2d
+
+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 tps65911:
+- vdd1, vdd2, vddctrl, vddio
+- ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7, ldo8
+
+vddio in datasheet is referred as vio, but for reduction of code and
+unification of smps regulators it is named vddio.
+
+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:
+
+tps65911@2d {
+	compatible = "ti,tps65911";
+	reg = <0x2d>;
+
+	regulators {
+		vdd1 {
+			regulator-name = "vdd_1v2_backlight";
+			regulator-min-microvolt = <1200000>;
+			regulator-max-microvolt = <1200000>;
+			regulator-always-on;
+			regulator-boot-on;
+		};
+
+		...
+
+		vddio {
+			regulator-name = "vdd_1v8_gen";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-always-on;
+			regulator-boot-on;
+		};
+
+		ldo1 {
+			regulator-name = "vdd_emmc_core";
+			regulator-min-microvolt = <3300000>;
+			regulator-max-microvolt = <3300000>;
+			regulator-always-on;
+			regulator-boot-on;
+		};
+
+		...
+
+		ldo8 {
+			regulator-name = "vdd_ddr_hs";
+			regulator-min-microvolt = <1000000>;
+			regulator-max-microvolt = <1000000>;
+		};
+	};
+};
diff --git a/drivers/power/pmic/pmic_tps65910_dm.c b/drivers/power/pmic/pmic_tps65910_dm.c
index e03ddc98d7..fb72344ee0 100644
--- a/drivers/power/pmic/pmic_tps65910_dm.c
+++ b/drivers/power/pmic/pmic_tps65910_dm.c
@@ -11,13 +11,19 @@
 #include <power/regulator.h>
 #include <power/tps65910_pmic.h>
 
-static const struct pmic_child_info pmic_children_info[] = {
+static const struct pmic_child_info tps65910_children_info[] = {
 	{ .prefix = "ldo_", .driver = TPS65910_LDO_DRIVER },
 	{ .prefix = "buck_", .driver = TPS65910_BUCK_DRIVER },
 	{ .prefix = "boost_", .driver = TPS65910_BOOST_DRIVER },
 	{ },
 };
 
+static const struct pmic_child_info tps65911_children_info[] = {
+	{ .prefix = "vdd", .driver = TPS65911_VDD_DRIVER },
+	{ .prefix = "ldo", .driver = TPS65911_LDO_DRIVER },
+	{ },
+};
+
 static int pmic_tps65910_reg_count(struct udevice *dev)
 {
 	return TPS65910_NUM_REGS;
@@ -51,6 +57,7 @@ static int pmic_tps65910_bind(struct udevice *dev)
 {
 	ofnode regulators_node;
 	int children;
+	int type = dev_get_driver_data(dev);
 
 	regulators_node = dev_read_subnode(dev, "regulators");
 	if (!ofnode_valid(regulators_node)) {
@@ -58,7 +65,19 @@ static int pmic_tps65910_bind(struct udevice *dev)
 		return -EINVAL;
 	}
 
-	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
+	switch (type) {
+	case TPS65910:
+		children = pmic_bind_children(dev, regulators_node,
+					      tps65910_children_info);
+		break;
+	case TPS65911:
+		children = pmic_bind_children(dev, regulators_node,
+					      tps65911_children_info);
+		break;
+	default:
+		log_err("unknown PMIC type\n");
+	}
+
 	if (!children)
 		debug("%s has no children (regulators)\n", dev->name);
 
@@ -82,7 +101,8 @@ static struct dm_pmic_ops pmic_tps65910_ops = {
 };
 
 static const struct udevice_id pmic_tps65910_match[] = {
-	{ .compatible = "ti,tps65910" },
+	{ .compatible = "ti,tps65910", .data = TPS65910 },
+	{ .compatible = "ti,tps65911", .data = TPS65911 },
 	{ /* sentinel */ }
 };
 
diff --git a/include/power/tps65910_pmic.h b/include/power/tps65910_pmic.h
index 66214786d3..10fe02b81a 100644
--- a/include/power/tps65910_pmic.h
+++ b/include/power/tps65910_pmic.h
@@ -6,6 +6,9 @@
 #ifndef __TPS65910_PMIC_H_
 #define __TPS65910_PMIC_H_
 
+#define TPS65910			1
+#define TPS65911			2
+
 #define TPS65910_I2C_SEL_MASK		(0x1 << 4)
 #define TPS65910_VDD_SR_MASK		(0x1 << 7)
 #define TPS65910_GAIN_SEL_MASK		(0x3 << 6)
@@ -126,4 +129,48 @@ struct tps65910_regulator_pdata {
 #define TPS65910_BOOST_DRIVER	"tps65910_boost"
 #define TPS65910_LDO_DRIVER	"tps65910_ldo"
 
+/* tps65911 i2c registers */
+enum {
+	TPS65911_REG_VIO			= 0x20,
+	TPS65911_REG_VDD1,
+	TPS65911_REG_VDD1_OP,
+	TPS65911_REG_VDD1_SR,
+	TPS65911_REG_VDD2,
+	TPS65911_REG_VDD2_OP,
+	TPS65911_REG_VDD2_SR,
+	TPS65911_REG_VDDCTRL,
+	TPS65911_REG_VDDCTRL_OP,
+	TPS65911_REG_VDDCTRL_SR,
+	TPS65911_REG_LDO1			= 0x30,
+	TPS65911_REG_LDO2,
+	TPS65911_REG_LDO5,
+	TPS65911_REG_LDO8,
+	TPS65911_REG_LDO7,
+	TPS65911_REG_LDO6,
+	TPS65911_REG_LDO4,
+	TPS65911_REG_LDO3,
+};
+
+#define TPS65911_VDD_NUM		4
+#define TPS65911_LDO_NUM		8
+
+#define TPS65911_VDD_VOLT_MAX		1500000
+#define TPS65911_VDD_VOLT_MIN		600000
+#define TPS65911_VDD_VOLT_BASE		562500
+
+#define TPS65911_LDO_VOLT_MAX		3300000
+#define TPS65911_LDO_VOLT_BASE		800000
+
+#define TPS65911_LDO_SEL_MASK		(0x3f << 2)
+
+#define TPS65911_LDO124_VOLT_MAX_HEX	0x32
+#define TPS65911_LDO358_VOLT_MAX_HEX	0x19
+#define TPS65911_LDO358_VOLT_MIN_HEX	0x02
+
+#define TPS65911_LDO124_VOLT_STEP	50000
+#define TPS65911_LDO358_VOLT_STEP	100000
+
+#define TPS65911_VDD_DRIVER		"tps65911_vdd"
+#define TPS65911_LDO_DRIVER		"tps65911_ldo"
+
 #endif /* __TPS65910_PMIC_H_ */
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 6/6] power: regulator: tps65911: add regulator support
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
                     ` (4 preceding siblings ...)
  2023-07-14 16:16   ` [PATCH v1 5/6] power: pmic: tps65910: add TPS65911 PMIC support Svyatoslav Ryhel
@ 2023-07-14 16:16   ` Svyatoslav Ryhel
  2023-07-15  8:09   ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
  2023-07-20  3:12   ` Jaehoon Chung
  7 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-14 16:16 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

The driver provides regulator set/get voltage enable/disable
functions for TI TPS5911 PMIC.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 drivers/power/regulator/Kconfig              |   8 +
 drivers/power/regulator/Makefile             |   1 +
 drivers/power/regulator/tps65911_regulator.c | 375 +++++++++++++++++++
 3 files changed, 384 insertions(+)
 create mode 100644 drivers/power/regulator/tps65911_regulator.c

diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig
index f297e408cd..3398f0fbee 100644
--- a/drivers/power/regulator/Kconfig
+++ b/drivers/power/regulator/Kconfig
@@ -345,6 +345,14 @@ config DM_REGULATOR_TPS65910
 	regulator types of the TPS65910 (BUCK, BOOST and LDO). It implements
 	the get/set api for value and enable.
 
+config DM_REGULATOR_TPS65911
+	bool "Enable driver for TPS65911 PMIC regulators"
+	depends on DM_PMIC_TPS65910
+	---help---
+	The TPS65911 PMIC provides 4 SMPSs and 8 LDOs. This driver supports all
+	regulator types of the TPS65911. It implements the get/set api for value
+	and enable.
+
 config DM_REGULATOR_TPS62360
 	bool "Enable driver for TPS6236x Power Regulator"
 	depends on DM_REGULATOR
diff --git a/drivers/power/regulator/Makefile b/drivers/power/regulator/Makefile
index 3ef55dc534..c2ab1b7721 100644
--- a/drivers/power/regulator/Makefile
+++ b/drivers/power/regulator/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_$(SPL_)DM_REGULATOR_LP873X) += lp873x_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_LP87565) += lp87565_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_STM32_VREFBUF) += stm32-vrefbuf.o
 obj-$(CONFIG_DM_REGULATOR_TPS65910) += tps65910_regulator.o
+obj-$(CONFIG_DM_REGULATOR_TPS65911) += tps65911_regulator.o
 obj-$(CONFIG_DM_REGULATOR_TPS62360) += tps62360_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_TPS80031) += tps80031_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_STPMIC1) += stpmic1.o
diff --git a/drivers/power/regulator/tps65911_regulator.c b/drivers/power/regulator/tps65911_regulator.c
new file mode 100644
index 0000000000..84ae52c888
--- /dev/null
+++ b/drivers/power/regulator/tps65911_regulator.c
@@ -0,0 +1,375 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <log.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/tps65910_pmic.h>
+
+/* fist row is control registers, second is voltage registers */
+static const char tps65911_vdd_reg[][TPS65911_VDD_NUM] = {
+	{ TPS65911_REG_VDD1, TPS65911_REG_VDD2,
+	  TPS65911_REG_VDDCTRL, TPS65911_REG_VIO },
+	{ TPS65911_REG_VDD1_OP, TPS65911_REG_VDD2_OP,
+	  TPS65911_REG_VDDCTRL_OP, 0x00 },
+};
+
+static const u32 tps65911_vio_range[] = {
+	1500000, 1800000, 2500000, 3300000
+};
+
+static const char tps65911_ldo_reg[TPS65911_LDO_NUM] = {
+	TPS65911_REG_LDO1, TPS65911_REG_LDO2, TPS65911_REG_LDO3,
+	TPS65911_REG_LDO4, TPS65911_REG_LDO5, TPS65911_REG_LDO6,
+	TPS65911_REG_LDO7, TPS65911_REG_LDO8
+};
+
+static int tps65911_regulator_enable(struct udevice *dev, int op, bool *enable)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->ctrl_reg;
+	int ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		if (ret & TPS65910_SUPPLY_STATE_ON)
+			*enable = true;
+		else
+			*enable = false;
+
+		return 0;
+	} else if (op == PMIC_OP_SET) {
+		ret &= ~(TPS65910_SUPPLY_STATE_MASK);
+
+		if (*enable)
+			ret |= TPS65910_SUPPLY_STATE_ON;
+
+		ret = pmic_reg_write(dev->parent, adr, ret);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int tps65911_get_enable(struct udevice *dev)
+{
+	bool enable = false;
+	int ret;
+
+	ret = tps65911_regulator_enable(dev, PMIC_OP_GET, &enable);
+	if (ret)
+		return ret;
+
+	return enable;
+}
+
+static int tps65911_set_enable(struct udevice *dev, bool enable)
+{
+	return tps65911_regulator_enable(dev, PMIC_OP_SET, &enable);
+}
+
+static int tps65911_vdd_volt2hex(int uV)
+{
+	if (uV > TPS65911_VDD_VOLT_MAX)
+		return -EINVAL;
+
+	if (uV < TPS65911_VDD_VOLT_MIN)
+		uV = TPS65911_VDD_VOLT_MIN;
+
+	return (uV - TPS65911_VDD_VOLT_BASE) / 12500;
+}
+
+static int tps65911_vdd_hex2volt(int hex)
+{
+	if (hex > TPS65910_VDD_SEL_MAX)
+		return -EINVAL;
+
+	if (hex < TPS65910_VDD_SEL_MIN)
+		hex = TPS65910_VDD_SEL_MIN;
+
+	return TPS65911_VDD_VOLT_BASE + hex * 12500;
+}
+
+static int tps65911_vio_val(struct udevice *dev, int op, int *uV)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->volt_reg;
+	int ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		*uV = 0;
+
+		ret |= TPS65910_SEL_MASK;
+
+		*uV = tps65911_vio_range[ret >> 2];
+
+		return 0;
+	}
+
+	/* vio has only 4 voltages available */
+	switch (*uV) {
+	case 1500000:
+		ret = 0x00;
+		break;
+	case 1800000:
+		ret = 0x01;
+		break;
+	case 2500000:
+		ret = 0x02;
+		break;
+	case 3300000:
+		ret = 0x03;
+		break;
+	default:
+		return -EINVAL;
+	};
+
+	return pmic_reg_write(dev->parent, adr, ret);
+}
+
+static int tps65911_vdd_val(struct udevice *dev, int op, int *uV)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->volt_reg;
+	int ret;
+
+	/* in case vdd is vio */
+	if (!adr)
+		return tps65911_vio_val(dev, op, uV);
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		*uV = 0;
+
+		ret = tps65911_vdd_hex2volt(ret);
+		if (ret < 0)
+			return ret;
+
+		*uV = ret;
+		return 0;
+	}
+
+	ret = tps65911_vdd_volt2hex(*uV);
+	if (ret < 0)
+		return ret;
+
+	return pmic_reg_write(dev->parent, adr, ret);
+}
+
+static int tps65911_vdd_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+
+	uc_pdata->type = REGULATOR_TYPE_BUCK;
+
+	if (dev->driver_data) {
+		u8 idx = dev->driver_data - 1;
+
+		uc_pdata->ctrl_reg = tps65911_vdd_reg[0][idx];
+		uc_pdata->volt_reg = tps65911_vdd_reg[1][idx];
+	} else {
+		/* check for vddctrl and vddio cases */
+		if (!strcmp("vddctrl", dev->name)) {
+			uc_pdata->ctrl_reg = tps65911_vdd_reg[0][2];
+			uc_pdata->volt_reg = tps65911_vdd_reg[1][2];
+		} else if (!strcmp("vddio", dev->name)) {
+			uc_pdata->ctrl_reg = tps65911_vdd_reg[0][3];
+			uc_pdata->volt_reg = tps65911_vdd_reg[1][3];
+		}
+	}
+
+	regulator_autoset(dev);
+
+	return 0;
+}
+
+static int vdd_get_value(struct udevice *dev)
+{
+	int uV;
+	int ret;
+
+	ret = tps65911_vdd_val(dev, PMIC_OP_GET, &uV);
+	if (ret)
+		return ret;
+
+	return uV;
+}
+
+static int vdd_set_value(struct udevice *dev, int uV)
+{
+	return tps65911_vdd_val(dev, PMIC_OP_SET, &uV);
+}
+
+static const struct dm_regulator_ops tps65911_vdd_ops = {
+	.get_value  = vdd_get_value,
+	.set_value  = vdd_set_value,
+	.get_enable = tps65911_get_enable,
+	.set_enable = tps65911_set_enable,
+};
+
+U_BOOT_DRIVER(tps65911_vdd) = {
+	.name = TPS65911_VDD_DRIVER,
+	.id = UCLASS_REGULATOR,
+	.ops = &tps65911_vdd_ops,
+	.probe = tps65911_vdd_probe,
+};
+
+static int tps65911_ldo_volt2hex(int id, int uV)
+{
+	int step;
+
+	if (uV > TPS65911_LDO_VOLT_MAX)
+		return -EINVAL;
+
+	if (uV < TPS65911_LDO_VOLT_BASE)
+		uV = TPS65911_LDO_VOLT_BASE;
+
+	switch (id) {
+	case 1:
+	case 2:
+	case 4:
+		step = TPS65911_LDO124_VOLT_STEP;
+		break;
+	case 3:
+	case 5:
+	case 6:
+	case 7:
+	case 8:
+		step = TPS65911_LDO358_VOLT_STEP;
+		break;
+	default:
+		return -EINVAL;
+	};
+
+	return ((uV - TPS65911_LDO_VOLT_BASE) / step) << 2;
+}
+
+static int tps65911_ldo_hex2volt(int id, int hex)
+{
+	int step;
+
+	switch (id) {
+	case 1:
+	case 2:
+	case 4:
+		if (hex > TPS65911_LDO124_VOLT_MAX_HEX)
+			return -EINVAL;
+
+		step = TPS65911_LDO124_VOLT_STEP;
+		break;
+	case 3:
+	case 5:
+	case 6:
+	case 7:
+	case 8:
+		if (hex > TPS65911_LDO358_VOLT_MAX_HEX)
+			return -EINVAL;
+
+		if (hex < TPS65911_LDO358_VOLT_MIN_HEX)
+			hex = TPS65911_LDO358_VOLT_MIN_HEX;
+
+		step = TPS65911_LDO358_VOLT_STEP;
+		break;
+	default:
+		return -EINVAL;
+	};
+
+	return TPS65911_LDO_VOLT_BASE + hex * step;
+}
+
+static int tps65911_ldo_val(struct udevice *dev, int op, int *uV)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u32 adr = uc_pdata->ctrl_reg;
+	int id = dev->driver_data;
+	int hex, ret;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		*uV = 0;
+		ret &= TPS65911_LDO_SEL_MASK;
+
+		ret = tps65911_ldo_hex2volt(id, ret >> 2);
+		if (ret < 0)
+			return ret;
+
+		*uV = ret;
+		return 0;
+	}
+
+	hex = tps65911_ldo_volt2hex(id, *uV);
+	if (hex < 0)
+		return hex;
+
+	ret &= ~(TPS65911_LDO_SEL_MASK);
+
+	return pmic_reg_write(dev->parent, adr, ret | hex);
+}
+
+static int tps65911_ldo_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_plat *uc_pdata =
+					dev_get_uclass_plat(dev);
+	u8 idx = dev->driver_data - 1;
+
+	uc_pdata->type = REGULATOR_TYPE_LDO;
+	uc_pdata->ctrl_reg = tps65911_ldo_reg[idx];
+
+	regulator_autoset(dev);
+
+	return 0;
+}
+
+static int ldo_get_value(struct udevice *dev)
+{
+	int uV;
+	int ret;
+
+	ret = tps65911_ldo_val(dev, PMIC_OP_GET, &uV);
+	if (ret)
+		return ret;
+
+	return uV;
+}
+
+static int ldo_set_value(struct udevice *dev, int uV)
+{
+	return tps65911_ldo_val(dev, PMIC_OP_SET, &uV);
+}
+
+static const struct dm_regulator_ops tps65911_ldo_ops = {
+	.get_value  = ldo_get_value,
+	.set_value  = ldo_set_value,
+	.get_enable = tps65911_get_enable,
+	.set_enable = tps65911_set_enable,
+};
+
+U_BOOT_DRIVER(tps65911_ldo) = {
+	.name = TPS65911_LDO_DRIVER,
+	.id = UCLASS_REGULATOR,
+	.ops = &tps65911_ldo_ops,
+	.probe = tps65911_ldo_probe,
+};
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
                     ` (5 preceding siblings ...)
  2023-07-14 16:16   ` [PATCH v1 6/6] power: regulator: tps65911: add regulator support Svyatoslav Ryhel
@ 2023-07-15  8:09   ` Svyatoslav Ryhel
  2023-07-20  3:12   ` Jaehoon Chung
  7 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-15  8:09 UTC (permalink / raw)
  To: Jaehoon Chung, Simon Glass, Svyatoslav Ryhel; +Cc: u-boot

Greetings!

I have one more improvement for these drivers which is implementation
of do_poweroff ability directly into them. I have tested it already and it is
a trivial task. What is non trivial is that pmic can be not responsible for
poweroff if the device uses 2 or more pmics.

Solution I am looking into is use of 'system-power-controller' device tree
property to indicate PMIC used for poweroff function. Issue I have encountered
is how to properly convert dts prop into #ifdef to be able to hide or expose
do_poweroff at will, and if this is allowed at all in u-boot.

Best regards,
Svyatoslav R.

пт, 14 лип. 2023 р. о 19:16 Svyatoslav Ryhel <clamor95@gmail.com> пише:
>
> Patch set adds basic support for PMICs used in many Tegra 3 devices.
> All PMIC drivers are based on datasheets provided by vendors.
> Implemented API include regulator set/get voltage enable/disable and
> basic PMIC r/w capabilities.
>
> Drivers were tested by me on LG P895 (max77663), HTC One X (TPS80032)
> and ASUS TF300T (tps65911). Calculations and behavior were correct,
> predictable and reproducible.
>
> Svyatoslav Ryhel (6):
>   power: pmic: add the base max77663 pmic support
>   power: regulator: max77663: add regulator support
>   power: pmic: add the base TPS80031 PMIC support
>   power: regulator: tps80031: add regulator support
>   power: pmic: tps65910: add TPS65911 PMIC support
>   power: regulator: tps65911: add regulator support
>
>  doc/device-tree-bindings/pmic/max77663.txt   |  84 +++++
>  doc/device-tree-bindings/pmic/tps65911.txt   |  78 ++++
>  doc/device-tree-bindings/pmic/tps80031.txt   |  76 ++++
>  drivers/power/pmic/Kconfig                   |  12 +
>  drivers/power/pmic/Makefile                  |   2 +
>  drivers/power/pmic/max77663.c                |  81 ++++
>  drivers/power/pmic/pmic_tps65910_dm.c        |  26 +-
>  drivers/power/pmic/tps80031.c                |  82 ++++
>  drivers/power/regulator/Kconfig              |  24 ++
>  drivers/power/regulator/Makefile             |   3 +
>  drivers/power/regulator/max77663_regulator.c | 362 ++++++++++++++++++
>  drivers/power/regulator/tps65911_regulator.c | 375 +++++++++++++++++++
>  drivers/power/regulator/tps80031_regulator.c | 296 +++++++++++++++
>  include/power/max77663.h                     |  40 ++
>  include/power/tps65910_pmic.h                |  47 +++
>  include/power/tps80031.h                     |  42 +++
>  16 files changed, 1627 insertions(+), 3 deletions(-)
>  create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
>  create mode 100644 doc/device-tree-bindings/pmic/tps65911.txt
>  create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
>  create mode 100644 drivers/power/pmic/max77663.c
>  create mode 100644 drivers/power/pmic/tps80031.c
>  create mode 100644 drivers/power/regulator/max77663_regulator.c
>  create mode 100644 drivers/power/regulator/tps65911_regulator.c
>  create mode 100644 drivers/power/regulator/tps80031_regulator.c
>  create mode 100644 include/power/max77663.h
>  create mode 100644 include/power/tps80031.h
>
> --
> 2.39.2
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
  2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
                     ` (6 preceding siblings ...)
  2023-07-15  8:09   ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
@ 2023-07-20  3:12   ` Jaehoon Chung
  2023-07-20  3:26     ` Svyatoslav Ryhel
  7 siblings, 1 reply; 12+ messages in thread
From: Jaehoon Chung @ 2023-07-20  3:12 UTC (permalink / raw)
  To: 'Svyatoslav Ryhel', 'Simon Glass'; +Cc: u-boot

Hi

> -----Original Message-----
> From: Svyatoslav Ryhel <clamor95@gmail.com>
> Sent: Saturday, July 15, 2023 1:16 AM
> To: Jaehoon Chung <jh80.chung@samsung.com>; Simon Glass <sjg@chromium.org>; Svyatoslav Ryhel
> <clamor95@gmail.com>
> Cc: u-boot@lists.denx.de
> Subject: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
> 
> Patch set adds basic support for PMICs used in many Tegra 3 devices.
> All PMIC drivers are based on datasheets provided by vendors.
> Implemented API include regulator set/get voltage enable/disable and
> basic PMIC r/w capabilities.
> 
> Drivers were tested by me on LG P895 (max77663), HTC One X (TPS80032)
> and ASUS TF300T (tps65911). Calculations and behavior were correct,
> predictable and reproducible.

I didn't find where those drivers is using. Do you have any plan to update the enabling CONFIG?
I hope the enabling CONFIG will be included. Otherwise, I can't check whether its building is fine or not.
If I missed some patches, let me know, plz

Until enabled CONFIG, these drivers can be dead codes.

Best Regards,
Jaehoon Chung

> 
> Svyatoslav Ryhel (6):
>   power: pmic: add the base max77663 pmic support
>   power: regulator: max77663: add regulator support
>   power: pmic: add the base TPS80031 PMIC support
>   power: regulator: tps80031: add regulator support
>   power: pmic: tps65910: add TPS65911 PMIC support
>   power: regulator: tps65911: add regulator support
> 
>  doc/device-tree-bindings/pmic/max77663.txt   |  84 +++++
>  doc/device-tree-bindings/pmic/tps65911.txt   |  78 ++++
>  doc/device-tree-bindings/pmic/tps80031.txt   |  76 ++++
>  drivers/power/pmic/Kconfig                   |  12 +
>  drivers/power/pmic/Makefile                  |   2 +
>  drivers/power/pmic/max77663.c                |  81 ++++
>  drivers/power/pmic/pmic_tps65910_dm.c        |  26 +-
>  drivers/power/pmic/tps80031.c                |  82 ++++
>  drivers/power/regulator/Kconfig              |  24 ++
>  drivers/power/regulator/Makefile             |   3 +
>  drivers/power/regulator/max77663_regulator.c | 362 ++++++++++++++++++
>  drivers/power/regulator/tps65911_regulator.c | 375 +++++++++++++++++++
>  drivers/power/regulator/tps80031_regulator.c | 296 +++++++++++++++
>  include/power/max77663.h                     |  40 ++
>  include/power/tps65910_pmic.h                |  47 +++
>  include/power/tps80031.h                     |  42 +++
>  16 files changed, 1627 insertions(+), 3 deletions(-)
>  create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
>  create mode 100644 doc/device-tree-bindings/pmic/tps65911.txt
>  create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
>  create mode 100644 drivers/power/pmic/max77663.c
>  create mode 100644 drivers/power/pmic/tps80031.c
>  create mode 100644 drivers/power/regulator/max77663_regulator.c
>  create mode 100644 drivers/power/regulator/tps65911_regulator.c
>  create mode 100644 drivers/power/regulator/tps80031_regulator.c
>  create mode 100644 include/power/max77663.h
>  create mode 100644 include/power/tps80031.h
> 
> --
> 2.39.2



^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
  2023-07-20  3:12   ` Jaehoon Chung
@ 2023-07-20  3:26     ` Svyatoslav Ryhel
  2023-07-20  6:17       ` Jaehoon Chung
  0 siblings, 1 reply; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-20  3:26 UTC (permalink / raw)
  To: Jaehoon Chung, 'Simon Glass'; +Cc: u-boot



20 липня 2023 р. 06:12:23 GMT+03:00, Jaehoon Chung <jh80.chung@samsung.com> написав(-ла):
>Hi
>
>> -----Original Message-----
>> From: Svyatoslav Ryhel <clamor95@gmail.com>
>> Sent: Saturday, July 15, 2023 1:16 AM
>> To: Jaehoon Chung <jh80.chung@samsung.com>; Simon Glass <sjg@chromium.org>; Svyatoslav Ryhel
>> <clamor95@gmail.com>
>> Cc: u-boot@lists.denx.de
>> Subject: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
>> 
>> Patch set adds basic support for PMICs used in many Tegra 3 devices.
>> All PMIC drivers are based on datasheets provided by vendors.
>> Implemented API include regulator set/get voltage enable/disable and
>> basic PMIC r/w capabilities.
>> 
>> Drivers were tested by me on LG P895 (max77663), HTC One X (TPS80032)
>> and ASUS TF300T (tps65911). Calculations and behavior were correct,
>> predictable and reproducible.
>
>I didn't find where those drivers is using. Do you have any plan to update the enabling CONFIG?
>I hope the enabling CONFIG will be included. Otherwise, I can't check whether its building is fine or not.
>If I missed some patches, let me know, plz
>
>Until enabled CONFIG, these drivers can be dead codes.

Enabling configs is planned as next step of this https://patchwork.ozlabs.org/project/uboot/list/?series=361808 patchset (initial bringup of devices). Unfortunately tegra custodians are too "busy" to initiate merge of those devices.

>Best Regards,
>Jaehoon Chung
>
>> 
>> Svyatoslav Ryhel (6):
>>   power: pmic: add the base max77663 pmic support
>>   power: regulator: max77663: add regulator support
>>   power: pmic: add the base TPS80031 PMIC support
>>   power: regulator: tps80031: add regulator support
>>   power: pmic: tps65910: add TPS65911 PMIC support
>>   power: regulator: tps65911: add regulator support
>> 
>>  doc/device-tree-bindings/pmic/max77663.txt   |  84 +++++
>>  doc/device-tree-bindings/pmic/tps65911.txt   |  78 ++++
>>  doc/device-tree-bindings/pmic/tps80031.txt   |  76 ++++
>>  drivers/power/pmic/Kconfig                   |  12 +
>>  drivers/power/pmic/Makefile                  |   2 +
>>  drivers/power/pmic/max77663.c                |  81 ++++
>>  drivers/power/pmic/pmic_tps65910_dm.c        |  26 +-
>>  drivers/power/pmic/tps80031.c                |  82 ++++
>>  drivers/power/regulator/Kconfig              |  24 ++
>>  drivers/power/regulator/Makefile             |   3 +
>>  drivers/power/regulator/max77663_regulator.c | 362 ++++++++++++++++++
>>  drivers/power/regulator/tps65911_regulator.c | 375 +++++++++++++++++++
>>  drivers/power/regulator/tps80031_regulator.c | 296 +++++++++++++++
>>  include/power/max77663.h                     |  40 ++
>>  include/power/tps65910_pmic.h                |  47 +++
>>  include/power/tps80031.h                     |  42 +++
>>  16 files changed, 1627 insertions(+), 3 deletions(-)
>>  create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
>>  create mode 100644 doc/device-tree-bindings/pmic/tps65911.txt
>>  create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
>>  create mode 100644 drivers/power/pmic/max77663.c
>>  create mode 100644 drivers/power/pmic/tps80031.c
>>  create mode 100644 drivers/power/regulator/max77663_regulator.c
>>  create mode 100644 drivers/power/regulator/tps65911_regulator.c
>>  create mode 100644 drivers/power/regulator/tps80031_regulator.c
>>  create mode 100644 include/power/max77663.h
>>  create mode 100644 include/power/tps80031.h
>> 
>> --
>> 2.39.2
>
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
  2023-07-20  3:26     ` Svyatoslav Ryhel
@ 2023-07-20  6:17       ` Jaehoon Chung
  2023-07-20  8:15         ` Svyatoslav Ryhel
  0 siblings, 1 reply; 12+ messages in thread
From: Jaehoon Chung @ 2023-07-20  6:17 UTC (permalink / raw)
  To: 'Svyatoslav Ryhel', 'Simon Glass'; +Cc: u-boot



> -----Original Message-----
> From: Svyatoslav Ryhel <clamor95@gmail.com>
> Sent: Thursday, July 20, 2023 12:26 PM
> To: Jaehoon Chung <jh80.chung@samsung.com>; 'Simon Glass' <sjg@chromium.org>
> Cc: u-boot@lists.denx.de
> Subject: RE: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
> 
> 
> 
> 20 липня 2023 р. 06:12:23 GMT+03:00, Jaehoon Chung <jh80.chung@samsung.com> написав(-ла):
> >Hi
> >
> >> -----Original Message-----
> >> From: Svyatoslav Ryhel <clamor95@gmail.com>
> >> Sent: Saturday, July 15, 2023 1:16 AM
> >> To: Jaehoon Chung <jh80.chung@samsung.com>; Simon Glass <sjg@chromium.org>; Svyatoslav Ryhel
> >> <clamor95@gmail.com>
> >> Cc: u-boot@lists.denx.de
> >> Subject: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
> >>
> >> Patch set adds basic support for PMICs used in many Tegra 3 devices.
> >> All PMIC drivers are based on datasheets provided by vendors.
> >> Implemented API include regulator set/get voltage enable/disable and
> >> basic PMIC r/w capabilities.
> >>
> >> Drivers were tested by me on LG P895 (max77663), HTC One X (TPS80032)
> >> and ASUS TF300T (tps65911). Calculations and behavior were correct,
> >> predictable and reproducible.
> >
> >I didn't find where those drivers is using. Do you have any plan to update the enabling CONFIG?
> >I hope the enabling CONFIG will be included. Otherwise, I can't check whether its building is fine or
> not.
> >If I missed some patches, let me know, plz
> >
> >Until enabled CONFIG, these drivers can be dead codes.
> 
> Enabling configs is planned as next step of this https://protect2.fireeye.com/v1/url?k=a8a63aa5-
> c92d2f85-a8a7b1ea-74fe485fb347-c1cc2b9c6f97e343&q=1&e=c08f18ed-4f66-46bb-b871-
> 17167bc5b502&u=https%3A%2F%2Fpatchwork.ozlabs.org%2Fproject%2Fuboot%2Flist%2F%3Fseries%3D361808
> patchset (initial bringup of devices). Unfortunately tegra custodians are too "busy" to initiate merge
> of those devices.

Thanks for sharing information. :)

Best Regards,
Jaehoon Chung

> 
> >Best Regards,
> >Jaehoon Chung
> >
> >>
> >> Svyatoslav Ryhel (6):
> >>   power: pmic: add the base max77663 pmic support
> >>   power: regulator: max77663: add regulator support
> >>   power: pmic: add the base TPS80031 PMIC support
> >>   power: regulator: tps80031: add regulator support
> >>   power: pmic: tps65910: add TPS65911 PMIC support
> >>   power: regulator: tps65911: add regulator support
> >>
> >>  doc/device-tree-bindings/pmic/max77663.txt   |  84 +++++
> >>  doc/device-tree-bindings/pmic/tps65911.txt   |  78 ++++
> >>  doc/device-tree-bindings/pmic/tps80031.txt   |  76 ++++
> >>  drivers/power/pmic/Kconfig                   |  12 +
> >>  drivers/power/pmic/Makefile                  |   2 +
> >>  drivers/power/pmic/max77663.c                |  81 ++++
> >>  drivers/power/pmic/pmic_tps65910_dm.c        |  26 +-
> >>  drivers/power/pmic/tps80031.c                |  82 ++++
> >>  drivers/power/regulator/Kconfig              |  24 ++
> >>  drivers/power/regulator/Makefile             |   3 +
> >>  drivers/power/regulator/max77663_regulator.c | 362 ++++++++++++++++++
> >>  drivers/power/regulator/tps65911_regulator.c | 375 +++++++++++++++++++
> >>  drivers/power/regulator/tps80031_regulator.c | 296 +++++++++++++++
> >>  include/power/max77663.h                     |  40 ++
> >>  include/power/tps65910_pmic.h                |  47 +++
> >>  include/power/tps80031.h                     |  42 +++
> >>  16 files changed, 1627 insertions(+), 3 deletions(-)
> >>  create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
> >>  create mode 100644 doc/device-tree-bindings/pmic/tps65911.txt
> >>  create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
> >>  create mode 100644 drivers/power/pmic/max77663.c
> >>  create mode 100644 drivers/power/pmic/tps80031.c
> >>  create mode 100644 drivers/power/regulator/max77663_regulator.c
> >>  create mode 100644 drivers/power/regulator/tps65911_regulator.c
> >>  create mode 100644 drivers/power/regulator/tps80031_regulator.c
> >>  create mode 100644 include/power/max77663.h
> >>  create mode 100644 include/power/tps80031.h
> >>
> >> --
> >> 2.39.2
> >
> >



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
  2023-07-20  6:17       ` Jaehoon Chung
@ 2023-07-20  8:15         ` Svyatoslav Ryhel
  0 siblings, 0 replies; 12+ messages in thread
From: Svyatoslav Ryhel @ 2023-07-20  8:15 UTC (permalink / raw)
  To: Jaehoon Chung; +Cc: Simon Glass, u-boot

чт, 20 лип. 2023 р. о 09:17 Jaehoon Chung <jh80.chung@samsung.com> пише:
>
>
>
> > -----Original Message-----
> > From: Svyatoslav Ryhel <clamor95@gmail.com>
> > Sent: Thursday, July 20, 2023 12:26 PM
> > To: Jaehoon Chung <jh80.chung@samsung.com>; 'Simon Glass' <sjg@chromium.org>
> > Cc: u-boot@lists.denx.de
> > Subject: RE: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
> >
> >
> >
> > 20 липня 2023 р. 06:12:23 GMT+03:00, Jaehoon Chung <jh80.chung@samsung.com> написав(-ла):
> > >Hi
> > >
> > >> -----Original Message-----
> > >> From: Svyatoslav Ryhel <clamor95@gmail.com>
> > >> Sent: Saturday, July 15, 2023 1:16 AM
> > >> To: Jaehoon Chung <jh80.chung@samsung.com>; Simon Glass <sjg@chromium.org>; Svyatoslav Ryhel
> > >> <clamor95@gmail.com>
> > >> Cc: u-boot@lists.denx.de
> > >> Subject: [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices
> > >>
> > >> Patch set adds basic support for PMICs used in many Tegra 3 devices.
> > >> All PMIC drivers are based on datasheets provided by vendors.
> > >> Implemented API include regulator set/get voltage enable/disable and
> > >> basic PMIC r/w capabilities.
> > >>
> > >> Drivers were tested by me on LG P895 (max77663), HTC One X (TPS80032)
> > >> and ASUS TF300T (tps65911). Calculations and behavior were correct,
> > >> predictable and reproducible.
> > >
> > >I didn't find where those drivers is using. Do you have any plan to update the enabling CONFIG?
> > >I hope the enabling CONFIG will be included. Otherwise, I can't check whether its building is fine or
> > not.
> > >If I missed some patches, let me know, plz
> > >
> > >Until enabled CONFIG, these drivers can be dead codes.
> >
> > Enabling configs is planned as next step of this https://protect2.fireeye.com/v1/url?k=a8a63aa5-
> > c92d2f85-a8a7b1ea-74fe485fb347-c1cc2b9c6f97e343&q=1&e=c08f18ed-4f66-46bb-b871-
> > 17167bc5b502&u=https%3A%2F%2Fpatchwork.ozlabs.org%2Fproject%2Fuboot%2Flist%2F%3Fseries%3D361808
> > patchset (initial bringup of devices). Unfortunately tegra custodians are too "busy" to initiate merge
> > of those devices.
>
> Thanks for sharing information. :)

Ye, you're welcome I guess :) These mailing lists kill me. Search in
patchwork for series
called  "Tegra: add ASUS/Google Nexus 7 (2012) support"  it contains
devices I have
mentioned.

> Best Regards,
> Jaehoon Chung
>
> >
> > >Best Regards,
> > >Jaehoon Chung
> > >
> > >>
> > >> Svyatoslav Ryhel (6):
> > >>   power: pmic: add the base max77663 pmic support
> > >>   power: regulator: max77663: add regulator support
> > >>   power: pmic: add the base TPS80031 PMIC support
> > >>   power: regulator: tps80031: add regulator support
> > >>   power: pmic: tps65910: add TPS65911 PMIC support
> > >>   power: regulator: tps65911: add regulator support
> > >>
> > >>  doc/device-tree-bindings/pmic/max77663.txt   |  84 +++++
> > >>  doc/device-tree-bindings/pmic/tps65911.txt   |  78 ++++
> > >>  doc/device-tree-bindings/pmic/tps80031.txt   |  76 ++++
> > >>  drivers/power/pmic/Kconfig                   |  12 +
> > >>  drivers/power/pmic/Makefile                  |   2 +
> > >>  drivers/power/pmic/max77663.c                |  81 ++++
> > >>  drivers/power/pmic/pmic_tps65910_dm.c        |  26 +-
> > >>  drivers/power/pmic/tps80031.c                |  82 ++++
> > >>  drivers/power/regulator/Kconfig              |  24 ++
> > >>  drivers/power/regulator/Makefile             |   3 +
> > >>  drivers/power/regulator/max77663_regulator.c | 362 ++++++++++++++++++
> > >>  drivers/power/regulator/tps65911_regulator.c | 375 +++++++++++++++++++
> > >>  drivers/power/regulator/tps80031_regulator.c | 296 +++++++++++++++
> > >>  include/power/max77663.h                     |  40 ++
> > >>  include/power/tps65910_pmic.h                |  47 +++
> > >>  include/power/tps80031.h                     |  42 +++
> > >>  16 files changed, 1627 insertions(+), 3 deletions(-)
> > >>  create mode 100644 doc/device-tree-bindings/pmic/max77663.txt
> > >>  create mode 100644 doc/device-tree-bindings/pmic/tps65911.txt
> > >>  create mode 100644 doc/device-tree-bindings/pmic/tps80031.txt
> > >>  create mode 100644 drivers/power/pmic/max77663.c
> > >>  create mode 100644 drivers/power/pmic/tps80031.c
> > >>  create mode 100644 drivers/power/regulator/max77663_regulator.c
> > >>  create mode 100644 drivers/power/regulator/tps65911_regulator.c
> > >>  create mode 100644 drivers/power/regulator/tps80031_regulator.c
> > >>  create mode 100644 include/power/max77663.h
> > >>  create mode 100644 include/power/tps80031.h
> > >>
> > >> --
> > >> 2.39.2
> > >
> > >
>
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-07-20  8:15 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20230714161647epcas1p13e0dd3a4dfb49400ea50a40e347e2118@epcas1p1.samsung.com>
2023-07-14 16:16 ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
2023-07-14 16:16   ` [PATCH v1 1/6] power: pmic: add the base max77663 pmic support Svyatoslav Ryhel
2023-07-14 16:16   ` [PATCH v1 2/6] power: regulator: max77663: add regulator support Svyatoslav Ryhel
2023-07-14 16:16   ` [PATCH v1 3/6] power: pmic: add the base TPS80031 PMIC support Svyatoslav Ryhel
2023-07-14 16:16   ` [PATCH v1 4/6] power: regulator: tps80031: add regulator support Svyatoslav Ryhel
2023-07-14 16:16   ` [PATCH v1 5/6] power: pmic: tps65910: add TPS65911 PMIC support Svyatoslav Ryhel
2023-07-14 16:16   ` [PATCH v1 6/6] power: regulator: tps65911: add regulator support Svyatoslav Ryhel
2023-07-15  8:09   ` [PATCH v1 0/6] Add support for PMICs used on Tegra 3 devices Svyatoslav Ryhel
2023-07-20  3:12   ` Jaehoon Chung
2023-07-20  3:26     ` Svyatoslav Ryhel
2023-07-20  6:17       ` Jaehoon Chung
2023-07-20  8:15         ` Svyatoslav Ryhel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.