All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 0/5] Add TI TPS65219 PMIC support for AM642 SK board.
@ 2022-06-13  9:05 ` Jerome NEANNE
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:05 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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


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

* [RFC PATCH 0/5] Add TI TPS65219 PMIC support for AM642 SK board.
@ 2022-06-13  9:05 ` Jerome NEANNE
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:05 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [RFC PATCH 1/5] regulator: dt-bindings: Add TI TPS65219 PMIC bindings
  2022-06-13  9:05 ` Jerome NEANNE
@ 2022-06-13  9:06   ` Jerome NEANNE
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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 <jneanne@baylibre.com>
---
 .../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 <jerome.neanne@baylibre.com>
+
+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


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

* [RFC PATCH 1/5] regulator: dt-bindings: Add TI TPS65219 PMIC bindings
@ 2022-06-13  9:06   ` Jerome NEANNE
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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 <jneanne@baylibre.com>
---
 .../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 <jerome.neanne@baylibre.com>
+
+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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [RFC PATCH 2/5] mfd: drivers: Add TI TPS65219 PMIC support
  2022-06-13  9:05 ` Jerome NEANNE
@ 2022-06-13  9:06   ` Jerome NEANNE
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

The TPS65219 is a power management IC PMIC designed
to supply a wide range of SoCs
in both portable and stationary applications.
Any SoC can control TPS65219 over a standard I2C interface.

It contains the following components:
- Regulators.
- Over Temperature warning and Shut down.
- GPIOs
- Multi Function Pins (MFP)

This patch adds support for tps65219 mfd device. At this time only
the functionalities listed below are made available:

- Regulators probe and functionalities
- warm and cold reset support
- SW shutdown support

Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>
---
 drivers/mfd/Kconfig          |  15 ++
 drivers/mfd/Makefile         |   1 +
 drivers/mfd/tps65219.c       | 296 +++++++++++++++++++++++++++++++++++
 include/linux/mfd/tps65219.h | 245 +++++++++++++++++++++++++++++
 4 files changed, 557 insertions(+)
 create mode 100644 drivers/mfd/tps65219.c
 create mode 100644 include/linux/mfd/tps65219.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 6a3fd2d75f96..f8639b7b034b 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1555,6 +1555,21 @@ config MFD_TPS65218
 	  This driver can also be built as a module.  If so, the module
 	  will be called tps65218.
 
+config MFD_TPS65219
+	tristate "TI TPS65219 Power Management chips"
+	depends on I2C && OF
+	select MFD_CORE
+	select REGMAP_I2C
+	select REGMAP_IRQ
+	help
+	  If you say yes here you get support for the TPS65219 series of
+	  Power Management chips.
+	  These include voltage regulators, gpio and other features
+	  that are often used in portable devices.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called tps65219.
+
 config MFD_TPS6586X
 	bool "TI TPS6586x Power Management chips"
 	depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 8116c19d5fd4..11bce3e134f4 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -101,6 +101,7 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
 obj-$(CONFIG_MFD_TPS65086)	+= tps65086.o
 obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
 obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
+obj-$(CONFIG_MFD_TPS65219)	+= tps65219.o
 obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
 obj-$(CONFIG_MFD_TPS65912)	+= tps65912-core.o
 obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
diff --git a/drivers/mfd/tps65219.c b/drivers/mfd/tps65219.c
new file mode 100644
index 000000000000..b8e8115da555
--- /dev/null
+++ b/drivers/mfd/tps65219.c
@@ -0,0 +1,296 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Driver for TPS65219 Integrated power management chipsets
+ *
+ * Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/
+ */
+
+/* This implementation derived from tps65218 authored by "J Keerthy <j-keerthy@ti.com>" */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/init.h>
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/regmap.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/mutex.h>
+#include <linux/reboot.h>
+
+#include <linux/mfd/core.h>
+#include <linux/mfd/tps65219.h>
+
+
+/**
+ * pmic_rst_restart: trig tps65219 reset to SOC.
+ *
+ * Trigged via notifier
+ */
+static int pmic_rst_restart(struct notifier_block *this,
+			  unsigned long mode, void *cmd)
+{
+	struct tps65219 *tps;
+
+	tps = container_of(this, struct tps65219, nb);
+	if (tps != NULL) {
+		if (WARMNCOLD)
+			tps65219_warm_reset(tps);
+		else
+			tps65219_cold_reset(tps);
+	} else {
+		pr_err("%s: pointer to tps65219 is invalid\n", __func__);
+		return -ENODEV;
+	}
+	return NOTIFY_DONE;
+}
+
+static struct i2c_client *tps65219_i2c_client;
+/**
+ * pmic_poweroff: trig tps65219 regulators power OFF sequence.
+ */
+static void pmic_poweroff_do_poweroff(void)
+{
+	struct tps65219 *tps;
+
+	tps = dev_get_drvdata(&tps65219_i2c_client->dev);
+	tps65219_soft_shutdown(tps);
+
+}
+
+static struct notifier_block pmic_rst_restart_nb = {
+	.notifier_call = pmic_rst_restart,
+};
+
+static const struct mfd_cell tps65219_cells[] = {
+	{ .name = "tps65219-regulator", },
+};
+
+/**
+ * tps65219_reg_read: Read a single tps65219 register.
+ *
+ * @tps: Device to read from.
+ * @reg: Register to read.
+ * @val: Contians the value
+ */
+int tps65219_reg_read(struct tps65219 *tps, unsigned int reg,
+			unsigned int *val)
+{
+	return regmap_read(tps->regmap, reg, val);
+}
+EXPORT_SYMBOL_GPL(tps65219_reg_read);
+
+/**
+ * tps65219_reg_write: Write a single tps65219 register.
+ *
+ * @tps: Device to write to.
+ * @reg: Register to write to.
+ * @val: Value to write.
+ */
+int tps65219_reg_write(struct tps65219 *tps, unsigned int reg,
+			unsigned int val)
+{
+	return regmap_write(tps->regmap, reg, val);
+}
+EXPORT_SYMBOL_GPL(tps65219_reg_write);
+
+/**
+ * tps65219_update_bits: Modify bits w.r.t mask, val and level.
+ *
+ * @tps: Device to write to.
+ * @reg: Register to read-write to.
+ * @mask: Mask.
+ * @val: Value to write.
+ */
+static int tps65219_update_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask, unsigned int val)
+{
+	int ret;
+	unsigned int data;
+
+	ret = regmap_read(tps->regmap, reg, &data);
+	if (ret) {
+		dev_err(tps->dev, "Read from reg 0x%x failed\n", reg);
+		return ret;
+	}
+
+	data &= ~mask;
+	data |= val & mask;
+
+	mutex_lock(&tps->tps_lock);
+	ret = tps65219_reg_write(tps, reg, data);
+	if (ret)
+		dev_err(tps->dev, "Write for reg 0x%x failed\n", reg);
+	mutex_unlock(&tps->tps_lock);
+
+	return ret;
+}
+
+int tps65219_set_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask, unsigned int val)
+{
+	return tps65219_update_bits(tps, reg, mask, val);
+}
+EXPORT_SYMBOL_GPL(tps65219_set_bits);
+
+int tps65219_clear_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask)
+{
+	return tps65219_update_bits(tps, reg, mask, 0);
+}
+EXPORT_SYMBOL_GPL(tps65219_clear_bits);
+
+/**
+ * tps65219_warm_reset: issue warm reset to SOC.
+ *
+ * @tps: Device to write to.
+ */
+int tps65219_warm_reset(struct tps65219 *tps)
+{
+	int ret;
+
+	dev_dbg(tps->dev, "warm reset");
+	ret =  tps65219_set_bits(tps, TPS65219_REG_MFP_CTRL, TPS65219_MFP_WARM_RESET_I2C_CTRL,
+				 TPS65219_MFP_WARM_RESET_I2C_CTRL);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tps65219_warm_reset);
+
+/**
+ * tps65219_cold_reset: issue cold reset to SOC.
+ *
+ * @tps: Device to write to.
+ */
+int tps65219_cold_reset(struct tps65219 *tps)
+{
+	int ret;
+
+	dev_dbg(tps->dev, "cold reset generation");
+	ret =  tps65219_set_bits(tps, TPS65219_REG_MFP_CTRL, TPS65219_MFP_COLD_RESET_I2C_CTRL,
+				 TPS65219_MFP_COLD_RESET_I2C_CTRL);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tps65219_cold_reset);
+
+/**
+ * tps65219_soft_shutdown: issue cold reset to SOC.
+ *
+ * @tps: Device to write to.
+ */
+int tps65219_soft_shutdown(struct tps65219 *tps)
+{
+	int ret;
+
+	dev_dbg(tps->dev, "software shutdown");
+	ret =  tps65219_set_bits(tps, TPS65219_REG_MFP_CTRL, TPS65219_MFP_I2C_OFF_REQ,
+				 TPS65219_MFP_I2C_OFF_REQ);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tps65219_soft_shutdown);
+
+static const struct regmap_range tps65219_yes_ranges[] = {
+	regmap_reg_range(TPS65219_REG_INT_SOURCE, TPS65219_REG_POWER_UP_STATUS),
+};
+
+static const struct regmap_access_table tps65219_volatile_table = {
+	.yes_ranges = tps65219_yes_ranges,
+	.n_yes_ranges = ARRAY_SIZE(tps65219_yes_ranges),
+};
+
+static const struct regmap_config tps65219_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.cache_type = REGCACHE_RBTREE,
+	.volatile_table = &tps65219_volatile_table,
+};
+
+static const struct of_device_id of_tps65219_match_table[] = {
+	{ .compatible = "ti,tps65219", },
+	{}
+};
+MODULE_DEVICE_TABLE(of, of_tps65219_match_table);
+
+static int tps65219_probe(struct i2c_client *client,
+				const struct i2c_device_id *ids)
+{
+	struct tps65219 *tps;
+	int ret;
+	unsigned int chipid;
+
+	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
+	if (!tps)
+		return -ENOMEM;
+
+	i2c_set_clientdata(client, tps);
+	tps->dev = &client->dev;
+	tps->regmap = devm_regmap_init_i2c(client, &tps65219_regmap_config);
+	if (IS_ERR(tps->regmap)) {
+		ret = PTR_ERR(tps->regmap);
+		dev_err(tps->dev, "Failed to allocate register map: %d\n",
+			ret);
+		return ret;
+	}
+
+	mutex_init(&tps->tps_lock);
+
+	ret = regmap_read(tps->regmap, TPS65219_REG_TI_DEV_ID, &chipid);
+	if (ret) {
+		dev_err(tps->dev, "Failed to read device ID: %d\n", ret);
+		return ret;
+	}
+
+	tps->rev = chipid & TPS65219_DEVID_REV_MASK;
+
+	ret = mfd_add_devices(tps->dev, PLATFORM_DEVID_AUTO, tps65219_cells,
+			      ARRAY_SIZE(tps65219_cells), NULL, 0,
+			      NULL);
+
+	tps->nb = pmic_rst_restart_nb;
+	ret = register_restart_handler(&pmic_rst_restart_nb);
+
+	if (ret) {
+		dev_err(tps->dev, "%s: cannot register restart handler, %d\n",
+				__func__, ret);
+		return -ENODEV;
+	}
+
+	/* If a pm_power_off function has already been added, leave it alone */
+	if (pm_power_off != NULL) {
+		dev_warn(tps->dev,
+			"%s: pm_power_off function already registered\n",
+		       __func__);
+	} else {
+		tps65219_i2c_client = client;
+		pm_power_off = &pmic_poweroff_do_poweroff;
+	}
+	return ret;
+}
+
+static const struct i2c_device_id tps65219_id_table[] = {
+	{ "tps65219", TPS65219 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, tps65219_id_table);
+
+static struct i2c_driver tps65219_driver = {
+	.driver		= {
+		.name	= "tps65219",
+		.of_match_table = of_tps65219_match_table,
+	},
+	.probe		= tps65219_probe,
+	.id_table       = tps65219_id_table,
+};
+
+module_i2c_driver(tps65219_driver);
+
+MODULE_AUTHOR("Jerome NEANNE <jneanne@baylibre.com>");
+MODULE_DESCRIPTION("TPS65219 chip family multi-function driver");
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/tps65219.h b/include/linux/mfd/tps65219.h
new file mode 100644
index 000000000000..c55efed2d130
--- /dev/null
+++ b/include/linux/mfd/tps65219.h
@@ -0,0 +1,245 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * linux/mfd/tps65219.h
+ *
+ * Functions to access TPS65219 power management chip.
+ *
+ * Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/
+ */
+
+#ifndef __LINUX_MFD_TPS65219_H
+#define __LINUX_MFD_TPS65219_H
+
+#include <linux/i2c.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+#include <linux/bitops.h>
+
+#define WARMNCOLD				1
+#define TPS65219_1V35				1350000
+#define TPS65219_1V8				1800000
+
+/* TPS chip id list */
+#define TPS65219				0xF0
+
+/* I2C ID for TPS65219 part */
+#define TPS65219_I2C_ID				0x24
+
+/* All register addresses */
+#define TPS65219_REG_TI_DEV_ID			0x00
+#define TPS65219_REG_NVM_ID			0x01
+#define TPS65219_REG_ENABLE_CTRL		0x02
+#define TPS65219_REG_BUCKS_CONFIG		0x03
+#define TPS65219_REG_LDO4_VOUT			0x04
+#define TPS65219_REG_LDO3_VOUT			0x05
+#define TPS65219_REG_LDO2_VOUT			0x06
+#define TPS65219_REG_LDO1_VOUT			0x07
+#define TPS65219_REG_BUCK3_VOUT			0x8
+#define TPS65219_REG_BUCK2_VOUT			0x9
+#define TPS65219_REG_BUCK1_VOUT			0xA
+#define TPS65219_REG_LDO4_SEQUENCE_SLOT		0xB
+#define TPS65219_REG_LDO3_SEQUENCE_SLOT		0xC
+#define TPS65219_REG_LDO2_SEQUENCE_SLOT		0xD
+#define TPS65219_REG_LDO1_SEQUENCE_SLOT		0xE
+#define TPS65219_REG_BUCK3_SEQUENCE_SLOT	0xF
+#define TPS65219_REG_BUCK2_SEQUENCE_SLOT	0x10
+#define TPS65219_REG_BUCK1_SEQUENCE_SLOT	0x11
+#define TPS65219_REG_nRST_SEQUENCE_SLOT		0x12
+#define TPS65219_REG_GPIO_SEQUENCE_SLOT		0x13
+#define TPS65219_REG_GPO2_SEQUENCE_SLOT		0x14
+#define TPS65219_REG_GPO1_SEQUENCE_SLOT		0x15
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_1	0x16
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_2	0x17
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_3	0x18
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_4	0x19
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_1	0x1A
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_2	0x1B
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_3	0x1C
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_4	0x1D
+#define TPS65219_REG_GENERAL_CONFIG		0x1E
+#define TPS65219_REG_MFP_1_CONFIG		0x1F
+#define TPS65219_REG_MFP_2_CONFIG		0x20
+#define TPS65219_REG_STBY_1_CONFIG		0x21
+#define TPS65219_REG_STBY_2_CONFIG		0x22
+#define TPS65219_REG_OC_DEGL_CONFIG		0x23
+#define TPS65219_REG_INT_MASK_UV		0x24
+#define TPS65219_REG_MASK_CONFIG		0x25
+#define TPS65219_REG_I2C_ADDRESS_REG		0x26
+#define TPS65219_REG_USER_GENERAL_NVM_STORAGE	0x27
+#define TPS65219_REG_MANUFACTURING_VER		0x28
+#define TPS65219_REG_MFP_CTRL			0x29
+#define TPS65219_REG_DISCHARGE_CONFIG		0x2A
+#define TPS65219_REG_INT_SOURCE			0x2B
+#define TPS65219_REG_INT_LDO_3_4		0x2C
+#define TPS65219_REG_INT_LDO_1_2		0x2D
+#define TPS65219_REG_INT_BUCK_3			0x2E
+#define TPS65219_REG_INT_BUCK_1_2		0x2F
+#define TPS65219_REG_INT_SYSTEM			0x30
+#define TPS65219_REG_INT_RV			0x31
+#define TPS65219_REG_INT_TIMEOUT_RV_SD		0x32
+#define TPS65219_REG_INT_PB			0x33
+#define TPS65219_REG_USER_NVM_CMD		0x34
+#define TPS65219_REG_POWER_UP_STATUS		0x35
+#define TPS65219_REG_SPARE_2			0x36
+#define TPS65219_REG_SPARE_3			0x37
+#define TPS65219_REG_FACTORY_CONFIG_2		0x41
+
+/* Register field definitions */
+#define TPS65219_DEVID_REV_MASK			0xFF
+#define TPS65219_BUCKS_LDOS_VOUT_VSET_MASK	0x3F
+#define TPS65219_BUCKS_UV_THR_SEL		BIT(6)
+#define TPS65219_BUCKS_BW_SEL			BIT(7)
+#define TPS65219_LDOS_BYP_CONFIG_SHIFT		6
+#define TPS65219_LDOS_BYP_CONFIG_MASK		BIT(TPS65219_LDOS_BYP_CONFIG_SHIFT)
+#define TPS65219_LDOS_LSW_CONFIG_MASK		BIT(7)
+/* Regulators enable control */
+#define TPS65219_ENABLE_BUCK1_EN		BIT(0)
+#define TPS65219_ENABLE_BUCK2_EN		BIT(1)
+#define TPS65219_ENABLE_BUCK3_EN		BIT(2)
+#define TPS65219_ENABLE_LDO1_EN			BIT(3)
+#define TPS65219_ENABLE_LDO2_EN			BIT(4)
+#define TPS65219_ENABLE_LDO3_EN			BIT(5)
+#define TPS65219_ENABLE_LDO4_EN			BIT(6)
+/* power ON-OFF sequence slot */
+#define TPS65219_BUCKS_LDOS_SEQUENCE_OFF_SLOT_MASK	0x0F
+#define TPS65219_BUCKS_LDOS_SEQUENCE_ON_SLOT_MASK	0xF0
+/* TODO: Not needed, same mapping as TPS65219_ENABLE_REGNAME_EN, factorize */
+#define TPS65219_STBY1_BUCK1_STBY_EN		BIT(0)
+#define TPS65219_STBY1_BUCK2_STBY_EN		BIT(1)
+#define TPS65219_STBY1_BUCK3_STBY_EN		BIT(2)
+#define TPS65219_STBY1_LDO1_STBY_EN		BIT(3)
+#define TPS65219_STBY1_LDO2_STBY_EN		BIT(4)
+#define TPS65219_STBY1_LDO3_STBY_EN		BIT(5)
+#define TPS65219_STBY1_LDO4_STBY_EN		BIT(6)
+/* STBY_2 config */
+#define TPS65219_STBY2_GPO1_STBY_EN		BIT(0)
+#define TPS65219_STBY2_GPO2_STBY_EN		BIT(1)
+#define TPS65219_STBY2_GPIO_STBY_EN		BIT(2)
+/* MFP Control */
+#define TPS65219_MFP_I2C_OFF_REQ		BIT(0)
+#define TPS65219_MFP_STBY_I2C_CTRL		BIT(1)
+#define TPS65219_MFP_COLD_RESET_I2C_CTRL	BIT(2)
+#define TPS65219_MFP_WARM_RESET_I2C_CTRL	BIT(3)
+#define TPS65219_MFP_GPIO_STATUS		BIT(4)
+#define BUCKS_LDOS_STBY_ON_BIT			0x1
+/* MFP_1 Config */
+#define TPS65219_MFP_1_VSEL_DDR_SEL		BIT(0)
+#define TPS65219_MFP_1_VSEL_SD_POL		BIT(1)
+#define TPS65219_MFP_1_VSEL_RAIL		BIT(2)
+/* interrupts source status*/
+#define TPS65219_INT_SRC_TIMEOUT_RV_SD_IS_SET	BIT(0)
+#define TPS65219_INT_SRC_RV_IS_SET		BIT(1)
+#define TPS65219_INT_SRC_SYSTEM_IS_SET		BIT(2)
+#define TPS65219_INT_SRC_BUCK_1_2_IS_SET	BIT(3)
+#define TPS65219_INT_SRC_BUCK_3_IS_SET		BIT(4)
+#define TPS65219_INT_SRC_LDO_1_2_IS_SET		BIT(5)
+#define TPS65219_INT_SRC_LDO_3_4_IS_SET		BIT(6)
+#define TPS65219_INT_SRC_PB_IS_SET		BIT(7)
+/* UnderVoltage - Short to GND - OverCurrent*/
+/* LDO3-4 */
+#define TPS65219_INT_LDO3_SCG			BIT(0)
+#define TPS65219_INT_LDO3_OC			BIT(1)
+#define TPS65219_INT_LDO3_UV			BIT(2)
+#define TPS65219_INT_LDO4_SCG			BIT(3)
+#define TPS65219_INT_LDO4_OC			BIT(4)
+#define TPS65219_INT_LDO4_UV			BIT(5)
+/* LDO1-2 */
+#define TPS65219_INT_LDO1_SCG			BIT(0)
+#define TPS65219_INT_LDO1_OC			BIT(1)
+#define TPS65219_INT_LDO1_UV			BIT(2)
+#define TPS65219_INT_LDO2_SCG			BIT(3)
+#define TPS65219_INT_LDO2_OC			BIT(4)
+#define TPS65219_INT_LDO2_UV			BIT(5)
+/* BUCK3 */
+#define TPS65219_INT_BUCK3_SCG			BIT(0)
+#define TPS65219_INT_BUCK3_OC			BIT(1)
+#define TPS65219_INT_BUCK3_NEG_OC		BIT(2)
+#define TPS65219_INT_BUCK3_UV			BIT(3)
+/* BUCK1-2 */
+#define TPS65219_INT_BUCK1_SCG			BIT(0)
+#define TPS65219_INT_BUCK1_OC			BIT(1)
+#define TPS65219_INT_BUCK1_NEG_OC		BIT(2)
+#define TPS65219_INT_BUCK1_UV			BIT(3)
+#define TPS65219_INT_BUCK2_SCG			BIT(4)
+#define TPS65219_INT_BUCK2_OC			BIT(5)
+#define TPS65219_INT_BUCK2_NEG_OC		BIT(6)
+#define TPS65219_INT_BUCK2_UV			BIT(7)
+/* Thermal Sensor  */
+#define TPS65219_INT_SENSOR_3_WARM		BIT(0)
+#define TPS65219_INT_SENSOR_2_WARM		BIT(1)
+#define TPS65219_INT_SENSOR_1_WARM		BIT(2)
+#define TPS65219_INT_SENSOR_0_WARM		BIT(3)
+#define TPS65219_INT_SENSOR_3_HOT		BIT(4)
+#define TPS65219_INT_SENSOR_2_HOT		BIT(5)
+#define TPS65219_INT_SENSOR_1_HOT		BIT(6)
+#define TPS65219_INT_SENSOR_0_HOT		BIT(7)
+/* Residual Voltage */
+#define TPS65219_INT_BUCK1_RV			BIT(0)
+#define TPS65219_INT_BUCK2_RV			BIT(1)
+#define TPS65219_INT_BUCK3_RV			BIT(2)
+#define TPS65219_INT_LDO1_RV			BIT(3)
+#define TPS65219_INT_LDO2_RV			BIT(4)
+#define TPS65219_INT_LDO3_RV			BIT(5)
+#define TPS65219_INT_LDO4_RV			BIT(6)
+/* Residual Voltage ShutDown */
+#define TPS65219_INT_BUCK1_RV_SD		BIT(0)
+#define TPS65219_INT_BUCK2_RV_SD		BIT(1)
+#define TPS65219_INT_BUCK3_RV_SD		BIT(2)
+#define TPS65219_INT_LDO1_RV_SD			BIT(3)
+#define TPS65219_INT_LDO2_RV_SD			BIT(4)
+#define TPS65219_INT_LDO3_RV_SD			BIT(5)
+#define TPS65219_INT_LDO4_RV_SD			BIT(6)
+#define TPS65219_INT_TIMEOUT			BIT(7)
+/* Power Button */
+#define TPS65219_INT_PB_FALLING_EDGE_DET	BIT(0)
+#define TPS65219_INT_PB_RISING_EDGE_DETECT	BIT(1)
+#define TPS65219_INT_PB_REAL_TIME_STATUS	BIT(2)
+
+enum tps65219_regulator_id {
+	/* DCDC's */
+	TPS65219_BUCK_1,
+	TPS65219_BUCK_2,
+	TPS65219_BUCK_3,
+	/* LDOs */
+	TPS65219_LDO_1,
+	TPS65219_LDO_2,
+	TPS65219_LDO_3,
+	TPS65219_LDO_4,
+};
+
+#define TPS65219_MAX_REG_ID		TPS65219_LDO_4
+
+/* Number of step-down converters available */
+#define TPS65219_NUM_DCDC		3
+/* Number of LDO voltage regulators available */
+#define TPS65219_NUM_LDO		4
+/* Number of total regulators available */
+#define TPS65219_NUM_REGULATOR		(TPS65219_NUM_DCDC + TPS65219_NUM_LDO)
+
+/**
+ * struct tps65219 - tps65219 sub-driver chip access routines
+ *
+ * Device data may be used to access the TPS65219 chip
+ */
+struct tps65219 {
+	struct device *dev;
+	unsigned int id;
+	u8 rev;
+	struct mutex tps_lock;		/* lock guarding the data structure */
+	struct regulator_desc desc[TPS65219_NUM_REGULATOR];
+	struct regmap *regmap;
+	u8 *strobes;
+	struct notifier_block nb;
+};
+int tps65219_reg_read(struct tps65219 *tps, unsigned int reg,
+			unsigned int *val);
+int tps65219_reg_write(struct tps65219 *tps, unsigned int reg,
+			unsigned int val);
+int tps65219_set_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask, unsigned int val);
+int tps65219_clear_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask);
+int tps65219_warm_reset(struct tps65219 *tps);
+int tps65219_cold_reset(struct tps65219 *tps);
+int tps65219_soft_shutdown(struct tps65219 *tps);
+#endif /*  __LINUX_MFD_TPS65219_H */
-- 
2.17.1


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

* [RFC PATCH 2/5] mfd: drivers: Add TI TPS65219 PMIC support
@ 2022-06-13  9:06   ` Jerome NEANNE
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

