summaryrefslogtreecommitdiff
path: root/drivers/power/supply/qcom/qpnp-fg.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/supply/qcom/qpnp-fg.c')
-rw-r--r--drivers/power/supply/qcom/qpnp-fg.c105
1 files changed, 87 insertions, 18 deletions
diff --git a/drivers/power/supply/qcom/qpnp-fg.c b/drivers/power/supply/qcom/qpnp-fg.c
index 1ace44f121b4..2f5b9e47aba2 100644
--- a/drivers/power/supply/qcom/qpnp-fg.c
+++ b/drivers/power/supply/qcom/qpnp-fg.c
@@ -239,18 +239,25 @@ enum fg_mem_data_index {
static struct fg_mem_setting settings[FG_MEM_SETTING_MAX] = {
/* ID Address, Offset, Value*/
- SETTING(SOFT_COLD, 0x454, 0, 100),
- SETTING(SOFT_HOT, 0x454, 1, 400),
- SETTING(HARD_COLD, 0x454, 2, 50),
- SETTING(HARD_HOT, 0x454, 3, 450),
+#ifdef CONFIG_MACH_ZUK_Z2_PLUS
+ SETTING(SOFT_COLD, 0x454, 0, 170),
+ SETTING(SOFT_HOT, 0x454, 1, 470),
+ SETTING(HARD_COLD, 0x454, 2, 20),
+ SETTING(HARD_HOT, 0x454, 3, 520),
+#else
+ SETTING(SOFT_COLD, 0x454, 0, 160),
+ SETTING(SOFT_HOT, 0x454, 1, 460),
+ SETTING(HARD_COLD, 0x454, 2, 10),
+ SETTING(HARD_HOT, 0x454, 3, 510),
+#endif
SETTING(RESUME_SOC, 0x45C, 1, 0),
SETTING(BCL_LM_THRESHOLD, 0x47C, 2, 50),
SETTING(BCL_MH_THRESHOLD, 0x47C, 3, 752),
SETTING(TERM_CURRENT, 0x40C, 2, 250),
SETTING(CHG_TERM_CURRENT, 0x4F8, 2, 250),
- SETTING(IRQ_VOLT_EMPTY, 0x458, 3, 3100),
- SETTING(CUTOFF_VOLTAGE, 0x40C, 0, 3200),
- SETTING(VBAT_EST_DIFF, 0x000, 0, 30),
+ SETTING(IRQ_VOLT_EMPTY, 0x458, 3, 3000),
+ SETTING(CUTOFF_VOLTAGE, 0x40C, 0, 3400),
+ SETTING(VBAT_EST_DIFF, 0x000, 0, 200),
SETTING(DELTA_SOC, 0x450, 3, 1),
SETTING(BATT_LOW, 0x458, 0, 4200),
SETTING(THERM_DELAY, 0x4AC, 3, 0),
@@ -644,6 +651,8 @@ struct fg_chip {
bool batt_info_restore;
bool *batt_range_ocv;
int *batt_range_pct;
+ ktime_t soc_kt;
+ u8 is_op_soc;
};
/* FG_MEMIF DEBUGFS structures */
@@ -2020,12 +2029,6 @@ static void fg_handle_battery_insertion(struct fg_chip *chip)
schedule_delayed_work(&chip->update_sram_data, msecs_to_jiffies(0));
}
-
-static int soc_to_setpoint(int soc)
-{
- return DIV_ROUND_CLOSEST(soc * 255, 100);
-}
-
static void batt_to_setpoint_adc(int vbatt_mv, u8 *data)
{
int val;
@@ -2233,10 +2236,78 @@ static int get_monotonic_soc_raw(struct fg_chip *chip)
}
#define EMPTY_CAPACITY 0
-#define DEFAULT_CAPACITY 50
+#define DEFAULT_CAPACITY 65
#define MISSING_CAPACITY 100
#define FULL_CAPACITY 100
#define FULL_SOC_RAW 0xFF
+
+static int bound_soc(int soc)
+{
+ soc = max(0, soc);
+ soc = min(100, soc);
+ return soc;
+}
+
+#define LENUK_OP_FIR_SOC 60
+#define LENUK_OP_SEC_SOC 85
+#define LENUK_SOC_CHANGE_MS 25000
+static int set_soc_remap_point(struct fg_chip *chip, int soc)
+{
+ int mapped_soc = 0;
+ if (!chip->is_op_soc) {
+ chip->soc_kt = ktime_get_boottime();
+ mapped_soc = soc;
+ chip->is_op_soc = 1;
+ } else {
+ ktime_t now_kt, delta_kt;
+ int delta_ms;
+ now_kt = ktime_get_boottime();
+ delta_kt = ktime_sub(now_kt, chip->soc_kt);
+ delta_ms = (int)div64_s64(ktime_to_ns(delta_kt), 1000000);
+ if (delta_ms <= LENUK_SOC_CHANGE_MS) {
+ if (chip->status == POWER_SUPPLY_STATUS_CHARGING)
+ mapped_soc = soc;
+ else
+ mapped_soc = soc + 1;
+ }else {
+ if (chip->status == POWER_SUPPLY_STATUS_CHARGING)
+ mapped_soc = soc + 1;
+ else
+ mapped_soc = soc;
+ }
+ }
+ return mapped_soc;
+}
+
+static int soc_remap_process(struct fg_chip *chip, int soc)
+{
+ int maped_soc = 0;
+ switch(soc){
+ case LENUK_OP_FIR_SOC :
+ maped_soc = set_soc_remap_point(chip,soc);
+ break;
+ case LENUK_OP_SEC_SOC :
+ maped_soc = set_soc_remap_point(chip,soc) + 1;
+ break;
+ default:
+ chip->is_op_soc = 0;
+ if(soc >= 61 && soc <= 84 )
+ maped_soc = soc + 1;
+ else if(soc >= 86 && soc <= 100)
+ maped_soc = bound_soc(soc + 2);
+ else
+ maped_soc = soc;
+ }
+ pr_info("pre_map_soc is %d,post_map_soc is %d\n",soc,maped_soc);
+ return maped_soc;
+}
+static int soc_show_op(struct fg_chip *chip, int msoc)
+{
+ int soc = DIV_ROUND_CLOSEST((msoc - 1) * (FULL_CAPACITY - 2),
+ FULL_SOC_RAW - 2) + 1;
+ return soc_remap_process(chip, soc);
+}
+
static int get_prop_capacity(struct fg_chip *chip)
{
int msoc, rc;
@@ -2284,9 +2355,7 @@ static int get_prop_capacity(struct fg_chip *chip)
} else if (msoc == FULL_SOC_RAW) {
return FULL_CAPACITY;
}
-
- return DIV_ROUND_CLOSEST((msoc - 1) * (FULL_CAPACITY - 2),
- FULL_SOC_RAW - 2) + 1;
+ return soc_show_op(chip, msoc);
}
#define HIGH_BIAS 3
@@ -8028,7 +8097,7 @@ static int fg_common_hw_init(struct fg_chip *chip)
}
rc = fg_mem_masked_write(chip, settings[FG_MEM_DELTA_SOC].address, 0xFF,
- soc_to_setpoint(settings[FG_MEM_DELTA_SOC].value),
+ settings[FG_MEM_DELTA_SOC].value,
settings[FG_MEM_DELTA_SOC].offset);
if (rc) {
pr_err("failed to write delta soc rc=%d\n", rc);