aboutsummaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorKalle Komierowski <karl.komierowski@gmail.com>2011-03-01 15:35:26 +0100
committerJonas ABERG <jonas.aberg@stericsson.com>2011-03-04 10:54:34 +0100
commit2e600853cef41011dce4f4fe29c31d62b6c972b6 (patch)
tree7a24ce2d7b2c60dfcc09d958a29f0521eb25d8ad /drivers/power
parent51424c9b770c895848f4bd7b3e5cf4f7fb1c836b (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.c28
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);
}
}
}