From 3c08788b8c7f7a667a9f0a0b756b600f2eb5e22a Mon Sep 17 00:00:00 2001
From: Jack Wu <wjack@google.com>
Date: Mon, 7 May 2018 19:14:42 +0800
Subject: [PATCH] power: qpnp-fg: make CHARGE_FULL property writable by user

CHARGE_FULL property indicates the learnt capacity of the battery
from the last capacity learning cycle. However, in some rare
cases, if the learnt capacity is having an unexpected value, it
requires a reset to a good value which is not possible for an
user who cannot reinsert a battery or do an explicit write to FG
SRAM. Allowing CHARGE_FULL to be writable helps this.

Bug:78883741

Change-Id: Ibf4760505e345f504be4d5372b1e41558ea6fb86
Signed-off-by: Jack Wu <wjack@google.com>
---
 drivers/power/qpnp-fg.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c
index 2b0f98f42995..8aa4e502a9a3 100644
--- a/drivers/power/qpnp-fg.c
+++ b/drivers/power/qpnp-fg.c
@@ -4699,6 +4699,18 @@ static int fg_power_set_property(struct power_supply *psy,
 			schedule_work(&chip->bcl_hi_power_work);
 		}
 		break;
+	case POWER_SUPPLY_PROP_CHARGE_FULL:
+		if (chip->learning_data.active) {
+			pr_warn("Capacity learning active!\n");
+			return 0;
+		}
+		if (val->intval <= 0 || val->intval > chip->nom_cap_uah) {
+			pr_err("charge_full is out of bounds\n");
+			return -EINVAL;
+		}
+		chip->learning_data.learned_cc_uah = val->intval;
+		fg_cap_learning_save_data(chip);
+		break;
 	default:
 		return -EINVAL;
 	};
@@ -4715,6 +4727,7 @@ static int fg_property_is_writeable(struct power_supply *psy,
 #ifdef CONFIG_QPNP_LEGACY_CYCLE_COUNT
 	case POWER_SUPPLY_PROP_CYCLE_COUNT_ID:
 #endif
+	case POWER_SUPPLY_PROP_CHARGE_FULL:
 		return 1;
 	default:
 		break;
-- 
GitLab