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

Commit bbbb61fa authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "phy-msm-usb: Fix crash due to USB h/w reset on disconnect"

parents 6bf2f6b4 7143a1e4
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -3340,17 +3340,24 @@ static int msm_otg_dpdm_regulator_enable(struct regulator_dev *rdev)
{
	int ret = 0;
	struct msm_otg *motg = rdev_get_drvdata(rdev);
	struct usb_phy *phy = &motg->phy;

	if (!motg->rm_pulldown) {
		msm_otg_dbg_log_event(&motg->phy, "Disable Pulldown",
				      motg->rm_pulldown, 0);
		ret = msm_hsusb_ldo_enable(motg, USB_PHY_REG_3P3_ON);
		if (!ret) {
		if (ret)
			return ret;

		motg->rm_pulldown = true;
			msm_otg_dbg_log_event(&motg->phy, "RM Pulldown",
		/* Don't reset h/w if previous disconnect handling is pending */
		if (phy->otg->state == OTG_STATE_B_IDLE ||
		    phy->otg->state == OTG_STATE_UNDEFINED)
			msm_otg_set_mode_nondriving(motg, true);
		else
			msm_otg_dbg_log_event(&motg->phy, "NonDrv err",
					      motg->rm_pulldown, 0);
	}
	}

	msm_otg_set_mode_nondriving(motg, true);

	return ret;
}
@@ -3359,17 +3366,22 @@ static int msm_otg_dpdm_regulator_disable(struct regulator_dev *rdev)
{
	int ret = 0;
	struct msm_otg *motg = rdev_get_drvdata(rdev);
	struct usb_phy *phy = &motg->phy;

	if (motg->rm_pulldown) {
		/* Let sm_work handle it if USB core is active */
		if (phy->otg->state == OTG_STATE_B_IDLE ||
		    phy->otg->state == OTG_STATE_UNDEFINED)
			msm_otg_set_mode_nondriving(motg, false);

	if (motg->rm_pulldown) {
		ret = msm_hsusb_ldo_enable(motg, USB_PHY_REG_3P3_OFF);
		if (!ret) {
		if (ret)
			return ret;

		motg->rm_pulldown = false;
			msm_otg_dbg_log_event(&motg->phy, "RM Pulldown",
		msm_otg_dbg_log_event(&motg->phy, "EN Pulldown",
				      motg->rm_pulldown, 0);
	}
	}

	return ret;
}