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

Commit ac689d33 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "power: smb5: handle role-switch failure"

parents 84042a1e 4ad918f8
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -6787,6 +6787,33 @@ int smblib_force_dr_mode(struct smb_charger *chg, int mode)
	return rc;
}

static int smblib_role_switch_failure(struct smb_charger *chg, int mode)
{
	int rc = 0;
	union power_supply_propval pval = {0, };

	if (!chg->use_extcon)
		return 0;

	rc = smblib_get_prop_usb_present(chg, &pval);
	if (rc < 0) {
		pr_err("Couldn't get usb presence status rc=%d\n", rc);
		return rc;
	}

	if (pval.intval) {
		if (mode == DUAL_ROLE_PROP_MODE_DFP)
			smblib_notify_device_mode(chg, true);
	} else {
		if (mode == DUAL_ROLE_PROP_MODE_UFP)
			smblib_notify_usb_host(chg, true);
	}
	smblib_dbg(chg, PR_MISC, "Role reversal is failed for %s, notify usb",
						mode ? "DFP" : "UFP");

	return rc;
}

static void smblib_dual_role_check_work(struct work_struct *work)
{
	struct smb_charger *chg = container_of(work, struct smb_charger,
@@ -6804,6 +6831,11 @@ static void smblib_dual_role_check_work(struct work_struct *work)
						DUAL_ROLE_PROP_MODE_NONE);
			if (rc < 0)
				pr_err("Failed to set DRP mode, rc=%d\n", rc);

			rc = smblib_role_switch_failure(chg,
						DUAL_ROLE_PROP_MODE_UFP);
			if (rc < 0)
				pr_err("Failed to role switch rc=%d\n", rc);
		}
		chg->pr_swap_in_progress = false;
		break;
@@ -6816,6 +6848,11 @@ static void smblib_dual_role_check_work(struct work_struct *work)
						DUAL_ROLE_PROP_MODE_NONE);
			if (rc < 0)
				pr_err("Failed to set DRP mode, rc=%d\n", rc);

			rc = smblib_role_switch_failure(chg,
						DUAL_ROLE_PROP_MODE_DFP);
			if (rc < 0)
				pr_err("Failed to role switch rc=%d\n", rc);
		}
		chg->pr_swap_in_progress = false;
		break;