diff --git a/drivers/power/qpnp-charger.c b/drivers/power/qpnp-charger.c index 0b96ca6fe4bc381aa94ab4df9a7704a8bd0fa3f8..86f656131ae57cc5c52e6d7ff87e24dd8825a533 100644 --- a/drivers/power/qpnp-charger.c +++ b/drivers/power/qpnp-charger.c @@ -3103,7 +3103,7 @@ qpnp_chg_set_appropriate_battery_current(struct qpnp_chg_chip *chip) chip->ibat_offset_ma; if (chip->ext_set_ibat_ma) - chg_current = min (chg_current, chip->ext_set_ibat_ma); + chg_current = min(chg_current, chip->ext_set_ibat_ma); if (chip->bat_is_cool) chg_current = min(chg_current, chip->cool_bat_chg_ma); @@ -3511,19 +3511,19 @@ qpnp_chg_adjust_vddmax(struct qpnp_chg_chip *chip, int vbat_mv) qpnp_chg_set_appropriate_vddmax(chip); } -static void qpnp_chg_compensate_ibat_error(struct qpnp_chg_chip *chip) +static int qpnp_chg_compensate_ibat_error(struct qpnp_chg_chip *chip) { int ibat_ma, ibat_max_ma, ibat_diff_ma, trim, rc; u8 ibat_trim; ibat_ma = get_prop_current_now(chip) / 1000; if (ibat_ma >= 0) - return; + return -EINVAL; rc = qpnp_chg_ibatmax_get(chip, &ibat_max_ma); if (rc) { - pr_debug("failed to get ibatmax rc=%d\n", rc); - return; + pr_err("failed to get ibatmax rc=%d\n", rc); + return -EIO; } ibat_diff_ma = -1 * ibat_ma @@ -3531,7 +3531,7 @@ static void qpnp_chg_compensate_ibat_error(struct qpnp_chg_chip *chip) if (abs(ibat_diff_ma) > QPNP_CHG_I_STEP_MA * 2) { pr_err("ibat diff is out of range\n"); - return; + return -EINVAL; } if (ibat_diff_ma > 0) @@ -3544,20 +3544,20 @@ static void qpnp_chg_compensate_ibat_error(struct qpnp_chg_chip *chip) chip->buck_base + BUCK_CTRL_TRIM3, 1); if (rc) { pr_err("failed to read BUCK_CTRL_TRIM3 rc=%d\n", rc); - return; + return -EIO; } ibat_trim += trim; ibat_trim &= IBAT_TRIM_OFFSET_MASK; if (!is_within_range(ibat_trim, IBAT_TRIM_LOW_LIM, IBAT_TRIM_HIGH_LIM)) - return; + return -EINVAL; rc = qpnp_chg_masked_write(chip, chip->buck_base + SEC_ACCESS, 0xFF, 0xA5, 1); if (rc) { pr_err("failed to write SEC_ACCESS rc=%d\n", rc); - return; + return -EIO; } ibat_trim |= IBAT_TRIM_GOOD_BIT; @@ -3565,11 +3565,14 @@ static void qpnp_chg_compensate_ibat_error(struct qpnp_chg_chip *chip) chip->buck_base + BUCK_CTRL_TRIM3, 1); if (rc) { pr_err("failed to set IBAT_TRIM rc=%d\n", rc); - return; + return -EIO; } pr_debug("ibat trim: %dmA\n", trim * IBAT_TRIM_LOW_LIM); + return 0; } + + return -EINVAL; } #define CONSECUTIVE_COUNT 3 @@ -3625,22 +3628,22 @@ qpnp_eoc_work(struct work_struct *work) ibat_ma, vbat_mv, chip->term_current); if (buck_sts & IBAT_LOOP_IRQ) - qpnp_chg_compensate_ibat_error(chip); + if (!qpnp_chg_compensate_ibat_error(chip)) + vbat_low_count = 0; vbat_lower_than_vbatdet = !(chg_sts & VBAT_DET_LOW_IRQ); if (vbat_lower_than_vbatdet && vbat_mv < (chip->max_voltage_mv - chip->resume_delta_mv - - chip->vbatdet_max_err_mv)) { + - chip->vbatdet_max_err_mv) && + (buck_sts & IBAT_LOOP_IRQ)) { vbat_low_count++; pr_debug("woke up too early vbat_mv = %d, max_mv = %d, resume_mv = %d tolerance_mv = %d low_count = %d\n", vbat_mv, chip->max_voltage_mv, chip->resume_delta_mv, chip->vbatdet_max_err_mv, vbat_low_count); - if ((vbat_low_count >= CONSECUTIVE_COUNT) && - (buck_sts & IBAT_LOOP_IRQ)) { + if (vbat_low_count >= CONSECUTIVE_COUNT) { pr_debug("woke up too early stopping\n"); - qpnp_chg_enable_irq(chip, &chip->chg_vbatdet_lo); goto stop_eoc; } else {