diff options
Diffstat (limited to 'driver/charger/bq24773.c')
-rw-r--r-- | driver/charger/bq24773.c | 136 |
1 files changed, 94 insertions, 42 deletions
diff --git a/driver/charger/bq24773.c b/driver/charger/bq24773.c index 4cd85b5ff1..87ef187357 100644 --- a/driver/charger/bq24773.c +++ b/driver/charger/bq24773.c @@ -42,28 +42,61 @@ static const struct charger_info bq2477x_charger_info = { .input_current_step = REG_TO_CURRENT(INPUT_I_STEP, R_AC), }; +#ifdef CONFIG_CHARGER_BQ24773 +static inline enum ec_error_list raw_read8(int chgnum, int offset, int *value) +{ + return i2c_read8(chg_chips[chgnum].i2c_port, + chg_chips[chgnum].i2c_addr_flags, + offset, value); +} + +static inline enum ec_error_list raw_write8(int chgnum, int offset, int value) +{ + return i2c_write8(chg_chips[chgnum].i2c_port, + chg_chips[chgnum].i2c_addr_flags, + offset, value); +} +#endif + +static inline enum ec_error_list raw_read16(int chgnum, int offset, int *value) +{ + return i2c_read16(chg_chips[chgnum].i2c_port, + chg_chips[chgnum].i2c_addr_flags, + offset, value); +} + +static inline enum ec_error_list raw_write16(int chgnum, int offset, int value) +{ + return i2c_write16(chg_chips[chgnum].i2c_port, + chg_chips[chgnum].i2c_addr_flags, + offset, value); +} + + /* chip specific interfaces */ -int charger_set_input_current(int input_current) +static enum ec_error_list bq2477x_set_input_current(int chgnum, + int input_current) { #ifdef CONFIG_CHARGER_BQ24770 - return raw_write16(REG_INPUT_CURRENT, + return raw_write16(chgnum, REG_INPUT_CURRENT, CURRENT_TO_REG(input_current, R_AC)); #elif defined(CONFIG_CHARGER_BQ24773) - return raw_write8(REG_INPUT_CURRENT, + return raw_write8(chgnum, REG_INPUT_CURRENT, CURRENT_TO_REG8(input_current, R_AC)); #endif } -int charger_get_input_current(int *input_current) +static enum ec_error_list bq2477x_get_input_current(int chgnum, + int *input_current) { int rv; int reg; #ifdef CONFIG_CHARGER_BQ24770 - rv = raw_read16(REG_INPUT_CURRENT, ®); + rv = raw_read16(chgnum, REG_INPUT_CURRENT, ®); #elif defined(CONFIG_CHARGER_BQ24773) - rv = raw_read8(REG_INPUT_CURRENT, ®); + rv = raw_read8(chgnum, REG_INPUT_CURRENT, ®); #endif if (rv) return rv; @@ -76,48 +109,48 @@ int charger_get_input_current(int *input_current) return EC_SUCCESS; } -int charger_manufacturer_id(int *id) +static enum ec_error_list bq2477x_manufacturer_id(int chgnum, int *id) { #ifdef CONFIG_CHARGER_BQ24770 - return raw_read16(REG_MANUFACTURE_ID, id); + return raw_read16(chgnum, REG_MANUFACTURE_ID, id); #elif defined(CONFIG_CHARGER_BQ24773) *id = 0x40; /* TI */ return EC_SUCCESS; #endif } -int charger_device_id(int *id) +static enum ec_error_list bq2477x_device_id(int chgnum, int *id) { #ifdef CONFIG_CHARGER_BQ24770 - return raw_read16(REG_DEVICE_ADDRESS, id); + return raw_read16(chgnum, REG_DEVICE_ADDRESS, id); #elif defined(CONFIG_CHARGER_BQ24773) - return raw_read8(REG_DEVICE_ADDRESS, id); + return raw_read8(chgnum, REG_DEVICE_ADDRESS, id); #endif } -int charger_get_option(int *option) +static enum ec_error_list bq2477x_get_option(int chgnum, int *option) { - return raw_read16(REG_CHARGE_OPTION0, option); + return raw_read16(chgnum, REG_CHARGE_OPTION0, option); } -int charger_set_option(int option) +static enum ec_error_list bq2477x_set_option(int chgnum, int option) { - return raw_write16(REG_CHARGE_OPTION0, option); + return raw_write16(chgnum, REG_CHARGE_OPTION0, option); } /* Charger interfaces */ -const struct charger_info *charger_get_info(void) +static const struct charger_info *bq2477x_get_info(int chgnum) { return &bq2477x_charger_info; } -int charger_get_status(int *status) +static enum ec_error_list bq2477x_get_status(int chgnum, int *status) { int rv; int option; - rv = charger_get_option(&option); + rv = bq2477x_get_option(chgnum, &option); if (rv) return rv; @@ -130,12 +163,12 @@ int charger_get_status(int *status) return EC_SUCCESS; } -int charger_set_mode(int mode) +static enum ec_error_list bq2477x_set_mode(int chgnum, int mode) { int rv; int option; - rv = charger_get_option(&option); + rv = bq2477x_get_option(chgnum, &option); if (rv) return rv; @@ -143,15 +176,15 @@ int charger_set_mode(int mode) option |= OPTION0_CHARGE_INHIBIT; else option &= ~OPTION0_CHARGE_INHIBIT; - return charger_set_option(option); + return bq2477x_set_option(chgnum, option); } -int charger_get_current(int *current) +static enum ec_error_list bq2477x_get_current(int chgnum, int *current) { int rv; int reg; - rv = raw_read16(REG_CHARGE_CURRENT, ®); + rv = raw_read16(chgnum, REG_CHARGE_CURRENT, ®); if (rv) return rv; @@ -160,55 +193,56 @@ int charger_get_current(int *current) return EC_SUCCESS; } -int charger_set_current(int current) +static enum ec_error_list bq2477x_set_current(int chgnum, int current) { current = charger_closest_current(current); - return raw_write16(REG_CHARGE_CURRENT, CURRENT_TO_REG(current, R_SNS)); + return raw_write16(chgnum, REG_CHARGE_CURRENT, + CURRENT_TO_REG(current, R_SNS)); } -int charger_get_voltage(int *voltage) +static enum ec_error_list bq2477x_get_voltage(int chgnum, int *voltage) { - return raw_read16(REG_MAX_CHARGE_VOLTAGE, voltage); + return raw_read16(chgnum, REG_MAX_CHARGE_VOLTAGE, voltage); } -int charger_set_voltage(int voltage) +static enum ec_error_list bq2477x_set_voltage(int chgnum, int voltage) { voltage = charger_closest_voltage(voltage); - return raw_write16(REG_MAX_CHARGE_VOLTAGE, voltage); + return raw_write16(chgnum, REG_MAX_CHARGE_VOLTAGE, voltage); } /* Charging power state initialization */ -int charger_post_init(void) +static enum ec_error_list bq2477x_post_init(int chgnum) { int rv, option; #ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED int option2; #endif - rv = charger_get_option(&option); + rv = bq2477x_get_option(chgnum, &option); if (rv) return rv; option &= ~OPTION0_LEARN_ENABLE; - rv = charger_set_option(option); + rv = bq2477x_set_option(chgnum, option); if (rv) return rv; #ifndef BOARD_SAMUS /* Turn off PROCHOT warning */ - rv = raw_read16(REG_PROCHOT_OPTION1, &option); + rv = raw_read16(chgnum, REG_PROCHOT_OPTION1, &option); if (rv) return rv; option &= ~PROCHOT_OPTION1_SELECTOR_MASK; - rv = raw_write16(REG_PROCHOT_OPTION1, option); + rv = raw_write16(chgnum, REG_PROCHOT_OPTION1, option); #else /* On Samus, use PROCHOT warning to detect charging problems */ /* Turn on PROCHOT warning */ - rv = raw_write16(REG_PROCHOT_OPTION1, 0x8120); + rv = raw_write16(chgnum, REG_PROCHOT_OPTION1, 0x8120); /* Set PROCHOT ICRIT warning when IADP is >120% of IDPM */ - rv |= raw_write16(REG_PROCHOT_OPTION0, 0x1b54); + rv |= raw_write16(chgnum, REG_PROCHOT_OPTION0, 0x1b54); #endif if (rv) @@ -216,14 +250,14 @@ int charger_post_init(void) #ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED /* Read the external ILIM pin enabled flag. */ - rv = raw_read16(REG_CHARGE_OPTION2, &option2); + rv = raw_read16(chgnum, REG_CHARGE_OPTION2, &option2); if (rv) return rv; /* Set ILIM pin disabled if it is currently enabled. */ if (option2 & OPTION2_EN_EXTILIM) { option2 &= ~OPTION2_EN_EXTILIM; - rv = raw_write16(REG_CHARGE_OPTION2, option2); + rv = raw_write16(chgnum, REG_CHARGE_OPTION2, option2); } return rv; #else @@ -231,19 +265,37 @@ int charger_post_init(void) #endif } -int charger_discharge_on_ac(int enable) +static enum ec_error_list bq2477x_discharge_on_ac(int chgnum, int enable) { int rv; int option; - rv = charger_get_option(&option); + rv = bq2477x_get_option(chgnum, &option); if (rv) return rv; if (enable) - rv = charger_set_option(option | OPTION0_LEARN_ENABLE); + rv = bq2477x_set_option(chgnum, option | OPTION0_LEARN_ENABLE); else - rv = charger_set_option(option & ~OPTION0_LEARN_ENABLE); + rv = bq2477x_set_option(chgnum, option & ~OPTION0_LEARN_ENABLE); return rv; } + +const struct charger_drv bq2477x_drv = { + .post_init = &bq2477x_post_init, + .get_info = &bq2477x_get_info, + .get_status = &bq2477x_get_status, + .set_mode = &bq2477x_set_mode, + .get_current = &bq2477x_get_current, + .set_current = &bq2477x_set_current, + .get_voltage = &bq2477x_get_voltage, + .set_voltage = &bq2477x_set_voltage, + .discharge_on_ac = &bq2477x_discharge_on_ac, + .set_input_current = &bq2477x_set_input_current, + .get_input_current = &bq2477x_get_input_current, + .manufacturer_id = &bq2477x_manufacturer_id, + .device_id = &bq2477x_device_id, + .get_option = &bq2477x_get_option, + .set_option = &bq2477x_set_option, +}; |