2022-06-13 09:22:34

by jerome Neanne

[permalink] [raw]
Subject: [RFC PATCH 0/5] Add TI TPS65219 PMIC support for AM642 SK board.

1-Regulators: full implementation
Visual check: cat /sys/kernel/debug/regulator/regulator_summary
Validation: userspace-consumer and virtual-regulator required
to test further

enable/disable:
cat /sys/devices/platform/userspace-consumer-VDDSHV_SD_IO_PMIC/state
echo disabled > /sys/devices/platform/userspace-consumer-VDDSHV_SD_IO_PMIC/state
echo enabled > /sys/devices/platform/userspace-consumer-VDDSHV_SD_IO_PMIC/state

change voltage:
cat /sys/devices/platform/regulator-virtual-ldo1/min_microvolts
echo 1000000 > /sys/devices/platform/regulator-virtual-ldo1/min_microvolts
echo 3000000 > /sys/devices/platform/regulator-virtual-ldo1/max_microvolts

Voltage changes monitored on LDO1 output on TP84 for k3-am642-sk board

2-Low power Mode (STBY)
A regulator set_mode with a standby mode is implemented (not tested)

3-Reset WARM/COLD
implemented not tested

4-SD Card VSEL_SD
Implemented, appears in summary as: tps65219-LDO1-SEL-SD GPIO control
not tested

5-Interrupt Pin (nINT)
Not implemented

6-SW Shutdown
Implemented not tested
Note: enters in competition with other source during probe

7-PB Startup and Shutdown
Can be derived from 65217/8 implementation but postponed,
interrupt support required first.

Jerome NEANNE (5):
regulator: dt-bindings: Add TI TPS65219 PMIC bindings
mfd: drivers: Add TI TPS65219 PMIC support
regulator: drivers: Add TI TPS65219 PMIC regulators support
arm64: Kconfig: Introduce CONFIG_MFD_TPS65219 and
CONFIG_REGULATOR_TPS65219
arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board.

.../bindings/regulator/ti,tps65219.yaml | 146 ++++++++
arch/arm64/boot/dts/ti/k3-am642-sk.dts | 102 ++++++
arch/arm64/configs/defconfig | 2 +
drivers/mfd/Kconfig | 15 +
drivers/mfd/Makefile | 1 +
drivers/mfd/tps65219.c | 296 ++++++++++++++++
drivers/regulator/Kconfig | 9 +
drivers/regulator/Makefile | 1 +
drivers/regulator/tps65219-regulator.c | 334 ++++++++++++++++++
include/linux/mfd/tps65219.h | 245 +++++++++++++
10 files changed, 1151 insertions(+)
create mode 100644 Documentation/devicetree/bindings/regulator/ti,tps65219.yaml
create mode 100644 drivers/mfd/tps65219.c
create mode 100644 drivers/regulator/tps65219-regulator.c
create mode 100644 include/linux/mfd/tps65219.h

--
2.17.1


2022-06-13 09:24:21

by jerome Neanne

[permalink] [raw]
Subject: [RFC PATCH 5/5] arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board.

Add support fot the TI Power Management IC TPS65219
on the AM642 SKEVM board

Signed-off-by: Jerome NEANNE <[email protected]>
---
arch/arm64/boot/dts/ti/k3-am642-sk.dts | 102 +++++++++++++++++++++++++
1 file changed, 102 insertions(+)

diff --git a/arch/arm64/boot/dts/ti/k3-am642-sk.dts b/arch/arm64/boot/dts/ti/k3-am642-sk.dts
index 8424cd071955..7886bb109160 100644
--- a/arch/arm64/boot/dts/ti/k3-am642-sk.dts
+++ b/arch/arm64/boot/dts/ti/k3-am642-sk.dts
@@ -69,6 +69,20 @@
vin-supply = <&vcc_3v3_sys>;
gpio = <&exp1 3 GPIO_ACTIVE_HIGH>;
};
+
+ vsel_sd_nddr: gpio-regulator {
+ compatible = "regulator-gpio";
+ pinctrl-names = "default";
+ pinctrl-0 = <&vsel_sd_nddr_pins_default>;
+ regulator-name = "tps65219-LDO1-SEL-SD";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ vin-supply = <&ldo1_reg>;
+ gpios = <&main_gpio0 45 GPIO_ACTIVE_HIGH>;
+ states = <1800000 0x0>,
+ <3300000 0x1>;
+ };
};

&main_pmx0 {
@@ -85,6 +99,13 @@
>;
};

