]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sysreset: implement MAX77663 sysreset functions
authorSvyatoslav Ryhel <clamor95@gmail.com>
Tue, 24 Oct 2023 07:49:05 +0000 (10:49 +0300)
committerTom Rini <trini@konsulko.com>
Fri, 3 Nov 2023 21:40:40 +0000 (17:40 -0400)
MAX77663 PMIC has embedded poweroff function used by some
device to initiane device power off. Implement it as sysreset
driver.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
drivers/power/pmic/max77663.c
drivers/sysreset/Kconfig
drivers/sysreset/Makefile
drivers/sysreset/sysreset_max77663.c [new file with mode: 0644]
include/power/max77663.h

index fac97ed221eac63304404cdefaba46fab7e48dba..68c3cbbc646967912a4b43f343387717d97c2ac2 100644 (file)
@@ -44,7 +44,16 @@ static int max77663_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
 static int max77663_bind(struct udevice *dev)
 {
        ofnode regulators_node;
-       int children;
+       int children, ret;
+
+       if (IS_ENABLED(CONFIG_SYSRESET_MAX77663)) {
+               ret = device_bind_driver(dev, MAX77663_RST_DRIVER,
+                                        "sysreset", NULL);
+               if (ret) {
+                       log_err("cannot bind SYSRESET (ret = %d)\n", ret);
+                       return ret;
+               }
+       }
 
        regulators_node = dev_read_subnode(dev, "regulators");
        if (!ofnode_valid(regulators_node)) {
index eab556c3499e6561c522cd6d11e908d0271fd8e3..bc358961012f0a6d5260a5de39d65540cab3f6b8 100644 (file)
@@ -74,6 +74,13 @@ config SYSRESET_GPIO
          example on Microblaze where reset logic can be controlled via GPIO
          pin which triggers cpu reset.
 
+config SYSRESET_MAX77663
+       bool "Enable support for MAX77663 PMIC System Reset"
+       depends on DM_PMIC_MAX77663
+       select SYSRESET_CMD_POWEROFF if CMD_POWEROFF
+       help
+         Enable system power management functions found in MAX77663 PMIC.
+
 config SYSRESET_MICROBLAZE
        bool "Enable support for Microblaze soft reset"
        depends on MICROBLAZE
index a9ac12375422a291b88294803163f762f8c9b2c2..c31f51c581a273eb733d49f331198d5d97106ea7 100644 (file)
@@ -9,6 +9,7 @@ obj-$(CONFIG_ARCH_STI) += sysreset_sti.o
 obj-$(CONFIG_SANDBOX) += sysreset_sandbox.o
 obj-$(CONFIG_POWEROFF_GPIO) += poweroff_gpio.o
 obj-$(CONFIG_SYSRESET_GPIO) += sysreset_gpio.o
+obj-$(CONFIG_$(SPL_TPL_)SYSRESET_MAX77663) += sysreset_max77663.o
 obj-$(CONFIG_SYSRESET_MPC83XX) += sysreset_mpc83xx.o
 obj-$(CONFIG_SYSRESET_MICROBLAZE) += sysreset_microblaze.o
 obj-$(CONFIG_SYSRESET_OCTEON) += sysreset_octeon.o
diff --git a/drivers/sysreset/sysreset_max77663.c b/drivers/sysreset/sysreset_max77663.c
new file mode 100644 (file)
index 0000000..8febcf8
--- /dev/null
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
+ */
+
+#include <dm.h>
+#include <i2c.h>
+#include <errno.h>
+#include <sysreset.h>
+#include <power/pmic.h>
+#include <power/max77663.h>
+
+static int max77663_sysreset_request(struct udevice *dev,
+                                    enum sysreset_t type)
+{
+       int val;
+
+       val = pmic_reg_read(dev->parent, MAX77663_REG_ONOFF_CFG1);
+       if (val < 0)
+               return val;
+
+       /* clear both bits */
+       val &= ~ONOFF_SFT_RST;
+       val &= ~ONOFF_PWR_OFF;
+
+       switch (type) {
+       case SYSRESET_POWER:
+               /* MAX77663: SFT_RST > ONOFF_CFG1 */
+               pmic_reg_write(dev->parent, MAX77663_REG_ONOFF_CFG1,
+                              val | ONOFF_SFT_RST);
+               break;
+       case SYSRESET_POWER_OFF:
+               /* MAX77663: PWR_OFF > ONOFF_CFG1 */
+               pmic_reg_write(dev->parent, MAX77663_REG_ONOFF_CFG1,
+                              val | ONOFF_PWR_OFF);
+               break;
+       default:
+               return -EPROTONOSUPPORT;
+       }
+
+       return -EINPROGRESS;
+}
+
+static struct sysreset_ops max77663_sysreset = {
+       .request = max77663_sysreset_request,
+};
+
+U_BOOT_DRIVER(sysreset_max77663) = {
+       .id     = UCLASS_SYSRESET,
+       .name   = MAX77663_RST_DRIVER,
+       .ops    = &max77663_sysreset,
+};
index 0f764bcbcc051141afdafa44a92c35e2348be376..b3ae3dabf462066e5b7c692edb1548623c0b38d2 100644 (file)
@@ -12,6 +12,7 @@
 /* Drivers name */
 #define MAX77663_LDO_DRIVER            "max77663_ldo"
 #define MAX77663_SD_DRIVER             "max77663_sd"
+#define MAX77663_RST_DRIVER            "max77663_rst"
 
 /* Step-Down (SD) Regulator calculations */
 #define SD_STATUS_MASK                 0x30
@@ -39,4 +40,8 @@
 
 #define LDO_VOLT_BASE                  800000
 
+#define MAX77663_REG_ONOFF_CFG1                0x41
+#define   ONOFF_SFT_RST                        BIT(7)
+#define   ONOFF_PWR_OFF                        BIT(1)
+
 #endif /* _MAX77663_H_ */