The TPS65219 is a power management IC PMIC designed
to supply a wide range of SoCs
in both portable and stationary applications.
Any SoC can control TPS65219 over a standard I2C interface.

It contains the following components:
- Regulators.
- Over Temperature warning and Shut down.
- GPIOs
- Multi Function Pins (MFP)

This patch adds support for tps65219 mfd device. At this time only
the functionalities listed below are made available:

- Regulators probe and functionalities
- warm and cold reset support
- SW shutdown support

Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>
---
 drivers/mfd/Kconfig          |  15 ++
 drivers/mfd/Makefile         |   1 +
 drivers/mfd/tps65219.c       | 296 +++++++++++++++++++++++++++++++++++
 include/linux/mfd/tps65219.h | 245 +++++++++++++++++++++++++++++
 4 files changed, 557 insertions(+)
 create mode 100644 drivers/mfd/tps65219.c
 create mode 100644 include/linux/mfd/tps65219.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 6a3fd2d75f96..f8639b7b034b 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1555,6 +1555,21 @@ config MFD_TPS65218
 	  This driver can also be built as a module.  If so, the module
 	  will be called tps65218.
 
+config MFD_TPS65219
+	tristate "TI TPS65219 Power Management chips"
+	depends on I2C && OF
+	select MFD_CORE
+	select REGMAP_I2C
+	select REGMAP_IRQ
+	help
+	  If you say yes here you get support for the TPS65219 series of
+	  Power Management chips.
+	  These include voltage regulators, gpio and other features
+	  that are often used in portable devices.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called tps65219.
+
 config MFD_TPS6586X
 	bool "TI TPS6586x Power Management chips"
 	depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 8116c19d5fd4..11bce3e134f4 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -101,6 +101,7 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
 obj-$(CONFIG_MFD_TPS65086)	+= tps65086.o
 obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
 obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
