diff options
-rw-r--r-- | common/charger.c | 33 | ||||
-rw-r--r-- | common/ocpc.c | 6 | ||||
-rw-r--r-- | driver/charger/isl923x.c | 59 | ||||
-rw-r--r-- | driver/charger/sm5803.c | 40 | ||||
-rw-r--r-- | include/charger.h | 10 |
5 files changed, 123 insertions, 25 deletions
diff --git a/common/charger.c b/common/charger.c index f9fd1c4640..e3d77976ae 100644 --- a/common/charger.c +++ b/common/charger.c @@ -359,6 +359,23 @@ int charger_is_sourcing_otg_power(int port) return chg_chips[chgnum].drv->is_sourcing_otg_power(chgnum, port); } +enum ec_error_list charger_get_actual_current(int chgnum, int *current) +{ + /* Note: chgnum may be -1 if no active port is selected */ + if (chgnum < 0) + return EC_ERROR_INVAL; + + if (chgnum >= board_get_charger_chip_count()) { + CPRINTS("%s(%d) Invalid charger!", __func__, chgnum); + return EC_ERROR_INVAL; + } + + if (!chg_chips[chgnum].drv->get_actual_current) + return EC_ERROR_UNIMPLEMENTED; + + return chg_chips[chgnum].drv->get_actual_current(chgnum, current); +} + enum ec_error_list charger_get_current(int chgnum, int *current) { /* Note: chgnum may be -1 if no active port is selected */ @@ -389,6 +406,22 @@ enum ec_error_list charger_set_current(int chgnum, int current) return chg_chips[chgnum].drv->set_current(chgnum, current); } +enum ec_error_list charger_get_actual_voltage(int chgnum, int *voltage) +{ + if (chgnum < 0) + return EC_ERROR_INVAL; + + if (chgnum >= board_get_charger_chip_count()) { + CPRINTS("%s(%d) Invalid charger!", __func__, chgnum); + return EC_ERROR_INVAL; + } + + if (!chg_chips[chgnum].drv->get_actual_voltage) + return EC_ERROR_UNIMPLEMENTED; + + return chg_chips[chgnum].drv->get_actual_voltage(chgnum, voltage); +} + enum ec_error_list charger_get_voltage(int chgnum, int *voltage) { if (chgnum < 0) diff --git a/common/ocpc.c b/common/ocpc.c index ab7f8e74a3..cf0d3adedb 100644 --- a/common/ocpc.c +++ b/common/ocpc.c @@ -606,7 +606,7 @@ void ocpc_get_adcs(struct ocpc_data *ocpc) ocpc->primary_ibus_ma = val; val = 0; - if (!charger_get_voltage(CHARGER_PRIMARY, &val)) + if (!charger_get_actual_voltage(CHARGER_PRIMARY, &val)) ocpc->vsys_mv = val; if (board_get_charger_chip_count() <= CHARGER_SECONDARY) { @@ -626,11 +626,11 @@ void ocpc_get_adcs(struct ocpc_data *ocpc) ocpc->secondary_ibus_ma = val; val = 0; - if (!charger_get_voltage(CHARGER_SECONDARY, &val)) + if (!charger_get_actual_voltage(CHARGER_SECONDARY, &val)) ocpc->vsys_aux_mv = val; val = 0; - if (!charger_get_current(CHARGER_SECONDARY, &val)) + if (!charger_get_actual_current(CHARGER_SECONDARY, &val)) ocpc->isys_ma = val; } diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c index 9cd6a2cbab..7d2b894f96 100644 --- a/driver/charger/isl923x.c +++ b/driver/charger/isl923x.c @@ -409,19 +409,28 @@ static enum ec_error_list isl923x_set_mode(int chgnum, int mode) return rv; } +#ifdef CONFIG_CHARGER_RAA489000 +static enum ec_error_list raa489000_get_actual_current(int chgnum, int *current) +{ + int rv; + int reg; + + rv = raw_read16(chgnum, RAA489000_REG_ADC_CHARGE_CURRENT, ®); + /* The value is in 22.2mA increments. */ + reg *= 222; + reg /= 10; + + *current = REG_TO_CURRENT(reg); + return rv; +} +#endif /* CONFIG_CHARGER_RAA489000 */ + static enum ec_error_list isl923x_get_current(int chgnum, int *current) { int rv; int reg; - if (IS_ENABLED(CONFIG_CHARGER_RAA489000)) { - rv = raw_read16(chgnum, RAA489000_REG_ADC_CHARGE_CURRENT, ®); - /* The value is in 22.2mA increments. */ - reg *= 222; - reg /= 10; - } else { - rv = raw_read16(chgnum, ISL923X_REG_CHG_CURRENT, ®); - } + rv = raw_read16(chgnum, ISL923X_REG_CHG_CURRENT, ®); if (rv) return rv; @@ -434,24 +443,28 @@ static enum ec_error_list isl923x_set_current(int chgnum, int current) return isl9237_set_current(chgnum, current); } -static enum ec_error_list isl923x_get_voltage(int chgnum, int *voltage) +#ifdef CONFIG_CHARGER_RAA489000 +static enum ec_error_list raa489000_get_actual_voltage(int chgnum, int *voltage) { int rv; int reg; - if (IS_ENABLED(CONFIG_CHARGER_RAA489000)) { - rv = raw_read16(chgnum, RAA489000_REG_ADC_VSYS, ®); - if (rv) - return rv; + rv = raw_read16(chgnum, RAA489000_REG_ADC_VSYS, ®); + if (rv) + return rv; - /* The voltage is returned in bits 13:6. LSB is 96mV. */ - reg &= GENMASK(13, 6); - reg >>= 6; - reg *= 96; + /* The voltage is returned in bits 13:6. LSB is 96mV. */ + reg &= GENMASK(13, 6); + reg >>= 6; + reg *= 96; - *voltage = reg; - return EC_SUCCESS; - } + *voltage = reg; + return EC_SUCCESS; +} +#endif /* CONFIG_CHARGER_RAA489000 */ + +static enum ec_error_list isl923x_get_voltage(int chgnum, int *voltage) +{ return raw_read16(chgnum, ISL923X_REG_SYS_VOLTAGE_MAX, voltage); } @@ -1376,8 +1389,14 @@ const struct charger_drv isl923x_drv = { .enable_otg_power = &isl923x_enable_otg_power, .set_otg_current_voltage = &isl923x_set_otg_current_voltage, #endif +#ifdef CONFIG_CHARGER_RAA489000 + .get_actual_current = &raa489000_get_actual_current, +#endif .get_current = &isl923x_get_current, .set_current = &isl923x_set_current, +#ifdef CONFIG_CHARGER_RAA489000 + .get_actual_voltage = &raa489000_get_actual_voltage, +#endif .get_voltage = &isl923x_get_voltage, .set_voltage = &isl923x_set_voltage, .discharge_on_ac = &isl923x_discharge_on_ac, diff --git a/driver/charger/sm5803.c b/driver/charger/sm5803.c index 7997dc09d8..7c635ddb93 100644 --- a/driver/charger/sm5803.c +++ b/driver/charger/sm5803.c @@ -1212,7 +1212,7 @@ static enum ec_error_list sm5803_set_mode(int chgnum, int mode) return rv; } -static enum ec_error_list sm5803_get_current(int chgnum, int *current) +static enum ec_error_list sm5803_get_actual_current(int chgnum, int *current) { enum ec_error_list rv; int reg; @@ -1233,6 +1233,21 @@ static enum ec_error_list sm5803_get_current(int chgnum, int *current) return EC_SUCCESS; } +static enum ec_error_list sm5803_get_current(int chgnum, int *current) +{ + enum ec_error_list rv; + int reg; + + rv = chg_read8(chgnum, SM5803_REG_FAST_CONF4, ®); + if (rv) + return rv; + + reg &= SM5803_CONF4_ICHG_FAST; + *current = SM5803_REG_TO_CURRENT(reg); + + return EC_SUCCESS; +} + static enum ec_error_list sm5803_set_current(int chgnum, int current) { enum ec_error_list rv; @@ -1249,7 +1264,7 @@ static enum ec_error_list sm5803_set_current(int chgnum, int current) return rv; } -static enum ec_error_list sm5803_get_voltage(int chgnum, int *voltage) +static enum ec_error_list sm5803_get_actual_voltage(int chgnum, int *voltage) { enum ec_error_list rv; int reg; @@ -1271,6 +1286,25 @@ static enum ec_error_list sm5803_get_voltage(int chgnum, int *voltage) return EC_SUCCESS; } +static enum ec_error_list sm5803_get_voltage(int chgnum, int *voltage) +{ + enum ec_error_list rv; + int regval; + int v; + + rv = chg_read8(chgnum, SM5803_REG_VBAT_FAST_MSB, ®val); + v = regval << 3; + rv |= chg_read8(chgnum, SM5803_REG_VBAT_FAST_LSB, ®val); + v |= (regval & 0x3); + + *voltage = SM5803_REG_TO_VOLTAGE(v); + + if (rv) + return EC_ERROR_UNKNOWN; + + return EC_SUCCESS; +} + static enum ec_error_list sm5803_set_voltage(int chgnum, int voltage) { enum ec_error_list rv; @@ -1716,8 +1750,10 @@ const struct charger_drv sm5803_drv = { .get_info = &sm5803_get_info, .get_status = &sm5803_get_status, .set_mode = &sm5803_set_mode, + .get_actual_current = &sm5803_get_actual_current, .get_current = &sm5803_get_current, .set_current = &sm5803_set_current, + .get_actual_voltage = &sm5803_get_actual_voltage, .get_voltage = &sm5803_get_voltage, .set_voltage = &sm5803_set_voltage, .discharge_on_ac = &sm5803_discharge_on_ac, diff --git a/include/charger.h b/include/charger.h index d8d62c1e9b..402f9eca73 100644 --- a/include/charger.h +++ b/include/charger.h @@ -85,6 +85,12 @@ struct charger_drv { enum ec_error_list (*get_voltage)(int chgnum, int *voltage); enum ec_error_list (*set_voltage)(int chgnum, int voltage); + + /* Get the measured charge current and voltage in mA/mV */ + enum ec_error_list (*get_actual_current)(int chgnum, int *current); + enum ec_error_list (*get_actual_voltage)(int chgnum, int *voltage); + + /* Discharge battery when on AC power. */ enum ec_error_list (*discharge_on_ac)(int chgnum, int enable); @@ -250,6 +256,10 @@ enum ec_error_list charger_set_current(int chgnum, int current); enum ec_error_list charger_get_voltage(int chgnum, int *voltage); enum ec_error_list charger_set_voltage(int chgnum, int voltage); +/* Get the measured charge current and voltage in mA/mV */ +enum ec_error_list charger_get_actual_current(int chgnum, int *current); +enum ec_error_list charger_get_actual_voltage(int chgnum, int *voltage); + /* Discharge battery when on AC power. */ enum ec_error_list charger_discharge_on_ac(int enable); |