Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 595e689c authored by Fenglin Wu's avatar Fenglin Wu
Browse files

power: smb1351: Ignore ICL update if parallel slave is enabled



After the ICL split across the master and slave charger is complete,
there is a possibility of the main charger's ICL to be updated to its
total ICL value. This can lead to excessive draw from the adapter.
Avoid it by skipping this ICL update of the main charger if the
parallel slave is already enabled and configured.

CRs-Fixed: 1043224
Change-Id: I0a8c2646f1d6053e03f9ac310106ad5682bd22db
Signed-off-by: default avatarFenglin Wu <fenglinw@codeaurora.org>
parent c44279d0
Loading
Loading
Loading
Loading
+26 −12
Original line number Diff line number Diff line
@@ -3002,6 +3002,11 @@ static void smb1351_chg_remove_work(struct work_struct *work)
	if (!(reg & IRQ_SOURCE_DET_BIT)) {
		pr_debug("chg removed\n");
		chip->chg_present = false;
		/* clear parallel slave PRESENT */
		if (parallel_psy && chip->parallel.slave_detected) {
			pr_debug("set parallel charger un-present!\n");
			power_supply_set_present(parallel_psy, false);
		}
		power_supply_set_supply_type(chip->usb_psy,
						POWER_SUPPLY_TYPE_UNKNOWN);
		power_supply_set_present(chip->usb_psy,
@@ -3010,11 +3015,6 @@ static void smb1351_chg_remove_work(struct work_struct *work)
		power_supply_set_dp_dm(chip->usb_psy,
				POWER_SUPPLY_DP_DM_DPR_DMR);
		chip->apsd_rerun = false;
		/* clear parallel slave PRESENT */
		if (parallel_psy && chip->parallel.slave_detected) {
			pr_debug("set parallel charger un-present!\n");
			power_supply_set_present(parallel_psy, false);
		}
	} else if (!chip->chg_remove_work_scheduled) {
		chip->chg_remove_work_scheduled = true;
		goto reschedule;
@@ -3064,15 +3064,15 @@ static int smb1351_usbin_uv_handler(struct smb1351_charger *chip, u8 status)
			}
		} else {
			chip->chg_present = false;
			/* clear parallel slave PRESENT */
			if (parallel_psy && chip->parallel.slave_detected)
				power_supply_set_present(parallel_psy, false);
			power_supply_set_supply_type(chip->usb_psy,
						POWER_SUPPLY_TYPE_UNKNOWN);
			power_supply_set_present(chip->usb_psy,
						chip->chg_present);
			pr_debug("updating usb_psy present=%d\n",
							chip->chg_present);
			/* clear parallel slave RESENT */
			if (parallel_psy && chip->parallel.slave_detected)
				power_supply_set_present(parallel_psy, false);
		}
		return 0;
	}
@@ -3116,12 +3116,12 @@ static int smb1351_usbin_ov_handler(struct smb1351_charger *chip, u8 status)
	if (status != 0) {
		chip->chg_present = false;
		chip->usbin_ov = true;
		power_supply_set_supply_type(chip->usb_psy,
						POWER_SUPPLY_TYPE_UNKNOWN);
		power_supply_set_present(chip->usb_psy, chip->chg_present);
		/* clear parallel slave PRESENT */
		if (parallel_psy && chip->parallel.slave_detected)
			power_supply_set_present(parallel_psy, false);
		power_supply_set_supply_type(chip->usb_psy,
						POWER_SUPPLY_TYPE_UNKNOWN);
		power_supply_set_present(chip->usb_psy, chip->chg_present);
	} else {
		chip->usbin_ov = false;
		if (reg & IRQ_USBIN_UV_BIT)
@@ -3870,11 +3870,25 @@ static void smb1351_external_power_changed(struct power_supply *psy)
{
	struct smb1351_charger *chip = container_of(psy,
				struct smb1351_charger, batt_psy);
	struct power_supply *parallel_psy =
				smb1351_get_parallel_slave(chip);
	union power_supply_propval prop = {0,};
	int rc, online = 0;
	int rc, online = 0, slave_present = 0;

	battery_soc_changed(chip);

	if (parallel_psy) {
		parallel_psy->get_property(parallel_psy,
				POWER_SUPPLY_PROP_PRESENT, &prop);
		slave_present = prop.intval;
		/* Don't update main charger ICL if slave is enabled */
		if (chip->parallel.slave_detected && slave_present
				&& chip->parallel.slave_icl_ma != 0) {
			pr_debug("Ignore ICL setting as parallel-slave is enabled\n");
			return;
		}
	}

	rc = chip->usb_psy->get_property(chip->usb_psy,
				POWER_SUPPLY_PROP_ONLINE, &prop);
	if (rc) {