+obj-$(CONFIG_MFD_TPS65219)	+= tps65219.o
 obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
 obj-$(CONFIG_MFD_TPS65912)	+= tps65912-core.o
 obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
diff --git a/drivers/mfd/tps65219.c b/drivers/mfd/tps65219.c
new file mode 100644
index 000000000000..b8e8115da555
--- /dev/null
+++ b/drivers/mfd/tps65219.c
@@ -0,0 +1,296 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Driver for TPS65219 Integrated power management chipsets
+ *
+ * Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/
+ */
+
+/* This implementation derived from tps65218 authored by "J Keerthy <j-keerthy@ti.com>" */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/init.h>
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/regmap.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/mutex.h>
+#include <linux/reboot.h>
+
+#include <linux/mfd/core.h>
+#include <linux/mfd/tps65219.h>
+
+
+/**
+ * pmic_rst_restart: trig tps65219 reset to SOC.
+ *
+ * Trigged via notifier
+ */
+static int pmic_rst_restart(struct notifier_block *this,
+			  unsigned long mode, void *cmd)
+{
+	struct tps65219 *tps;
+
+	tps = container_of(this, struct tps65219, nb);
+	if (tps != NULL) {
+		if (WARMNCOLD)
+			tps65219_warm_reset(tps);
+		else
+			tps65219_cold_reset(tps);
+	} else {
+		pr_err("%s: pointer to tps65219 is invalid\n", __func__);
+		return -ENODEV;
+	}
+	return NOTIFY_DONE;
+}
+
+static struct i2c_client *tps65219_i2c_client;
+/**
+ * pmic_poweroff: trig tps65219 regulators power OFF sequence.
+ */
+static void pmic_poweroff_do_poweroff(void)
+{
+	struct tps65219 *tps;
+
+	tps = dev_get_drvdata(&tps65219_i2c_client->dev);
+	tps65219_soft_shutdown(tps);
+
+}
+
+static struct notifier_block pmic_rst_restart_nb = {
+	.notifier_call = pmic_rst_restart,
+};
+
+static const struct mfd_cell tps65219_cells[] = {
+	{ .name = "tps65219-regulator", },
+};
+
+/**
+ * tps65219_reg_read: Read a single tps65219 register.
+ *
+ * @tps: Device to read from.
+ * @reg: Register to read.
+ * @val: Contians the value
+ */
+int tps65219_reg_read(struct tps65219 *tps, unsigned int reg,
+			unsigned int *val)
+{
+	return regmap_read(tps->regmap, reg, val);
+}
+EXPORT_SYMBOL_GPL(tps65219_reg_read);
+
+/**
+ * tps65219_reg_write: Write a single tps65219 register.
+ *
+ * @tps: Device to write to.
+ * @reg: Register to write to.
+ * @val: Value to write.
+ */
+int tps65219_reg_write(struct tps65219 *tps, unsigned int reg,
+			unsigned int val)
+{
+	return regmap_write(tps->regmap, reg, val);
+}
+EXPORT_SYMBOL_GPL(tps65219_reg_write);
+
+/**
+ * tps65219_update_bits: Modify bits w.r.t mask, val and level.
+ *
+ * @tps: Device to write to.
+ * @reg: Register to read-write to.
+ * @mask: Mask.
+ * @val: Value to write.
+ */
+static int tps65219_update_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask, unsigned int val)
+{
+	int ret;
+	unsigned int data;
+
+	ret = regmap_read(tps->regmap, reg, &data);
+	if (ret) {
+		dev_err(tps->dev, "Read from reg 0x%x failed\n", reg);
+		return ret;
+	}
+
+	data &= ~mask;
+	data |= val & mask;
+
+	mutex_lock(&tps->tps_lock);
+	ret = tps65219_reg_write(tps, reg, data);
+	if (ret)
+		dev_err(tps->dev, "Write for reg 0x%x failed\n", reg);
+	mutex_unlock(&tps->tps_lock);
+
+	return ret;
+}
+
+int tps65219_set_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask, unsigned int val)
+{
+	return tps65219_update_bits(tps, reg, mask, val);
+}
+EXPORT_SYMBOL_GPL(tps65219_set_bits);
+
+int tps65219_clear_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask)
+{
+	return tps65219_update_bits(tps, reg, mask, 0);
+}
+EXPORT_SYMBOL_GPL(tps65219_clear_bits);
+
+/**
+ * tps65219_warm_reset: issue warm reset to SOC.
+ *
+ * @tps: Device to write to.
+ */
+int tps65219_warm_reset(struct tps65219 *tps)
+{
+	int ret;
+
+	dev_dbg(tps->dev, "warm reset");
+	ret =  tps65219_set_bits(tps, TPS65219_REG_MFP_CTRL, TPS65219_MFP_WARM_RESET_I2C_CTRL,
+				 TPS65219_MFP_WARM_RESET_I2C_CTRL);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tps65219_warm_reset);
+
+/**
+ * tps65219_cold_reset: issue cold reset to SOC.
+ *
+ * @tps: Device to write to.
+ */
+int tps65219_cold_reset(struct tps65219 *tps)
+{
+	int ret;
+
+	dev_dbg(tps->dev, "cold reset generation");
+	ret =  tps65219_set_bits(tps, TPS65219_REG_MFP_CTRL, TPS65219_MFP_COLD_RESET_I2C_CTRL,
+				 TPS65219_MFP_COLD_RESET_I2C_CTRL);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tps65219_cold_reset);
+
+/**
+ * tps65219_soft_shutdown: issue cold reset to SOC.
+ *
+ * @tps: Device to write to.
+ */
+int tps65219_soft_shutdown(struct tps65219 *tps)
+{
+	int ret;
+
+	dev_dbg(tps->dev, "software shutdown");
+	ret =  tps65219_set_bits(tps, TPS65219_REG_MFP_CTRL, TPS65219_MFP_I2C_OFF_REQ,
+				 TPS65219_MFP_I2C_OFF_REQ);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tps65219_soft_shutdown);
+
+static const struct regmap_range tps65219_yes_ranges[] = {
+	regmap_reg_range(TPS65219_REG_INT_SOURCE, TPS65219_REG_POWER_UP_STATUS),
+};
+
+static const struct regmap_access_table tps65219_volatile_table = {
+	.yes_ranges = tps65219_yes_ranges,
+	.n_yes_ranges = ARRAY_SIZE(tps65219_yes_ranges),
+};
+
+static const struct regmap_config tps65219_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.cache_type = REGCACHE_RBTREE,
+	.volatile_table = &tps65219_volatile_table,
+};
+
+static const struct of_device_id of_tps65219_match_table[] = {
+	{ .compatible = "ti,tps65219", },
+	{}
+};
+MODULE_DEVICE_TABLE(of, of_tps65219_match_table);
+
+static int tps65219_probe(struct i2c_client *client,
+				const struct i2c_device_id *ids)
+{
+	struct tps65219 *tps;
+	int ret;
+	unsigned int chipid;
+
+	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
+	if (!tps)
+		return -ENOMEM;
+
+	i2c_set_clientdata(client, tps);
+	tps->dev = &client->dev;
+	tps->regmap = devm_regmap_init_i2c(client, &tps65219_regmap_config);
+	if (IS_ERR(tps->regmap)) {
+		ret = PTR_ERR(tps->regmap);
+		dev_err(tps->dev, "Failed to allocate register map: %d\n",
+			ret);
+		return ret;
+	}
+
+	mutex_init(&tps->tps_lock);
+
+	ret = regmap_read(tps->regmap, TPS65219_REG_TI_DEV_ID, &chipid);
+	if (ret) {
+		dev_err(tps->dev, "Failed to read device ID: %d\n", ret);
+		return ret;
+	}
+
+	tps->rev = chipid & TPS65219_DEVID_REV_MASK;
+
+	ret = mfd_add_devices(tps->dev, PLATFORM_DEVID_AUTO, tps65219_cells,
+			      ARRAY_SIZE(tps65219_cells), NULL, 0,
+			      NULL);
+
+	tps->nb = pmic_rst_restart_nb;
+	ret = register_restart_handler(&pmic_rst_restart_nb);
+
+	if (ret) {
+		dev_err(tps->dev, "%s: cannot register restart handler, %d\n",
+				__func__, ret);
+		return -ENODEV;
+	}
+
+	/* If a pm_power_off function has already been added, leave it alone */
+	if (pm_power_off != NULL) {
+		dev_warn(tps->dev,
+			"%s: pm_power_off function already registered\n",
+		       __func__);
+	} else {
+		tps65219_i2c_client = client;
+		pm_power_off = &pmic_poweroff_do_poweroff;
+	}
+	return ret;
+}
+
+static const struct i2c_device_id tps65219_id_table[] = {
+	{ "tps65219", TPS65219 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, tps65219_id_table);
+
+static struct i2c_driver tps65219_driver = {
+	.driver		= {
+		.name	= "tps65219",
+		.of_match_table = of_tps65219_match_table,
+	},
+	.probe		= tps65219_probe,
+	.id_table       = tps65219_id_table,
+};
+
+module_i2c_driver(tps65219_driver);
+
+MODULE_AUTHOR("Jerome NEANNE <jneanne@baylibre.com>");
+MODULE_DESCRIPTION("TPS65219 chip family multi-function driver");
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/tps65219.h b/include/linux/mfd/tps65219.h
new file mode 100644
index 000000000000..c55efed2d130
--- /dev/null
+++ b/include/linux/mfd/tps65219.h
@@ -0,0 +1,245 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * linux/mfd/tps65219.h
+ *
+ * Functions to access TPS65219 power management chip.
+ *
+ * Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/
+ */
+
+#ifndef __LINUX_MFD_TPS65219_H
+#define __LINUX_MFD_TPS65219_H
+
+#include <linux/i2c.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+#include <linux/bitops.h>
+
+#define WARMNCOLD				1
+#define TPS65219_1V35				1350000
+#define TPS65219_1V8				1800000
+
+/* TPS chip id list */
+#define TPS65219				0xF0
+
+/* I2C ID for TPS65219 part */
+#define TPS65219_I2C_ID				0x24
+
+/* All register addresses */
+#define TPS65219_REG_TI_DEV_ID			0x00
+#define TPS65219_REG_NVM_ID			0x01
+#define TPS65219_REG_ENABLE_CTRL		0x02
+#define TPS65219_REG_BUCKS_CONFIG		0x03
+#define TPS65219_REG_LDO4_VOUT			0x04
+#define TPS65219_REG_LDO3_VOUT			0x05
+#define TPS65219_REG_LDO2_VOUT			0x06
+#define TPS65219_REG_LDO1_VOUT			0x07
+#define TPS65219_REG_BUCK3_VOUT			0x8
+#define TPS65219_REG_BUCK2_VOUT			0x9
+#define TPS65219_REG_BUCK1_VOUT			0xA
+#define TPS65219_REG_LDO4_SEQUENCE_SLOT		0xB
+#define TPS65219_REG_LDO3_SEQUENCE_SLOT		0xC
+#define TPS65219_REG_LDO2_SEQUENCE_SLOT		0xD
+#define TPS65219_REG_LDO1_SEQUENCE_SLOT		0xE
+#define TPS65219_REG_BUCK3_SEQUENCE_SLOT	0xF
+#define TPS65219_REG_BUCK2_SEQUENCE_SLOT	0x10
+#define TPS65219_REG_BUCK1_SEQUENCE_SLOT	0x11
+#define TPS65219_REG_nRST_SEQUENCE_SLOT		0x12
+#define TPS65219_REG_GPIO_SEQUENCE_SLOT		0x13
+#define TPS65219_REG_GPO2_SEQUENCE_SLOT		0x14
+#define TPS65219_REG_GPO1_SEQUENCE_SLOT		0x15
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_1	0x16
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_2	0x17
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_3	0x18
+#define TPS65219_REG_POWER_UP_SLOT_DURATION_4	0x19
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_1	0x1A
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_2	0x1B
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_3	0x1C
+#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_4	0x1D
+#define TPS65219_REG_GENERAL_CONFIG		0x1E
+#define TPS65219_REG_MFP_1_CONFIG		0x1F
+#define TPS65219_REG_MFP_2_CONFIG		0x20
+#define TPS65219_REG_STBY_1_CONFIG		0x21
+#define TPS65219_REG_STBY_2_CONFIG		0x22
+#define TPS65219_REG_OC_DEGL_CONFIG		0x23
+#define TPS65219_REG_INT_MASK_UV		0x24
+#define TPS65219_REG_MASK_CONFIG		0x25
+#define TPS65219_REG_I2C_ADDRESS_REG		0x26
+#define TPS65219_REG_USER_GENERAL_NVM_STORAGE	0x27
+#define TPS65219_REG_MANUFACTURING_VER		0x28
+#define TPS65219_REG_MFP_CTRL			0x29
+#define TPS65219_REG_DISCHARGE_CONFIG		0x2A
+#define TPS65219_REG_INT_SOURCE			0x2B
+#define TPS65219_REG_INT_LDO_3_4		0x2C
+#define TPS65219_REG_INT_LDO_1_2		0x2D
+#define TPS65219_REG_INT_BUCK_3			0x2E
+#define TPS65219_REG_INT_BUCK_1_2		0x2F
+#define TPS65219_REG_INT_SYSTEM			0x30
+#define TPS65219_REG_INT_RV			0x31
+#define TPS65219_REG_INT_TIMEOUT_RV_SD		0x32
+#define TPS65219_REG_INT_PB			0x33
+#define TPS65219_REG_USER_NVM_CMD		0x34
+#define TPS65219_REG_POWER_UP_STATUS		0x35
+#define TPS65219_REG_SPARE_2			0x36
+#define TPS65219_REG_SPARE_3			0x37
+#define TPS65219_REG_FACTORY_CONFIG_2		0x41
+
+/* Register field definitions */
+#define TPS65219_DEVID_REV_MASK			0xFF
+#define TPS65219_BUCKS_LDOS_VOUT_VSET_MASK	0x3F
+#define TPS65219_BUCKS_UV_THR_SEL		BIT(6)
+#define TPS65219_BUCKS_BW_SEL			BIT(7)
+#define TPS65219_LDOS_BYP_CONFIG_SHIFT		6
+#define TPS65219_LDOS_BYP_CONFIG_MASK		BIT(TPS65219_LDOS_BYP_CONFIG_SHIFT)
+#define TPS65219_LDOS_LSW_CONFIG_MASK		BIT(7)
+/* Regulators enable control */
+#define TPS65219_ENABLE_BUCK1_EN		BIT(0)
+#define TPS65219_ENABLE_BUCK2_EN		BIT(1)
+#define TPS65219_ENABLE_BUCK3_EN		BIT(2)
+#define TPS65219_ENABLE_LDO1_EN			BIT(3)
+#define TPS65219_ENABLE_LDO2_EN			BIT(4)
+#define TPS65219_ENABLE_LDO3_EN			BIT(5)
+#define TPS65219_ENABLE_LDO4_EN			BIT(6)
+/* power ON-OFF sequence slot */
+#define TPS65219_BUCKS_LDOS_SEQUENCE_OFF_SLOT_MASK	0x0F
+#define TPS65219_BUCKS_LDOS_SEQUENCE_ON_SLOT_MASK	0xF0
+/* TODO: Not needed, same mapping as TPS65219_ENABLE_REGNAME_EN, factorize */
+#define TPS65219_STBY1_BUCK1_STBY_EN		BIT(0)
+#define TPS65219_STBY1_BUCK2_STBY_EN		BIT(1)
+#define TPS65219_STBY1_BUCK3_STBY_EN		BIT(2)
+#define TPS65219_STBY1_LDO1_STBY_EN		BIT(3)
+#define TPS65219_STBY1_LDO2_STBY_EN		BIT(4)
+#define TPS65219_STBY1_LDO3_STBY_EN		BIT(5)
+#define TPS65219_STBY1_LDO4_STBY_EN		BIT(6)
+/* STBY_2 config */
+#define TPS65219_STBY2_GPO1_STBY_EN		BIT(0)
+#define TPS65219_STBY2_GPO2_STBY_EN		BIT(1)
+#define TPS65219_STBY2_GPIO_STBY_EN		BIT(2)
+/* MFP Control */
+#define TPS65219_MFP_I2C_OFF_REQ		BIT(0)
+#define TPS65219_MFP_STBY_I2C_CTRL		BIT(1)
+#define TPS65219_MFP_COLD_RESET_I2C_CTRL	BIT(2)
+#define TPS65219_MFP_WARM_RESET_I2C_CTRL	BIT(3)
+#define TPS65219_MFP_GPIO_STATUS		BIT(4)
+#define BUCKS_LDOS_STBY_ON_BIT			0x1
+/* MFP_1 Config */
+#define TPS65219_MFP_1_VSEL_DDR_SEL		BIT(0)
+#define TPS65219_MFP_1_VSEL_SD_POL		BIT(1)
+#define TPS65219_MFP_1_VSEL_RAIL		BIT(2)
+/* interrupts source status*/
+#define TPS65219_INT_SRC_TIMEOUT_RV_SD_IS_SET	BIT(0)
+#define TPS65219_INT_SRC_RV_IS_SET		BIT(1)
+#define TPS65219_INT_SRC_SYSTEM_IS_SET		BIT(2)
+#define TPS65219_INT_SRC_BUCK_1_2_IS_SET	BIT(3)
+#define TPS65219_INT_SRC_BUCK_3_IS_SET		BIT(4)
+#define TPS65219_INT_SRC_LDO_1_2_IS_SET		BIT(5)
+#define TPS65219_INT_SRC_LDO_3_4_IS_SET		BIT(6)
+#define TPS65219_INT_SRC_PB_IS_SET		BIT(7)
+/* UnderVoltage - Short to GND - OverCurrent*/
+/* LDO3-4 */
+#define TPS65219_INT_LDO3_SCG			BIT(0)
+#define TPS65219_INT_LDO3_OC			BIT(1)
+#define TPS65219_INT_LDO3_UV			BIT(2)
+#define TPS65219_INT_LDO4_SCG			BIT(3)
+#define TPS65219_INT_LDO4_OC			BIT(4)
+#define TPS65219_INT_LDO4_UV			BIT(5)
+/* LDO1-2 */
+#define TPS65219_INT_LDO1_SCG			BIT(0)
+#define TPS65219_INT_LDO1_OC			BIT(1)
+#define TPS65219_INT_LDO1_UV			BIT(2)
+#define TPS65219_INT_LDO2_SCG			BIT(3)
+#define TPS65219_INT_LDO2_OC			BIT(4)
+#define TPS65219_INT_LDO2_UV			BIT(5)
+/* BUCK3 */
+#define TPS65219_INT_BUCK3_SCG			BIT(0)
+#define TPS65219_INT_BUCK3_OC			BIT(1)
+#define TPS65219_INT_BUCK3_NEG_OC		BIT(2)
+#define TPS65219_INT_BUCK3_UV			BIT(3)
+/* BUCK1-2 */
+#define TPS65219_INT_BUCK1_SCG			BIT(0)
+#define TPS65219_INT_BUCK1_OC			BIT(1)
+#define TPS65219_INT_BUCK1_NEG_OC		BIT(2)
+#define TPS65219_INT_BUCK1_UV			BIT(3)
+#define TPS65219_INT_BUCK2_SCG			BIT(4)
+#define TPS65219_INT_BUCK2_OC			BIT(5)
+#define TPS65219_INT_BUCK2_NEG_OC		BIT(6)
+#define TPS65219_INT_BUCK2_UV			BIT(7)
+/* Thermal Sensor  */
+#define TPS65219_INT_SENSOR_3_WARM		BIT(0)
+#define TPS65219_INT_SENSOR_2_WARM		BIT(1)
+#define TPS65219_INT_SENSOR_1_WARM		BIT(2)
+#define TPS65219_INT_SENSOR_0_WARM		BIT(3)
+#define TPS65219_INT_SENSOR_3_HOT		BIT(4)
+#define TPS65219_INT_SENSOR_2_HOT		BIT(5)
+#define TPS65219_INT_SENSOR_1_HOT		BIT(6)
+#define TPS65219_INT_SENSOR_0_HOT		BIT(7)
+/* Residual Voltage */
+#define TPS65219_INT_BUCK1_RV			BIT(0)
+#define TPS65219_INT_BUCK2_RV			BIT(1)
+#define TPS65219_INT_BUCK3_RV			BIT(2)
+#define TPS65219_INT_LDO1_RV			BIT(3)
+#define TPS65219_INT_LDO2_RV			BIT(4)
+#define TPS65219_INT_LDO3_RV			BIT(5)
+#define TPS65219_INT_LDO4_RV			BIT(6)
+/* Residual Voltage ShutDown */
+#define TPS65219_INT_BUCK1_RV_SD		BIT(0)
+#define TPS65219_INT_BUCK2_RV_SD		BIT(1)
+#define TPS65219_INT_BUCK3_RV_SD		BIT(2)
+#define TPS65219_INT_LDO1_RV_SD			BIT(3)
+#define TPS65219_INT_LDO2_RV_SD			BIT(4)
+#define TPS65219_INT_LDO3_RV_SD			BIT(5)
+#define TPS65219_INT_LDO4_RV_SD			BIT(6)
+#define TPS65219_INT_TIMEOUT			BIT(7)
+/* Power Button */
+#define TPS65219_INT_PB_FALLING_EDGE_DET	BIT(0)
+#define TPS65219_INT_PB_RISING_EDGE_DETECT	BIT(1)
+#define TPS65219_INT_PB_REAL_TIME_STATUS	BIT(2)
+
+enum tps65219_regulator_id {
+	/* DCDC's */
+	TPS65219_BUCK_1,
+	TPS65219_BUCK_2,
+	TPS65219_BUCK_3,
+	/* LDOs */
+	TPS65219_LDO_1,
+	TPS65219_LDO_2,
+	TPS65219_LDO_3,
+	TPS65219_LDO_4,
+};
+
+#define TPS65219_MAX_REG_ID		TPS65219_LDO_4
+
+/* Number of step-down converters available */
+#define TPS65219_NUM_DCDC		3
+/* Number of LDO voltage regulators available */
+#define TPS65219_NUM_LDO		4
+/* Number of total regulators available */
+#define TPS65219_NUM_REGULATOR		(TPS65219_NUM_DCDC + TPS65219_NUM_LDO)
+
+/**
+ * struct tps65219 - tps65219 sub-driver chip access routines
+ *
+ * Device data may be used to access the TPS65219 chip
+ */
+struct tps65219 {
+	struct device *dev;
+	unsigned int id;
+	u8 rev;
+	struct mutex tps_lock;		/* lock guarding the data structure */
+	struct regulator_desc desc[TPS65219_NUM_REGULATOR];
+	struct regmap *regmap;
+	u8 *strobes;
+	struct notifier_block nb;
+};
+int tps65219_reg_read(struct tps65219 *tps, unsigned int reg,
+			unsigned int *val);
+int tps65219_reg_write(struct tps65219 *tps, unsigned int reg,
+			unsigned int val);
+int tps65219_set_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask, unsigned int val);
+int tps65219_clear_bits(struct tps65219 *tps, unsigned int reg,
+		unsigned int mask);
+int tps65219_warm_reset(struct tps65219 *tps);
+int tps65219_cold_reset(struct tps65219 *tps);
+int tps65219_soft_shutdown(struct tps65219 *tps);
+#endif /*  __LINUX_MFD_TPS65219_H */
-- 
2.17.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [RFC PATCH 3/5] regulator: drivers: Add TI TPS65219 PMIC regulators support
  2022-06-13  9:05 ` Jerome NEANNE
@ 2022-06-13  9:06   ` Jerome NEANNE
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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 <jneanne@baylibre.com>
---
 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 <j-keerthy@ti.com>" */
