summaryrefslogtreecommitdiff
path: root/drivers/power/ab8500_chargalg.c
diff options
context:
space:
mode:
authorPhilippe Langlais <philippe.langlais@stericsson.com>2011-10-12 11:20:04 +0200
committerPhilippe Langlais <philippe.langlais@stericsson.com>2011-12-06 10:50:01 +0100
commitd42db7ea0ecdd5a3b3aa3121bac9c8babadc02bd (patch)
tree3774b99370ff095fd5a1c7711f5c1b98df4dca30 /drivers/power/ab8500_chargalg.c
parent01830ed7b0821da7b44129c6a05d4aea83f0840f (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.c55
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: