fix: corrects various register step size and offset values fix: corrects bq25980_get_input_curr_lim() and bq25980_set_input_curr_lim()
fix: corrects bq25980_get_const_charge_curr() and bq25980_set_const_charge_curr() fix: corrects BQ25960_BATOVP_MIN_uV, BQ25960_BATOVP_OFFSET_uV, BQ25960_BATOVP_STEP_uV, and BQ25960_BATOVP_MAX_uV fix: corrects busocp_sc_min and busocp_byp_min members fix: removes unnecessary polarity check from bq25980_get_adc_ibus() fix: removes unnecessary polarity check from bq25980_get_adc_ibat() fix: clamps ibat_adc to match datasheet change Fixes: 5069185fc18e ("power: supply: bq25980: Add support for the BQ259xx family") Signed-off-by: Ricardo Rivera-Matos <r-rivera-ma...@ti.com> --- drivers/power/supply/bq25980_charger.c | 141 ++++++++++++++++++++----- drivers/power/supply/bq25980_charger.h | 77 ++++++++++---- 2 files changed, 173 insertions(+), 45 deletions(-) diff --git a/drivers/power/supply/bq25980_charger.c b/drivers/power/supply/bq25980_charger.c index 530ff4025b31..7c489a9e8877 100644 --- a/drivers/power/supply/bq25980_charger.c +++ b/drivers/power/supply/bq25980_charger.c @@ -52,6 +52,10 @@ struct bq25980_chip_info { int busocp_byp_max; int busocp_sc_min; int busocp_byp_min; + int busocp_sc_step; + int busocp_byp_step; + int busocp_sc_offset; + int busocp_byp_offset; int busovp_sc_def; int busovp_byp_def; @@ -73,6 +77,20 @@ struct bq25980_chip_info { int batocp_def; int batocp_max; + int batocp_min; + int batocp_step; + + int vbus_adc_step; + int vbus_adc_offset; + + int ibus_adc_step; + int ibus_adc_offset; + + int vbat_adc_step; + int vbat_adc_offset; + + int ibat_adc_step; + int ibat_adc_offset; }; struct bq25980_init_data { @@ -275,13 +293,22 @@ static int bq25980_watchdog_time[BQ25980_NUM_WD_VAL] = {5000, 10000, 50000, static int bq25980_get_input_curr_lim(struct bq25980_device *bq) { unsigned int busocp_reg_code; + int offset, step; int ret; + if (bq->state.bypass) { + step = bq->chip_info->busocp_byp_step; + offset = bq->chip_info->busocp_byp_offset; + } else { + step = bq->chip_info->busocp_sc_step; + offset = bq->chip_info->busocp_sc_offset; + } + ret = regmap_read(bq->regmap, BQ25980_BUSOCP, &busocp_reg_code); if (ret) return ret; - return (busocp_reg_code * BQ25980_BUSOCP_STEP_uA) + BQ25980_BUSOCP_OFFSET_uA; + return (busocp_reg_code * step) + offset; } static int bq25980_set_hiz(struct bq25980_device *bq, int setting) @@ -293,6 +320,7 @@ static int bq25980_set_hiz(struct bq25980_device *bq, int setting) static int bq25980_set_input_curr_lim(struct bq25980_device *bq, int busocp) { unsigned int busocp_reg_code; + int step, offset; int ret; if (!busocp) @@ -303,13 +331,17 @@ static int bq25980_set_input_curr_lim(struct bq25980_device *bq, int busocp) if (busocp < BQ25980_BUSOCP_MIN_uA) busocp = BQ25980_BUSOCP_MIN_uA; - if (bq->state.bypass) + if (bq->state.bypass) { busocp = min(busocp, bq->chip_info->busocp_sc_max); - else + step = bq->chip_info->busocp_byp_step; + offset = bq->chip_info->busocp_byp_offset; + } else { busocp = min(busocp, bq->chip_info->busocp_byp_max); + step = bq->chip_info->busocp_sc_step; + offset = bq->chip_info->busocp_sc_offset; + } - busocp_reg_code = (busocp - BQ25980_BUSOCP_OFFSET_uA) - / BQ25980_BUSOCP_STEP_uA; + busocp_reg_code = (busocp - offset) / step; ret = regmap_write(bq->regmap, BQ25980_BUSOCP, busocp_reg_code); if (ret) @@ -374,6 +406,7 @@ static int bq25980_set_input_volt_lim(struct bq25980_device *bq, int busovp) static int bq25980_get_const_charge_curr(struct bq25980_device *bq) { + int step = bq->chip_info->batocp_step; unsigned int batocp_reg_code; int ret; @@ -381,19 +414,20 @@ static int bq25980_get_const_charge_curr(struct bq25980_device *bq) if (ret) return ret; - return (batocp_reg_code & BQ25980_BATOCP_MASK) * - BQ25980_BATOCP_STEP_uA; + return (batocp_reg_code & BQ25980_BATOCP_MASK) * step; } static int bq25980_set_const_charge_curr(struct bq25980_device *bq, int batocp) { + int step = bq->chip_info->batocp_step; + int max = bq->chip_info->batocp_max; + int min = bq->chip_info->batocp_min; unsigned int batocp_reg_code; int ret; - batocp = max(batocp, BQ25980_BATOCP_MIN_uA); - batocp = min(batocp, bq->chip_info->batocp_max); + batocp = clamp(batocp, min, max); - batocp_reg_code = batocp / BQ25980_BATOCP_STEP_uA; + batocp_reg_code = batocp / step; ret = regmap_update_bits(bq->regmap, BQ25980_BATOCP, BQ25980_BATOCP_MASK, batocp_reg_code); @@ -490,10 +524,8 @@ static int bq25980_get_adc_ibus(struct bq25980_device *bq) ibus_adc = (ibus_adc_msb << 8) | ibus_adc_lsb; - if (ibus_adc_msb & BQ25980_ADC_POLARITY_BIT) - return ((ibus_adc ^ 0xffff) + 1) * BQ25980_ADC_CURR_STEP_uA; - - return ibus_adc * BQ25980_ADC_CURR_STEP_uA; + return (ibus_adc * bq->chip_info->ibus_adc_step) + + bq->chip_info->ibus_adc_offset; } static int bq25980_get_adc_vbus(struct bq25980_device *bq) @@ -512,7 +544,8 @@ static int bq25980_get_adc_vbus(struct bq25980_device *bq) vbus_adc = (vbus_adc_msb << 8) | vbus_adc_lsb; - return vbus_adc * BQ25980_ADC_VOLT_STEP_uV; + return (vbus_adc * bq->chip_info->vbus_adc_step) + + bq->chip_info->vbus_adc_offset; } static int bq25980_get_ibat_adc(struct bq25980_device *bq) @@ -531,29 +564,31 @@ static int bq25980_get_ibat_adc(struct bq25980_device *bq) ibat_adc = (ibat_adc_msb << 8) | ibat_adc_lsb; - if (ibat_adc_msb & BQ25980_ADC_POLARITY_BIT) - return ((ibat_adc ^ 0xffff) + 1) * BQ25980_ADC_CURR_STEP_uA; + ibat_adc = clamp(ibat_adc, BQ25960_ADC_IBAT_MIN_CODE, + BQ25960_ADC_IBAT_MAX_CODE); - return ibat_adc * BQ25980_ADC_CURR_STEP_uA; + return (ibat_adc * bq->chip_info->ibat_adc_step) + + bq->chip_info->ibat_adc_offset; } static int bq25980_get_adc_vbat(struct bq25980_device *bq) { - int vsys_adc_lsb, vsys_adc_msb; - u16 vsys_adc; + int vbat_adc_lsb, vbat_adc_msb; + u16 vbat_adc; int ret; - ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_MSB, &vsys_adc_msb); + ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_MSB, &vbat_adc_msb); if (ret) return ret; - ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_LSB, &vsys_adc_lsb); + ret = regmap_read(bq->regmap, BQ25980_VBAT_ADC_LSB, &vbat_adc_lsb); if (ret) return ret; - vsys_adc = (vsys_adc_msb << 8) | vsys_adc_lsb; + vbat_adc = (vbat_adc_msb << 8) | vbat_adc_lsb; - return vsys_adc * BQ25980_ADC_VOLT_STEP_uV; + return (vbat_adc * bq->chip_info->vbat_adc_step) + + bq->chip_info->vbat_adc_offset; } static int bq25980_get_state(struct bq25980_device *bq, @@ -984,6 +1019,10 @@ static const struct bq25980_chip_info bq25980_chip_info_tbl[] = { .busocp_sc_max = BQ25980_BUSOCP_SC_MAX_uA, .busocp_byp_max = BQ25980_BUSOCP_BYP_MAX_uA, .busocp_byp_min = BQ25980_BUSOCP_MIN_uA, + .busocp_sc_step = BQ25980_BUSOCP_STEP_uA, + .busocp_byp_step = BQ25980_BUSOCP_STEP_uA, + .busocp_sc_offset = BQ25980_BUSOCP_OFFSET_uA, + .busocp_byp_offset = BQ25980_BUSOCP_OFFSET_uA, .busovp_sc_def = BQ25980_BUSOVP_DFLT_uV, .busovp_byp_def = BQ25980_BUSOVP_BYPASS_DFLT_uV, @@ -1004,6 +1043,20 @@ static const struct bq25980_chip_info bq25980_chip_info_tbl[] = { .batocp_def = BQ25980_BATOCP_DFLT_uA, .batocp_max = BQ25980_BATOCP_MAX_uA, + .batocp_min = BQ25980_BATOCP_MIN_uA, + .batocp_step = BQ25980_BATOCP_STEP_uA, + + .vbus_adc_step = BQ25980_ADC_VBUS_STEP_uV, + .vbus_adc_offset = BQ25980_ADC_VBUS_OFFSET_uV, + + .ibus_adc_step = BQ25980_ADC_IBUS_STEP_uA, + .ibus_adc_offset = BQ25980_ADC_IBUS_OFFSET_uA, + + .vbat_adc_step = BQ25980_ADC_VBAT_STEP_uV, + .vbat_adc_offset = BQ25980_ADC_VBAT_OFFSET_uV, + + .ibat_adc_step = BQ25980_ADC_IBAT_STEP_uA, + .ibat_adc_offset = BQ25980_ADC_IBAT_OFFSET_uA, }, [BQ25975] = { @@ -1015,6 +1068,10 @@ static const struct bq25980_chip_info bq25980_chip_info_tbl[] = { .busocp_sc_max = BQ25975_BUSOCP_SC_MAX_uA, .busocp_byp_min = BQ25980_BUSOCP_MIN_uA, .busocp_byp_max = BQ25975_BUSOCP_BYP_MAX_uA, + .busocp_sc_step = BQ25980_BUSOCP_STEP_uA, + .busocp_byp_step = BQ25980_BUSOCP_STEP_uA, + .busocp_sc_offset = BQ25980_BUSOCP_OFFSET_uA, + .busocp_byp_offset = BQ25980_BUSOCP_OFFSET_uA, .busovp_sc_def = BQ25975_BUSOVP_DFLT_uV, .busovp_byp_def = BQ25975_BUSOVP_BYPASS_DFLT_uV, @@ -1035,6 +1092,20 @@ static const struct bq25980_chip_info bq25980_chip_info_tbl[] = { .batocp_def = BQ25980_BATOCP_DFLT_uA, .batocp_max = BQ25980_BATOCP_MAX_uA, + .batocp_min = BQ25980_BATOCP_MIN_uA, + .batocp_step = BQ25980_BATOCP_STEP_uA, + + .vbus_adc_step = BQ25975_ADC_VBUS_STEP_uV, + .vbus_adc_offset = BQ25975_ADC_VBUS_OFFSET_uV, + + .ibus_adc_step = BQ25975_ADC_IBUS_STEP_uA, + .ibus_adc_offset = BQ25975_ADC_IBUS_OFFSET_uA, + + .vbat_adc_step = BQ25975_ADC_VBAT_STEP_uV, + .vbat_adc_offset = BQ25975_ADC_VBAT_OFFSET_uV, + + .ibat_adc_step = BQ25975_ADC_IBAT_STEP_uA, + .ibat_adc_offset = BQ25975_ADC_IBAT_OFFSET_uA, }, [BQ25960] = { @@ -1042,10 +1113,14 @@ static const struct bq25980_chip_info bq25980_chip_info_tbl[] = { .regmap_config = &bq25960_regmap_config, .busocp_def = BQ25960_BUSOCP_DFLT_uA, - .busocp_sc_min = BQ25960_BUSOCP_SC_MAX_uA, + .busocp_sc_min = BQ25960_BUSOCP_SC_MIN_uA, .busocp_sc_max = BQ25960_BUSOCP_SC_MAX_uA, - .busocp_byp_min = BQ25960_BUSOCP_SC_MAX_uA, + .busocp_byp_min = BQ25960_BUSOCP_BYP_MIN_uA, .busocp_byp_max = BQ25960_BUSOCP_BYP_MAX_uA, + .busocp_sc_step = BQ25960_BUSOCP_SC_STEP_uA, + .busocp_byp_step = BQ25960_BUSOCP_BYP_STEP_uA, + .busocp_sc_offset = BQ25960_BUSOCP_SC_OFFSET_uA, + .busocp_byp_offset = BQ25960_BUSOCP_BYP_OFFSET_uA, .busovp_sc_def = BQ25975_BUSOVP_DFLT_uV, .busovp_byp_def = BQ25975_BUSOVP_BYPASS_DFLT_uV, @@ -1066,6 +1141,20 @@ static const struct bq25980_chip_info bq25980_chip_info_tbl[] = { .batocp_def = BQ25960_BATOCP_DFLT_uA, .batocp_max = BQ25960_BATOCP_MAX_uA, + .batocp_min = BQ25960_BATOCP_MIN_uA, + .batocp_step = BQ25960_BATOCP_STEP_uA, + + .vbus_adc_step = BQ25960_ADC_VBUS_STEP_uV, + .vbus_adc_offset = BQ25960_ADC_VBUS_OFFSET_uV, + + .ibus_adc_step = BQ25960_ADC_IBUS_STEP_uA, + .ibus_adc_offset = BQ25960_ADC_IBUS_OFFSET_uA, + + .vbat_adc_step = BQ25960_ADC_VBAT_STEP_uV, + .vbat_adc_offset = BQ25960_ADC_VBAT_OFFSET_uV, + + .ibat_adc_step = BQ25960_ADC_IBAT_STEP_uA, + .ibat_adc_offset = BQ25960_ADC_IBAT_OFFSET_uA, }, }; diff --git a/drivers/power/supply/bq25980_charger.h b/drivers/power/supply/bq25980_charger.h index 39f94eba5f6c..7394bd9d7263 100644 --- a/drivers/power/supply/bq25980_charger.h +++ b/drivers/power/supply/bq25980_charger.h @@ -66,22 +66,29 @@ #define BQ25980_DEGLITCH_TIME 0x39 #define BQ25980_CHRGR_CTRL_6 0x3A -#define BQ25980_BUSOCP_STEP_uA 250000 -#define BQ25980_BUSOCP_OFFSET_uA 1000000 +#define BQ25980_BUSOCP_STEP_uA 262500 +#define BQ25980_BUSOCP_OFFSET_uA 1050000 -#define BQ25980_BUSOCP_DFLT_uA 4250000 -#define BQ25975_BUSOCP_DFLT_uA 4250000 +#define BQ25960_BUSOCP_SC_STEP_uA 254375 +#define BQ25960_BUSOCP_SC_OFFSET_uA 1017500 +#define BQ25960_BUSOCP_BYP_STEP_uA 261875 +#define BQ25960_BUSOCP_BYP_OFFSET_uA 1047500 + +#define BQ25980_BUSOCP_DFLT_uA 4462500 +#define BQ25975_BUSOCP_DFLT_uA 4462500 #define BQ25960_BUSOCP_DFLT_uA 3250000 -#define BQ25980_BUSOCP_MIN_uA 1000000 +#define BQ25980_BUSOCP_MIN_uA 1050000 +#define BQ25960_BUSOCP_SC_MIN_uA 1017500 +#define BQ25960_BUSOCP_BYP_MIN_uA 1047500 -#define BQ25980_BUSOCP_SC_MAX_uA 5750000 -#define BQ25975_BUSOCP_SC_MAX_uA 5750000 -#define BQ25960_BUSOCP_SC_MAX_uA 3750000 +#define BQ25980_BUSOCP_SC_MAX_uA 6037500 +#define BQ25975_BUSOCP_SC_MAX_uA 6037500 +#define BQ25960_BUSOCP_SC_MAX_uA 4578750 -#define BQ25980_BUSOCP_BYP_MAX_uA 8500000 -#define BQ25975_BUSOCP_BYP_MAX_uA 8500000 -#define BQ25960_BUSOCP_BYP_MAX_uA 5750000 +#define BQ25980_BUSOCP_BYP_MAX_uA 8925000 +#define BQ25975_BUSOCP_BYP_MAX_uA 8925000 +#define BQ25960_BUSOCP_BYP_MAX_uA 6808750 #define BQ25980_BUSOVP_SC_STEP_uV 100000 #define BQ25975_BUSOVP_SC_STEP_uV 50000 @@ -120,11 +127,11 @@ #define BQ25980_BATOVP_STEP_uV 20000 #define BQ25975_BATOVP_STEP_uV 10000 -#define BQ25960_BATOVP_STEP_uV 10000 +#define BQ25960_BATOVP_STEP_uV 9985 #define BQ25980_BATOVP_OFFSET_uV 7000000 #define BQ25975_BATOVP_OFFSET_uV 3500000 -#define BQ25960_BATOVP_OFFSET_uV 3500000 +#define BQ25960_BATOVP_OFFSET_uV 3491000 #define BQ25980_BATOVP_DFLT_uV 14000000 #define BQ25975_BATOVP_DFLT_uV 8900000 @@ -132,24 +139,26 @@ #define BQ25980_BATOVP_MIN_uV 7000000 #define BQ25975_BATOVP_MIN_uV 3500000 -#define BQ25960_BATOVP_MIN_uV 3500000 +#define BQ25960_BATOVP_MIN_uV 3491000 #define BQ25980_BATOVP_MAX_uV 9540000 #define BQ25975_BATOVP_MAX_uV 4770000 -#define BQ25960_BATOVP_MAX_uV 4770000 +#define BQ25960_BATOVP_MAX_uV 4759000 #define BQ25980_BATOCP_STEP_uA 100000 +#define BQ25960_BATOCP_STEP_uA 102500 #define BQ25980_BATOCP_MASK GENMASK(6, 0) #define BQ25980_BATOCP_DFLT_uA 8100000 -#define BQ25960_BATOCP_DFLT_uA 6100000 +#define BQ25960_BATOCP_DFLT_uA 7277500 #define BQ25980_BATOCP_MIN_uA 2000000 +#define BQ25960_BATOCP_MIN_uA 2050000 #define BQ25980_BATOCP_MAX_uA 11000000 #define BQ25975_BATOCP_MAX_uA 11000000 -#define BQ25960_BATOCP_MAX_uA 7000000 +#define BQ25960_BATOCP_MAX_uA 8712500 #define BQ25980_ENABLE_HIZ 0xff #define BQ25980_DISABLE_HIZ 0x0 @@ -165,10 +174,40 @@ #define BQ25980_EN_HIZ BIT(6) #define BQ25980_ADC_EN BIT(7) -#define BQ25980_ADC_VOLT_STEP_uV 1000 -#define BQ25980_ADC_CURR_STEP_uA 1000 #define BQ25980_ADC_POLARITY_BIT BIT(7) +#define BQ25980_ADC_IBUS_STEP_uA 1070 +#define BQ25980_ADC_IBUS_OFFSET_uA 0 +#define BQ25980_ADC_VBUS_STEP_uV 1007 +#define BQ25980_ADC_VBUS_OFFSET_uV -60000 + +#define BQ25980_ADC_IBAT_STEP_uA 1000 +#define BQ25980_ADC_IBAT_OFFSET_uA 0 +#define BQ25980_ADC_VBAT_STEP_uV 1006 +#define BQ25980_ADC_VBAT_OFFSET_uV 0 + +#define BQ25975_ADC_IBUS_STEP_uA 1070 +#define BQ25975_ADC_IBUS_OFFSET_uA 0 +#define BQ25975_ADC_VBUS_STEP_uV 1003 +#define BQ25975_ADC_VBUS_OFFSET_uV -40000 + +#define BQ25975_ADC_IBAT_STEP_uA 1000 +#define BQ25975_ADC_IBAT_OFFSET_uA 12000 +#define BQ25975_ADC_VBAT_STEP_uV 1001 +#define BQ25975_ADC_VBAT_OFFSET_uV 10000 + +#define BQ25960_ADC_IBUS_STEP_uA 1000 +#define BQ25960_ADC_IBUS_OFFSET_uA 65000 +#define BQ25960_ADC_VBUS_STEP_uV 1002 +#define BQ25960_ADC_VBUS_OFFSET_uV 0 + +#define BQ25960_ADC_IBAT_STEP_uA 999 +#define BQ25960_ADC_IBAT_OFFSET_uA -150 +#define BQ25960_ADC_IBAT_MIN_CODE 0x96 +#define BQ25960_ADC_IBAT_MAX_CODE 0x2ee0 +#define BQ25960_ADC_VBAT_STEP_uV 1017 +#define BQ25960_ADC_VBAT_OFFSET_uV 1000 + #define BQ25980_WATCHDOG_MASK GENMASK(4, 3) #define BQ25980_WATCHDOG_DIS BIT(2) #define BQ25980_WATCHDOG_MAX 300000 -- 2.30.0