diff options
Diffstat (limited to 'plat/allwinner/sun50i_h6/sunxi_power.c')
-rw-r--r-- | plat/allwinner/sun50i_h6/sunxi_power.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/plat/allwinner/sun50i_h6/sunxi_power.c b/plat/allwinner/sun50i_h6/sunxi_power.c index a7865a5d4..d298e6b8a 100644 --- a/plat/allwinner/sun50i_h6/sunxi_power.c +++ b/plat/allwinner/sun50i_h6/sunxi_power.c @@ -10,7 +10,9 @@ #include <common/debug.h> #include <drivers/allwinner/axp.h> #include <drivers/allwinner/sunxi_rsb.h> +#include <lib/mmio.h> +#include <sunxi_cpucfg.h> #include <sunxi_def.h> #include <sunxi_mmap.h> #include <sunxi_private.h> @@ -102,3 +104,16 @@ void sunxi_power_down(void) break; } } + +void sunxi_cpu_power_off_self(void) +{ + u_register_t mpidr = read_mpidr(); + unsigned int core = MPIDR_AFFLVL0_VAL(mpidr); + + /* Enable the CPUIDLE hardware (only really needs to be done once). */ + mmio_write_32(SUNXI_CPUIDLE_EN_REG, 0x16aa0000); + mmio_write_32(SUNXI_CPUIDLE_EN_REG, 0xaa160001); + + /* Trigger power off for this core. */ + mmio_write_32(SUNXI_CORE_CLOSE_REG, BIT_32(core)); +} |