diff options
author | Ting Shen <phoenixshen@google.com> | 2020-05-28 17:45:50 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-05-29 11:50:44 +0000 |
commit | c4734d29ea83d2be54fe189e6cbeb360fa266fb7 (patch) | |
tree | acd35af45c42348e5638d0fe5b586e0a87303165 | |
parent | 3e98b58661f67fda599fddb03116ae1dcbeaedc0 (diff) | |
download | chrome-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.c | 77 | ||||
-rw-r--r-- | board/kodama/battery.c | 74 |
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(); |