summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2020-05-28 17:45:50 +0800
committerCommit Bot <commit-bot@chromium.org>2020-05-29 11:50:44 +0000
commitc4734d29ea83d2be54fe189e6cbeb360fa266fb7 (patch)
treeacd35af45c42348e5638d0fe5b586e0a87303165
parent3e98b58661f67fda599fddb03116ae1dcbeaedc0 (diff)
downloadchrome-ec-c4734d29ea83d2be54fe189e6cbeb360fa266fb7.tar.gz
baseboard/kukui: move bitbang stability fix to common code
All Kukui boards with bitbang enabled should have this board_battery_compensate_params() to make sure host side does not receiving bad data. BUG=b:156998242 TEST=make BRANCH=kukui Signed-off-by: Ting Shen <phoenixshen@google.com> Change-Id: I3cd6ec521fd9d7b6b985ba15f96f694fd9095cb8 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2219711 Reviewed-by: Fei Shao <fshao@chromium.org> Reviewed-by: Eric Yilun Lin <yllin@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Tested-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--baseboard/kukui/battery_smart.c77
-rw-r--r--board/kodama/battery.c74
2 files changed, 77 insertions, 74 deletions
diff --git a/baseboard/kukui/battery_smart.c b/baseboard/kukui/battery_smart.c
index 7a58644e53..3cd8facd5e 100644
--- a/baseboard/kukui/battery_smart.c
+++ b/baseboard/kukui/battery_smart.c
@@ -8,6 +8,8 @@
#include "battery.h"
#include "battery_fuel_gauge.h"
#include "battery_smart.h"
+#include "timer.h"
+#include "util.h"
enum battery_present batt_pres_prev = BP_NOT_SURE;
@@ -65,3 +67,78 @@ enum battery_present battery_is_present(void)
batt_pres_prev = battery_check_present_status();
return batt_pres_prev;
}
+
+#ifdef CONFIG_I2C_BITBANG
+static void fix_single_param(int flag, int *cached, int *curr)
+{
+ if (flag)
+ *curr = *cached;
+ else
+ *cached = *curr;
+}
+
+#define CACHE_INVALIDATION_TIME_US (5 * SECOND)
+
+/*
+ * b:144195782: bitbang fails randomly, and there's no way to
+ * notify kernel side that bitbang read failed.
+ * Thus, if any value in batt_params is bad, replace it with a cached
+ * good value, to make sure we never send random numbers to kernel
+ * side.
+ */
+__override void board_battery_compensate_params(struct batt_params *batt)
+{
+ static struct batt_params batt_cache = { 0 };
+ static timestamp_t deadline;
+
+ /*
+ * If battery keeps failing for 5 seconds, stop hiding the error and
+ * report back to host.
+ */
+ if (batt->flags & BATT_FLAG_BAD_ANY) {
+ if (timestamp_expired(deadline, NULL))
+ return;
+ } else {
+ deadline.val = get_time().val + CACHE_INVALIDATION_TIME_US;
+ }
+
+ /* return cached values for at most CACHE_INVALIDATION_TIME_US */
+ fix_single_param(batt->flags & BATT_FLAG_BAD_STATE_OF_CHARGE,
+ &batt_cache.state_of_charge,
+ &batt->state_of_charge);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_VOLTAGE,
+ &batt_cache.voltage,
+ &batt->voltage);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_CURRENT,
+ &batt_cache.current,
+ &batt->current);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_DESIRED_VOLTAGE,
+ &batt_cache.desired_voltage,
+ &batt->desired_voltage);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_DESIRED_CURRENT,
+ &batt_cache.desired_current,
+ &batt->desired_current);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_REMAINING_CAPACITY,
+ &batt_cache.remaining_capacity,
+ &batt->remaining_capacity);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_FULL_CAPACITY,
+ &batt_cache.full_capacity,
+ &batt->full_capacity);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_STATUS,
+ &batt_cache.status,
+ &batt->status);
+ fix_single_param(batt->flags & BATT_FLAG_BAD_TEMPERATURE,
+ &batt_cache.temperature,
+ &batt->temperature);
+ /*
+ * If battery_compensate_params() didn't calculate display_charge
+ * for us, also update it with last good value.
+ */
+ fix_single_param(batt->display_charge == 0,
+ &batt_cache.display_charge,
+ &batt->display_charge);
+
+ /* remove bad flags after applying cached values */
+ batt->flags &= ~BATT_FLAG_BAD_ANY;
+}
+#endif /* CONFIG_I2C_BITBANG */
diff --git a/board/kodama/battery.c b/board/kodama/battery.c
index 99dc3f4845..1dbff92a00 100644
--- a/board/kodama/battery.c
+++ b/board/kodama/battery.c
@@ -11,7 +11,6 @@
#include "driver/charger/rt946x.h"
#include "gpio.h"
#include "power.h"
-#include "timer.h"
#include "usb_pd.h"
#include "util.h"
@@ -82,79 +81,6 @@ enum battery_present battery_hw_present(void)
return gpio_get_level(GPIO_EC_BATT_PRES_ODL) ? BP_NO : BP_YES;
}
-static void fix_single_param(int flag, int *cached, int *curr)
-{
- if (flag)
- *curr = *cached;
- else
- *cached = *curr;
-}
-
-#define CACHE_INVALIDATION_TIME_US (5 * SECOND)
-
-/*
- * b:144195782: bitbang fails randomly, and there's no way to
- * notify kernel side that bitbang read failed.
- * Thus, if any value in batt_params is bad, replace it with a cached
- * good value, to make sure we never send random numbers to kernel
- * side.
- */
-__override void board_battery_compensate_params(struct batt_params *batt)
-{
- static struct batt_params batt_cache = { 0 };
- static timestamp_t deadline;
-
- /*
- * If battery keeps failing for 5 seconds, stop hiding the error and
- * report back to host.
- */
- if (batt->flags & BATT_FLAG_BAD_ANY) {
- if (timestamp_expired(deadline, NULL))
- return;
- } else {
- deadline.val = get_time().val + CACHE_INVALIDATION_TIME_US;
- }
-
- /* return cached values for at most CACHE_INVALIDATION_TIME_US */
- fix_single_param(batt->flags & BATT_FLAG_BAD_STATE_OF_CHARGE,
- &batt_cache.state_of_charge,
- &batt->state_of_charge);
- fix_single_param(batt->flags & BATT_FLAG_BAD_VOLTAGE,
- &batt_cache.voltage,
- &batt->voltage);
- fix_single_param(batt->flags & BATT_FLAG_BAD_CURRENT,
- &batt_cache.current,
- &batt->current);
- fix_single_param(batt->flags & BATT_FLAG_BAD_DESIRED_VOLTAGE,
- &batt_cache.desired_voltage,
- &batt->desired_voltage);
- fix_single_param(batt->flags & BATT_FLAG_BAD_DESIRED_CURRENT,
- &batt_cache.desired_current,
- &batt->desired_current);
- fix_single_param(batt->flags & BATT_FLAG_BAD_REMAINING_CAPACITY,
- &batt_cache.remaining_capacity,
- &batt->remaining_capacity);
- fix_single_param(batt->flags & BATT_FLAG_BAD_FULL_CAPACITY,
- &batt_cache.full_capacity,
- &batt->full_capacity);
- fix_single_param(batt->flags & BATT_FLAG_BAD_STATUS,
- &batt_cache.status,
- &batt->status);
- fix_single_param(batt->flags & BATT_FLAG_BAD_TEMPERATURE,
- &batt_cache.temperature,
- &batt->temperature);
- /*
- * If battery_compensate_params() didn't calculate display_charge
- * for us, also update it with last good value.
- */
- fix_single_param(batt->display_charge == 0,
- &batt_cache.display_charge,
- &batt->display_charge);
-
- /* remove bad flags after applying cached values */
- batt->flags &= ~BATT_FLAG_BAD_ANY;
-}
-
int charger_profile_override(struct charge_state_data *curr)
{
const struct battery_info *batt_info = battery_get_info();