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

Commit f7bb6acc authored by Ashay Jaiswal's avatar Ashay Jaiswal Committed by Vamshi Krishna B V
Browse files

power: qpnp-smbcharger: update SMBCHG restart workaround



The driver should set the hvdcp detection ignore flag while
re-running apsd, which it doesn't do right now. Not ignoring
the interrupts causes restore_from_hvdcp to run interfering
with the insertion step. Set the ignore flag before doing any of
it. Ignoring interrupts will not schedule the hvdcp_det work, do
that explicitly.

CRs-Fixed: 1034364
Change-Id: Ia2852fb310f660f47eecaf20f7dc8c42067fa500
Signed-off-by: default avatarAshay Jaiswal <ashayj@codeaurora.org>
Signed-off-by: default avatarVamshi Krishna B V <vbv@codeaurora.org>
parent db1d853d
Loading
Loading
Loading
Loading
+65 −49
Original line number Diff line number Diff line
@@ -5321,49 +5321,63 @@ static int smbchg_unprepare_for_pulsing(struct smbchg_chip *chip)
#define APSD_RERUN		BIT(0)
static int rerun_apsd(struct smbchg_chip *chip)
{
	int rc;
	int rc = 0;

	chip->hvdcp_3_det_ignore_uv = true;

	if (chip->schg_version == QPNP_SCHG_LITE) {
		pr_smb(PR_STATUS, "Re-running APSD\n");
		reinit_completion(&chip->src_det_raised);
		reinit_completion(&chip->usbin_uv_lowered);
		reinit_completion(&chip->src_det_lowered);
		reinit_completion(&chip->usbin_uv_raised);

		/* re-run APSD */
	rc = smbchg_masked_write(chip, chip->usb_chgpth_base + USB_CMD_APSD,
		rc = smbchg_masked_write(chip,
				chip->usb_chgpth_base + USB_CMD_APSD,
				APSD_RERUN, APSD_RERUN);
		if (rc) {
			pr_err("Couldn't re-run APSD rc=%d\n", rc);
		return rc;
			goto out;
		}

		pr_smb(PR_MISC, "Waiting on rising usbin uv\n");
		rc = wait_for_usbin_uv(chip, true);
		if (rc < 0) {
			pr_err("wait for usbin uv failed rc = %d\n", rc);
		return rc;
			goto out;
		}

		pr_smb(PR_MISC, "Waiting on falling src det\n");
		rc = wait_for_src_detect(chip, false);
		if (rc < 0) {
			pr_err("wait for src detect failed rc = %d\n", rc);
		return rc;
			goto out;
		}

		pr_smb(PR_MISC, "Waiting on falling usbin uv\n");
		rc = wait_for_usbin_uv(chip, false);
		if (rc < 0) {
			pr_err("wait for usbin uv failed rc = %d\n", rc);
		return rc;
			goto out;
		}

		pr_smb(PR_MISC, "Waiting on rising src det\n");
		rc = wait_for_src_detect(chip, true);
		if (rc < 0) {
			pr_err("wait for src detect failed rc = %d\n", rc);
		return rc;
			goto out;
		}
	} else {
		pr_smb(PR_STATUS, "Faking Removal\n");
		rc = fake_insertion_removal(chip, false);
		msleep(500);
		pr_smb(PR_STATUS, "Faking Insertion\n");
		rc = fake_insertion_removal(chip, true);
	}

out:
	chip->hvdcp_3_det_ignore_uv = false;
	return rc;
}

@@ -5440,8 +5454,6 @@ static int smbchg_prepare_for_pulsing_lite(struct smbchg_chip *chip)
	smbchg_sec_masked_write(chip, chip->usb_chgpth_base + USB_AICL_CFG,
			AICL_EN_BIT, 0);

	chip->hvdcp_3_det_ignore_uv = true;

	/* re-run APSD */
	rc = rerun_apsd(chip);
	if (rc) {
@@ -5449,8 +5461,6 @@ static int smbchg_prepare_for_pulsing_lite(struct smbchg_chip *chip)
		goto out;
	}

	chip->hvdcp_3_det_ignore_uv = false;

	pr_smb(PR_MISC, "Enable AICL\n");
	smbchg_sec_masked_write(chip, chip->usb_chgpth_base + USB_AICL_CFG,
			AICL_EN_BIT, AICL_EN_BIT);
@@ -8033,20 +8043,18 @@ static void rerun_hvdcp_det_if_necessary(struct smbchg_chip *chip)
			pr_err("Couldn't vote for 300mA for suspend wa, going ahead rc=%d\n",
					rc);

		pr_smb(PR_STATUS, "Faking Removal\n");
		fake_insertion_removal(chip, false);
		msleep(500);
		pr_smb(PR_STATUS, "Faking Insertion\n");
		fake_insertion_removal(chip, true);
		rc = rerun_apsd(chip);
		if (rc)
			pr_err("APSD rerun failed rc=%d\n", rc);

		read_usb_type(chip, &usb_type_name, &usb_supply_type);
		if (usb_supply_type != POWER_SUPPLY_TYPE_USB_DCP) {
			msleep(500);
			pr_smb(PR_STATUS, "Fake Removal again as type!=DCP\n");
			fake_insertion_removal(chip, false);
			msleep(500);
			pr_smb(PR_STATUS, "Fake Insert again as type!=DCP\n");
			fake_insertion_removal(chip, true);
			pr_smb(PR_STATUS, "Rerun APSD as type !=DCP\n");

			rc = rerun_apsd(chip);
			if (rc)
				pr_err("APSD rerun failed rc=%d\n", rc);
		}

		rc = vote(chip->usb_icl_votable,
@@ -8054,6 +8062,14 @@ static void rerun_hvdcp_det_if_necessary(struct smbchg_chip *chip)
		if (rc < 0)
			pr_err("Couldn't vote for 0 for suspend wa, going ahead rc=%d\n",
					rc);

		/* Schedule work for HVDCP detection */
		if (!chip->hvdcp_not_supported) {
			cancel_delayed_work_sync(&chip->hvdcp_det_work);
			smbchg_stay_awake(chip, PM_DETECT_HVDCP);
			schedule_delayed_work(&chip->hvdcp_det_work,
					msecs_to_jiffies(HVDCP_NOTIFY_MS));
		}
	}
}