power: qpnp-qg: Add time and sequence-no to FIFO data
Add the clock monotonic time and sequence-no information
to the FIFO data passed to userspace as additional
debugging info.
While at it, update the charge_counter value.
Change-Id: I7bb3591502f3cf19a96c2958c1d3adec9c16a87e
Signed-off-by: Anirudh Ghayal <aghayal@codeaurora.org>
diff --git a/drivers/power/supply/qcom/qg-core.h b/drivers/power/supply/qcom/qg-core.h
index aadef7f..7c0db70 100644
--- a/drivers/power/supply/qcom/qg-core.h
+++ b/drivers/power/supply/qcom/qg-core.h
@@ -91,6 +91,8 @@
int charge_type;
int next_wakeup_ms;
u32 wa_flags;
+ u32 seq_no;
+ u32 charge_counter_uah;
ktime_t last_user_update_time;
ktime_t last_fifo_update_time;
diff --git a/drivers/power/supply/qcom/qpnp-qg.c b/drivers/power/supply/qcom/qpnp-qg.c
index 55cb5ef..3fe2579 100644
--- a/drivers/power/supply/qcom/qpnp-qg.c
+++ b/drivers/power/supply/qcom/qpnp-qg.c
@@ -226,6 +226,8 @@
u8 v_fifo[MAX_FIFO_LENGTH * 2], i_fifo[MAX_FIFO_LENGTH * 2];
u32 sample_interval = 0, sample_count = 0, fifo_v = 0, fifo_i = 0;
+ chip->kdata.fifo_time = (u32)ktime_get_seconds();
+
if (!fifo_length) {
pr_debug("No FIFO data\n");
return 0;
@@ -279,6 +281,7 @@
}
chip->kdata.fifo_length = fifo_length;
+ chip->kdata.seq_no = chip->seq_no++ % U32_MAX;
return rc;
}
@@ -330,6 +333,9 @@
chip->kdata.fifo[index].count = count;
chip->kdata.fifo_length++;
+ if (chip->kdata.fifo_length == 1) /* Only accumulator data */
+ chip->kdata.seq_no = chip->seq_no++ % U32_MAX;
+
qg_dbg(chip, QG_DEBUG_FIFO, "ACC v_avg=%duV i_avg=%duA interval=%d count=%d\n",
chip->kdata.fifo[index].v,
(int)chip->kdata.fifo[index].i,
@@ -507,11 +513,8 @@
qg_dbg(chip, QG_DEBUG_SOC, "udata SOC=%d last SOC=%d\n",
chip->udata.param[QG_SOC].data, chip->catch_up_soc);
- /* Only scale if SOC has changed */
- if (chip->catch_up_soc != chip->udata.param[QG_SOC].data) {
- chip->catch_up_soc = chip->udata.param[QG_SOC].data;
- qg_scale_soc(chip, false);
- }
+ chip->catch_up_soc = chip->udata.param[QG_SOC].data;
+ qg_scale_soc(chip, false);
/* update parameters to SDAM */
chip->sdam_data[SDAM_SOC] =
@@ -527,6 +530,10 @@
pr_err("Failed to update SDAM params, rc=%d\n", rc);
}
+ if (chip->udata.param[QG_CHARGE_COUNTER].valid)
+ chip->charge_counter_uah =
+ chip->udata.param[QG_CHARGE_COUNTER].data;
+
vote(chip->awake_votable, UDATA_READY_VOTER, false, 0);
}
@@ -958,6 +965,9 @@
case POWER_SUPPLY_PROP_BATT_PROFILE_VERSION:
pval->intval = chip->bp.qg_profile_version;
break;
+ case POWER_SUPPLY_PROP_CHARGE_COUNTER:
+ pval->intval = chip->charge_counter_uah;
+ break;
default:
pr_debug("Unsupported property %d\n", psp);
break;
@@ -978,6 +988,7 @@
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_VOLTAGE_OCV,
POWER_SUPPLY_PROP_CURRENT_NOW,
+ POWER_SUPPLY_PROP_CHARGE_COUNTER,
POWER_SUPPLY_PROP_RESISTANCE,
POWER_SUPPLY_PROP_RESISTANCE_ID,
POWER_SUPPLY_PROP_RESISTANCE_CAPACITIVE,
@@ -1169,6 +1180,7 @@
goto fail_read;
}
+
if (copy_to_user(buf, &chip->kdata, data_size)) {
pr_err("Failed in copy_to_user\n");
rc = -EFAULT;
@@ -1176,9 +1188,6 @@
}
chip->data_ready = false;
- /* clear data */
- memset(&chip->kdata, 0, sizeof(chip->kdata));
-
/* release all wake sources */
vote(chip->awake_votable, GOOD_OCV_VOTER, false, 0);
vote(chip->awake_votable, FIFO_DONE_VOTER, false, 0);
@@ -1186,7 +1195,11 @@
vote(chip->awake_votable, SUSPEND_DATA_VOTER, false, 0);
qg_dbg(chip, QG_DEBUG_DEVICE,
- "QG device read complete Size=%ld\n", data_size);
+ "QG device read complete Seq_no=%u Size=%ld\n",
+ chip->kdata.seq_no, data_size);
+
+ /* clear data */
+ memset(&chip->kdata, 0, sizeof(chip->kdata));
mutex_unlock(&chip->data_lock);
@@ -1489,7 +1502,8 @@
use_pon_ocv = true;
goto done;
}
- qg_dbg(chip, QG_DEBUG_PON, "Shutdown: SOC=%d OCV=%duV time=%dsecs, time_now=%ldsecs\n",
+ qg_dbg(chip, QG_DEBUG_PON, "Shutdown: Valid=%d SOC=%d OCV=%duV time=%dsecs, time_now=%ldsecs\n",
+ shutdown[SDAM_VALID],
shutdown[SDAM_SOC],
shutdown[SDAM_OCV_UV],
shutdown[SDAM_TIME_SEC],
diff --git a/include/uapi/linux/qg.h b/include/uapi/linux/qg.h
index c0b2b6e..54488ff 100644
--- a/include/uapi/linux/qg.h
+++ b/include/uapi/linux/qg.h
@@ -38,6 +38,8 @@
};
struct qg_kernel_data {
+ unsigned int seq_no;
+ unsigned int fifo_time;
unsigned int fifo_length;
struct fifo_data fifo[MAX_FIFO_LENGTH];
struct qg_param param[QG_MAX];