USB: dwc3_otg: Cancel charger detection work before entering LPM
Charger detection algorithm takes significant time (hundreds of msec)
to complete. This can result in a scenario where chg_det work is
pending to run even after cable disconnection. Since, USB clocks are
turned off after cable disconnect, hence, execution of detection-work
later can result in unlocked register accesses. Hence, cancel any
pending charger detection work before turning off clocks.
CRs-Fixed: 422848
Change-Id: Iccaba4c003ee492b84bce057de64a2ae8edc2ef6
Signed-off-by: Manu Gautam <mgautam@codeaurora.org>
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index 4073fc8..12c11de 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -1250,6 +1250,14 @@
return 0;
}
+ if (cancel_delayed_work_sync(&mdwc->chg_work))
+ dev_dbg(mdwc->dev, "%s: chg_work was pending\n", __func__);
+ if (mdwc->chg_state != USB_CHG_STATE_DETECTED) {
+ /* charger detection wasn't complete; re-init flags */
+ mdwc->chg_state = USB_CHG_STATE_UNDEFINED;
+ mdwc->charger.chg_type = DWC3_INVALID_CHARGER;
+ }
+
/* Sequence to put hardware in low power state:
* 1. Set OTGDISABLE to disable OTG block in HSPHY (saves power)
* 2. Clear charger detection control fields
diff --git a/drivers/usb/dwc3/dwc3_otg.c b/drivers/usb/dwc3/dwc3_otg.c
index 7b672c4..fab443c 100644
--- a/drivers/usb/dwc3/dwc3_otg.c
+++ b/drivers/usb/dwc3/dwc3_otg.c
@@ -640,14 +640,9 @@
}
}
} else {
- if (charger) {
- if (charger->chg_type == DWC3_INVALID_CHARGER)
- charger->start_detection(dotg->charger,
- false);
- else
- charger->chg_type =
- DWC3_INVALID_CHARGER;
- }
+ if (charger)
+ charger->start_detection(dotg->charger, false);
+
dwc3_otg_set_power(phy, 0);
dev_dbg(phy->dev, "No device, trying to suspend\n");
pm_runtime_put_sync(phy->dev);