+
+#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 <j-neanne@baylibre.com>");
+MODULE_DESCRIPTION("TPS65219 voltage regulator driver");
+MODULE_ALIAS("platform:tps65219-pmic");
+MODULE_LICENSE("GPL v2");
-- 
2.17.1


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

* [RFC PATCH 3/5] regulator: drivers: Add TI TPS65219 PMIC regulators support
@ 2022-06-13  9:06   ` Jerome NEANNE
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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 <jneanne@baylibre.com>
---
 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 <j-keerthy@ti.com>" */
+
+#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 <j-neanne@baylibre.com>");
+MODULE_DESCRIPTION("TPS65219 voltage regulator driver");
+MODULE_ALIAS("platform:tps65219-pmic");
+MODULE_LICENSE("GPL v2");
-- 
2.17.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [RFC PATCH 4/5] arm64: Kconfig: Introduce CONFIG_MFD_TPS65219 and CONFIG_REGULATOR_TPS65219
  2022-06-13  9:05 ` Jerome NEANNE
@ 2022-06-13  9:06   ` Jerome NEANNE
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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

Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>
---
 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


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

* [RFC PATCH 4/5] arm64: Kconfig: Introduce CONFIG_MFD_TPS65219 and CONFIG_REGULATOR_TPS65219
@ 2022-06-13  9:06   ` Jerome NEANNE
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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

Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>
---
 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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [RFC PATCH 5/5] arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board.
  2022-06-13  9:05 ` Jerome NEANNE
@ 2022-06-13  9:06   ` Jerome NEANNE
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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

Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>
---
 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


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

