diff --git a/plat/allwinner/common/sunxi_pm.c b/plat/allwinner/common/sunxi_pm.c index 2a1f223..e4bb582 100644 --- a/plat/allwinner/common/sunxi_pm.c +++ b/plat/allwinner/common/sunxi_pm.c @@ -54,9 +54,7 @@ /* Turn off all secondary CPUs */ sunxi_disable_secondary_cpus(plat_my_core_pos()); - ERROR("PSCI: Full shutdown not implemented, halting\n"); - wfi(); - panic(); + sunxi_power_down(); } static void __dead2 sunxi_system_reset(void) diff --git a/plat/allwinner/common/sunxi_private.h b/plat/allwinner/common/sunxi_private.h index 49a5c50..20fa23e 100644 --- a/plat/allwinner/common/sunxi_private.h +++ b/plat/allwinner/common/sunxi_private.h @@ -17,4 +17,6 @@ void sunxi_pmic_setup(void); void sunxi_security_setup(void); +void __dead2 sunxi_power_down(void); + #endif /* __SUNXI_PRIVATE_H__ */ diff --git a/plat/allwinner/sun50i_a64/sunxi_power.c b/plat/allwinner/sun50i_a64/sunxi_power.c index 50eaa6b..c1907d6 100644 --- a/plat/allwinner/sun50i_a64/sunxi_power.c +++ b/plat/allwinner/sun50i_a64/sunxi_power.c @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include #include int sunxi_pmic_setup(void) @@ -14,3 +15,10 @@ return 0; } + +void __dead2 sunxi_power_down(void) +{ + ERROR("PSCI: Full shutdown not implemented, halting\n"); + wfi(); + panic(); +} diff --git a/plat/allwinner/sun50i_h6/sunxi_power.c b/plat/allwinner/sun50i_h6/sunxi_power.c index 3638a19..f109cce 100644 --- a/plat/allwinner/sun50i_h6/sunxi_power.c +++ b/plat/allwinner/sun50i_h6/sunxi_power.c @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include #include #include #include @@ -119,3 +120,24 @@ return 0; } + +void __dead2 sunxi_power_down(void) +{ + uint8_t val; + + switch (pmic) { + case AXP805: + val = 0x26; /* Default value for REG 32H */ + axp_i2c_read(AXP805_ADDR, 0x32, &val); + val |= 0x80; + axp_i2c_write(AXP805_ADDR, 0x32, val); + break; + default: + break; + } + + udelay(1000); + ERROR("PSCI: Cannot communicate with PMIC, halting\n"); + wfi(); + panic(); +}