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

Commit 5475e84f authored by Ashay Jaiswal's avatar Ashay Jaiswal
Browse files

power: qpnp-smbcharger: re-arrange parallel charger detection check



In scenarios where fast-charge/taper interrupt fires even before
src_detect_handler detects the parallel charger, parallel charging
will remain disabled. Fix this by adding a parallel charger detection
check in fastcharge and taper handler.

CRs-Fixed: 984187
Change-Id: I082cad6cf1bc3e8d9a5c327222f72d046190f9ca
Signed-off-by: default avatarAshay Jaiswal <ashayj@codeaurora.org>
parent 079af6dc
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -1929,6 +1929,16 @@ static bool smbchg_is_usbin_active_pwr_src(struct smbchg_chip *chip)
		&& (reg & USBIN_ACTIVE_PWR_SRC_BIT);
}

static void smbchg_detect_parallel_charger(struct smbchg_chip *chip)
{
	struct power_supply *parallel_psy = get_parallel_psy(chip);

	if (parallel_psy)
		chip->parallel_charger_detected =
			power_supply_set_present(parallel_psy, true) ?
								false : true;
}

static int smbchg_parallel_usb_charging_en(struct smbchg_chip *chip, bool en)
{
	struct power_supply *parallel_psy = get_parallel_psy(chip);
@@ -2050,7 +2060,8 @@ static void smbchg_parallel_usb_taper(struct smbchg_chip *chip)
	int parallel_fcc_ma, tries = 0;
	u8 reg = 0;

	if (!parallel_psy || !chip->parallel_charger_detected)
	smbchg_detect_parallel_charger(chip);
	if (!chip->parallel_charger_detected)
		return;

	smbchg_stay_awake(chip, PM_PARALLEL_TAPER);
@@ -4674,7 +4685,6 @@ static bool is_usbin_uv_high(struct smbchg_chip *chip)
#define HVDCP_NOTIFY_MS		2500
static void handle_usb_insertion(struct smbchg_chip *chip)
{
	struct power_supply *parallel_psy = get_parallel_psy(chip);
	enum power_supply_type usb_supply_type;
	int rc;
	char *usb_type_name = "null";
@@ -4724,12 +4734,7 @@ static void handle_usb_insertion(struct smbchg_chip *chip)
					msecs_to_jiffies(HVDCP_NOTIFY_MS));
	}

	if (parallel_psy) {
		rc = power_supply_set_present(parallel_psy, true);
		chip->parallel_charger_detected = rc ? false : true;
		if (rc)
			pr_debug("parallel-charger absent rc=%d\n", rc);
	}
	smbchg_detect_parallel_charger(chip);

	if (chip->parallel.avail && chip->aicl_done_irq
			&& !chip->enable_aicl_wake) {
@@ -6074,6 +6079,7 @@ static irqreturn_t fastchg_handler(int irq, void *_chip)
	struct smbchg_chip *chip = _chip;

	pr_smb(PR_INTERRUPT, "p2f triggered\n");
	smbchg_detect_parallel_charger(chip);
	smbchg_parallel_usb_check_ok(chip);
	if (chip->psy_registered)
		power_supply_changed(&chip->batt_psy);