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

Commit 14297be0 authored by zhanghangzhou's avatar zhanghangzhou Committed by lio.chen
Browse files

USB: mtu3: fix resume timing issue.

Change-Id: I5063faf9d673bde70597e4e3b4907fa9d3bff2cb
parent eb845292
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -347,6 +347,7 @@ struct ssusb_mtk {
	/* dp switch */
	struct regmap *dp_switch;
	u32 dp_switch_oft;
	bool is_suspended;
};

/**
+11 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@
#define USB2_PORT 2
#define USB3_PORT 3

#define SSUSB_SUSPEND_RESUME_TIMEOUT (HZ) /* 1 sec */

static inline struct ssusb_mtk *otg_sx_to_ssusb(struct otg_switch_mtk *otg_sx)
{
	return container_of(otg_sx, struct ssusb_mtk, otg_switch);
@@ -215,6 +217,7 @@ static void ssusb_mode_sw_work_v2(struct work_struct *work)
	enum usb_role desired_role;
	enum usb_role current_role;
	unsigned long flags;
	size_t expire;

	desired_role = work_data->desired_role;
	current_role = otg_sx->current_role;
@@ -227,6 +230,14 @@ static void ssusb_mode_sw_work_v2(struct work_struct *work)

	mtu3_dbg_trace(ssusb->dev, "set role : %s", usb_role_string(desired_role));

	expire = jiffies + SSUSB_SUSPEND_RESUME_TIMEOUT;
	while (time_before(jiffies, expire)) {
		if (!ssusb->is_suspended)
			break;
		dev_info(ssusb->dev, "wait for suspend/resume complete\n");
		msleep(20);
	}

	pm_runtime_get_sync(ssusb->dev);

	/* switch port to off first */
+13 −6
Original line number Diff line number Diff line
@@ -978,15 +978,17 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg)
	if (ssusb->clk_mgr && !ssusb->is_host)
		return 0;

	ssusb->is_suspended = true;

	ssusb->offload_mode = ssusb_offload_get_mode();

	dev_info(ssusb->dev, "%s offload_mode %d\n", __func__, ssusb->offload_mode);

	if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_S) {
		ssusb_set_power_state(ssusb, MTU3_STATE_OFFLOAD);
		return 0;
		goto suspend;
	} else if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_D) {
		return 0;
		goto suspend;
	}

	ssusb_set_power_state(ssusb, MTU3_STATE_SUSPEND);
@@ -1010,7 +1012,8 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg)
		ssusb_host_suspend(ssusb);
		break;
	default:
		return -EINVAL;
		ret = -EINVAL;
		goto err;
	}

	ret = wait_for_ip_sleep(ssusb);
@@ -1020,6 +1023,7 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg)
	ssusb_phy_power_off(ssusb);
	clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks);
	ssusb_wakeup_set(ssusb, true);
suspend:
	return 0;

sleep_err:
@@ -1029,13 +1033,14 @@ static int mtu3_suspend_common(struct device *dev, pm_message_t msg)
		ssusb_set_mode(&ssusb->otg_switch, USB_ROLE_HOST);
	}
err:
	ssusb->is_suspended = false;
	return ret;
}

static int mtu3_resume_common(struct device *dev, pm_message_t msg)
{
	struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
	int ret;
	int ret = 0;

	dev_info(ssusb->dev, "%s event %d\n", __func__, msg.event);

@@ -1048,9 +1053,9 @@ static int mtu3_resume_common(struct device *dev, pm_message_t msg)

	if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_S) {
		ssusb_set_power_state(ssusb, MTU3_STATE_POWER_ON);
		return 0;
		goto resume;
	} else if (ssusb->offload_mode == SSUSB_OFFLOAD_MODE_D) {
		return 0;
		goto resume;
	}

	ssusb_wakeup_set(ssusb, false);
@@ -1066,6 +1071,8 @@ static int mtu3_resume_common(struct device *dev, pm_message_t msg)

	ssusb_set_power_state(ssusb, MTU3_STATE_RESUME);

resume:
	ssusb->is_suspended = false;
	return ret;
phy_err:
	clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks);