summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/battery/smart.c42
-rw-r--r--include/battery.h7
2 files changed, 49 insertions, 0 deletions
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index 3fda584910..4f6c2f349d 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -7,11 +7,19 @@
#include "battery.h"
#include "battery_smart.h"
+#include "console.h"
#include "host_command.h"
#include "i2c.h"
#include "timer.h"
#include "util.h"
+/* Console output macros */
+#define CPUTS(outstr) cputs(CC_CHARGER, outstr);
+#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args)
+
+#define BATTERY_WAIT_TIMEOUT (2800*MSEC)
+#define BATTERY_NO_RESPONSE_TIMEOUT (1000*MSEC)
+
test_mockable int sbc_read(int cmd, int *param)
{
return i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR, cmd, param);
@@ -304,6 +312,40 @@ void battery_get_params(struct batt_params *batt)
memcpy(batt, &batt_new, sizeof(*batt));
}
+/* Wait until battery is totally stable */
+int battery_wait_for_stable(void)
+{
+ int status, got_response;
+ uint64_t wait_timeout = get_time().val + BATTERY_WAIT_TIMEOUT;
+ uint64_t no_response_timeout = get_time().val +
+ BATTERY_NO_RESPONSE_TIMEOUT;
+
+ got_response = 0;
+
+ CPRINTF("[%T Wait for battery stabilized during %d]\n",
+ BATTERY_WAIT_TIMEOUT);
+ while (get_time().val < wait_timeout) {
+ /* Starting pinging battery */
+ if (battery_status(&status) == EC_SUCCESS) {
+ got_response = 1;
+ /* Battery is stable */
+ if (status & STATUS_INITIALIZED) {
+ CPRINTF("[%T battery initialized]\n");
+ return EC_SUCCESS;
+ }
+ }
+ /* Assume no battery connected if no response for a while */
+ else if (!got_response &&
+ get_time().val > no_response_timeout) {
+ CPRINTF("[%T battery not responding]\n");
+ return EC_ERROR_NOT_POWERED;
+ }
+ msleep(25); /* clock stretching could hold 25ms */
+ }
+ CPRINTF("[%T battery wait stable timeout]\n");
+ return EC_ERROR_TIMEOUT;
+}
+
/*****************************************************************************/
/* Smart battery pass-through
*/
diff --git a/include/battery.h b/include/battery.h
index cfc358bf4e..e395839546 100644
--- a/include/battery.h
+++ b/include/battery.h
@@ -302,4 +302,11 @@ int battery_get_vendor_param(uint32_t param, uint32_t *value);
*/
int battery_set_vendor_param(uint32_t param, uint32_t value);
+/**
+ * Wait for battery stable.
+ *
+ * @return non-zero if error.
+ */
+int battery_wait_for_stable(void);
+
#endif /* __CROS_EC_BATTERY_H */