summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--init/Android.mk8
-rw-r--r--init/init.cpp21
2 files changed, 28 insertions, 1 deletions
diff --git a/init/Android.mk b/init/Android.mk
index b060f04..75a3f29 100644
--- a/init/Android.mk
+++ b/init/Android.mk
@@ -50,6 +50,14 @@ LOCAL_SRC_FILES:= \
watchdogd.cpp \
vendor_init.cpp
+SYSTEM_CORE_INIT_DEFINES := BOARD_CHARGING_MODE_BOOTING_LPM
+
+$(foreach system_core_init_define,$(SYSTEM_CORE_INIT_DEFINES), \
+ $(if $($(system_core_init_define)), \
+ $(eval LOCAL_CFLAGS += -D$(system_core_init_define)=\"$($(system_core_init_define))\") \
+ ) \
+)
+
LOCAL_MODULE:= init
LOCAL_C_INCLUDES += \
system/extras/ext4_utils \
diff --git a/init/init.cpp b/init/init.cpp
index 9eb2958..d49ece7 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -986,6 +986,24 @@ static void selinux_initialize(bool in_kernel_domain) {
}
}
+static int charging_mode_booting(void) {
+#ifndef BOARD_CHARGING_MODE_BOOTING_LPM
+ return 0;
+#else
+ int f;
+ char cmb;
+ f = open(BOARD_CHARGING_MODE_BOOTING_LPM, O_RDONLY);
+ if (f < 0)
+ return 0;
+
+ if (1 != read(f, (void *)&cmb,1))
+ return 0;
+
+ close(f);
+ return ('1' == cmb);
+#endif
+}
+
int main(int argc, char** argv) {
if (!strcmp(basename(argv[0]), "ueventd")) {
return ueventd_main(argc, argv);
@@ -1097,7 +1115,8 @@ int main(int argc, char** argv) {
// Don't mount filesystems or start core system services in charger mode.
char bootmode[PROP_VALUE_MAX];
- if (property_get("ro.bootmode", bootmode) > 0 && strcmp(bootmode, "charger") == 0) {
+ if ((property_get("ro.bootmode", bootmode) > 0 && strcmp(bootmode, "charger") == 0)
+ || charging_mode_booting()) {
action_for_each_trigger("charger", action_add_queue_tail);
} else if (strncmp(bootmode, "ffbm", 4) == 0) {
KLOG_ERROR("Booting into ffbm mode\n");