Snap for 12365243 from 67c2ed4d426cf2113e46745d60caca105be840a9 to android13-gs-pixel-5.10-24Q4-release

Change-Id: I30b69a0e95b53a2141f3aaf62bc9c7fc7a18a94b
Signed-off-by: Coastguard Worker <[email protected]>
diff --git a/Documentation/ABI/testing/sysfs-class-power b/Documentation/ABI/testing/sysfs-class-power
index 5aa0e50..83e1739 100644
--- a/Documentation/ABI/testing/sysfs-class-power
+++ b/Documentation/ABI/testing/sysfs-class-power
@@ -16,4 +16,25 @@
                 Write 0 to disable this feature.
 
 		Access: Read/Write
-		Valid values: Represented as int
\ No newline at end of file
+		Valid values: Represented as int
+
+What:		/sys/class/power_supply/maxfg/registers_dump
+Date:		Sep 2024
+Contact:	"Spade Lee" <[email protected]>
+Description:
+		Read to dump fuel gauge registers
+Users:          Dumpstate
+
+What:		/sys/class/power_supply/maxfg_base/registers_dump
+Date:		Sep 2024
+Contact:	"Spade Lee" <[email protected]>
+Description:
+		Read to dump base fuel gauge registers
+Users:          Dumpstate
+
+What:		/sys/class/power_supply/maxfg_secondary/registers_dump
+Date:		Sep 2024
+Contact:	"Spade Lee" <[email protected]>
+Description:
+		Read to dump secondary fuel gauge registers
+Users:          Dumpstate
diff --git a/max1720x_battery.c b/max1720x_battery.c
index 4eb0d93..7ed22c7 100644
--- a/max1720x_battery.c
+++ b/max1720x_battery.c
@@ -4467,6 +4467,67 @@
  *	break;
  */
 
+static ssize_t registers_dump_show(struct device *dev, struct device_attribute *attr,
+				   char *buf)
+{
+	struct power_supply *psy = container_of(dev, struct power_supply, dev);
+	struct max1720x_chip *chip = power_supply_get_drvdata(psy);
+	u32 reg_address, data;
+	int ret = 0, offset = 0;
+
+	if (!chip->regmap.regmap) {
+		dev_err(dev, "Failed to read, no regmap\n");
+		return -EIO;
+	}
+
+	for (reg_address = 0; reg_address <= 0xFF; reg_address++) {
+		if (!max1720x_is_reg(dev, reg_address))
+			continue;
+
+		ret = regmap_read(chip->regmap.regmap, reg_address, &data);
+		if (ret < 0)
+			continue;
+
+		ret = sysfs_emit_at(buf, offset, "%02x: %04x\n", reg_address, data);
+		if (!ret) {
+			dev_err(dev, "[%s]: Not all registers printed. last:%x\n", __func__,
+				reg_address - 1);
+			break;
+		}
+		offset += ret;
+	}
+
+	if (!chip->regmap_nvram.regmap)
+		return offset;
+
+	ret = sysfs_emit_at(buf, offset, "\nnvram:\n");
+	if (!ret)
+		return offset;
+
+	offset += ret;
+
+	for (reg_address = 0; reg_address <= 0xFF; reg_address++) {
+		if (!max1720x_is_nvram_reg(dev, reg_address))
+			continue;
+
+		ret = regmap_read(chip->regmap_nvram.regmap, reg_address, &data);
+		if (ret < 0)
+			continue;
+
+		ret = sysfs_emit_at(buf, offset, "%02x: %04x\n", reg_address, data);
+		if (!ret) {
+			dev_err(dev, "[%s]: Not all registers printed. last:%x\n", __func__,
+				reg_address - 1);
+			break;
+		}
+		offset += ret;
+	}
+
+	return offset;
+}
+
+static DEVICE_ATTR_RO(registers_dump);
+
 static ssize_t act_impedance_store(struct device *dev,
 			       struct device_attribute *attr,
 			       const char *buf, size_t count) {
@@ -4517,6 +4578,11 @@
 	if (ret)
 		dev_err(&chip->psy->dev, "Failed to create fix_cycle_count\n");
 
+	/* registers */
+	ret = device_create_file(&chip->psy->dev, &dev_attr_registers_dump);
+	if (ret)
+		dev_err(&chip->psy->dev, "Failed to create registers_dump\n");
+
 	de = debugfs_create_dir(chip->max1720x_psy_desc.name, 0);
 	if (IS_ERR_OR_NULL(de))
 		return -ENOENT;