Loading drivers/power/supply/qcom/fg-core.h +1 −0 Original line number Diff line number Diff line Loading @@ -467,6 +467,7 @@ extern void dump_sram(u8 *buf, int addr, int len); extern int64_t twos_compliment_extend(int64_t val, int s_bit_pos); extern s64 fg_float_decode(u16 val); extern bool is_input_present(struct fg_chip *chip); extern bool is_qnovo_en(struct fg_chip *chip); extern void fg_circ_buf_add(struct fg_circ_buf *, int); extern void fg_circ_buf_clr(struct fg_circ_buf *); extern int fg_circ_buf_avg(struct fg_circ_buf *, int *); Loading drivers/power/supply/qcom/fg-util.c +33 −8 Original line number Diff line number Diff line Loading @@ -106,14 +106,17 @@ static struct fg_dbgfs dbgfs_data = { static bool is_usb_present(struct fg_chip *chip) { union power_supply_propval pval = {0, }; int rc; if (!chip->usb_psy) chip->usb_psy = power_supply_get_by_name("usb"); if (chip->usb_psy) power_supply_get_property(chip->usb_psy, if (!chip->usb_psy) return false; rc = power_supply_get_property(chip->usb_psy, POWER_SUPPLY_PROP_PRESENT, &pval); else if (rc < 0) return false; return pval.intval != 0; Loading @@ -122,14 +125,17 @@ static bool is_usb_present(struct fg_chip *chip) static bool is_dc_present(struct fg_chip *chip) { union power_supply_propval pval = {0, }; int rc; if (!chip->dc_psy) chip->dc_psy = power_supply_get_by_name("dc"); if (chip->dc_psy) power_supply_get_property(chip->dc_psy, if (!chip->dc_psy) return false; rc = power_supply_get_property(chip->dc_psy, POWER_SUPPLY_PROP_PRESENT, &pval); else if (rc < 0) return false; return pval.intval != 0; Loading @@ -140,6 +146,25 @@ bool is_input_present(struct fg_chip *chip) return is_usb_present(chip) || is_dc_present(chip); } bool is_qnovo_en(struct fg_chip *chip) { union power_supply_propval pval = {0, }; int rc; if (!chip->batt_psy) chip->batt_psy = power_supply_get_by_name("battery"); if (!chip->batt_psy) return false; rc = power_supply_get_property(chip->batt_psy, POWER_SUPPLY_PROP_CHARGE_QNOVO_ENABLE, &pval); if (rc < 0) return false; return pval.intval != 0; } #define EXPONENT_SHIFT 11 #define EXPONENT_OFFSET -9 #define MANTISSA_SIGN_BIT 10 Loading drivers/power/supply/qcom/qpnp-fg-gen3.c +26 −10 Original line number Diff line number Diff line Loading @@ -1402,6 +1402,7 @@ out: static void fg_cap_learning_update(struct fg_chip *chip) { int rc, batt_soc, batt_soc_msb; bool input_present = is_input_present(chip); mutex_lock(&chip->cl.lock); Loading Loading @@ -1442,13 +1443,31 @@ static void fg_cap_learning_update(struct fg_chip *chip) chip->cl.init_cc_uah = 0; } if (chip->charge_status == POWER_SUPPLY_STATUS_DISCHARGING) { if (!input_present) { fg_dbg(chip, FG_CAP_LEARN, "Capacity learning aborted @ battery SOC %d\n", batt_soc_msb); chip->cl.active = false; chip->cl.init_cc_uah = 0; } } if (chip->charge_status == POWER_SUPPLY_STATUS_NOT_CHARGING) { if (is_qnovo_en(chip) && input_present) { /* * Don't abort the capacity learning when qnovo * is enabled and input is present where the * charging status can go to "not charging" * intermittently. */ } else { fg_dbg(chip, FG_CAP_LEARN, "Capacity learning aborted @ battery SOC %d\n", batt_soc_msb); chip->cl.active = false; chip->cl.init_cc_uah = 0; } } } out: mutex_unlock(&chip->cl.lock); Loading Loading @@ -1981,7 +2000,7 @@ static int fg_esr_fcc_config(struct fg_chip *chip) { union power_supply_propval prop = {0, }; int rc; bool parallel_en = false, qnovo_en = false; bool parallel_en = false, qnovo_en; if (is_parallel_charger_available(chip)) { rc = power_supply_get_property(chip->parallel_psy, Loading @@ -1994,10 +2013,7 @@ static int fg_esr_fcc_config(struct fg_chip *chip) parallel_en = prop.intval; } rc = power_supply_get_property(chip->batt_psy, POWER_SUPPLY_PROP_CHARGE_QNOVO_ENABLE, &prop); if (!rc) qnovo_en = prop.intval; qnovo_en = is_qnovo_en(chip); fg_dbg(chip, FG_POWER_SUPPLY, "chg_sts: %d par_en: %d qnov_en: %d esr_fcc_ctrl_en: %d\n", chip->charge_status, parallel_en, qnovo_en, Loading Loading @@ -4479,7 +4495,7 @@ static int fg_gen3_probe(struct platform_device *pdev) disable_irq_nosync(fg_irqs[SOC_UPDATE_IRQ].irq); /* Keep BSOC_DELTA_IRQ irq disabled until we require it */ rerun_election(chip->delta_bsoc_irq_en_votable); vote(chip->delta_bsoc_irq_en_votable, DELTA_BSOC_IRQ_VOTER, false, 0); rc = fg_debugfs_create(chip); if (rc < 0) { Loading Loading
drivers/power/supply/qcom/fg-core.h +1 −0 Original line number Diff line number Diff line Loading @@ -467,6 +467,7 @@ extern void dump_sram(u8 *buf, int addr, int len); extern int64_t twos_compliment_extend(int64_t val, int s_bit_pos); extern s64 fg_float_decode(u16 val); extern bool is_input_present(struct fg_chip *chip); extern bool is_qnovo_en(struct fg_chip *chip); extern void fg_circ_buf_add(struct fg_circ_buf *, int); extern void fg_circ_buf_clr(struct fg_circ_buf *); extern int fg_circ_buf_avg(struct fg_circ_buf *, int *); Loading
drivers/power/supply/qcom/fg-util.c +33 −8 Original line number Diff line number Diff line Loading @@ -106,14 +106,17 @@ static struct fg_dbgfs dbgfs_data = { static bool is_usb_present(struct fg_chip *chip) { union power_supply_propval pval = {0, }; int rc; if (!chip->usb_psy) chip->usb_psy = power_supply_get_by_name("usb"); if (chip->usb_psy) power_supply_get_property(chip->usb_psy, if (!chip->usb_psy) return false; rc = power_supply_get_property(chip->usb_psy, POWER_SUPPLY_PROP_PRESENT, &pval); else if (rc < 0) return false; return pval.intval != 0; Loading @@ -122,14 +125,17 @@ static bool is_usb_present(struct fg_chip *chip) static bool is_dc_present(struct fg_chip *chip) { union power_supply_propval pval = {0, }; int rc; if (!chip->dc_psy) chip->dc_psy = power_supply_get_by_name("dc"); if (chip->dc_psy) power_supply_get_property(chip->dc_psy, if (!chip->dc_psy) return false; rc = power_supply_get_property(chip->dc_psy, POWER_SUPPLY_PROP_PRESENT, &pval); else if (rc < 0) return false; return pval.intval != 0; Loading @@ -140,6 +146,25 @@ bool is_input_present(struct fg_chip *chip) return is_usb_present(chip) || is_dc_present(chip); } bool is_qnovo_en(struct fg_chip *chip) { union power_supply_propval pval = {0, }; int rc; if (!chip->batt_psy) chip->batt_psy = power_supply_get_by_name("battery"); if (!chip->batt_psy) return false; rc = power_supply_get_property(chip->batt_psy, POWER_SUPPLY_PROP_CHARGE_QNOVO_ENABLE, &pval); if (rc < 0) return false; return pval.intval != 0; } #define EXPONENT_SHIFT 11 #define EXPONENT_OFFSET -9 #define MANTISSA_SIGN_BIT 10 Loading
drivers/power/supply/qcom/qpnp-fg-gen3.c +26 −10 Original line number Diff line number Diff line Loading @@ -1402,6 +1402,7 @@ out: static void fg_cap_learning_update(struct fg_chip *chip) { int rc, batt_soc, batt_soc_msb; bool input_present = is_input_present(chip); mutex_lock(&chip->cl.lock); Loading Loading @@ -1442,13 +1443,31 @@ static void fg_cap_learning_update(struct fg_chip *chip) chip->cl.init_cc_uah = 0; } if (chip->charge_status == POWER_SUPPLY_STATUS_DISCHARGING) { if (!input_present) { fg_dbg(chip, FG_CAP_LEARN, "Capacity learning aborted @ battery SOC %d\n", batt_soc_msb); chip->cl.active = false; chip->cl.init_cc_uah = 0; } } if (chip->charge_status == POWER_SUPPLY_STATUS_NOT_CHARGING) { if (is_qnovo_en(chip) && input_present) { /* * Don't abort the capacity learning when qnovo * is enabled and input is present where the * charging status can go to "not charging" * intermittently. */ } else { fg_dbg(chip, FG_CAP_LEARN, "Capacity learning aborted @ battery SOC %d\n", batt_soc_msb); chip->cl.active = false; chip->cl.init_cc_uah = 0; } } } out: mutex_unlock(&chip->cl.lock); Loading Loading @@ -1981,7 +2000,7 @@ static int fg_esr_fcc_config(struct fg_chip *chip) { union power_supply_propval prop = {0, }; int rc; bool parallel_en = false, qnovo_en = false; bool parallel_en = false, qnovo_en; if (is_parallel_charger_available(chip)) { rc = power_supply_get_property(chip->parallel_psy, Loading @@ -1994,10 +2013,7 @@ static int fg_esr_fcc_config(struct fg_chip *chip) parallel_en = prop.intval; } rc = power_supply_get_property(chip->batt_psy, POWER_SUPPLY_PROP_CHARGE_QNOVO_ENABLE, &prop); if (!rc) qnovo_en = prop.intval; qnovo_en = is_qnovo_en(chip); fg_dbg(chip, FG_POWER_SUPPLY, "chg_sts: %d par_en: %d qnov_en: %d esr_fcc_ctrl_en: %d\n", chip->charge_status, parallel_en, qnovo_en, Loading Loading @@ -4479,7 +4495,7 @@ static int fg_gen3_probe(struct platform_device *pdev) disable_irq_nosync(fg_irqs[SOC_UPDATE_IRQ].irq); /* Keep BSOC_DELTA_IRQ irq disabled until we require it */ rerun_election(chip->delta_bsoc_irq_en_votable); vote(chip->delta_bsoc_irq_en_votable, DELTA_BSOC_IRQ_VOTER, false, 0); rc = fg_debugfs_create(chip); if (rc < 0) { Loading