diff options
author | Scott Chao <scott_chao@wistron.corp-partner.google.com> | 2022-01-06 08:44:19 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2022-01-11 12:18:04 +0000 |
commit | 4e08816c9ae836cb7fcce4d9034387a2e38f2a51 (patch) | |
tree | 697face94fd1980d5d3979afc131dc79b4922859 | |
parent | 4c9d046fffe71f3e2a4afdd04ccb886ec4a9b053 (diff) | |
download | chrome-ec-4e08816c9ae836cb7fcce4d9034387a2e38f2a51.tar.gz |
bq25710: fix read IIN_DPM and write IIN_HOST
- If we want to set input current limit at 3A(0x3c00),
it will become 2.95A(0x3b00) which is not accurate.
- Add IIN_DPM offset when code 0.
- Fix INPUT_RESISTOR_RATIO will be 0 when 5mOhm sense resistor.
BUG=b:206571423, b:212618911
BRANCH=none
TEST=make -j BOARD=primus
Signed-off-by: Scott Chao <scott_chao@wistron.corp-partner.google.com>
Change-Id: I4c40dc86a0a8ccc02d957eb8b72c5d0e7e2bf650
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3295248
Reviewed-by: Zhuohao Lee <zhuohao@chromium.org>
Reviewed-by: Boris Mittelberg <bmbm@google.com>
Reviewed-by: caveh jalali <caveh@chromium.org>
-rw-r--r-- | driver/charger/bq25710.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/driver/charger/bq25710.c b/driver/charger/bq25710.c index 2f5ac93e91..9ecb9a6aca 100644 --- a/driver/charger/bq25710.c +++ b/driver/charger/bq25710.c @@ -123,14 +123,12 @@ /* Sense resistor configurations and macros */ #define DEFAULT_SENSE_RESISTOR 10 -#define INPUT_RESISTOR_RATIO \ - ((CONFIG_CHARGER_BQ25710_SENSE_RESISTOR_AC) / DEFAULT_SENSE_RESISTOR) - -#define CHARGING_RESISTOR_RATIO \ - ((CONFIG_CHARGER_BQ25710_SENSE_RESISTOR) / DEFAULT_SENSE_RESISTOR) - -#define REG_TO_CHARGING_CURRENT(REG) ((REG) / CHARGING_RESISTOR_RATIO) -#define CHARGING_CURRENT_TO_REG(CUR) ((CUR) * CHARGING_RESISTOR_RATIO) +#define REG_TO_CHARGING_CURRENT(REG) ((REG) * \ + DEFAULT_SENSE_RESISTOR / CONFIG_CHARGER_BQ25710_SENSE_RESISTOR) +#define REG_TO_CHARGING_CURRENT_AC(REG) ((REG) * \ + DEFAULT_SENSE_RESISTOR / CONFIG_CHARGER_BQ25710_SENSE_RESISTOR_AC) +#define CHARGING_CURRENT_TO_REG(CUR) ((CUR) * \ + CONFIG_CHARGER_BQ25710_SENSE_RESISTOR / DEFAULT_SENSE_RESISTOR) #define VMIN_AP_VSYS_TH2_TO_REG(DV) ((DV) - 32) /* Console output macros */ @@ -146,18 +144,24 @@ static uint32_t bq25710_perf_mode_req; static struct mutex bq25710_perf_mode_mutex; #endif +/* + * 10mOhm sense resistor, there is 50mA offset at code 0. + * 5mOhm sense resistor, there is 100mA offset at code 0. + */ +#define BQ25710_IIN_DPM_CODE0_OFFSET REG_TO_CHARGING_CURRENT(50) + /* Charger parameters */ static const struct charger_info bq25710_charger_info = { .name = "bq25710", .voltage_max = 19200, .voltage_min = 1024, .voltage_step = 8, - .current_max = 8128 / CHARGING_RESISTOR_RATIO, - .current_min = 64 / CHARGING_RESISTOR_RATIO, - .current_step = 64 / CHARGING_RESISTOR_RATIO, - .input_current_max = 6400 / INPUT_RESISTOR_RATIO, - .input_current_min = 50 / INPUT_RESISTOR_RATIO, - .input_current_step = 50 / INPUT_RESISTOR_RATIO, + .current_max = REG_TO_CHARGING_CURRENT(8128), + .current_min = REG_TO_CHARGING_CURRENT(64), + .current_step = REG_TO_CHARGING_CURRENT(64), + .input_current_max = REG_TO_CHARGING_CURRENT_AC(6400), + .input_current_min = REG_TO_CHARGING_CURRENT_AC(50), + .input_current_step = REG_TO_CHARGING_CURRENT_AC(50), }; static enum ec_error_list bq25710_get_option(int chgnum, int *option); @@ -165,14 +169,24 @@ static enum ec_error_list bq25710_set_option(int chgnum, int option); static inline int iin_dpm_reg_to_current(int reg) { - return (reg + 1) * BQ257X0_IIN_DPM_CURRENT_STEP_MA / - INPUT_RESISTOR_RATIO; + /* + * When set 00 at 3F register, read 22h back, + * you will see 00, but actually it’s 50mA@10mOhm right now. + * TI don’t have exactly 0A setting for input current limit, + * it set the 50mA@10mOhm offset so that the converter can + * work normally. + */ + if (reg == 0) + return BQ25710_IIN_DPM_CODE0_OFFSET; + else + return REG_TO_CHARGING_CURRENT_AC(reg * + BQ257X0_IIN_DPM_CURRENT_STEP_MA); } static inline int iin_host_current_to_reg(int current) { - return (current * INPUT_RESISTOR_RATIO / - BQ257X0_IIN_HOST_CURRENT_STEP_MA) - 1; + return (REG_TO_CHARGING_CURRENT_AC(current) / + BQ257X0_IIN_HOST_CURRENT_STEP_MA); } static inline enum ec_error_list raw_read16(int chgnum, int offset, int *value) |