diff options
author | Vijay Hiremath <vijay.p.hiremath@intel.com> | 2016-10-17 19:33:18 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-11-12 01:50:27 -0800 |
commit | 3f728b4ca62f2e1f4c8b89d6097e91c3f24571c9 (patch) | |
tree | 9757062c29751c4e1c7f78abdc962738e3d4173c /driver | |
parent | 732dced60f39c48fc838968fcedfd1b01143a9a9 (diff) | |
download | chrome-ec-3f728b4ca62f2e1f4c8b89d6097e91c3f24571c9.tar.gz |
bd9995x: Battery charging profile settings
Added battery charging profile settings as given in the datasheet.
BUG=chrome-os-partner:58553
BRANCH=none
TEST=Manually verified on reef. VBAT is equal to battery voltage.
Previous/current Charge status is equal to the conditions given
in the datasheet.
Change-Id: Ie04619a122fe52d6768c03ff5156b368e3f2d340
Signed-off-by: Vijay Hiremath <vijay.p.hiremath@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/398080
Commit-Ready: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Tested-by: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Reviewed-by: David Hendricks <dhendrix@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r-- | driver/charger/bd9995x.c | 103 |
1 files changed, 69 insertions, 34 deletions
diff --git a/driver/charger/bd9995x.c b/driver/charger/bd9995x.c index bfb98a9bef..851ba0b8ac 100644 --- a/driver/charger/bd9995x.c +++ b/driver/charger/bd9995x.c @@ -581,14 +581,14 @@ int charger_set_current(int current) else if (current < bd9995x_charger_info.current_min) current = bd9995x_charger_info.current_min; - rv = ch_raw_write16(BD9995X_CMD_CHG_CURRENT, current, - BD9995X_BAT_CHG_COMMAND); + rv = ch_raw_write16(BD9995X_CMD_IPRECH_SET, + MIN(current, BD9995X_IPRECH_MAX), + BD9995X_EXTENDED_COMMAND); if (rv) return rv; - return ch_raw_write16(BD9995X_CMD_IPRECH_SET, - MIN(current, BD9995X_IPRECH_MAX), - BD9995X_EXTENDED_COMMAND); + return ch_raw_write16(BD9995X_CMD_CHG_CURRENT, current, + BD9995X_BAT_CHG_COMMAND); } int charger_get_voltage(int *voltage) @@ -601,7 +601,6 @@ int charger_set_voltage(int voltage) { int rv; int reg; - const struct battery_info *bi = battery_get_info(); /* * Regulate the system voltage to battery max if the battery @@ -616,7 +615,7 @@ int charger_set_voltage(int voltage) reg & BD9995X_CMD_CHGOP_SET2_BATT_LEARN || battery_is_present() != BP_YES || battery_is_cut_off()) - voltage = bi->voltage_max; + voltage = battery_get_info()->voltage_max; /* Charge voltage step 16 mV */ voltage &= ~0x0F; @@ -628,11 +627,69 @@ int charger_set_voltage(int voltage) BD9995X_BAT_CHG_COMMAND); } -static void bd99995_init(void) +static void bd9995x_battery_charging_profile_settings(void) { - int reg; const struct battery_info *bi = battery_get_info(); + /* Input Current Limit Setting */ + charger_set_input_current(CONFIG_CHARGER_INPUT_CURRENT); + + /* Fast-charge & Pre-charge Current Setting */ + charger_set_current(PD_MAX_CURRENT_MA); + + /* Charge Termination Current Setting */ + ch_raw_write16(BD9995X_CMD_ITERM_SET, + bd9995x_charger_info.current_min & 0x07C0, + BD9995X_EXTENDED_COMMAND); + + /* Trickle-charge Current Setting */ + ch_raw_write16(BD9995X_CMD_ITRICH_SET, + bi->precharge_current & 0x07C0, + BD9995X_EXTENDED_COMMAND); + + /* Fast Charge Voltage Regulation Settings for fast charging. */ + ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET1, + bi->voltage_max & 0x7FF0, + BD9995X_EXTENDED_COMMAND); + + ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET2, + bi->voltage_max & 0x7FF0, + BD9995X_EXTENDED_COMMAND); + + ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET3, + bi->voltage_max & 0x7FF0, + BD9995X_EXTENDED_COMMAND); + + /* Set Pre-charge Voltage Threshold for trickle charging. */ + ch_raw_write16(BD9995X_CMD_VPRECHG_TH_SET, + (bi->voltage_min - 1000) & 0x7FC0, + BD9995X_EXTENDED_COMMAND); + + /* Re-charge Battery Voltage Setting */ + ch_raw_write16(BD9995X_CMD_VRECHG_SET, + bi->voltage_max & 0x7FF0, + BD9995X_EXTENDED_COMMAND); + + /* Set battery OVP to 500 + maximum battery voltage */ + ch_raw_write16(BD9995X_CMD_VBATOVP_SET, + (bi->voltage_max + 500) & 0x7ff0, + BD9995X_EXTENDED_COMMAND); + + /* Reverse buck boost voltage Setting */ + ch_raw_write16(BD9995X_CMD_VRBOOST_SET, 0, + BD9995X_EXTENDED_COMMAND); + + /* Disable fast/pre-charging watchdog */ + ch_raw_write16(BD9995X_CMD_CHGWDT_SET, 0, + BD9995X_EXTENDED_COMMAND); + + /* TODO(crosbug.com/p/55626): Set VSYSVAL_THH/THL appropriately */ +} + +static void bd9995x_init(void) +{ + int reg; + /* Enable BC1.2 detection on VCC */ if (ch_raw_read16(BD9995X_CMD_VCC_UCD_SET, ®, BD9995X_EXTENDED_COMMAND)) @@ -673,13 +730,6 @@ static void bd99995_init(void) ch_raw_write16(BD9995X_CMD_CHGOP_SET2, reg, BD9995X_EXTENDED_COMMAND); - /* TODO(crosbug.com/p/55626): Set VSYSVAL_THH/THL appropriately */ - - /* Set battery OVP to 500 + maximum battery voltage */ - ch_raw_write16(BD9995X_CMD_VBATOVP_SET, - (bi->voltage_max + 500) & 0x7ff0, - BD9995X_EXTENDED_COMMAND); - /* Disable IADP pin current limit */ if (ch_raw_read16(BD9995X_CMD_VM_CTRL_SET, ®, BD9995X_EXTENDED_COMMAND)) @@ -688,23 +738,8 @@ static void bd99995_init(void) ch_raw_write16(BD9995X_CMD_VM_CTRL_SET, reg, BD9995X_EXTENDED_COMMAND); - /* Disable fast/pre-charging watchdog */ - ch_raw_write16(BD9995X_CMD_CHGWDT_SET, 0, - BD9995X_EXTENDED_COMMAND); - - /* Set charge termination current to 0 mA. */ - ch_raw_write16(BD9995X_CMD_ITERM_SET, 0, - BD9995X_EXTENDED_COMMAND); - - /* Set Pre-charge Voltage Threshold for trickle charging. */ - ch_raw_write16(BD9995X_CMD_VPRECHG_TH_SET, - bi->voltage_min & 0x7FC0, - BD9995X_EXTENDED_COMMAND); - - /* Trickle-charge Current Setting */ - ch_raw_write16(BD9995X_CMD_ITRICH_SET, - bi->precharge_current & 0x07C0, - BD9995X_EXTENDED_COMMAND); + /* Define battery charging profile */ + bd9995x_battery_charging_profile_settings(); /* Power save mode when VBUS/VCC is removed. */ #ifdef CONFIG_BD9995X_POWER_SAVE_MODE @@ -732,7 +767,7 @@ static void bd99995_init(void) /* Re-lock debug regs */ ch_raw_write16(BD9995X_CMD_PROTECT_SET, 0x0, BD9995X_EXTENDED_COMMAND); } -DECLARE_HOOK(HOOK_INIT, bd99995_init, HOOK_PRIO_INIT_EXTPOWER); +DECLARE_HOOK(HOOK_INIT, bd9995x_init, HOOK_PRIO_INIT_EXTPOWER); int charger_post_init(void) { |