diff options
author | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-10-12 11:20:04 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-12-06 10:50:01 +0100 |
commit | d42db7ea0ecdd5a3b3aa3121bac9c8babadc02bd (patch) | |
tree | 3774b99370ff095fd5a1c7711f5c1b98df4dca30 /drivers/power/ab8500_chargalg.c | |
parent | 01830ed7b0821da7b44129c6a05d4aea83f0840f (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>
Conflicts:
arch/arm/mach-ux500/board-mop500-bm.c
Diffstat (limited to 'drivers/power/ab8500_chargalg.c')
-rw-r--r-- | drivers/power/ab8500_chargalg.c | 55 |
1 files changed, 52 insertions, 3 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: |