google_battery: temperature and charge rate FAN level policy
Use the following hints for battery fan level:
From Battery temperature
DON’T CARE when battery temperature is under 32C
LOW for battery temperature under 42C
MEDIUM for battery temperature under 46C
HIGH for battery temperature over 46C
ALERT in JEITA HOT
From charge rate
LOW at 0.5 * C, MED at 0.7 * C, HIGH at 1C
Bug: 188478529
Signed-off-by: AleX Pelosi <[email protected]>
Change-Id: Idc43d9a475e32de4a9643d40b31b7cec80224a04
diff --git a/google_battery.c b/google_battery.c
index 6491cc7..3424a3f 100644
--- a/google_battery.c
+++ b/google_battery.c
@@ -332,7 +332,7 @@
int fan_level;
};
-static int gbatt_get_temp(struct batt_drv *batt_drv, int *temp);
+static int gbatt_get_temp(const struct batt_drv *batt_drv, int *temp);
static int batt_chg_tier_stats_cstr(char *buff, int size,
const struct gbms_ce_tier_stats *tier_stat,
@@ -749,32 +749,69 @@
ssoc_get_capacity_raw(ssoc_state), type);
}
-static int fan_calculate_level(struct batt_drv *batt_drv)
-{
- const struct gbms_chg_profile *profile = &batt_drv->chg_profile;
- int charging_rate = 0, temp, ret;
- const int temp_max = profile->temp_limits[profile->temp_nb_limits - 1];
+/* Fan levels limits from battery temperature */
+#define FAN_BT_LIMIT_NOT_CARE 320
+#define FAN_BT_LIMIT_LOW 420
+#define FAN_BT_LIMIT_MED 460
+#define FAN_BT_LIMIT_HIGH 480
+/* Fan levels limits from charge rate */
+#define FAN_CHG_LIMIT_LOW 50
+#define FAN_CHG_LIMIT_MED 70
- if (batt_drv->temp_idx < 2)
- return FAN_LVL_NOT_CARE;
- if (batt_drv->temp_idx == 3)
- return FAN_LVL_MED;
+static int fan_bt_calculate_level(const struct batt_drv *batt_drv)
+{
+ int level, temp, ret;
ret = gbatt_get_temp(batt_drv, &temp);
- if (ret == 0 && temp > temp_max)
- return FAN_LVL_ALARM;
+ if (ret < 0) {
- if (batt_drv->battery_capacity == 0)
- return FAN_LVL_UNKNOWN;
+ if (batt_drv->temp_idx < 2)
+ level = FAN_LVL_NOT_CARE;
+ else if (batt_drv->temp_idx == 3)
+ level = FAN_LVL_MED;
+ else
+ level = FAN_LVL_HIGH;
+
+ pr_warn("FAN_LEVEL: level=%d from temp_idx=%d (%d)\n",
+ level, batt_drv->temp_idx, ret);
+ return level;
+ }
+
+ if (temp <= FAN_BT_LIMIT_NOT_CARE)
+ level = FAN_LVL_NOT_CARE;
+ else if (temp <= FAN_BT_LIMIT_LOW)
+ level = FAN_LVL_LOW;
+ else if (temp <= FAN_BT_LIMIT_MED)
+ level = FAN_LVL_LOW;
+ else if (temp <= FAN_BT_LIMIT_HIGH)
+ level = FAN_LVL_HIGH;
+ else
+ level = FAN_LVL_ALARM;
+
+ return level;
+}
+
+static int fan_calculate_level(const struct batt_drv *batt_drv)
+{
+ int charging_rate, fan_level, chg_fan_level;
+
+ fan_level = fan_bt_calculate_level(batt_drv);
+ if (batt_drv->cc_max == 0 || batt_drv->battery_capacity == 0)
+ return fan_level;
charging_rate = batt_drv->cc_max / batt_drv->battery_capacity / 10;
+ if (charging_rate <= FAN_CHG_LIMIT_LOW)
+ chg_fan_level = FAN_LVL_LOW;
+ else if (charging_rate <= FAN_CHG_LIMIT_MED)
+ chg_fan_level = FAN_LVL_MED;
+ else
+ chg_fan_level = FAN_LVL_HIGH;
- if (charging_rate <= 50)
- return FAN_LVL_LOW;
- if (charging_rate <= 70)
- return FAN_LVL_MED;
+ /* Charge rate can increase the level */
+ if (chg_fan_level > fan_level)
+ fan_level = chg_fan_level;
- return FAN_LVL_HIGH;
+ return fan_level;
}
static void fan_level_reset(const struct batt_drv *batt_drv)
@@ -2884,15 +2921,19 @@
if (batt_drv->jeita_stop_charging)
batt_drv->cc_max = 0;
+ /* Fan level can be updated only during power transfer */
if (batt_drv->fan_level_votable) {
int level = fan_calculate_level(batt_drv);
+
vote(batt_drv->fan_level_votable, "MSC_BATT", true, level);
+ pr_debug("MSC_FAN_LVL: level=%d\n", level);
}
- pr_info("%s msc_state=%d cv_cnt=%d ov_cnt=%d temp_idx:%d, vbatt_idx:%d fv_uv=%d cc_max=%d update_interval=%d\n",
+ pr_info("%s msc_state=%d cv_cnt=%d ov_cnt=%d rl_sts=%d temp_idx:%d, vbatt_idx:%d fv_uv=%d cc_max=%d update_interval=%d\n",
(disable_votes) ? "MSC_DOUT" : "MSC_VOTE",
batt_drv->msc_state,
batt_drv->checked_cv_cnt, batt_drv->checked_ov_cnt,
+ batt_drv->ssoc_state.rl_status,
batt_drv->temp_idx, batt_drv->vbatt_idx,
batt_drv->fv_uv, batt_drv->cc_max,
batt_drv->msc_update_interval);
@@ -4576,7 +4617,7 @@
return capacity_level;
}
-static int gbatt_get_temp(struct batt_drv *batt_drv, int *temp)
+static int gbatt_get_temp(const struct batt_drv *batt_drv, int *temp)
{
int err = 0;
union power_supply_propval val;