diff options
author | Kalle Komierowski <karl.komierowski@gmail.com> | 2011-03-01 15:35:26 +0100 |
---|---|---|
committer | Jonas ABERG <jonas.aberg@stericsson.com> | 2011-03-04 10:54:34 +0100 |
commit | 2e600853cef41011dce4f4fe29c31d62b6c972b6 (patch) | |
tree | 7a24ce2d7b2c60dfcc09d958a29f0521eb25d8ad /drivers/power | |
parent | 51424c9b770c895848f4bd7b3e5cf4f7fb1c836b (diff) |
power: ab8500_bm: Added hysteresis to the temperature limits
A small hysteresis has been added when going from a too high/low
temperature to less critical level
ST-Ericsson ID: -
Change-Id: I622b856dd14b9027ed8172f1e129980fd71b8f1d
Signed-off-by: Kalle Komierowski <karl.komierowski@gmail.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/17344
Reviewed-by: Johan PALSSON <johan.palsson@stericsson.com>
Tested-by: Karl KOMIEROWSKI <karl.komierowski@stericsson.com>
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/ab8500_chargalg.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/drivers/power/ab8500_chargalg.c b/drivers/power/ab8500_chargalg.c index a166320198f..225c4420bc1 100644 --- a/drivers/power/ab8500_chargalg.c +++ b/drivers/power/ab8500_chargalg.c @@ -178,6 +178,10 @@ enum maxim_ret { * @charge_status: battery operating status * @eoc_cnt: counter used to determine end-of_charge * @maintenance_chg: indicate if maintenance charge is active + * @t_hyst_norm temperature hysteresis when the temperature has been + * over or under normal limits + * @t_hyst_lowhigh temperature hysteresis when the temperature has been + * over or under the high or low limits * @charge_state: current state of the charging algorithm * @ccm charging current maximization parameters * @chg_info: information about connected charger types @@ -202,6 +206,8 @@ struct ab8500_chargalg { int charge_status; int eoc_cnt; bool maintenance_chg; + int t_hyst_norm; + int t_hyst_lowhigh; enum ab8500_chargalg_states charge_state; struct ab8500_charge_curr_maximization ccm; struct ab8500_chargalg_charger_info chg_info; @@ -570,24 +576,38 @@ static void ab8500_chargalg_start_charging(struct ab8500_chargalg *di, */ static void ab8500_chargalg_check_temp(struct ab8500_chargalg *di) { - if (di->batt_data.temp > di->bat->temp_low && - di->batt_data.temp < di->bat->temp_high) { + if (di->batt_data.temp > (di->bat->temp_low + di->t_hyst_norm) && + di->batt_data.temp < (di->bat->temp_high - di->t_hyst_norm)) { /* Temp OK! */ di->events.btemp_underover = false; di->events.btemp_lowhigh = false; + di->t_hyst_norm = 0; + di->t_hyst_lowhigh = 0; } else { if (((di->batt_data.temp >= di->bat->temp_high) && - (di->batt_data.temp < di->bat->temp_over)) || - ((di->batt_data.temp > di->bat->temp_under) && + (di->batt_data.temp < + (di->bat->temp_over - di->t_hyst_lowhigh))) || + ((di->batt_data.temp > + (di->bat->temp_under + di->t_hyst_lowhigh)) && (di->batt_data.temp <= di->bat->temp_low))) { /* TEMP minor!!!!! */ di->events.btemp_underover = false; di->events.btemp_lowhigh = true; + di->t_hyst_norm = di->bat->temp_hysteresis; + di->t_hyst_lowhigh = 0; } else if (di->batt_data.temp <= di->bat->temp_under || di->batt_data.temp >= di->bat->temp_over) { /* TEMP major!!!!! */ di->events.btemp_underover = true; di->events.btemp_lowhigh = false; + di->t_hyst_norm = 0; + di->t_hyst_lowhigh = di->bat->temp_hysteresis; + } else { + /* Within hysteresis */ + dev_dbg(di->dev, "Within hysteresis limit temp: %d " + "hyst_lowhigh %d, hyst normal %d\n", + di->batt_data.temp, di->t_hyst_lowhigh, + di->t_hyst_norm); } } } |