aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2012-05-26 22:27:58 -0700
committerRicardo Cerqueira <cyanogenmod@cerqueira.org>2012-07-10 23:09:00 +0100
commit5e619b59976350830caa9be4ce98615c076181ec (patch)
treef62552d99dd3c7e7a0cf07b2e23d87180c664052
parent910e55a75faac4f40e03622040ab0fc92b74f5b4 (diff)
downloadsystem_core-5e619b59976350830caa9be4ce98615c076181ec.tar.gz
system_core-5e619b59976350830caa9be4ce98615c076181ec.tar.bz2
system_core-5e619b59976350830caa9be4ce98615c076181ec.zip
charger: Add support for non-standard charging interfaces
* Certain devices may have multiple battery devices or broken uevent reporting when a power supply is disconnected. * Add a new BOARD_BATTERY_DEVICE_NAME to force which device to monitor. Change-Id: I3045bf17a4d962cc5f0e6a951472916412ac0d0d
-rw-r--r--charger/Android.mk4
-rw-r--r--charger/charger.c20
2 files changed, 21 insertions, 3 deletions
diff --git a/charger/Android.mk b/charger/Android.mk
index 5367a980..0dfd7d3f 100644
--- a/charger/Android.mk
+++ b/charger/Android.mk
@@ -19,6 +19,10 @@ LOCAL_C_INCLUDES := bootable/recovery
LOCAL_STATIC_LIBRARIES := libminui libpixelflinger_static libpng
LOCAL_STATIC_LIBRARIES += libz libstdc++ libcutils libc
+ifneq ($(BOARD_BATTERY_DEVICE_NAME),)
+LOCAL_CFLAGS += -DBATTERY_DEVICE_NAME=\"$(BOARD_BATTERY_DEVICE_NAME)\"
+endif
+
include $(BUILD_EXECUTABLE)
define _add-charger-image
diff --git a/charger/charger.c b/charger/charger.c
index abf55171..589a6bf1 100644
--- a/charger/charger.c
+++ b/charger/charger.c
@@ -64,9 +64,15 @@
#define LAST_KMSG_PATH "/proc/last_kmsg"
#define LAST_KMSG_MAX_SZ (32 * 1024)
+#if 1
#define LOGE(x...) do { KLOG_ERROR("charger", x); } while (0)
#define LOGI(x...) do { KLOG_INFO("charger", x); } while (0)
#define LOGV(x...) do { KLOG_DEBUG("charger", x); } while (0)
+#else
+#define LOG_NDEBUG 0
+#define LOG_TAG "charger"
+#include <cutils/log.h>
+#endif
struct key_state {
bool pending;
@@ -421,6 +427,12 @@ static void process_ps_uevent(struct charger *charger, struct uevent *uevent)
strlcpy(ps_type, uevent->ps_type, sizeof(ps_type));
}
+#ifdef BATTERY_DEVICE_NAME
+ // We only want to look at one device
+ if (strcmp(BATTERY_DEVICE_NAME, uevent->ps_name) != 0)
+ return;
+#endif
+
if (!strncmp(ps_type, "Battery", 7))
battery = true;
@@ -442,7 +454,7 @@ static void process_ps_uevent(struct charger *charger, struct uevent *uevent)
}
/* only pick up the first battery for now */
if (battery && !charger->battery)
- charger->battery = supply;
+ charger->battery = supply;
} else {
LOGE("supply '%s' already exists..\n", uevent->ps_name);
}
@@ -457,7 +469,6 @@ static void process_ps_uevent(struct charger *charger, struct uevent *uevent)
if (!supply) {
LOGE("power supply '%s' not found ('%s' %d)\n",
uevent->ps_name, ps_type, online);
- return;
}
} else {
return;
@@ -465,13 +476,16 @@ static void process_ps_uevent(struct charger *charger, struct uevent *uevent)
/* allow battery to be managed in the supply list but make it not
* contribute to online power supplies. */
+#ifndef BATTERY_DEVICE_NAME
if (!battery) {
+#endif
if (was_online && !online)
charger->num_supplies_online--;
else if (supply && !was_online && online)
charger->num_supplies_online++;
+#ifndef BATTERY_DEVICE_NAME
}
-
+#endif
LOGI("power supply %s (%s) %s (action=%s num_online=%d num_supplies=%d)\n",
uevent->ps_name, ps_type, battery ? "" : online ? "online" : "offline",
uevent->action, charger->num_supplies_online, charger->num_supplies);