summaryrefslogtreecommitdiff
path: root/drivers/usb/dwc3/dwc3-msm.c
diff options
context:
space:
mode:
authorAjay Agarwal <ajaya@codeaurora.org>2019-08-30 14:11:00 +0530
committerAjay Agarwal <ajaya@codeaurora.org>2019-09-12 17:49:42 +0530
commitd418b9a1df7e92e22646f72fd2f3b7515b4316ea (patch)
tree75500b15f857d41f3f209107ab08059a85a4af48 /drivers/usb/dwc3/dwc3-msm.c
parentb2c10286f7e3250fbb1473c28d1a7fd40e091d37 (diff)
usb: dwc3-msm: Try core reset and reinit if PHY PLL lock fails
Add support for retrying core reset and re-initialization in host mode if the PHY PLL lock failure is seen. Also, increase the lock timeout to 50 msec. Change-Id: I8c8db60dcd73b7cf05598538d0c519b1b1e2417f Signed-off-by: Ajay Agarwal <ajaya@codeaurora.org>
Diffstat (limited to 'drivers/usb/dwc3/dwc3-msm.c')
-rw-r--r--drivers/usb/dwc3/dwc3-msm.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index 0650f0b69de7..7fec7b8e4dd9 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -276,6 +276,8 @@ struct dwc3_msm {
struct mutex suspend_resume_mutex;
enum usb_device_speed override_usb_speed;
+
+ bool core_init_failed;
};
#define USB_HSPHY_3P3_VOL_MIN 3050000 /* uV */
@@ -1953,12 +1955,20 @@ static void dwc3_msm_power_collapse_por(struct dwc3_msm *mdwc)
ret = dwc3_core_pre_init(dwc);
if (ret) {
dev_err(mdwc->dev, "dwc3_core_pre_init failed\n");
+ mdwc->core_init_failed = true;
return;
}
mdwc->init = true;
}
- dwc3_core_init(dwc);
+ ret = dwc3_core_init(dwc);
+ if (ret) {
+ dev_err(mdwc->dev, "dwc3_core_init failed\n");
+ mdwc->core_init_failed = true;
+ return;
+ }
+
+ mdwc->core_init_failed = false;
/* Re-configure event buffers */
dwc3_event_buffers_setup(dwc);
@@ -3602,6 +3612,12 @@ static int dwc3_otg_start_host(struct dwc3_msm *mdwc, int on)
dev_dbg(mdwc->dev, "%s: turn on host\n", __func__);
pm_runtime_get_sync(mdwc->dev);
+ if (mdwc->core_init_failed) {
+ dev_err(mdwc->dev, "%s: Core init failed\n", __func__);
+ pm_runtime_put_sync_suspend(mdwc->dev);
+ return -EAGAIN;
+ }
+
mdwc->hs_phy->flags |= PHY_HOST_MODE;
if (dwc->maximum_speed == USB_SPEED_SUPER) {
mdwc->ss_phy->flags |= PHY_HOST_MODE;
@@ -4076,6 +4092,10 @@ static void dwc3_otg_sm_work(struct work_struct *w)
delay = VBUS_REG_CHECK_DELAY;
work = 1;
mdwc->vbus_retry_count++;
+ } else if (ret == -EAGAIN) {
+ mdwc->drd_state = DRD_STATE_HOST_IDLE;
+ dev_dbg(mdwc->dev, "Core init failed. Retrying...\n");
+ work = 1;
} else if (ret) {
dev_err(mdwc->dev, "unable to start host\n");
mdwc->drd_state = DRD_STATE_HOST_IDLE;