[PATCH v2 2/9] cmd: boot: implement PMIC based poweroff

Simon Glass sjg at chromium.org
Sun Jul 23 05:48:25 CEST 2023


Hi Svyatoslav,

On Thu, 20 Jul 2023 at 02:48, Svyatoslav Ryhel <clamor95 at gmail.com> wrote:
>
> Use new PMIC ops to perform device poweroff.
>
> Signed-off-by: Svyatoslav Ryhel <clamor95 at 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
>

How does this relate to sysreset_walk(SYSRESET_POWER_OFF) and
do_poweroff() in cmd/boot.c?

Regards,
Simon


More information about the U-Boot mailing list