+ main_i2c0_pins_default: main-i2c0-pins-default {
+ pinctrl-single,pins = <
+ AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
+ AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
+ >;
+ };
+
main_i2c1_pins_default: main-i2c1-pins-default {
pinctrl-single,pins = <
AM64X_IOPAD(0x0268, PIN_INPUT_PULLUP, 0) /* (C18) I2C1_SCL */
@@ -148,6 +169,12 @@
AM64X_IOPAD(0x0008, PIN_INPUT, 0) /* (N19) OSPI0_DQS */
>;
};
+
+ vsel_sd_nddr_pins_default: vsel-sd-nddr-pins-default {
+ pinctrl-single,pins = <
+ AM64X_IOPAD(0x00b4, PIN_OUTPUT, 0) /* (45x4=0xb4) WKUP_GPIO0_45 */
+ >;
+ };
};

&mcu_uart0 {
@@ -191,6 +218,81 @@
status = "disabled";
};

+&main_i2c0 {
+ pinctrl-nammain-i2c0-pins-defaultes = "default";
+ pinctrl-0 = <&main_i2c0_pins_default>;
+ clock-frequency = <400000>;
+ status = "okay";
+
+ tps65219: pmic@30 {
+ compatible = "ti,tps65219";
+ reg = <0x30>;
+ buck1-supply = <&vcc_3v3_sys>;
+ buck2-supply = <&vcc_3v3_sys>;
+ buck3-supply = <&vcc_3v3_sys>;
+ ldo1-supply = <&vcc_3v3_sys>;
+ ldo2-supply = <&buck2_reg>;
+ ldo3-supply = <&vcc_3v3_sys>;
+ ldo4-supply = <&vcc_3v3_sys>;
+
+ regulators {
+ buck1_reg: buck1 {
+ regulator-name = "VDD_CORE";
+ regulator-min-microvolt = <750000>;
+ regulator-max-microvolt = <1000000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ buck2_reg: buck2 {
+ regulator-name = "VCC1V8";
+ regulator-min-microvolt = <1700000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ buck3_reg: buck3 {
+ regulator-name = "VDD_LPDDR4";
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo1_reg: ldo1 {
+ regulator-name = "VDDSHV_SD_IO_PMIC";
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-allow-bypass;
+ };
+
+ ldo2_reg: ldo2 {
+ regulator-name = "VDDAR_CORE";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <850000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo3_reg: ldo3 {
+ regulator-name = "VDDA_1V8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo4_reg: ldo4 {
+ regulator-name = "VDD_PHY_2V5";
+ regulator-min-microvolt = <2500000>;
+ regulator-max-microvolt = <2500000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+ };
+ };
+};
&main_i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&main_i2c1_pins_default>;
--
2.17.1

2022-06-13 09:25:50

by jerome Neanne

[permalink] [raw]
Subject: [RFC PATCH 3/5] regulator: drivers: Add TI TPS65219 PMIC regulators support

The regulators set consists of 3 bucks DCDCs and 4 LDOs. The output
voltages are configurable and are meant to supply power to the
main processor and other components.

Validation:
Visual check: cat /sys/kernel/debug/regulator/regulator_summary
Validation: userspace-consumer and virtual-regulator required
to test further

Enable/Disable:
cat /sys/devices/platform/userspace-consumer-VDDSHV_SD_IO_PMIC/state
echo disabled > /sys/devices/platform/
userspace-consumer-VDDSHV_SD_IO_PMIC/state
echo enabled > /sys/devices/platform/
userspace-consumer-VDDSHV_SD_IO_PMIC/state

Change voltage:
cat /sys/devices/platform/regulator-virtual-ldo1/min_microvolts
echo 1000000 > /sys/devices/platform/regulator-virtual-ldo1/
min_microvolts
echo 3000000 > /sys/devices/platform/regulator-virtual-ldo1/
max_microvolts

Signed-off-by: Jerome NEANNE <[email protected]>
---
drivers/regulator/Kconfig | 9 +
drivers/regulator/Makefile | 1 +
drivers/regulator/tps65219-regulator.c | 334 +++++++++++++++++++++++++
3 files changed, 344 insertions(+)
create mode 100644 drivers/regulator/tps65219-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 24ce9a17ab4f..1a17b925264c 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -1291,6 +1291,15 @@ config REGULATOR_TPS65218
voltage regulators. It supports software based voltage control
for different voltage domains

+config REGULATOR_TPS65219
+ tristate "TI TPS65219 Power regulators"
+ depends on MFD_TPS65219 && OF
+ help
+ This driver supports TPS65219 voltage regulator chips.
+ TPS65219 series of PMICs have 3 single phase BUCKs & 4 LDOs
+ voltage regulators. It supports software based voltage control
+ for different voltage domains
+
config REGULATOR_TPS6524X
tristate "TI TPS6524X Power regulators"
depends on SPI
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 8c2f82206b94..790839810e8e 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -152,6 +152,7 @@ obj-$(CONFIG_REGULATOR_TPS65086) += tps65086-regulator.o
obj-$(CONFIG_REGULATOR_TPS65090) += tps65090-regulator.o
obj-$(CONFIG_REGULATOR_TPS65217) += tps65217-regulator.o
obj-$(CONFIG_REGULATOR_TPS65218) += tps65218-regulator.o
+obj-$(CONFIG_REGULATOR_TPS65219) += tps65219-regulator.o
obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o
obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
diff --git a/drivers/regulator/tps65219-regulator.c b/drivers/regulator/tps65219-regulator.c
new file mode 100644
index 000000000000..0e176e15daa6
--- /dev/null
+++ b/drivers/regulator/tps65219-regulator.c
@@ -0,0 +1,334 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * tps65219-regulator.c
+ *
+ * Regulator driver for TPS65219 PMIC
+ *
+ * Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/
+ */
+
+/* This implementation derived from tps65218 authored by "J Keerthy <[email protected]>" */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+#include <linux/regulator/of_regulator.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+#include <linux/mfd/tps65219.h>
+
+#define TPS65219_REGULATOR(_name, _of, _id, _type, _ops, _n, _vr, _vm, _er, \
+ _em, _cr, _cm, _lr, _nlr, _delay, _fuv, \
+ _ct, _ncl, _bpm) \
+ { \
+ .name = _name, \
+ .of_match = _of, \
+ .regulators_node = of_match_ptr("regulators"), \
+ .supply_name = _of, \
+ .id = _id, \
+ .ops = &_ops, \
+ .n_voltages = _n, \
+ .type = _type, \
+ .owner = THIS_MODULE, \
+ .vsel_reg = _vr, \
+ .vsel_mask = _vm, \
+ .csel_reg = _cr, \
+ .csel_mask = _cm, \
+ .curr_table = _ct, \
+ .n_current_limits = _ncl, \
+ .enable_reg = _er, \
+ .enable_mask = _em, \
+ .volt_table = NULL, \
+ .linear_ranges = _lr, \
+ .n_linear_ranges = _nlr, \
+ .ramp_delay = _delay, \
+ .fixed_uV = _fuv, \
+ .bypass_reg = _vr, \
+ .bypass_mask = _bpm, \
+ .bypass_val_on = 1, \
+ } \
+
+static const struct linear_range bucks_ranges[] = {
+ REGULATOR_LINEAR_RANGE(600000, 0x0, 0x1f, 25000),
+ REGULATOR_LINEAR_RANGE(1400000, 0x20, 0x33, 100000),
+ REGULATOR_LINEAR_RANGE(3400000, 0x34, 0x3f, 0),
+};
+
+static const struct linear_range ldos_1_2_ranges[] = {
+ REGULATOR_LINEAR_RANGE(600000, 0x0, 0x37, 50000),
+ REGULATOR_LINEAR_RANGE(3400000, 0x38, 0x3f, 0),
+};
+
+static const struct linear_range ldos_3_4_ranges[] = {
+ REGULATOR_LINEAR_RANGE(1200000, 0x0, 0xC, 0),
+ REGULATOR_LINEAR_RANGE(1250000, 0xD, 0x35, 50000),
+ REGULATOR_LINEAR_RANGE(3300000, 0x36, 0x3F, 0),
+};
+
+static int tps65219_pmic_set_voltage_sel(struct regulator_dev *dev,
+ unsigned int selector)
+{
+ int ret;
+ struct tps65219 *tps = rdev_get_drvdata(dev);
+
+ /* Set the voltage based on vsel value */
+ ret = tps65219_set_bits(tps, dev->desc->vsel_reg, dev->desc->vsel_mask,
+ selector);
+ dev_dbg(tps->dev, "%s failed for regulator %s: %d ", __func__, dev->desc->name, ret);
+ return ret;
+}
+
+static int tps65219_pmic_enable(struct regulator_dev *dev)
+{
+ struct tps65219 *tps = rdev_get_drvdata(dev);
+ int rid = rdev_get_id(dev);
+ int ret;
+
+
+
+ if (rid < TPS65219_BUCK_1 || rid > TPS65219_LDO_4)
+ return -EINVAL;
+
+ ret = tps65219_set_bits(tps, dev->desc->enable_reg,
+ dev->desc->enable_mask, dev->desc->enable_mask);
+ return ret;
+}
+
+static int tps65219_pmic_disable(struct regulator_dev *dev)
+{
+ struct tps65219 *tps = rdev_get_drvdata(dev);
+ int rid = rdev_get_id(dev);
+
+
+ if (rid < TPS65219_BUCK_1 || rid > TPS65219_LDO_4)
+ return -EINVAL;
+
+
+ return tps65219_clear_bits(tps, dev->desc->enable_reg,
+ dev->desc->enable_mask);
+}
+
+static int tps65219_set_mode(struct regulator_dev *dev, unsigned int mode)
+{
+ struct tps65219 *tps = rdev_get_drvdata(dev);
+ unsigned int rid = rdev_get_id(dev);
+
+ if (rid < TPS65219_BUCK_1 || rid > TPS65219_LDO_4)
+ return -EINVAL;
+
+ switch (mode) {
+ case REGULATOR_MODE_NORMAL:
+ return tps65219_set_bits(tps, TPS65219_REG_STBY_1_CONFIG, dev->desc->enable_mask,
+ dev->desc->enable_mask);
+
+ case REGULATOR_MODE_STANDBY:
+ return tps65219_clear_bits(tps, TPS65219_REG_STBY_1_CONFIG, dev->desc->enable_mask);
+ }
+
+ return -EINVAL;
+}
+static unsigned int tps65219_get_mode(struct regulator_dev *dev)
+{
+ struct tps65219 *tps = rdev_get_drvdata(dev);
+ unsigned int rid = rdev_get_id(dev);
+ int ret, value = 0;
+
+ if (rid < TPS65219_BUCK_1 || rid > TPS65219_LDO_4)
+ return -EINVAL;
+
+ ret = tps65219_reg_read(tps, TPS65219_REG_STBY_1_CONFIG, &value);
+ value = (value & BIT(rid)) >> rid;
+ if (!(value & BUCKS_LDOS_STBY_ON_BIT))
+ ret = REGULATOR_MODE_STANDBY;
+ else
+ ret = REGULATOR_MODE_NORMAL;
+ return ret;
+}
+
+/* generic regulator_set_bypass_regmap does not match requirements use custom instead */
+static int tps65219_set_bypass(struct regulator_dev *dev, bool enable)
+{
+ struct tps65219 *tps = rdev_get_drvdata(dev);
+ unsigned int rid = rdev_get_id(dev);
+ int ret = 0;
+
+ if (rid < TPS65219_BUCK_1 || rid > TPS65219_LDO_4)
+ return -EINVAL;
+
+ if (rid < TPS65219_LDO_1 || rid > TPS65219_LDO_2) {
+ dev_err(tps->dev, "%s bypass allowed for LDO1/2 only ", __func__);
+ return -EPERM;
+ }
+
+ if (dev->desc->ops->is_enabled) {
+ dev_err(tps->dev, "%s LDO%d is enabled, should be shut down to set bypass ",
+ __func__, rid);
+ return -EBUSY;
+ }
+
+ if (enable) {
+ dev_dbg(tps->dev, "%s, LDO%d already in bypass mode", __func__, rid);
+ return ret;
+ }
+
+ ret = tps65219_set_bits(tps, dev->desc->vsel_reg, TPS65219_LDOS_BYP_CONFIG_MASK,
+ TPS65219_LDOS_BYP_CONFIG_MASK);
+ dev_dbg(tps->dev, "%s LDO%d switched to bypass mode", __func__, rid);
+ return ret;
+}
+
+/* Operations permitted on BUCK1/2/3 */
+static const struct regulator_ops tps65219_bucks_ops = {
+ .is_enabled = regulator_is_enabled_regmap,
+ .enable = tps65219_pmic_enable,
+ .disable = tps65219_pmic_disable,
+ .set_mode = tps65219_set_mode,
+ .get_mode = tps65219_get_mode,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
+ .set_voltage_sel = tps65219_pmic_set_voltage_sel,
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .set_voltage_time_sel = regulator_set_voltage_time_sel,
+
+};
+
+/* Operations permitted on LDO1/2 */
+static const struct regulator_ops tps65219_ldos_1_2_ops = {
+ .is_enabled = regulator_is_enabled_regmap,
+ .enable = tps65219_pmic_enable,
+ .disable = tps65219_pmic_disable,
+ .set_mode = tps65219_set_mode,
+ .get_mode = tps65219_get_mode,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
+ .set_voltage_sel = tps65219_pmic_set_voltage_sel,
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+ .set_bypass = tps65219_set_bypass,
+ .get_bypass = regulator_get_bypass_regmap,
+};
+
+/* Operations permitted on LDO3/4 */
+static const struct regulator_ops tps65219_ldos_3_4_ops = {
+ .is_enabled = regulator_is_enabled_regmap,
+ .enable = tps65219_pmic_enable,
+ .disable = tps65219_pmic_disable,
+ .set_mode = tps65219_set_mode,
+ .get_mode = tps65219_get_mode,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
+ .set_voltage_sel = tps65219_pmic_set_voltage_sel,
+ .list_voltage = regulator_list_voltage_linear_range,
+ .map_voltage = regulator_map_voltage_linear_range,
+};
+
+static const struct regulator_desc regulators[] = {
+ TPS65219_REGULATOR("BUCK1", "buck1", TPS65219_BUCK_1,
+ REGULATOR_VOLTAGE, tps65219_bucks_ops, 64,
+ TPS65219_REG_BUCK1_VOUT,
+ TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, TPS65219_REG_ENABLE_CTRL,
+ TPS65219_ENABLE_BUCK1_EN, 0, 0, bucks_ranges,
+ 3, 4000, 0, NULL, 0, 0),
+ TPS65219_REGULATOR("BUCK2", "buck2", TPS65219_BUCK_2,
+ REGULATOR_VOLTAGE, tps65219_bucks_ops, 64,
+ TPS65219_REG_BUCK2_VOUT,
+ TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, TPS65219_REG_ENABLE_CTRL,
+ TPS65219_ENABLE_BUCK2_EN, 0, 0, bucks_ranges,
+ 3, 4000, 0, NULL, 0, 0),
+ TPS65219_REGULATOR("BUCK3", "buck3", TPS65219_BUCK_3,
+ REGULATOR_VOLTAGE, tps65219_bucks_ops, 64,
+ TPS65219_REG_BUCK3_VOUT,
+ TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, TPS65219_REG_ENABLE_CTRL,
+ TPS65219_ENABLE_BUCK3_EN, 0, 0, bucks_ranges, 3,
+ 0, 0, NULL, 0, 0),
+ TPS65219_REGULATOR("LDO1", "ldo1", TPS65219_LDO_1,
+ REGULATOR_VOLTAGE, tps65219_ldos_1_2_ops, 64,
+ TPS65219_REG_LDO1_VOUT,
+ TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, TPS65219_REG_ENABLE_CTRL,
+ TPS65219_ENABLE_LDO1_EN, 0, 0, ldos_1_2_ranges,
+ 2, 0, 0, NULL, 0, TPS65219_LDOS_BYP_CONFIG_MASK),
+ TPS65219_REGULATOR("LDO2", "ldo2", TPS65219_LDO_2,
+ REGULATOR_VOLTAGE, tps65219_ldos_1_2_ops, 64,
+ TPS65219_REG_LDO2_VOUT,
+ TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, TPS65219_REG_ENABLE_CTRL,
+ TPS65219_ENABLE_LDO2_EN, 0, 0, ldos_1_2_ranges,
+ 2, 0, 0, NULL, 0, TPS65219_LDOS_BYP_CONFIG_MASK),
+ TPS65219_REGULATOR("LDO3", "ldo3", TPS65219_LDO_3,
+ REGULATOR_VOLTAGE, tps65219_ldos_3_4_ops, 64,
+ TPS65219_REG_LDO3_VOUT,
+ TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, TPS65219_REG_ENABLE_CTRL,
+ TPS65219_ENABLE_LDO3_EN, 0, 0, ldos_3_4_ranges,
+ 3, 0, 0, NULL, 0, 0),
+ TPS65219_REGULATOR("LDO4", "ldo4", TPS65219_LDO_4,
+ REGULATOR_VOLTAGE, tps65219_ldos_3_4_ops, 64,
+ TPS65219_REG_LDO4_VOUT,
+ TPS65219_BUCKS_LDOS_VOUT_VSET_MASK, TPS65219_REG_ENABLE_CTRL,
+ TPS65219_ENABLE_LDO4_EN, 0, 0, ldos_3_4_ranges,
+ 3, 0, 0, NULL, 0, 0),
+};
+
+static int tps65219_regulator_probe(struct platform_device *pdev)
+{
+ struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
+ struct regulator_dev *rdev;
+ struct regulator_config config = { };
+ int i, ret;
+ unsigned int val;
+
+
+ config.dev = tps->dev;
+ config.driver_data = tps;
+ config.regmap = tps->regmap;
+
+ /* Allocate memory for strobes */
+ tps->strobes = devm_kcalloc(&pdev->dev,
+ TPS65219_NUM_REGULATOR, sizeof(u8),
+ GFP_KERNEL);
+ if (!tps->strobes)
+ return -ENOMEM;
+
+ for (i = 0; i < ARRAY_SIZE(regulators); i++) {
+ pr_debug("tps65219 regul i= %d START", i);
+ rdev = devm_regulator_register(&pdev->dev, &regulators[i],
+ &config);
+ if (IS_ERR(rdev)) {
+ dev_err(tps->dev, "failed to register %s regulator\n",
+ pdev->name);
+ return PTR_ERR(rdev);
+ }
+
+ ret = regmap_read(tps->regmap, regulators[i].bypass_reg, &val);
+ if (ret) {
+ dev_err(tps->dev, "dev_err failed to map register for %s regulator\n",
+ pdev->name);
+ return ret;
+ }
+ pr_debug("tps65219 regul i= %d COMPLETED", i);
+ }
+
+ return 0;
+}
+
+static const struct platform_device_id tps65219_regulator_id_table[] = {
+ { "tps65219-regulator", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(platform, tps65219_regulator_id_table);
+
+static struct platform_driver tps65219_regulator_driver = {
+ .driver = {
+ .name = "tps65219-pmic",
+ },
+ .probe = tps65219_regulator_probe,
+ .id_table = tps65219_regulator_id_table,
+};
+
+module_platform_driver(tps65219_regulator_driver);
+
+MODULE_AUTHOR("J Neanne <[email protected]>");
+MODULE_DESCRIPTION("TPS65219 voltage regulator driver");
+MODULE_ALIAS("platform:tps65219-pmic");
+MODULE_LICENSE("GPL v2");
--
2.17.1

2022-06-13 09:42:30

by jerome Neanne

[permalink] [raw]
Subject: [RFC PATCH 4/5] arm64: Kconfig: Introduce CONFIG_MFD_TPS65219 and CONFIG_REGULATOR_TPS65219

This adds a Kconfig option to support TPS65219 PMIC, MFD and Regulators

Signed-off-by: Jerome NEANNE <[email protected]>
---
arch/arm64/configs/defconfig | 2 ++
1 file changed, 2 insertions(+)

diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index 08c6f769df9a..8d9b359a6663 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -609,6 +609,7 @@ CONFIG_MFD_SPMI_PMIC=y
CONFIG_MFD_RK808=y
CONFIG_MFD_SEC_CORE=y
CONFIG_MFD_SL28CPLD=y
+CONFIG_MFD_TPS65219=m
CONFIG_MFD_ROHM_BD718XX=y
CONFIG_MFD_WCD934X=m
CONFIG_REGULATOR_FIXED_VOLTAGE=y
@@ -634,6 +635,7 @@ CONFIG_REGULATOR_QCOM_SPMI=y
CONFIG_REGULATOR_RK808=y
CONFIG_REGULATOR_S2MPS11=y
CONFIG_REGULATOR_TPS65132=m
+CONFIG_REGULATOR_TPS65219=m
CONFIG_REGULATOR_VCTRL=m
CONFIG_RC_CORE=m
CONFIG_RC_DECODERS=y
--
2.17.1

2022-06-13 09:45:17

by jerome Neanne

[permalink] [raw]
Subject: [RFC PATCH 1/5] regulator: dt-bindings: Add TI TPS65219 PMIC bindings

Add TPS65219 PMIC bindings using json-schema.

Describe required properties and regname-supply.
regname-supply is required when bypass mode is used for a regulator.
Describes regulator topology.

Signed-off-by: Jerome NEANNE <[email protected]>
---
.../bindings/regulator/ti,tps65219.yaml | 146 ++++++++++++++++++
1 file changed, 146 insertions(+)
create mode 100644 Documentation/devicetree/bindings/regulator/ti,tps65219.yaml

diff --git a/Documentation/devicetree/bindings/regulator/ti,tps65219.yaml b/Documentation/devicetree/bindings/regulator/ti,tps65219.yaml
new file mode 100644
index 000000000000..a4717ff4e95b
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/ti,tps65219.yaml
@@ -0,0 +1,146 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/ti,tps65219.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: TI tps65219 Power Management Integrated Circuit regulators
+
+maintainers:
+ - Jerome Neanne <[email protected]>
+
+description: |
+ Regulator nodes should be named to buck<number> and ldo<number>.
+
+properties:
+ compatible:
+ enum:
+ - ti,tps65219
+
+ reg:
+ maxItems: 1
+
+patternProperties:
+ "^buck[1-3]-supply$":
+ description: Input supply phandle of one regulator.
+
+ "^ldo[1-4]-supply$":
+ description: Input supply phandle of one regulator.
+
+ regulators:
+ type: object
+ description: |
+ list of regulators provided by this controller
+
+ patternProperties:
+ "^ldo[1-4]$":
+ type: object
+ $ref: regulator.yaml#
+ description:
+ Properties for single LDO regulator.
+
+ properties:
+ regulator-name:
+ pattern: "^VDD[A-Z0-9_]+$"
+ description:
+ should be "VDDNAME_LDO1", ..., "VDDNAMELDO4"
+
+ unevaluatedProperties: false
+
+ "^buck[1-3]$":
+ type: object
+ $ref: regulator.yaml#
+ description:
+ Properties for single BUCK regulator.
+
+ properties:
+ regulator-name:
+ pattern: "^VDD|VCC[A-Z0-9_]+$"
+ description:
+ should be like "VDD_BUCK1NAME", ..., "VCCBUCK_3NAME"
+
+ unevaluatedProperties: false
+
+ additionalProperties: false
+
+required:
+ - compatible
+ - reg
+ - regulators
+
+additionalProperties: false
+
+examples:
+ - |
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ tps65219: pmic@30 {
+ compatible = "ti,tps65219";
+ reg = <0x30>;
+ buck1-supply = <&vcc_3v3_sys>;
+ buck2-supply = <&vcc_3v3_sys>;
+ buck3-supply = <&vcc_3v3_sys>;
+ ldo1-supply = <&vcc_3v3_sys>;
+ ldo2-supply = <&buck2_reg>;
+ ldo3-supply = <&vcc_3v3_sys>;
+ ldo4-supply = <&vcc_3v3_sys>;
+
+ regulators {
+ buck1_reg: buck1 {
+ regulator-name = "VDD_CORE";
+ regulator-min-microvolt = <750000>;
+ regulator-max-microvolt = <750000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ buck2_reg: buck2 {
+ regulator-name = "VCC1V8";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ buck3_reg: buck3 {
+ regulator-name = "VDD_LPDDR4";
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo1_reg: ldo1 {
+ regulator-name = "VDDSHV_SD_IO_PMIC";
+ regulator-min-microvolt = <33000000>;
+ regulator-max-microvolt = <33000000>;
+ };
+
+ ldo2_reg: ldo2 {
+ regulator-name = "VDDAR_CORE";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <850000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo3_reg: ldo3 {
+ regulator-name = "VDDA_1V8";
+ regulator-min-microvolt = <18000000>;
+ regulator-max-microvolt = <18000000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ ldo4_reg: ldo4 {
+ regulator-name = "VDD_PHY_2V5";
+ regulator-min-microvolt = <25000000>;
+ regulator-max-microvolt = <25000000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+ };
+ };
+ };
--
2.17.1

2022-06-13 17:47:02

by Mark Brown

[permalink] [raw]
Subject: Re: [RFC PATCH 5/5] arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board.

On Mon, Jun 13, 2022 at 11:06:04AM +0200, Jerome NEANNE wrote:

> + buck2_reg: buck2 {
> + regulator-name = "VCC1V8";
> + regulator-min-microvolt = <1700000>;
> + regulator-max-microvolt = <1800000>;
> + regulator-boot-on;
> + regulator-always-on;
> + };

The supply labelled 1V8 can vary between 1.7V and 1.8V? That at least
deserves a comment.

You should only set boot-on for supplies where it is not possible to
read the current state.


Attachments:
(No filename) (475.00 B)
signature.asc (499.00 B)
Download all attachments

2022-06-13 17:55:32

by Mark Brown

[permalink] [raw]
Subject: Re: [RFC PATCH 3/5] regulator: drivers: Add TI TPS65219 PMIC regulators support

On Mon, Jun 13, 2022 at 11:06:02AM +0200, Jerome NEANNE wrote:

> +static int tps65219_pmic_enable(struct regulator_dev *dev)
> +{
> + struct tps65219 *tps = rdev_get_drvdata(dev);
> + int rid = rdev_get_id(dev);
> + int ret;
> +
> +
> +

Lots of random blank space here.

> + if (rid < TPS65219_BUCK_1 || rid > TPS65219_LDO_4)
> + return -EINVAL;
> +

If a regulator doesn't support an operation it shouldn't be providing
it, no need to check here.

> + ret = tps65219_set_bits(tps, dev->desc->enable_reg,
> + dev->desc->enable_mask, dev->desc->enable_mask);

If you provide the regmap to the child devices then this can use the
standard regmap helpers for most of the operations, meaning most of
the operations in the driver can be removed.

> +/* generic regulator_set_bypass_regmap does not match requirements use custom instead */

In what way? Please also try to keep within 80 columns normally.

> + if (dev->desc->ops->is_enabled) {
> + dev_err(tps->dev, "%s LDO%d is enabled, should be shut down to set bypass ",
> + __func__, rid);
> + return -EBUSY;
> + }

This is testing if there is an enable operation, not if the regulator is
enabled.

> + if (enable) {
> + dev_dbg(tps->dev, "%s, LDO%d already in bypass mode", __func__, rid);
> + return ret;
> + }

This is not a problem, just silently succeed.

> + /* Allocate memory for strobes */
> + tps->strobes = devm_kcalloc(&pdev->dev,
> + TPS65219_NUM_REGULATOR, sizeof(u8),
> + GFP_KERNEL);
> + if (!tps->strobes)
> + return -ENOMEM;

These are never referenced anywhere else in the driver, no need to
allocate them.

> + ret = regmap_read(tps->regmap, regulators[i].bypass_reg, &val);
> + if (ret) {
> + dev_err(tps->dev, "dev_err failed to map register for %s regulator\n",
> + pdev->name);
> + return ret;
> + }

I'm not clear what this check is intended to do, it at least needs to be
better documented.


Attachments:
(No filename) (1.93 kB)
signature.asc (499.00 B)
Download all attachments

2022-06-16 18:05:01

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [RFC PATCH 1/5] regulator: dt-bindings: Add TI TPS65219 PMIC bindings

On Mon, Jun 13, 2022 at 11:06:00AM +0200, Jerome NEANNE wrote:
> Add TPS65219 PMIC bindings using json-schema.
>
> Describe required properties and regname-supply.
> regname-supply is required when bypass mode is used for a regulator.
> Describes regulator topology.
>
> Signed-off-by: Jerome NEANNE <[email protected]>
> ---
> .../bindings/regulator/ti,tps65219.yaml | 146 ++++++++++++++++++
> 1 file changed, 146 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/regulator/ti,tps65219.yaml
>
> diff --git a/Documentation/devicetree/bindings/regulator/ti,tps65219.yaml b/Documentation/devicetree/bindings/regulator/ti,tps65219.yaml
> new file mode 100644
> index 000000000000..a4717ff4e95b
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/regulator/ti,tps65219.yaml
> @@ -0,0 +1,146 @@
> +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/regulator/ti,tps65219.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: TI tps65219 Power Management Integrated Circuit regulators
> +
> +maintainers:
> + - Jerome Neanne <[email protected]>
> +
> +description: |
> + Regulator nodes should be named to buck<number> and ldo<number>.
> +
> +properties:
> + compatible:
> + enum:
> + - ti,tps65219
> +
> + reg:
> + maxItems: 1
> +
> +patternProperties:
> + "^buck[1-3]-supply$":
> + description: Input supply phandle of one regulator.
> +
> + "^ldo[1-4]-supply$":
> + description: Input supply phandle of one regulator.
> +
> + regulators:
> + type: object
> + description: |
> + list of regulators provided by this controller
> +
> + patternProperties:
> + "^ldo[1-4]$":
> + type: object
> + $ref: regulator.yaml#
> + description:
> + Properties for single LDO regulator.
> +
> + properties:
> + regulator-name:
> + pattern: "^VDD[A-Z0-9_]+$"
> + description:
> + should be "VDDNAME_LDO1", ..., "VDDNAMELDO4"
> +
> + unevaluatedProperties: false

For the indented cases of this it's more readable when 'properties' gets
long to put these next to 'type' or '$ref'.

Either way,

Reviewed-by: Rob Herring <[email protected]>