* [RFC PATCH 5/5] arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board.
@ 2022-06-13  9:06   ` Jerome NEANNE
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome NEANNE @ 2022-06-13  9:06 UTC (permalink / raw)
  To: lgirdwood, broonie, robh+dt, nm, kristo, will, lee.jones, jneanne
  Cc: khilman, narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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

Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>
---
 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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [RFC PATCH 2/5] mfd: drivers: Add TI TPS65219 PMIC support
  2022-06-13  9:06   ` Jerome NEANNE
@ 2022-06-13 12:57     ` Mark Brown
  -1 siblings, 0 replies; 22+ messages in thread
From: Mark Brown @ 2022-06-13 12:57 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, robh+dt, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel


[-- Attachment #1.1: Type: text/plain, Size: 1619 bytes --]

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

> +/**
> + * tps65219_reg_read: Read a single tps65219 register.
> + *
> + * @tps: Device to read from.
> + * @reg: Register to read.
> + * @val: Contians the value
> + */
> +int tps65219_reg_read(struct tps65219 *tps, unsigned int reg,
> +			unsigned int *val)
> +{
> +	return regmap_read(tps->regmap, reg, val);
> +}
> +EXPORT_SYMBOL_GPL(tps65219_reg_read);

It is better practice to just expose the regmap and let the function
drivers use it, that means the function drivers can just use standard
helper functions.

> +static int tps65219_update_bits(struct tps65219 *tps, unsigned int reg,
> +		unsigned int mask, unsigned int val)
> +{
> +	int ret;
> +	unsigned int data;
> +
> +	ret = regmap_read(tps->regmap, reg, &data);
> +	if (ret) {
> +		dev_err(tps->dev, "Read from reg 0x%x failed\n", reg);
> +		return ret;
> +	}
> +
> +	data &= ~mask;
> +	data |= val & mask;
> +
> +	mutex_lock(&tps->tps_lock);
> +	ret = tps65219_reg_write(tps, reg, data);
> +	if (ret)
> +		dev_err(tps->dev, "Write for reg 0x%x failed\n", reg);
> +	mutex_unlock(&tps->tps_lock);

It's not clear what this locking is intended to protect.  It looks like
this should just be using regmap_update_bits().

> +static const struct regmap_range tps65219_yes_ranges[] = {
> +	regmap_reg_range(TPS65219_REG_INT_SOURCE, TPS65219_REG_POWER_UP_STATUS),
> +};
> +
> +static const struct regmap_access_table tps65219_volatile_table = {
> +	.yes_ranges = tps65219_yes_ranges,
> +	.n_yes_ranges = ARRAY_SIZE(tps65219_yes_ranges),
> +};

tps65219_yes_ranges probably needs a clearer name.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [RFC PATCH 2/5] mfd: drivers: Add TI TPS65219 PMIC support
@ 2022-06-13 12:57     ` Mark Brown
  0 siblings, 0 replies; 22+ messages in thread
