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/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],