allwinner: implement system power down on H6 w/ AXP805
authorIcenowy Zheng <icenowy@aosc.io>
Sun, 22 Jul 2018 13:52:50 +0000 (21:52 +0800)
committerIcenowy Zheng <icenowy@aosc.io>
Fri, 7 Sep 2018 15:20:17 +0000 (23:20 +0800)
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: Icenowy Zheng <icenowy@aosc.io>
plat/allwinner/common/sunxi_pm.c
plat/allwinner/common/sunxi_private.h
plat/allwinner/sun50i_a64/sunxi_power.c
plat/allwinner/sun50i_h6/sunxi_power.c

index 2a1f2231deb1f2460a423934d452746fabc4d068..e4bb58229fd50aa640c4c4c2948767c36b79b884 100644 (file)
@@ -54,9 +54,7 @@ static void __dead2 sunxi_system_off(void)
        /* 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)
index 49a5c50da8f69acd494a57a452aa1c3922f6d8bf..20fa23e6234b038cc815eb64cc162c2d27c376d4 100644 (file)
@@ -17,4 +17,6 @@ uint16_t sunxi_read_soc_id(void);
 void sunxi_pmic_setup(void);
 void sunxi_security_setup(void);
 
+void __dead2 sunxi_power_down(void);
+
 #endif /* __SUNXI_PRIVATE_H__ */
index 50eaa6b9d2fd39371ce511e0b7487578540b9a28..c1907d6d23d36f0b07b56e33594e13398a2d8365 100644 (file)
@@ -5,6 +5,7 @@
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
+#include <arch_helpers.h>
 #include <debug.h>
 
 int sunxi_pmic_setup(void)
@@ -14,3 +15,10 @@ int sunxi_pmic_setup(void)
 
        return 0;
 }
+
+void __dead2 sunxi_power_down(void)
+{
+       ERROR("PSCI: Full shutdown not implemented, halting\n");
+       wfi();
+       panic();
+}
index 3638a199c35bb23b5b792b22bbfbe87a19767191..f109ccece304a28a5aa2b61e09034b09ffd8da23 100644 (file)
@@ -5,6 +5,7 @@
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
+#include <arch_helpers.h>
 #include <debug.h>
 #include <delay_timer.h>
 #include <errno.h>
@@ -119,3 +120,24 @@ int sunxi_pmic_setup(void)
 
        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();
+}