summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVijay Hiremath <vijay.p.hiremath@intel.com>2016-10-17 19:33:18 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-11-12 01:50:27 -0800
commit3f728b4ca62f2e1f4c8b89d6097e91c3f24571c9 (patch)
tree9757062c29751c4e1c7f78abdc962738e3d4173c
parent732dced60f39c48fc838968fcedfd1b01143a9a9 (diff)
downloadchrome-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>
-rw-r--r--driver/charger/bd9995x.c103
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, &reg,
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, &reg,
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)
{