Snap for 12590519 from 5c1955829bb868bb08949e10506a044de5988750 to android14-gs-pixel-6.1-25Q1-release
Change-Id: I218bd142f4ee61b6a6114e738da7220858c51380
Signed-off-by: Coastguard Worker <[email protected]>
diff --git a/google_battery.c b/google_battery.c
index 80908c0..5f61c0e 100644
--- a/google_battery.c
+++ b/google_battery.c
@@ -639,6 +639,7 @@
int aacr_algo;
int aacr_min_capacity_rate;
int aacr_cliff_capacity_rate;
+ struct mutex aacr_state_lock;
/* AAFV: Aged Adjusted Float Voltage */
enum batt_aafv_state aafv_state;
@@ -3945,6 +3946,7 @@
if (batt_drv->aacr_state == BATT_AACR_DISABLED)
goto exit_done;
+ mutex_lock(&batt_drv->aacr_state_lock);
if (cycle_count <= batt_drv->aacr_cycle_grace) {
batt_drv->aacr_state = BATT_AACR_UNDER_CYCLES;
} else {
@@ -3958,6 +3960,7 @@
capacity = aacr_capacity;
}
}
+ mutex_unlock(&batt_drv->aacr_state_lock);
exit_done:
return (u32)capacity;
@@ -7699,8 +7702,10 @@
pr_info("aacr_state: %d -> %d, aacr_algo: %d -> %d\n",
batt_drv->aacr_state, state, batt_drv->aacr_algo, algo);
+ mutex_lock(&batt_drv->aacr_state_lock);
batt_drv->aacr_state = state;
batt_drv->aacr_algo = algo;
+ mutex_unlock(&batt_drv->aacr_state_lock);
aacr_update_chg_table(batt_drv);
@@ -7734,7 +7739,10 @@
if (value < 0)
return -ERANGE;
+ mutex_lock(&batt_drv->aacr_state_lock);
batt_drv->aacr_cycle_grace = value;
+ mutex_unlock(&batt_drv->aacr_state_lock);
+
return count;
}
@@ -7765,7 +7773,10 @@
if (value < 0 || value > 3000) /* unexpected cycles */
return -ERANGE;
+ mutex_lock(&batt_drv->aacr_state_lock);
batt_drv->aacr_cycle_max = value;
+ mutex_unlock(&batt_drv->aacr_state_lock);
+
return count;
}
@@ -7803,7 +7814,10 @@
if (ret < 0 || rate > 100 || rate <= 0)
return ret;
+ mutex_lock(&batt_drv->aacr_state_lock);
batt_drv->aacr_min_capacity_rate = rate;
+ mutex_unlock(&batt_drv->aacr_state_lock);
+
return count;
}
@@ -7833,7 +7847,10 @@
if(rate > 100 || rate <= 0)
return -ERANGE;
+ mutex_lock(&batt_drv->aacr_state_lock);
batt_drv->aacr_cliff_capacity_rate = rate;
+ mutex_unlock(&batt_drv->aacr_state_lock);
+
return count;
}
@@ -7848,6 +7865,72 @@
static const DEVICE_ATTR_RW(aacr_cliff_capacity_rate);
+static ssize_t aacr_profile_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct power_supply *psy = container_of(dev, struct power_supply, dev);
+ struct batt_drv *batt_drv = power_supply_get_drvdata(psy);
+ struct gbms_chg_profile *profile = &batt_drv->chg_profile;
+ u32 cc[GBMS_AACR_DATA_MAX] = { 0 };
+ u32 fd[GBMS_AACR_DATA_MAX] = { 0 };
+ int cnt = 0, batt_id;
+
+ cnt = sscanf(buf, "%d,%u:%u,%u:%u,%u:%u,%u:%u,%u:%u,%u:%u,%u:%u,%u:%u,%u:%u,%u:%u",
+ &batt_id, &cc[0], &fd[0], &cc[1], &fd[1], &cc[2], &fd[2], &cc[3], &fd[3],
+ &cc[4], &fd[4], &cc[5], &fd[5], &cc[6], &fd[6], &cc[7], &fd[7],
+ &cc[8], &fd[8], &cc[9], &fd[9]);
+
+ /* The number entered must be an odd number (include batt_id) */
+ if (cnt % 2 == 0 || cnt < 3)
+ return -ERANGE;
+
+ /* validity check */
+ for (cnt = 0; cnt < GBMS_AACR_DATA_MAX - 1; cnt++) {
+ if (cc[cnt + 1] == 0)
+ break;
+
+ if (cc[cnt] > cc[cnt + 1] || fd[cnt] > fd[cnt + 1])
+ return -ERANGE;
+ }
+
+ if (batt_id == batt_drv->batt_id) {
+ mutex_lock(&batt_drv->aacr_state_lock);
+ memcpy(&profile->aacr_reference_cycles, cc, sizeof(cc));
+ memcpy(&profile->aacr_reference_fade10, fd, sizeof(fd));
+ profile->aacr_nb_limits = (u32)(cnt + 1);
+ mutex_unlock(&batt_drv->aacr_state_lock);
+ }
+
+ return count;
+}
+
+static ssize_t aacr_profile_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct power_supply *psy = container_of(dev, struct power_supply, dev);
+ struct batt_drv *batt_drv = power_supply_get_drvdata(psy);
+ struct gbms_chg_profile *profile = &batt_drv->chg_profile;
+ ssize_t cnt = 0;
+ int i;
+
+ if (profile->aacr_nb_limits == 0)
+ return cnt;
+
+ cnt += sysfs_emit_at(buf, cnt, "%d", batt_drv->batt_id);
+
+ for (i = 0; i < profile->aacr_nb_limits; i++)
+ cnt += sysfs_emit_at(buf, cnt, ",%u:%u",
+ profile->aacr_reference_cycles[i],
+ profile->aacr_reference_fade10[i]);
+
+ cnt += sysfs_emit_at(buf, cnt, "\n");
+
+ return cnt;
+}
+
+static const DEVICE_ATTR_RW(aacr_profile);
+
/* AAFV ------------------------------------------------------------------- */
static ssize_t aafv_state_store(struct device *dev,
@@ -9235,6 +9318,9 @@
ret = device_create_file(&batt_drv->psy->dev, &dev_attr_aacr_cliff_capacity_rate);
if (ret)
dev_err(&batt_drv->psy->dev, "Failed to create aacr cliff capacity rate\n");
+ ret = device_create_file(&batt_drv->psy->dev, &dev_attr_aacr_profile);
+ if (ret)
+ dev_err(&batt_drv->psy->dev, "Failed to create aacr profile\n");
/* aafv */
ret = device_create_file(&batt_drv->psy->dev, &dev_attr_aafv_state);
if (ret)
@@ -11318,6 +11404,7 @@
mutex_init(&batt_drv->cc_data.lock);
mutex_init(&batt_drv->bpst_state.lock);
mutex_init(&batt_drv->hda_tz_lock);
+ mutex_init(&batt_drv->aacr_state_lock);
mutex_init(&batt_drv->aafv_state_lock);
ret = of_property_read_u32(node, "google,batt-init-delay", &init_delay_ms);
diff --git a/google_charger.c b/google_charger.c
index 4a5e90a..33d3d9d 100644
--- a/google_charger.c
+++ b/google_charger.c
@@ -5687,6 +5687,17 @@
if (ret == -EPROBE_DEFER)
goto retry_init_work;
+ /* pass logbuffer_bd addr to google_battery to log AACP */
+ if (chg_drv->bd_state.bd_log) {
+ ret = GPSY_SET_INT64_PROP(chg_drv->bat_psy,
+ GBMS_PROP_LOGBUFFER_BD,
+ chg_drv->bd_state.bd_log);
+ if (ret == -EAGAIN)
+ goto retry_init_work;
+ if (ret < 0)
+ pr_info("send logbuffer_bd addr failed %d", ret);
+ }
+
/* PPS negotiation handled in google_charger */
if (!chg_drv->tcpm_psy) {
pr_info("PPS not available\n");
@@ -5740,17 +5751,6 @@
if (ret < 0)
pr_err("Cannot register power supply notifer, ret=%d\n", ret);
- /* pass logbuffer_bd addr to google_battery to log AACP */
- if (chg_drv->bd_state.bd_log) {
- ret = GPSY_SET_INT64_PROP(chg_drv->bat_psy,
- GBMS_PROP_LOGBUFFER_BD,
- chg_drv->bd_state.bd_log);
- if (ret == -EAGAIN)
- goto retry_init_work;
- if (ret < 0)
- pr_info("send logbuffer_bd addr failed %d", ret);
- }
-
chg_drv->init_done = true;
pr_info("google_charger chg=%d bat=%d wlc=%d usb=%d ext=%d tcpm=%d init_work done\n",
!!chg_drv->chg_psy, !!chg_drv->bat_psy, !!chg_drv->wlc_psy,