From: Mark Brown @ 2022-06-13 12:57 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, robh+dt, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

[-- Attachment #1: Type: text/plain, Size: 1619 bytes --]

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

> +/**
> + * tps65219_reg_read: Read a single tps65219 register.
> + *
> + * @tps: Device to read from.
> + * @reg: Register to read.
> + * @val: Contians the value
> + */
> +int tps65219_reg_read(struct tps65219 *tps, unsigned int reg,
> +			unsigned int *val)
> +{
> +	return regmap_read(tps->regmap, reg, val);
> +}
> +EXPORT_SYMBOL_GPL(tps65219_reg_read);

It is better practice to just expose the regmap and let the function
drivers use it, that means the function drivers can just use standard
helper functions.

> +static int tps65219_update_bits(struct tps65219 *tps, unsigned int reg,
> +		unsigned int mask, unsigned int val)
> +{
> +	int ret;
> +	unsigned int data;
> +
> +	ret = regmap_read(tps->regmap, reg, &data);
> +	if (ret) {
> +		dev_err(tps->dev, "Read from reg 0x%x failed\n", reg);
> +		return ret;
> +	}
> +
> +	data &= ~mask;
> +	data |= val & mask;
> +
> +	mutex_lock(&tps->tps_lock);
> +	ret = tps65219_reg_write(tps, reg, data);
> +	if (ret)
> +		dev_err(tps->dev, "Write for reg 0x%x failed\n", reg);
> +	mutex_unlock(&tps->tps_lock);

It's not clear what this locking is intended to protect.  It looks like
this should just be using regmap_update_bits().

> +static const struct regmap_range tps65219_yes_ranges[] = {
> +	regmap_reg_range(TPS65219_REG_INT_SOURCE, TPS65219_REG_POWER_UP_STATUS),
> +};
> +
> +static const struct regmap_access_table tps65219_volatile_table = {
> +	.yes_ranges = tps65219_yes_ranges,
> +	.n_yes_ranges = ARRAY_SIZE(tps65219_yes_ranges),
> +};

tps65219_yes_ranges probably needs a clearer name.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [RFC PATCH 3/5] regulator: drivers: Add TI TPS65219 PMIC regulators support
  2022-06-13  9:06   ` Jerome NEANNE
@ 2022-06-13 13:04     ` Mark Brown
  -1 siblings, 0 replies; 22+ messages in thread
From: Mark Brown @ 2022-06-13 13:04 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, robh+dt, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel


[-- Attachment #1.1: Type: text/plain, Size: 1909 bytes --]

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.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [RFC PATCH 3/5] regulator: drivers: Add TI TPS65219 PMIC regulators support
@ 2022-06-13 13:04     ` Mark Brown
  0 siblings, 0 replies; 22+ messages in thread
From: Mark Brown @ 2022-06-13 13:04 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, robh+dt, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

[-- Attachment #1: Type: text/plain, Size: 1909 bytes --]

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.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [RFC PATCH 5/5] arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board.
  2022-06-13  9:06   ` Jerome NEANNE
@ 2022-06-13 13:06     ` Mark Brown
  -1 siblings, 0 replies; 22+ messages in thread
From: Mark Brown @ 2022-06-13 13:06 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, robh+dt, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel


[-- Attachment #1.1: Type: text/plain, Size: 460 bytes --]

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.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [RFC PATCH 5/5] arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board.
@ 2022-06-13 13:06     ` Mark Brown
  0 siblings, 0 replies; 22+ messages in thread
From: Mark Brown @ 2022-06-13 13:06 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, robh+dt, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

[-- Attachment #1: Type: text/plain, Size: 460 bytes --]

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.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [RFC PATCH 2/5] mfd: drivers: Add TI TPS65219 PMIC support
  2022-06-13  9:06   ` Jerome NEANNE
@ 2022-06-14 21:03     ` Kevin Hilman
  -1 siblings, 0 replies; 22+ messages in thread
From: Kevin Hilman @ 2022-06-14 21:03 UTC (permalink / raw)
  To: Jerome NEANNE, lgirdwood, broonie, robh+dt, nm, kristo, will,
	lee.jones, jneanne
  Cc: narmstrong, msp, j-keerthy, linux-kernel, devicetree, linux-arm-kernel

Jerome NEANNE <jneanne@baylibre.com> writes:

> The TPS65219 is a power management IC PMIC designed
> to supply a wide range of SoCs
> in both portable and stationary applications.
> Any SoC can control TPS65219 over a standard I2C interface.
>
> It contains the following components:
> - Regulators.
> - Over Temperature warning and Shut down.
> - GPIOs
> - Multi Function Pins (MFP)
>
> This patch adds support for tps65219 mfd device. At this time only
> the functionalities listed below are made available:
>
> - Regulators probe and functionalities
> - warm and cold reset support
> - SW shutdown support
>
> Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>

[...]

> +/**
> + * pmic_rst_restart: trig tps65219 reset to SOC.
> + *
> + * Trigged via notifier
> + */
> +static int pmic_rst_restart(struct notifier_block *this,
> +			  unsigned long mode, void *cmd)
> +{
> +	struct tps65219 *tps;
> +
> +	tps = container_of(this, struct tps65219, nb);
> +	if (tps != NULL) {
> +		if (WARMNCOLD)

This value is hard-coded to 1 in the header, so war reset will always be
done.  

> +			tps65219_warm_reset(tps);
> +		else
> +			tps65219_cold_reset(tps);

Doesn't the reboot_notifier get a value like REBOOT_WARM,
REBOOT_COLD etc (c.f. enum in linux/reboot.h)  so you could properly select?

Kevin

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

* Re: [RFC PATCH 2/5] mfd: drivers: Add TI TPS65219 PMIC support
@ 2022-06-14 21:03     ` Kevin Hilman
  0 siblings, 0 replies; 22+ messages in thread
From: Kevin Hilman @ 2022-06-14 21:03 UTC (permalink / raw)
  To: Jerome NEANNE, lgirdwood, broonie, robh+dt, nm, kristo, will,
	lee.jones, jneanne
  Cc: narmstrong, msp, j-keerthy, linux-kernel, devicetree, linux-arm-kernel

Jerome NEANNE <jneanne@baylibre.com> writes:

> The TPS65219 is a power management IC PMIC designed
> to supply a wide range of SoCs
> in both portable and stationary applications.
> Any SoC can control TPS65219 over a standard I2C interface.
>
> It contains the following components:
> - Regulators.
> - Over Temperature warning and Shut down.
> - GPIOs
> - Multi Function Pins (MFP)
>
> This patch adds support for tps65219 mfd device. At this time only
> the functionalities listed below are made available:
>
> - Regulators probe and functionalities
> - warm and cold reset support
> - SW shutdown support
>
> Signed-off-by: Jerome NEANNE <jneanne@baylibre.com>

[...]

> +/**
> + * pmic_rst_restart: trig tps65219 reset to SOC.
> + *
> + * Trigged via notifier
> + */
> +static int pmic_rst_restart(struct notifier_block *this,
> +			  unsigned long mode, void *cmd)
> +{
> +	struct tps65219 *tps;
> +
> +	tps = container_of(this, struct tps65219, nb);
> +	if (tps != NULL) {
> +		if (WARMNCOLD)

This value is hard-coded to 1 in the header, so war reset will always be
done.  

> +			tps65219_warm_reset(tps);
> +		else
> +			tps65219_cold_reset(tps);

Doesn't the reboot_notifier get a value like REBOOT_WARM,
REBOOT_COLD etc (c.f. enum in linux/reboot.h)  so you could properly select?

Kevin

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [RFC PATCH 1/5] regulator: dt-bindings: Add TI TPS65219 PMIC bindings
  2022-06-13  9:06   ` Jerome NEANNE
@ 2022-06-16 17:52     ` Rob Herring
  -1 siblings, 0 replies; 22+ messages in thread
From: Rob Herring @ 2022-06-16 17:52 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, broonie, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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 <jneanne@baylibre.com>
> ---
>  .../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 <jerome.neanne@baylibre.com>
> +
> +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 <robh@kernel.org>

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

* Re: [RFC PATCH 1/5] regulator: dt-bindings: Add TI TPS65219 PMIC bindings
@ 2022-06-16 17:52     ` Rob Herring
  0 siblings, 0 replies; 22+ messages in thread
From: Rob Herring @ 2022-06-16 17:52 UTC (permalink / raw)
  To: Jerome NEANNE
  Cc: lgirdwood, broonie, nm, kristo, will, lee.jones, khilman,
	narmstrong, msp, j-keerthy, linux-kernel, devicetree,
	linux-arm-kernel

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 <jneanne@baylibre.com>
> ---
>  .../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 <jerome.neanne@baylibre.com>
> +
> +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 <robh@kernel.org>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

end of thread, other threads:[~2022-06-16 17:53 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-13  9:05 [RFC PATCH 0/5] Add TI TPS65219 PMIC support for AM642 SK board Jerome NEANNE
2022-06-13  9:05 ` Jerome NEANNE
2022-06-13  9:06 ` [RFC PATCH 1/5] regulator: dt-bindings: Add TI TPS65219 PMIC bindings Jerome NEANNE
2022-06-13  9:06   ` Jerome NEANNE
2022-06-16 17:52   ` Rob Herring
2022-06-16 17:52     ` Rob Herring
2022-06-13  9:06 ` [RFC PATCH 2/5] mfd: drivers: Add TI TPS65219 PMIC support Jerome NEANNE
2022-06-13  9:06   ` Jerome NEANNE
2022-06-13 12:57   ` Mark Brown
2022-06-13 12:57     ` Mark Brown
2022-06-14 21:03   ` Kevin Hilman
2022-06-14 21:03     ` Kevin Hilman
2022-06-13  9:06 ` [RFC PATCH 3/5] regulator: drivers: Add TI TPS65219 PMIC regulators support Jerome NEANNE
2022-06-13  9:06   ` Jerome NEANNE
2022-06-13 13:04   ` Mark Brown
2022-06-13 13:04     ` Mark Brown
2022-06-13  9:06 ` [RFC PATCH 4/5] arm64: Kconfig: Introduce CONFIG_MFD_TPS65219 and CONFIG_REGULATOR_TPS65219 Jerome NEANNE
2022-06-13  9:06   ` Jerome NEANNE
2022-06-13  9:06 ` [RFC PATCH 5/5] arm64: dts: ti: Add TI TPS65219 PMIC support for AM642 SK board Jerome NEANNE
2022-06-13  9:06   ` Jerome NEANNE
2022-06-13 13:06   ` Mark Brown
2022-06-13 13:06     ` Mark Brown

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.