diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index 4a4c28083ba6..660c91ccb6dc 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h @@ -1387,6 +1387,11 @@ static inline int dwc2_is_device_mode(struct dwc2_hsotg *hsotg) return (dwc2_readl(hsotg, GINTSTS) & GINTSTS_CURMODE_HOST) == 0; } +static inline int dwc2_is_force_host_mode(struct dwc2_hsotg *hsotg) +{ + return (dwc2_readl(hsotg, GUSBCFG) & GUSBCFG_FORCEHOSTMODE) != 0; +} + int dwc2_drd_init(struct dwc2_hsotg *hsotg); void dwc2_drd_suspend(struct dwc2_hsotg *hsotg); void dwc2_drd_resume(struct dwc2_hsotg *hsotg); diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index 598a4e64205d..fdb989e1068e 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -796,7 +796,8 @@ static int __maybe_unused dwc2_resume(struct device *dev) dwc2_drd_resume(dwc2); } - if (dwc2->dr_mode == USB_DR_MODE_HOST && dwc2_is_device_mode(dwc2)) { + if (dwc2->dr_mode == USB_DR_MODE_HOST && (dwc2_is_device_mode(dwc2) || + !dwc2_is_force_host_mode(dwc2))) { /* Reinit for Host mode if lost power */ dwc2_force_mode(dwc2, true);