diff options
| author | Kalle Komierowski <kalle.komierowski@gmail.com> | 2011-04-01 14:35:09 +0200 |
|---|---|---|
| committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 15:15:04 +0200 |
| commit | 96765873ec8ca6295be5fbec1b19b7792011a831 (patch) | |
| tree | 572c073f37f8f69f3279aa9a2a70b212a871af35 /drivers/power | |
| parent | ce128447c31a55c8bab73d8c9dc4d474ba6da155 (diff) | |
power: ab8500_bm: Removal of maintenance charging
This patch makes it possible to remove the maintenance A and B
charging states and replaces them with a state that restarts the
charging when the battery voltage level dropped below a certain
level. The maintenance charging can now be turned of by setting
a flag in the board configuration.
ST-Ericsson Linux Next: -
ST-Ericsson ID: CR333019
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: Ie5e8ab20a3b57a1028d544371b10ffbb1fd77660
Signed-off-by: Kalle Komierowski <kalle.komierowski@gmail.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/19916
Reviewed-by: Johan GARDSMARK <johan.gardsmark@stericsson.com>
Reviewed-by: Johan PALSSON <johan.palsson@stericsson.com>
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Tested-by: Karl KOMIEROWSKI <karl.komierowski@stericsson.com>
Diffstat (limited to 'drivers/power')
| -rw-r--r-- | drivers/power/ab8500_chargalg.c | 55 | ||||
| -rw-r--r-- | drivers/power/ab8500_fg.c | 3 |
2 files changed, 53 insertions, 5 deletions
diff --git a/drivers/power/ab8500_chargalg.c b/drivers/power/ab8500_chargalg.c index 788d81aa7cd..cb56c67475c 100644 --- a/drivers/power/ab8500_chargalg.c +++ b/drivers/power/ab8500_chargalg.c @@ -30,6 +30,9 @@ /* End-of-charge criteria counter */ #define EOC_COND_CNT 10 +/* Recharge criteria counter */ +#define RCH_COND_CNT 3 + #define to_ab8500_chargalg_device_info(x) container_of((x), \ struct ab8500_chargalg, chargalg_psy); @@ -80,6 +83,8 @@ enum ab8500_chargalg_states { STATE_HW_TEMP_PROTECT, STATE_NORMAL_INIT, STATE_NORMAL, + STATE_WAIT_FOR_RECHARGE_INIT, + STATE_WAIT_FOR_RECHARGE, STATE_MAINTENANCE_A_INIT, STATE_MAINTENANCE_A, STATE_MAINTENANCE_B_INIT, @@ -109,6 +114,8 @@ static const char *states[] = { "HW_TEMP_PROTECT", "NORMAL_INIT", "NORMAL", + "WAIT_FOR_RECHARGE_INIT", + "WAIT_FOR_RECHARGE", "MAINTENANCE_A_INIT", "MAINTENANCE_A", "MAINTENANCE_B_INIT", @@ -186,6 +193,7 @@ enum maxim_ret { * @dev: pointer to the structure device * @charge_status: battery operating status * @eoc_cnt: counter used to determine end-of_charge + * @rch_cnt: counter used to determine start of recharge * @maintenance_chg: indicate if maintenance charge is active * @t_hyst_norm temperature hysteresis when the temperature has been * over or under normal limits @@ -214,6 +222,7 @@ struct ab8500_chargalg { struct device *dev; int charge_status; int eoc_cnt; + int rch_cnt; bool maintenance_chg; int t_hyst_norm; int t_hyst_lowhigh; @@ -569,6 +578,26 @@ static void ab8500_chargalg_stop_charging(struct ab8500_chargalg *di) } /** + * ab8500_chargalg_hold_charging() - Pauses charging + * @di: pointer to the ab8500_chargalg structure + * + * This function is called in the case where maintenance charging has been + * disabled and instead a battery voltage mode is entered to check when the + * battery voltage has reached a certain recharge voltage + */ +static void ab8500_chargalg_hold_charging(struct ab8500_chargalg *di) +{ + ab8500_chargalg_ac_en(di, false, 0, 0); + ab8500_chargalg_usb_en(di, false, 0, 0); + ab8500_chargalg_stop_safety_timer(di); + ab8500_chargalg_stop_maintenance_timer(di); + di->charge_status = POWER_SUPPLY_STATUS_CHARGING; + di->maintenance_chg = false; + cancel_delayed_work(&di->chargalg_wd_work); + power_supply_changed(&di->chargalg_psy); +} + +/** * ab8500_chargalg_start_charging() - Start the charger * @di: pointer to the ab8500_chargalg structure * @vset: requested charger output voltage @@ -1384,11 +1413,31 @@ static void ab8500_chargalg_algorithm(struct ab8500_chargalg *di) case STATE_NORMAL: handle_maxim_chg_curr(di); - if (di->charge_status == POWER_SUPPLY_STATUS_FULL && - di->maintenance_chg) - ab8500_chargalg_state_to(di, STATE_MAINTENANCE_A_INIT); + di->maintenance_chg) { + if (di->bat->no_maintenance) + ab8500_chargalg_state_to(di, + STATE_WAIT_FOR_RECHARGE_INIT); + else + ab8500_chargalg_state_to(di, + STATE_MAINTENANCE_A_INIT); + } + break; + /* This state will be used when the maintenance state is disabled */ + case STATE_WAIT_FOR_RECHARGE_INIT: + ab8500_chargalg_hold_charging(di); + ab8500_chargalg_state_to(di, STATE_WAIT_FOR_RECHARGE); + di->rch_cnt = RCH_COND_CNT; + /* Intentional fallthrough */ + + case STATE_WAIT_FOR_RECHARGE: + if (di->batt_data.volt <= + di->bat->bat_type[di->bat->batt_id].recharge_vol) { + if (di->rch_cnt-- == 0) + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); + } else + di->rch_cnt = RCH_COND_CNT; break; case STATE_MAINTENANCE_A_INIT: diff --git a/drivers/power/ab8500_fg.c b/drivers/power/ab8500_fg.c index a42ce95d48f..8af5216b90b 100644 --- a/drivers/power/ab8500_fg.c +++ b/drivers/power/ab8500_fg.c @@ -590,8 +590,7 @@ static void ab8500_fg_acc_cur_work(struct work_struct *work) mutex_unlock(&di->cc_lock); - queue_work(di->fg_wq, - &di->fg_work); + queue_work(di->fg_wq, &di->fg_work); return; exit: |
