Commit 5069c1cf authored by Icenowy Zheng's avatar Icenowy Zheng
Browse files

allwinner: implement system power down on H6 w/ AXP805



The AXP805 PMIC used with H6 is capable of shutting down the system.

Add support for using it to shut down the system power.

The original placeholder power off code is moved to A64 code, as it's
still TODO to implement PMIC operations for A64.
Signed-off-by: default avatarIcenowy Zheng <icenowy@aosc.io>
parent 6d372828
...@@ -54,9 +54,7 @@ static void __dead2 sunxi_system_off(void) ...@@ -54,9 +54,7 @@ static void __dead2 sunxi_system_off(void)
/* Turn off all secondary CPUs */ /* Turn off all secondary CPUs */
sunxi_disable_secondary_cpus(plat_my_core_pos()); sunxi_disable_secondary_cpus(plat_my_core_pos());
ERROR("PSCI: Full shutdown not implemented, halting\n"); sunxi_power_down();
wfi();
panic();
} }
static void __dead2 sunxi_system_reset(void) static void __dead2 sunxi_system_reset(void)
......
...@@ -17,4 +17,6 @@ uint16_t sunxi_read_soc_id(void); ...@@ -17,4 +17,6 @@ uint16_t sunxi_read_soc_id(void);
void sunxi_pmic_setup(void); void sunxi_pmic_setup(void);
void sunxi_security_setup(void); void sunxi_security_setup(void);
void __dead2 sunxi_power_down(void);
#endif /* __SUNXI_PRIVATE_H__ */ #endif /* __SUNXI_PRIVATE_H__ */
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
#include <arch_helpers.h>
#include <debug.h> #include <debug.h>
int sunxi_pmic_setup(void) int sunxi_pmic_setup(void)
...@@ -14,3 +15,10 @@ int sunxi_pmic_setup(void) ...@@ -14,3 +15,10 @@ int sunxi_pmic_setup(void)
return 0; return 0;
} }
void __dead2 sunxi_power_down(void)
{
ERROR("PSCI: Full shutdown not implemented, halting\n");
wfi();
panic();
}
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
#include <arch_helpers.h>
#include <debug.h> #include <debug.h>
#include <delay_timer.h> #include <delay_timer.h>
#include <errno.h> #include <errno.h>
...@@ -119,3 +120,24 @@ int sunxi_pmic_setup(void) ...@@ -119,3 +120,24 @@ int sunxi_pmic_setup(void)
return 0; 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();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment