diff options
-rw-r--r-- | board/kodama/battery.c | 30 | ||||
-rw-r--r-- | driver/charger/rt946x.c | 6 | ||||
-rw-r--r-- | driver/charger/rt946x.h | 5 |
3 files changed, 38 insertions, 3 deletions
diff --git a/board/kodama/battery.c b/board/kodama/battery.c index 21e5672879..e64e0c167a 100644 --- a/board/kodama/battery.c +++ b/board/kodama/battery.c @@ -83,10 +83,37 @@ enum battery_present battery_hw_present(void) int charger_profile_override(struct charge_state_data *curr) { + const struct battery_info *batt_info = battery_get_info(); + static int normal_charge_lock, over_discharge_lock; /* battery temp in 0.1 deg C */ int bat_temp_c = curr->batt.temperature - 2731; /* + * SMP battery uses HW pre-charge circuit and pre-charge current is + * limited to ~50mA. Once the charge current is lower than IEOC level + * within CHG_TEDG_EOC, and TE is enabled, the charging power path will + * be turned off. Disable EOC and TE when battery stays over discharge + * state, otherwise enable EOC and TE. + */ + if (curr->batt.voltage < batt_info->voltage_min) { + normal_charge_lock = 0; + + if (!over_discharge_lock && curr->state == ST_CHARGE) { + over_discharge_lock = 1; + rt946x_enable_charge_eoc(0); + rt946x_enable_charge_termination(0); + } + } else { + over_discharge_lock = 0; + + if (!normal_charge_lock) { + normal_charge_lock = 1; + rt946x_enable_charge_eoc(1); + rt946x_enable_charge_termination(1); + } + } + + /* * When smart battery temperature is more than 45 deg C, the max * charging voltage is 4100mV. */ @@ -107,9 +134,6 @@ int charger_profile_override(struct charge_state_data *curr) if (!curr->batt.is_present && curr->requested_voltage == 0 && curr->requested_current == 0) { - const struct battery_info *batt_info = - battery_get_info(); - /* * b/138978212: With adapter plugged in S0, the system * will set charging current and voltage as 0V/0A once diff --git a/driver/charger/rt946x.c b/driver/charger/rt946x.c index d6933b8736..cb7c36be3b 100644 --- a/driver/charger/rt946x.c +++ b/driver/charger/rt946x.c @@ -1198,6 +1198,12 @@ int rt946x_enable_charge_termination(int en) (RT946X_REG_CHGCTRL2, RT946X_MASK_TE); } +int rt946x_enable_charge_eoc(int en) +{ + return (en ? rt946x_set_bit : rt946x_clr_bit) + (RT946X_REG_CHGCTRL9, RT946X_MASK_EOC); +} + #ifdef CONFIG_CHARGER_MT6370 /* MT6370 LDO */ diff --git a/driver/charger/rt946x.h b/driver/charger/rt946x.h index 86a0e7cd65..9cb8b7dfd8 100644 --- a/driver/charger/rt946x.h +++ b/driver/charger/rt946x.h @@ -335,8 +335,10 @@ #define RT946X_MASK_IPREC (0xF << RT946X_SHIFT_IPREC) /* ========== CHGCTRL9 0x09 ============ */ +#define RT946X_SHIFT_EOC 3 #define RT946X_SHIFT_IEOC 4 +#define RT946X_MASK_EOC BIT(RT946X_SHIFT_EOC) #define RT946X_MASK_IEOC (0xF << RT946X_SHIFT_IEOC) /* ========== CHGCTRL10 0x0A ============ */ @@ -663,6 +665,9 @@ int rt946x_cutoff_battery(void); /* Enable/Disable charge temination */ int rt946x_enable_charge_termination(int en); +/* Enable/Disable charge EOC */ +int rt946x_enable_charge_eoc(int en); + /** * Toggle BC12 detection * |