Use new PMIC ops to perform device poweroff.

Signed-off-by: Svyatoslav Ryhel <clamo...@gmail.com>
---
 cmd/Kconfig |  6 ++++++
 cmd/boot.c  | 40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/cmd/Kconfig b/cmd/Kconfig
index ecfd575237..47654297f8 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1439,6 +1439,12 @@ config CMD_POWEROFF
        help
          Poweroff/Shutdown the system
 
+config CMD_PMIC_POWEROFF
+       bool "PMIC poweroff"
+       select CMD_POWEROFF
+       help
+         Shutdown the system using PMIC poweroff sequence.
+
 config CMD_READ
        bool "read - Read binary data from a partition"
        help
diff --git a/cmd/boot.c b/cmd/boot.c
index 14839c1ced..4270034194 100644
--- a/cmd/boot.c
+++ b/cmd/boot.c
@@ -9,7 +9,13 @@
  */
 #include <common.h>
 #include <command.h>
+#include <dm.h>
+#include <log.h>
 #include <net.h>
+#include <dm/device-internal.h>
+#include <dm/uclass-internal.h>
+#include <power/pmic.h>
+#include <linux/delay.h>
 
 #ifdef CONFIG_CMD_GO
 
@@ -64,6 +70,40 @@ U_BOOT_CMD(
 );
 
 #ifdef CONFIG_CMD_POWEROFF
+#ifdef CONFIG_CMD_PMIC_POWEROFF
+int do_poweroff(struct cmd_tbl *cmdtp, int flag,
+               int argc, char *const argv[])
+{
+       struct uc_pmic_priv *pmic_priv;
+       struct udevice *dev;
+       int ret;
+
+       for (uclass_find_first_device(UCLASS_PMIC, &dev);
+            dev;
+            uclass_find_next_device(&dev)) {
+               if (dev && !device_active(dev)) {
+                       ret = device_probe(dev);
+                       if (ret)
+                               return ret;
+               }
+
+               /* value we need to check is set after probe */
+               pmic_priv = dev_get_uclass_priv(dev);
+               if (pmic_priv->sys_pow_ctrl) {
+                       ret = pmic_poweroff(dev);
+
+                       /* wait some time and then print error */
+                       mdelay(5000);
+                       log_err("Failed to power off!!!\n");
+                       return ret;
+               }
+       }
+
+       /* no device should reach here */
+       return 1;
+}
+#endif
+
 U_BOOT_CMD(
        poweroff, 1, 0, do_poweroff,
        "Perform POWEROFF of the device",
-- 
2.39.2

Reply via email to