Loading drivers/power/supply/qcom/fg-core.h +8 −5 Original line number Diff line number Diff line Loading @@ -51,6 +51,9 @@ #define PROFILE_LOAD "fg_profile_load" #define DELTA_SOC "fg_delta_soc" /* Delta BSOC votable reasons */ #define DELTA_BSOC_IRQ_VOTER "fg_delta_bsoc_irq" #define DEBUG_PRINT_BUFFER_SIZE 64 /* 3 byte address + 1 space character */ #define ADDR_LEN 4 Loading Loading @@ -330,6 +333,7 @@ struct fg_chip { struct fg_memif *sram; struct fg_irq_info *irqs; struct votable *awake_votable; struct votable *delta_bsoc_irq_en_votable; struct fg_sram_param *sp; struct fg_alg_flag *alg_flags; int *debug_mask; Loading Loading @@ -370,7 +374,6 @@ struct fg_chip { bool esr_fcc_ctrl_en; bool soc_reporting_ready; bool esr_flt_cold_temp_en; bool bsoc_delta_irq_en; bool slope_limit_en; bool use_ima_single_mode; struct completion soc_update; Loading drivers/power/supply/qcom/qpnp-fg-gen3.c +46 −17 Original line number Diff line number Diff line Loading @@ -1054,6 +1054,25 @@ static void fg_notify_charger(struct fg_chip *chip) fg_dbg(chip, FG_STATUS, "Notified charger on float voltage and FCC\n"); } static int fg_delta_bsoc_irq_en_cb(struct votable *votable, void *data, int enable, const char *client) { struct fg_chip *chip = data; if (!chip->irqs[BSOC_DELTA_IRQ].irq) return 0; if (enable) { enable_irq(chip->irqs[BSOC_DELTA_IRQ].irq); enable_irq_wake(chip->irqs[BSOC_DELTA_IRQ].irq); } else { disable_irq_wake(chip->irqs[BSOC_DELTA_IRQ].irq); disable_irq(chip->irqs[BSOC_DELTA_IRQ].irq); } return 0; } static int fg_awake_cb(struct votable *votable, void *data, int awake, const char *client) { Loading Loading @@ -1477,16 +1496,8 @@ static int fg_charge_full_update(struct fg_chip *chip) return 0; mutex_lock(&chip->charge_full_lock); if (!chip->charge_done && chip->bsoc_delta_irq_en) { disable_irq_wake(fg_irqs[BSOC_DELTA_IRQ].irq); disable_irq_nosync(fg_irqs[BSOC_DELTA_IRQ].irq); chip->bsoc_delta_irq_en = false; } else if (chip->charge_done && !chip->bsoc_delta_irq_en) { enable_irq(fg_irqs[BSOC_DELTA_IRQ].irq); enable_irq_wake(fg_irqs[BSOC_DELTA_IRQ].irq); chip->bsoc_delta_irq_en = true; } vote(chip->delta_bsoc_irq_en_votable, DELTA_BSOC_IRQ_VOTER, chip->charge_done, 0); rc = power_supply_get_property(chip->batt_psy, POWER_SUPPLY_PROP_HEALTH, &prop); if (rc < 0) { Loading Loading @@ -2198,6 +2209,17 @@ static bool is_profile_load_required(struct fg_chip *chip) /* Check if integrity bit is set */ if (val & PROFILE_LOAD_BIT) { fg_dbg(chip, FG_STATUS, "Battery profile integrity bit is set\n"); /* Whitelist the values */ val &= ~PROFILE_LOAD_BIT; if (val != HLOS_RESTART_BIT && val != BOOTLOADER_LOAD_BIT && val != (BOOTLOADER_LOAD_BIT | BOOTLOADER_RESTART_BIT)) { val |= PROFILE_LOAD_BIT; pr_warn("Garbage value in profile integrity word: 0x%x\n", val); return true; } rc = fg_sram_read(chip, PROFILE_LOAD_WORD, PROFILE_LOAD_OFFSET, buf, PROFILE_COMP_LEN, FG_IMA_DEFAULT); if (rc < 0) { Loading Loading @@ -4023,6 +4045,9 @@ static void fg_cleanup(struct fg_chip *chip) if (chip->awake_votable) destroy_votable(chip->awake_votable); if (chip->delta_bsoc_irq_en_votable) destroy_votable(chip->delta_bsoc_irq_en_votable); if (chip->batt_id_chan) iio_channel_release(chip->batt_id_chan); Loading Loading @@ -4064,7 +4089,15 @@ static int fg_gen3_probe(struct platform_device *pdev) chip); if (IS_ERR(chip->awake_votable)) { rc = PTR_ERR(chip->awake_votable); return rc; goto exit; } chip->delta_bsoc_irq_en_votable = create_votable("FG_DELTA_BSOC_IRQ", VOTE_SET_ANY, fg_delta_bsoc_irq_en_cb, chip); if (IS_ERR(chip->delta_bsoc_irq_en_votable)) { rc = PTR_ERR(chip->delta_bsoc_irq_en_votable); goto exit; } rc = fg_parse_dt(chip); Loading @@ -4091,7 +4124,7 @@ static int fg_gen3_probe(struct platform_device *pdev) rc = fg_get_batt_id(chip); if (rc < 0) { pr_err("Error in getting battery id, rc:%d\n", rc); return rc; goto exit; } rc = fg_get_batt_profile(chip); Loading Loading @@ -4149,11 +4182,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 */ if (fg_irqs[BSOC_DELTA_IRQ].irq) { disable_irq_wake(fg_irqs[BSOC_DELTA_IRQ].irq); disable_irq_nosync(fg_irqs[BSOC_DELTA_IRQ].irq); chip->bsoc_delta_irq_en = false; } rerun_election(chip->delta_bsoc_irq_en_votable); rc = fg_debugfs_create(chip); if (rc < 0) { Loading Loading
drivers/power/supply/qcom/fg-core.h +8 −5 Original line number Diff line number Diff line Loading @@ -51,6 +51,9 @@ #define PROFILE_LOAD "fg_profile_load" #define DELTA_SOC "fg_delta_soc" /* Delta BSOC votable reasons */ #define DELTA_BSOC_IRQ_VOTER "fg_delta_bsoc_irq" #define DEBUG_PRINT_BUFFER_SIZE 64 /* 3 byte address + 1 space character */ #define ADDR_LEN 4 Loading Loading @@ -330,6 +333,7 @@ struct fg_chip { struct fg_memif *sram; struct fg_irq_info *irqs; struct votable *awake_votable; struct votable *delta_bsoc_irq_en_votable; struct fg_sram_param *sp; struct fg_alg_flag *alg_flags; int *debug_mask; Loading Loading @@ -370,7 +374,6 @@ struct fg_chip { bool esr_fcc_ctrl_en; bool soc_reporting_ready; bool esr_flt_cold_temp_en; bool bsoc_delta_irq_en; bool slope_limit_en; bool use_ima_single_mode; struct completion soc_update; Loading
drivers/power/supply/qcom/qpnp-fg-gen3.c +46 −17 Original line number Diff line number Diff line Loading @@ -1054,6 +1054,25 @@ static void fg_notify_charger(struct fg_chip *chip) fg_dbg(chip, FG_STATUS, "Notified charger on float voltage and FCC\n"); } static int fg_delta_bsoc_irq_en_cb(struct votable *votable, void *data, int enable, const char *client) { struct fg_chip *chip = data; if (!chip->irqs[BSOC_DELTA_IRQ].irq) return 0; if (enable) { enable_irq(chip->irqs[BSOC_DELTA_IRQ].irq); enable_irq_wake(chip->irqs[BSOC_DELTA_IRQ].irq); } else { disable_irq_wake(chip->irqs[BSOC_DELTA_IRQ].irq); disable_irq(chip->irqs[BSOC_DELTA_IRQ].irq); } return 0; } static int fg_awake_cb(struct votable *votable, void *data, int awake, const char *client) { Loading Loading @@ -1477,16 +1496,8 @@ static int fg_charge_full_update(struct fg_chip *chip) return 0; mutex_lock(&chip->charge_full_lock); if (!chip->charge_done && chip->bsoc_delta_irq_en) { disable_irq_wake(fg_irqs[BSOC_DELTA_IRQ].irq); disable_irq_nosync(fg_irqs[BSOC_DELTA_IRQ].irq); chip->bsoc_delta_irq_en = false; } else if (chip->charge_done && !chip->bsoc_delta_irq_en) { enable_irq(fg_irqs[BSOC_DELTA_IRQ].irq); enable_irq_wake(fg_irqs[BSOC_DELTA_IRQ].irq); chip->bsoc_delta_irq_en = true; } vote(chip->delta_bsoc_irq_en_votable, DELTA_BSOC_IRQ_VOTER, chip->charge_done, 0); rc = power_supply_get_property(chip->batt_psy, POWER_SUPPLY_PROP_HEALTH, &prop); if (rc < 0) { Loading Loading @@ -2198,6 +2209,17 @@ static bool is_profile_load_required(struct fg_chip *chip) /* Check if integrity bit is set */ if (val & PROFILE_LOAD_BIT) { fg_dbg(chip, FG_STATUS, "Battery profile integrity bit is set\n"); /* Whitelist the values */ val &= ~PROFILE_LOAD_BIT; if (val != HLOS_RESTART_BIT && val != BOOTLOADER_LOAD_BIT && val != (BOOTLOADER_LOAD_BIT | BOOTLOADER_RESTART_BIT)) { val |= PROFILE_LOAD_BIT; pr_warn("Garbage value in profile integrity word: 0x%x\n", val); return true; } rc = fg_sram_read(chip, PROFILE_LOAD_WORD, PROFILE_LOAD_OFFSET, buf, PROFILE_COMP_LEN, FG_IMA_DEFAULT); if (rc < 0) { Loading Loading @@ -4023,6 +4045,9 @@ static void fg_cleanup(struct fg_chip *chip) if (chip->awake_votable) destroy_votable(chip->awake_votable); if (chip->delta_bsoc_irq_en_votable) destroy_votable(chip->delta_bsoc_irq_en_votable); if (chip->batt_id_chan) iio_channel_release(chip->batt_id_chan); Loading Loading @@ -4064,7 +4089,15 @@ static int fg_gen3_probe(struct platform_device *pdev) chip); if (IS_ERR(chip->awake_votable)) { rc = PTR_ERR(chip->awake_votable); return rc; goto exit; } chip->delta_bsoc_irq_en_votable = create_votable("FG_DELTA_BSOC_IRQ", VOTE_SET_ANY, fg_delta_bsoc_irq_en_cb, chip); if (IS_ERR(chip->delta_bsoc_irq_en_votable)) { rc = PTR_ERR(chip->delta_bsoc_irq_en_votable); goto exit; } rc = fg_parse_dt(chip); Loading @@ -4091,7 +4124,7 @@ static int fg_gen3_probe(struct platform_device *pdev) rc = fg_get_batt_id(chip); if (rc < 0) { pr_err("Error in getting battery id, rc:%d\n", rc); return rc; goto exit; } rc = fg_get_batt_profile(chip); Loading Loading @@ -4149,11 +4182,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 */ if (fg_irqs[BSOC_DELTA_IRQ].irq) { disable_irq_wake(fg_irqs[BSOC_DELTA_IRQ].irq); disable_irq_nosync(fg_irqs[BSOC_DELTA_IRQ].irq); chip->bsoc_delta_irq_en = false; } rerun_election(chip->delta_bsoc_irq_en_votable); rc = fg_debugfs_create(chip); if (rc < 0) { Loading