This patchset series adds support for the TPS6594x PMIC along with
initial support for its RTC, and poweroff sequence.
Additionally, add usage of the PMIC for the various Jacintor platforms
devicetree's.
Changes from v1:
* Corrected devicetree documentation issues found with dt-schema
* Changed MFD references to PMIC reflecting the more valid use of driver
* Cleaning up variable naming and ordering within functions
* Adding gpio + regulator cells for upcoming driver support
* Switching from .probe to .probe_new API
* Revising comments within drivers to be more concise
* Adding device tree nodes for j721s2 and j721e platforms
Keerthy (3):
MFD: TPS6594x: Add new PMIC device driver for TPS6594x chips
rtc: rtc-tps6594x: Add support for TPS6594X PMIC RTC
arm64: dts: ti: k3-j7200-common-proc-board: Add TPS6594x PMIC node
Matt Ranostay (3):
Documentation: tps6594x: Add DT bindings for the TPS6594x PMIC
arm64: dts: ti: k3-j721e-common-proc-board: Add TPS6594x PMIC node
arm64: dts: ti: k3-j721s2-common-proc-board: Add TPS6594x PMIC node
.../devicetree/bindings/mfd/ti,tps6594x.yaml | 56 ++++++
.../dts/ti/k3-j7200-common-proc-board.dts | 16 ++
.../dts/ti/k3-j721e-common-proc-board.dts | 16 ++
.../dts/ti/k3-j721s2-common-proc-board.dts | 16 ++
drivers/mfd/Kconfig | 14 ++
drivers/mfd/Makefile | 1 +
drivers/mfd/tps6594x.c | 121 ++++++++++++
drivers/rtc/Kconfig | 10 +
drivers/rtc/Makefile | 1 +
drivers/rtc/rtc-tps6594x.c | 181 ++++++++++++++++++
include/linux/mfd/tps6594x.h | 84 ++++++++
11 files changed, 516 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml
create mode 100644 drivers/mfd/tps6594x.c
create mode 100644 drivers/rtc/rtc-tps6594x.c
create mode 100644 include/linux/mfd/tps6594x.h
--
2.36.1
From: Keerthy <[email protected]>
The TPS6594x chip is a PMIC, and contains the following components:
- Regulators
- GPIO controller
- RTC
However initially only RTC is supported.
Signed-off-by: Keerthy <[email protected]>
Signed-off-by: Matt Ranostay <[email protected]>
---
drivers/mfd/Kconfig | 14 ++++
drivers/mfd/Makefile | 1 +
drivers/mfd/tps6594x.c | 121 +++++++++++++++++++++++++++++++++++
include/linux/mfd/tps6594x.h | 84 ++++++++++++++++++++++++
4 files changed, 220 insertions(+)
create mode 100644 drivers/mfd/tps6594x.c
create mode 100644 include/linux/mfd/tps6594x.h
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index abb58ab1a1a4..4845683ae1d0 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1547,6 +1547,20 @@ config MFD_TI_LP873X
This driver can also be built as a module. If so, the module
will be called lp873x.
+config MFD_TPS6594X
+ tristate "TI TPS6594X Power Management IC"
+ depends on I2C && OF
+ select MFD_CORE
+ select REGMAP_I2C
+ help
+ If you say yes here then you get support for the TPS6594X series of
+ Power Management Integrated Circuits (PMIC).
+ These include voltage regulators, RTS, configurable
+ General Purpose Outputs (GPO) that are used in portable devices.
+
+ This driver can also be built as a module. If so, the module
+ will be called tps6594x.
+
config MFD_TI_LP87565
tristate "TI LP87565 Power Management IC"
depends on I2C && OF
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 858cacf659d6..7ff6a8a57d55 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -105,6 +105,7 @@ obj-$(CONFIG_MFD_TPS65910) += tps65910.o
obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o
obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o
obj-$(CONFIG_MFD_TPS65912_SPI) += tps65912-spi.o
+obj-$(CONFIG_MFD_TPS6594X) += tps6594x.o
obj-$(CONFIG_MENELAUS) += menelaus.o
obj-$(CONFIG_TWL4030_CORE) += twl-core.o twl4030-irq.o twl6030-irq.o
diff --git a/drivers/mfd/tps6594x.c b/drivers/mfd/tps6594x.c
new file mode 100644
index 000000000000..ff265b91db3e
--- /dev/null
+++ b/drivers/mfd/tps6594x.c
@@ -0,0 +1,121 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Driver for tps6594x PMIC chips
+ *
+ * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
+ * Author: Keerthy <[email protected]>
+ */
+
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/mfd/core.h>
+#include <linux/mfd/tps6594x.h>
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/regmap.h>
+
+static const struct regmap_config tps6594x_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .max_register = TPS6594X_REG_MAX,
+};
+
+static const struct mfd_cell tps6594x_cells[] = {
+ { .name = "tps6594x-gpio" },
+ { .name = "tps6594x-regulator" },
+ { .name = "tps6594x-rtc" },
+};
+
+static struct tps6594x *tps;
+
+static void tps6594x_power_off(void)
+{
+ regmap_write(tps->regmap, TPS6594X_FSM_NSLEEP_TRIGGERS,
+ TPS6594X_FSM_NSLEEP_NSLEEP1B | TPS6594X_FSM_NSLEEP_NSLEEP2B);
+
+ regmap_write(tps->regmap, TPS6594X_INT_STARTUP,
+ TPS6594X_INT_STARTUP_NPWRON_START_INT |
+ TPS6594X_INT_STARTUP_ENABLE_INT | TPS6594X_INT_STARTUP_RTC_INT |
+ TPS6594X_INT_STARTUP_SOFT_REBOOT_INT);
+
+ regmap_write(tps->regmap, TPS6594X_INT_MISC,
+ TPS6594X_INT_MISC_BIST_PASS_INT |
+ TPS6594X_INT_MISC_EXT_CLK_INT | TPS6594X_INT_MISC_TWARN_INT);
+
+ regmap_write(tps->regmap, TPS6594X_CONFIG_1,
+ TPS6594X_CONFIG_NSLEEP1_MASK | TPS6594X_CONFIG_NSLEEP2_MASK);
+
+ regmap_write(tps->regmap, TPS6594X_FSM_I2C_TRIGGERS,
+ TPS6594X_FSM_I2C_TRIGGERS_I2C0);
+}
+
+static int tps6594x_probe(struct i2c_client *client)
+{
+ struct tps6594x *ddata;
+ struct device_node *node = client->dev.of_node;
+ unsigned int otpid;
+ int ret;
+
+ ddata = devm_kzalloc(&client->dev, sizeof(*ddata), GFP_KERNEL);
+ if (!ddata)
+ return -ENOMEM;
+
+ ddata->dev = &client->dev;
+
+ ddata->regmap = devm_regmap_init_i2c(client, &tps6594x_regmap_config);
+ if (IS_ERR(ddata->regmap)) {
+ ret = PTR_ERR(ddata->regmap);
+ dev_err(ddata->dev,
+ "Failed to initialize register map: %d\n", ret);
+ return ret;
+ }
+
+ ret = regmap_read(ddata->regmap, TPS6594X_REG_DEV_REV, &otpid);
+ if (ret) {
+ dev_err(ddata->dev, "Failed to read OTP ID\n");
+ return ret;
+ }
+
+ ddata->rev = otpid;
+ i2c_set_clientdata(client, ddata);
+
+ ret = mfd_add_devices(ddata->dev, PLATFORM_DEVID_AUTO, tps6594x_cells,
+ ARRAY_SIZE(tps6594x_cells), NULL, 0, NULL);
+ if (ret) {
+ dev_err(ddata->dev, "Failed to register cells\n");
+ return ret;
+ }
+
+ tps = ddata;
+
+ if (of_property_read_bool(node, "ti,system-power-controller"))
+ pm_power_off = tps6594x_power_off;
+
+ return 0;
+}
+
+static const struct of_device_id of_tps6594x_match_table[] = {
+ { .compatible = "ti,tps6594x", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, of_tps6594x_match_table);
+
+static const struct i2c_device_id tps6594x_id_table[] = {
+ { "tps6594x", 0 },
+ {}
+};
+MODULE_DEVICE_TABLE(i2c, tps6594x_id_table);
+
+static struct i2c_driver tps6594x_driver = {
+ .driver = {
+ .name = "tps6594x",
+ .of_match_table = of_tps6594x_match_table,
+ },
+ .probe_new = tps6594x_probe,
+ .id_table = tps6594x_id_table,
+};
+module_i2c_driver(tps6594x_driver);
+
+MODULE_AUTHOR("J Keerthy <[email protected]>");
+MODULE_DESCRIPTION("TPS6594X PMIC device driver");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/mfd/tps6594x.h b/include/linux/mfd/tps6594x.h
new file mode 100644
index 000000000000..5a6af0da9223
--- /dev/null
+++ b/include/linux/mfd/tps6594x.h
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Core driver interface for TI TPS6594x PMIC family
+ *
+ * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
+ */
+
+#ifndef __MFD_TPS6594X_H
+#define __MFD_TPS6594X_H
+
+#include <linux/bits.h>
+
+/* TPS6594x chip ID list */
+#define TPS6594X 0x00
+
+/* All register addresses */
+#define TPS6594X_REG_DEV_REV 0x01
+#define TPS6594X_INT_STARTUP 0x65
+#define TPS6594X_INT_MISC 0x66
+#define TPS6594X_CONFIG_1 0x7d
+#define TPS6594X_FSM_I2C_TRIGGERS 0x85
+#define TPS6594X_FSM_NSLEEP_TRIGGERS 0x86
+
+#define TPS6594X_RTC_SECONDS 0xb5
+#define TPS6594X_RTC_MINUTES 0xb6
+#define TPS6594X_RTC_HOURS 0xb7
+#define TPS6594X_RTC_DAYS 0xb8
+#define TPS6594X_RTC_MONTHS 0xb9
+#define TPS6594X_RTC_YEARS 0xba
+#define TPS6594X_RTC_WEEKS 0xbb
+#define TPS6594X_ALARM_SECONDS 0xbc
+#define TPS6594X_ALARM_MINUTES 0xbd
+#define TPS6594X_ALARM_HOURS 0xbe
+#define TPS6594X_ALARM_DAYS 0xbf
+#define TPS6594X_ALARM_MONTHS 0xc0
+#define TPS6594X_ALARM_YEARS 0xc1
+#define TPS6594X_RTC_CTRL_1 0xc2
+#define TPS6594X_RTC_CTRL_2 0xc3
+#define TPS6594X_RTC_STATUS 0xc4
+#define TPS6594X_RTC_INTERRUPTS 0xc5
+#define TPS6594X_REG_MAX 0xd0
+
+/* Register field definitions */
+#define TPS6594X_DEV_REV_DEV_ID 0xff
+
+#define TPS6594X_INT_STARTUP_NPWRON_START_INT BIT(0)
+#define TPS6594X_INT_STARTUP_ENABLE_INT BIT(1)
+#define TPS6594X_INT_STARTUP_RTC_INT BIT(2)
+#define TPS6594X_INT_STARTUP_FSD_INT BIT(4)
+#define TPS6594X_INT_STARTUP_SOFT_REBOOT_INT BIT(5)
+
+#define TPS6594X_INT_MISC_BIST_PASS_INT BIT(0)
+#define TPS6594X_INT_MISC_EXT_CLK_INT BIT(1)
+#define TPS6594X_INT_MISC_TWARN_INT BIT(3)
+
+#define TPS6594X_CONFIG_NSLEEP1_MASK BIT(6)
+#define TPS6594X_CONFIG_NSLEEP2_MASK BIT(7)
+
+#define TPS6594X_FSM_I2C_TRIGGERS_I2C0 BIT(0)
+
+#define TPS6594X_FSM_NSLEEP_NSLEEP1B BIT(0)
+#define TPS6594X_FSM_NSLEEP_NSLEEP2B BIT(1)
+
+#define TPS6594X_RTC_CTRL_REG_GET_TIME BIT(6)
+#define TPS6594X_RTC_CTRL_REG_STOP_RTC BIT(0)
+#define TPS6594X_RTC_INTERRUPTS_REG_IT_ALARM BIT(3)
+
+#define TPS6594X_RTC_STATUS_RUN BIT(1)
+
+/**
+ * struct tps6594x - state holder for the tps6594x driver
+ * @dev: struct device pointer for MFD device
+ * @rev: revision of the tps6594x
+ * @lock: lock guarding the data structure
+ * @regmap: register map of the tps6594x PMIC
+ *
+ * Device data may be used to access the TPS6594X chip
+ */
+struct tps6594x {
+ struct device *dev;
+ u8 rev;
+ struct regmap *regmap;
+};
+#endif /* __MFD_TPS6594X_H */
--
2.36.1
Add TPS6594x PMIC + RTC definition for j721e common processor board
device tree.
Signed-off-by: Matt Ranostay <[email protected]>
---
.../boot/dts/ti/k3-j721e-common-proc-board.dts | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
index b1691ac3442d..f7b8b40993bd 100644
--- a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
+++ b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
@@ -995,3 +995,19 @@ &main_mcan12 {
&main_mcan13 {
status = "disabled";
};
+
+&wkup_i2c0 {
+ status = "okay";
+};
+
+&wkup_i2c0 {
+ tps6594x: tps6594x@48 {
+ compatible = "ti,tps6594x";
+ reg = <0x48>;
+ ti,system-power-controller;
+
+ rtc {
+ compatible = "ti,tps6594x-rtc";
+ };
+ };
+};
--
2.36.1
Add TPS6594x PMIC + RTC definition for j721s2 common processor board
device tree.
Signed-off-by: Matt Ranostay <[email protected]>
---
.../boot/dts/ti/k3-j721s2-common-proc-board.dts | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/arch/arm64/boot/dts/ti/k3-j721s2-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721s2-common-proc-board.dts
index b210cc07c539..0156a700f5df 100644
--- a/arch/arm64/boot/dts/ti/k3-j721s2-common-proc-board.dts
+++ b/arch/arm64/boot/dts/ti/k3-j721s2-common-proc-board.dts
@@ -429,3 +429,19 @@ &main_mcan15 {
&main_mcan17 {
status = "disabled";
};
+
+&wkup_i2c0 {
+ status = "okay";
+};
+
+&wkup_i2c0 {
+ tps6594x: tps6594x@48 {
+ compatible = "ti,tps6594x";
+ reg = <0x48>;
+ ti,system-power-controller;
+
+ rtc {
+ compatible = "ti,tps6594x-rtc";
+ };
+ };
+};
--
2.36.1
Signed-off-by: Matt Ranostay <[email protected]>
---
.../devicetree/bindings/mfd/ti,tps6594x.yaml | 56 +++++++++++++++++++
1 file changed, 56 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml
diff --git a/Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml b/Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml
new file mode 100644
index 000000000000..9b5e17f63709
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml
@@ -0,0 +1,56 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/ti,tps6594x.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: TPS6594x Power Management Integrated Circuit (PMIC)
+
+maintainers:
+ - Keerthy <[email protected]>
+
+properties:
+ compatible:
+ contains:
+ enum:
+ - ti,tps6594x
+
+ reg:
+ const: 0x48
+ description: I2C slave address
+
+ ti,system-power-controller:
+ type: boolean
+ description: PMIC is controlling the system power.
+
+ rtc:
+ type: object
+ $ref: /schemas/rtc/rtc.yaml#
+ unevaluatedProperties: false
+ properties:
+ compatible:
+ const: ti,tps6594x-rtc
+
+additionalProperties: false
+
+required:
+ - compatible
+ - reg
+
+examples:
+ - |
+ i2c0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ pmic: pmic@48 {
+ compatible = "ti,tps6594x";
+ reg = <0x48>;
+
+ rtc {
+ compatible = "ti,tps6594x-rtc";
+ };
+ };
+ };
+
+...
--
2.36.1
From: Keerthy <[email protected]>
Add support for TPS6594X PMIC RTC. However, currently only get/set of
time + date functionality is supported..
Signed-off-by: Keerthy <[email protected]>
Signed-off-by: Matt Ranostay <[email protected]>
---
drivers/rtc/Kconfig | 10 ++
drivers/rtc/Makefile | 1 +
drivers/rtc/rtc-tps6594x.c | 181 +++++++++++++++++++++++++++++++++++++
3 files changed, 192 insertions(+)
create mode 100644 drivers/rtc/rtc-tps6594x.c
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index b8de25118ad0..df8e78eed5fb 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -593,6 +593,16 @@ config RTC_DRV_TPS65910
This driver can also be built as a module. If so, the module
will be called rtc-tps65910.
+config RTC_DRV_TPS6594X
+ tristate "TI TPS6594X RTC driver"
+ depends on MFD_TPS6594X
+ help
+ If you say yes here you get support for the RTC of TI TPS6594X series PMIC
+ chips.
+
+ This driver can also be built as a module. If so, the module
+ will be called rtc-tps6594x.
+
config RTC_DRV_RC5T583
tristate "RICOH 5T583 RTC driver"
depends on MFD_RC5T583
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index aab22bc63432..d854e162275a 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -177,6 +177,7 @@ obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o
obj-$(CONFIG_RTC_DRV_TI_K3) += rtc-ti-k3.o
obj-$(CONFIG_RTC_DRV_TPS6586X) += rtc-tps6586x.o
obj-$(CONFIG_RTC_DRV_TPS65910) += rtc-tps65910.o
+obj-$(CONFIG_RTC_DRV_TPS6594X) += rtc-tps6594x.o
obj-$(CONFIG_RTC_DRV_TWL4030) += rtc-twl.o
obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o
obj-$(CONFIG_RTC_DRV_VT8500) += rtc-vt8500.o
diff --git a/drivers/rtc/rtc-tps6594x.c b/drivers/rtc/rtc-tps6594x.c
new file mode 100644
index 000000000000..e9f904d0a769
--- /dev/null
+++ b/drivers/rtc/rtc-tps6594x.c
@@ -0,0 +1,181 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * rtc-tps6594x.c -- TPS6594x Real Time Clock driver.
+ *
+ * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com
+ *
+ * TODO: alarm support
+ */
+
+#include <linux/bcd.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/mfd/tps6594x.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/rtc.h>
+#include <linux/types.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+struct tps6594x_rtc {
+ struct rtc_device *rtc;
+ struct device *dev;
+};
+
+#define TPS6594X_NUM_TIME_REGS (TPS6594X_RTC_YEARS - TPS6594X_RTC_SECONDS + 1)
+
+static int tps6594x_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+ unsigned char rtc_data[TPS6594X_NUM_TIME_REGS];
+ struct tps6594x *tps6594x = dev_get_drvdata(dev->parent);
+ int ret;
+
+ /* Reset TPS6594X_RTC_CTRL_REG_GET_TIME bit to zero, required for latch */
+ ret = regmap_update_bits(tps6594x->regmap, TPS6594X_RTC_CTRL_1,
+ TPS6594X_RTC_CTRL_REG_GET_TIME, 0);
+ if (ret < 0) {
+ dev_err(dev, "RTC CTRL reg update failed, err: %d\n", ret);
+ return ret;
+ }
+
+ /* Copy RTC counting registers to static registers or latches */
+ ret = regmap_update_bits(tps6594x->regmap, TPS6594X_RTC_CTRL_1,
+ TPS6594X_RTC_CTRL_REG_GET_TIME, TPS6594X_RTC_CTRL_REG_GET_TIME);
+ if (ret < 0) {
+ dev_err(dev, "RTC CTRL reg update failed, err: %d\n", ret);
+ return ret;
+ }
+
+ ret = regmap_bulk_read(tps6594x->regmap, TPS6594X_RTC_SECONDS,
+ rtc_data, TPS6594X_NUM_TIME_REGS);
+ if (ret < 0) {
+ dev_err(dev, "RTC_SECONDS reg read failed, err = %d\n", ret);
+ return ret;
+ }
+
+ tm->tm_sec = bcd2bin(rtc_data[0]);
+ tm->tm_min = bcd2bin(rtc_data[1]);
+ tm->tm_hour = bcd2bin(rtc_data[2]);
+ tm->tm_mday = bcd2bin(rtc_data[3]);
+ tm->tm_mon = bcd2bin(rtc_data[4]) - 1;
+ tm->tm_year = bcd2bin(rtc_data[5]) + 100;
+
+ return ret;
+}
+
+static int tps6594x_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+ unsigned char rtc_data[TPS6594X_NUM_TIME_REGS];
+ struct tps6594x *tps6594x = dev_get_drvdata(dev->parent);
+ int ret, retries = 5;
+ unsigned int val;
+
+ rtc_data[0] = bin2bcd(tm->tm_sec);
+ rtc_data[1] = bin2bcd(tm->tm_min);
+ rtc_data[2] = bin2bcd(tm->tm_hour);
+ rtc_data[3] = bin2bcd(tm->tm_mday);
+ rtc_data[4] = bin2bcd(tm->tm_mon + 1);
+ rtc_data[5] = bin2bcd(tm->tm_year - 100);
+
+ /* Stop RTC while updating the RTC time registers */
+ ret = regmap_update_bits(tps6594x->regmap, TPS6594X_RTC_CTRL_1,
+ TPS6594X_RTC_CTRL_REG_STOP_RTC, 0);
+ if (ret < 0) {
+ dev_err(dev, "RTC stop failed, err = %d\n", ret);
+ return ret;
+ }
+
+ /* Waiting till RTC isn't running */
+ do {
+ ret = regmap_read(tps6594x->regmap, TPS6594X_RTC_STATUS, &val);
+ if (ret < 0) {
+ dev_err(dev, "RTC_STATUS reg read failed, err = %d\n", ret);
+ return ret;
+ }
+ msleep(20);
+ } while (--retries && (val & TPS6594X_RTC_STATUS_RUN));
+
+ if (!retries) {
+ dev_err(dev, "RTC_STATUS is still RUNNING\n");
+ return -ETIMEDOUT;
+ }
+
+ ret = regmap_bulk_write(tps6594x->regmap, TPS6594X_RTC_SECONDS,
+ rtc_data, TPS6594X_NUM_TIME_REGS);
+ if (ret < 0) {
+ dev_err(dev, "RTC_SECONDS reg write failed, err = %d\n", ret);
+ return ret;
+ }
+
+ /* Start back RTC */
+ ret = regmap_update_bits(tps6594x->regmap, TPS6594X_RTC_CTRL_1,
+ TPS6594X_RTC_CTRL_REG_STOP_RTC,
+ TPS6594X_RTC_CTRL_REG_STOP_RTC);
+ if (ret < 0)
+ dev_err(dev, "RTC start failed, err = %d\n", ret);
+
+ return ret;
+}
+
+static const struct rtc_class_ops tps6594x_rtc_ops = {
+ .read_time = tps6594x_rtc_read_time,
+ .set_time = tps6594x_rtc_set_time,
+};
+
+static int tps6594x_rtc_probe(struct platform_device *pdev)
+{
+ struct tps6594x *tps6594x = dev_get_drvdata(pdev->dev.parent);
+ struct tps6594x_rtc *tps6594x_rtc = NULL;
+ int ret;
+
+ tps6594x_rtc = devm_kzalloc(&pdev->dev, sizeof(struct tps6594x_rtc), GFP_KERNEL);
+ if (!tps6594x_rtc)
+ return -ENOMEM;
+
+ tps6594x_rtc->dev = &pdev->dev;
+ platform_set_drvdata(pdev, tps6594x_rtc);
+
+ /* Start RTC */
+ ret = regmap_update_bits(tps6594x->regmap, TPS6594X_RTC_CTRL_1,
+ TPS6594X_RTC_CTRL_REG_STOP_RTC,
+ TPS6594X_RTC_CTRL_REG_STOP_RTC);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "RTC_CTRL write failed, err = %d\n", ret);
+ return ret;
+ }
+
+ tps6594x_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
+ &tps6594x_rtc_ops, THIS_MODULE);
+ if (IS_ERR(tps6594x_rtc->rtc)) {
+ ret = PTR_ERR(tps6594x_rtc->rtc);
+ dev_err(&pdev->dev, "RTC register failed, err = %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+#ifdef CONFIG_OF
+static const struct of_device_id of_tps6594x_rtc_match[] = {
+ { .compatible = "ti,tps6594x-rtc", },
+ {},
+};
+MODULE_DEVICE_TABLE(of, of_tps6594x_rtc_match);
+#endif
+
+static struct platform_driver tps6594x_rtc_driver = {
+ .probe = tps6594x_rtc_probe,
+ .driver = {
+ .name = "tps6594x-rtc",
+ .of_match_table = of_match_ptr(of_tps6594x_rtc_match),
+ },
+};
+
+module_platform_driver(tps6594x_rtc_driver);
+
+MODULE_ALIAS("platform:tps6594x_rtc");
+MODULE_DESCRIPTION("TI TPS6594x series RTC driver");
+MODULE_AUTHOR("Keerthy J <[email protected]>");
+MODULE_LICENSE("GPL");
--
2.36.1
From: Keerthy <[email protected]>
Add TPS6594x PMIC + RTC definition for J7200 common processor board
device tree.
Signed-off-by: Keerthy <[email protected]>
---
.../boot/dts/ti/k3-j7200-common-proc-board.dts | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/arch/arm64/boot/dts/ti/k3-j7200-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j7200-common-proc-board.dts
index 121975dc8239..6deab4f9a04b 100644
--- a/arch/arm64/boot/dts/ti/k3-j7200-common-proc-board.dts
+++ b/arch/arm64/boot/dts/ti/k3-j7200-common-proc-board.dts
@@ -353,3 +353,19 @@ &pcie1_ep {
num-lanes = <2>;
status = "disabled";
};
+
+&wkup_i2c0 {
+ status = "okay";
+};
+
+&wkup_i2c0 {
+ tps6594x: tps6594x@48 {
+ compatible = "ti,tps6594x";
+ reg = <0x48>;
+ ti,system-power-controller;
+
+ rtc {
+ compatible = "ti,tps6594x-rtc";
+ };
+ };
+};
--
2.36.1
On Thu, 11 Aug 2022, Matt Ranostay wrote:
> From: Keerthy <[email protected]>
>
> The TPS6594x chip is a PMIC, and contains the following components:
>
> - Regulators
> - GPIO controller
> - RTC
>
> However initially only RTC is supported.
>
> Signed-off-by: Keerthy <[email protected]>
> Signed-off-by: Matt Ranostay <[email protected]>
> ---
> drivers/mfd/Kconfig | 14 ++++
> drivers/mfd/Makefile | 1 +
> drivers/mfd/tps6594x.c | 121 +++++++++++++++++++++++++++++++++++
> include/linux/mfd/tps6594x.h | 84 ++++++++++++++++++++++++
> 4 files changed, 220 insertions(+)
> create mode 100644 drivers/mfd/tps6594x.c
> create mode 100644 include/linux/mfd/tps6594x.h
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index abb58ab1a1a4..4845683ae1d0 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1547,6 +1547,20 @@ config MFD_TI_LP873X
> This driver can also be built as a module. If so, the module
> will be called lp873x.
>
> +config MFD_TPS6594X
> + tristate "TI TPS6594X Power Management IC"
> + depends on I2C && OF
> + select MFD_CORE
> + select REGMAP_I2C
> + help
> + If you say yes here then you get support for the TPS6594X series of
> + Power Management Integrated Circuits (PMIC).
> + These include voltage regulators, RTS, configurable
> + General Purpose Outputs (GPO) that are used in portable devices.
> +
> + This driver can also be built as a module. If so, the module
> + will be called tps6594x.
> +
> config MFD_TI_LP87565
> tristate "TI LP87565 Power Management IC"
> depends on I2C && OF
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 858cacf659d6..7ff6a8a57d55 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -105,6 +105,7 @@ obj-$(CONFIG_MFD_TPS65910) += tps65910.o
> obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o
> obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o
> obj-$(CONFIG_MFD_TPS65912_SPI) += tps65912-spi.o
> +obj-$(CONFIG_MFD_TPS6594X) += tps6594x.o
> obj-$(CONFIG_MENELAUS) += menelaus.o
>
> obj-$(CONFIG_TWL4030_CORE) += twl-core.o twl4030-irq.o twl6030-irq.o
> diff --git a/drivers/mfd/tps6594x.c b/drivers/mfd/tps6594x.c
> new file mode 100644
> index 000000000000..ff265b91db3e
> --- /dev/null
> +++ b/drivers/mfd/tps6594x.c
> @@ -0,0 +1,121 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Driver for tps6594x PMIC chips
> + *
> + * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
> + * Author: Keerthy <[email protected]>
> + */
> +
> +#include <linux/of.h>
> +#include <linux/of_device.h>
> +#include <linux/mfd/core.h>
> +#include <linux/mfd/tps6594x.h>
> +#include <linux/module.h>
> +#include <linux/i2c.h>
> +#include <linux/regmap.h>
> +
> +static const struct regmap_config tps6594x_regmap_config = {
> + .reg_bits = 8,
> + .val_bits = 8,
> + .max_register = TPS6594X_REG_MAX,
> +};
> +
> +static const struct mfd_cell tps6594x_cells[] = {
> + { .name = "tps6594x-gpio" },
> + { .name = "tps6594x-regulator" },
> + { .name = "tps6594x-rtc" },
> +};
Where are the device drivers for these?
--
Lee Jones [李琼斯]
On Thu, Aug 11, 2022 at 08:22:37PM -0700, Matt Ranostay wrote:
> Signed-off-by: Matt Ranostay <[email protected]>
Commit message? Use a subject prefix appropriate for the subsystem.
> ---
> .../devicetree/bindings/mfd/ti,tps6594x.yaml | 56 +++++++++++++++++++
> 1 file changed, 56 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml
>
> diff --git a/Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml b/Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml
> new file mode 100644
> index 000000000000..9b5e17f63709
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/ti,tps6594x.yaml
> @@ -0,0 +1,56 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/mfd/ti,tps6594x.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: TPS6594x Power Management Integrated Circuit (PMIC)
> +
> +maintainers:
> + - Keerthy <[email protected]>
> +
> +properties:
> + compatible:
> + contains:
No, this means '"foo", "ti,tps6594x", "bar"' is valid.
> + enum:
Use 'const' if only 1 entry.
> + - ti,tps6594x
Don't use wildcards in compatible strings.
> +
> + reg:
> + const: 0x48
> + description: I2C slave address
> +
> + ti,system-power-controller:
> + type: boolean
> + description: PMIC is controlling the system power.
> +
> + rtc:
Why do you need a sub-node here? Is the RTC a separate block with its
own resources?
> + type: object
> + $ref: /schemas/rtc/rtc.yaml#
> + unevaluatedProperties: false
> + properties:
> + compatible:
> + const: ti,tps6594x-rtc
> +
> +additionalProperties: false
> +
> +required:
> + - compatible
> + - reg
> +
> +examples:
> + - |
> + i2c0 {
i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + pmic: pmic@48 {
> + compatible = "ti,tps6594x";
> + reg = <0x48>;
> +
> + rtc {
> + compatible = "ti,tps6594x-rtc";
> + };
> + };
> + };
> +
> +...
> --
> 2.36.1
>
>
On Fri, Aug 12, 2022 at 08:01:04AM +0100, Lee Jones wrote:
> On Thu, 11 Aug 2022, Matt Ranostay wrote:
>
> > From: Keerthy <[email protected]>
> >
> > The TPS6594x chip is a PMIC, and contains the following components:
> >
> > - Regulators
> > - GPIO controller
> > - RTC
> >
> > However initially only RTC is supported.
> >
> > Signed-off-by: Keerthy <[email protected]>
> > Signed-off-by: Matt Ranostay <[email protected]>
> > ---
> > drivers/mfd/Kconfig | 14 ++++
> > drivers/mfd/Makefile | 1 +
> > drivers/mfd/tps6594x.c | 121 +++++++++++++++++++++++++++++++++++
> > include/linux/mfd/tps6594x.h | 84 ++++++++++++++++++++++++
> > 4 files changed, 220 insertions(+)
> > create mode 100644 drivers/mfd/tps6594x.c
> > create mode 100644 include/linux/mfd/tps6594x.h
> >
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index abb58ab1a1a4..4845683ae1d0 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -1547,6 +1547,20 @@ config MFD_TI_LP873X
> > This driver can also be built as a module. If so, the module
> > will be called lp873x.
> >
> > +config MFD_TPS6594X
> > + tristate "TI TPS6594X Power Management IC"
> > + depends on I2C && OF
> > + select MFD_CORE
> > + select REGMAP_I2C
> > + help
> > + If you say yes here then you get support for the TPS6594X series of
> > + Power Management Integrated Circuits (PMIC).
> > + These include voltage regulators, RTS, configurable
> > + General Purpose Outputs (GPO) that are used in portable devices.
> > +
> > + This driver can also be built as a module. If so, the module
> > + will be called tps6594x.
> > +
> > config MFD_TI_LP87565
> > tristate "TI LP87565 Power Management IC"
> > depends on I2C && OF
> > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > index 858cacf659d6..7ff6a8a57d55 100644
> > --- a/drivers/mfd/Makefile
> > +++ b/drivers/mfd/Makefile
> > @@ -105,6 +105,7 @@ obj-$(CONFIG_MFD_TPS65910) += tps65910.o
> > obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o
> > obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o
> > obj-$(CONFIG_MFD_TPS65912_SPI) += tps65912-spi.o
> > +obj-$(CONFIG_MFD_TPS6594X) += tps6594x.o
> > obj-$(CONFIG_MENELAUS) += menelaus.o
> >
> > obj-$(CONFIG_TWL4030_CORE) += twl-core.o twl4030-irq.o twl6030-irq.o
> > diff --git a/drivers/mfd/tps6594x.c b/drivers/mfd/tps6594x.c
> > new file mode 100644
> > index 000000000000..ff265b91db3e
> > --- /dev/null
> > +++ b/drivers/mfd/tps6594x.c
> > @@ -0,0 +1,121 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Driver for tps6594x PMIC chips
> > + *
> > + * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
> > + * Author: Keerthy <[email protected]>
> > + */
> > +
> > +#include <linux/of.h>
> > +#include <linux/of_device.h>
> > +#include <linux/mfd/core.h>
> > +#include <linux/mfd/tps6594x.h>
> > +#include <linux/module.h>
> > +#include <linux/i2c.h>
> > +#include <linux/regmap.h>
> > +
> > +static const struct regmap_config tps6594x_regmap_config = {
> > + .reg_bits = 8,
> > + .val_bits = 8,
> > + .max_register = TPS6594X_REG_MAX,
> > +};
> > +
> > +static const struct mfd_cell tps6594x_cells[] = {
> > + { .name = "tps6594x-gpio" },
> > + { .name = "tps6594x-regulator" },
> > + { .name = "tps6594x-rtc" },
> > +};
>
> Where are the device drivers for these?
>
They currently don't exist. Would these need to be merged/developed
before the acceptance of the mfd driver?
- Matt
> --
> Lee Jones [李琼斯]
On Tue, 30 Aug 2022, Matt Ranostay wrote:
> On Fri, Aug 12, 2022 at 08:01:04AM +0100, Lee Jones wrote:
> > On Thu, 11 Aug 2022, Matt Ranostay wrote:
> >
> > > From: Keerthy <[email protected]>
> > >
> > > The TPS6594x chip is a PMIC, and contains the following components:
> > >
> > > - Regulators
> > > - GPIO controller
> > > - RTC
> > >
> > > However initially only RTC is supported.
> > >
> > > Signed-off-by: Keerthy <[email protected]>
> > > Signed-off-by: Matt Ranostay <[email protected]>
> > > ---
> > > drivers/mfd/Kconfig | 14 ++++
> > > drivers/mfd/Makefile | 1 +
> > > drivers/mfd/tps6594x.c | 121 +++++++++++++++++++++++++++++++++++
> > > include/linux/mfd/tps6594x.h | 84 ++++++++++++++++++++++++
> > > 4 files changed, 220 insertions(+)
> > > create mode 100644 drivers/mfd/tps6594x.c
> > > create mode 100644 include/linux/mfd/tps6594x.h
> > >
> > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > index abb58ab1a1a4..4845683ae1d0 100644
> > > --- a/drivers/mfd/Kconfig
> > > +++ b/drivers/mfd/Kconfig
> > > @@ -1547,6 +1547,20 @@ config MFD_TI_LP873X
> > > This driver can also be built as a module. If so, the module
> > > will be called lp873x.
> > >
> > > +config MFD_TPS6594X
> > > + tristate "TI TPS6594X Power Management IC"
> > > + depends on I2C && OF
> > > + select MFD_CORE
> > > + select REGMAP_I2C
> > > + help
> > > + If you say yes here then you get support for the TPS6594X series of
> > > + Power Management Integrated Circuits (PMIC).
> > > + These include voltage regulators, RTS, configurable
> > > + General Purpose Outputs (GPO) that are used in portable devices.
> > > +
> > > + This driver can also be built as a module. If so, the module
> > > + will be called tps6594x.
> > > +
> > > config MFD_TI_LP87565
> > > tristate "TI LP87565 Power Management IC"
> > > depends on I2C && OF
> > > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > > index 858cacf659d6..7ff6a8a57d55 100644
> > > --- a/drivers/mfd/Makefile
> > > +++ b/drivers/mfd/Makefile
> > > @@ -105,6 +105,7 @@ obj-$(CONFIG_MFD_TPS65910) += tps65910.o
> > > obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o
> > > obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o
> > > obj-$(CONFIG_MFD_TPS65912_SPI) += tps65912-spi.o
> > > +obj-$(CONFIG_MFD_TPS6594X) += tps6594x.o
> > > obj-$(CONFIG_MENELAUS) += menelaus.o
> > >
> > > obj-$(CONFIG_TWL4030_CORE) += twl-core.o twl4030-irq.o twl6030-irq.o
> > > diff --git a/drivers/mfd/tps6594x.c b/drivers/mfd/tps6594x.c
> > > new file mode 100644
> > > index 000000000000..ff265b91db3e
> > > --- /dev/null
> > > +++ b/drivers/mfd/tps6594x.c
> > > @@ -0,0 +1,121 @@
> > > +// SPDX-License-Identifier: GPL-2.0-or-later
> > > +/*
> > > + * Driver for tps6594x PMIC chips
> > > + *
> > > + * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
> > > + * Author: Keerthy <[email protected]>
> > > + */
> > > +
> > > +#include <linux/of.h>
> > > +#include <linux/of_device.h>
> > > +#include <linux/mfd/core.h>
> > > +#include <linux/mfd/tps6594x.h>
> > > +#include <linux/module.h>
> > > +#include <linux/i2c.h>
> > > +#include <linux/regmap.h>
> > > +
> > > +static const struct regmap_config tps6594x_regmap_config = {
> > > + .reg_bits = 8,
> > > + .val_bits = 8,
> > > + .max_register = TPS6594X_REG_MAX,
> > > +};
> > > +
> > > +static const struct mfd_cell tps6594x_cells[] = {
> > > + { .name = "tps6594x-gpio" },
> > > + { .name = "tps6594x-regulator" },
> > > + { .name = "tps6594x-rtc" },
> > > +};
> >
> > Where are the device drivers for these?
> >
>
> They currently don't exist. Would these need to be merged/developed
> before the acceptance of the mfd driver?
Yes, they would.
--
Lee Jones [李琼斯]