| From 42b32b164acecd850edef010915a02418345a033 Mon Sep 17 00:00:00 2001 |
| From: Artur Petrosyan <Arthur.Petrosyan@synopsys.com> |
| Date: Thu, 8 Apr 2021 13:45:49 +0400 |
| Subject: usb: dwc2: Fix session request interrupt handler |
| |
| From: Artur Petrosyan <Arthur.Petrosyan@synopsys.com> |
| |
| commit 42b32b164acecd850edef010915a02418345a033 upstream. |
| |
| According to programming guide in host mode, port |
| power must be turned on in session request |
| interrupt handlers. |
| |
| Fixes: 21795c826a45 ("usb: dwc2: exit hibernation on session request") |
| Cc: <stable@vger.kernel.org> |
| Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com> |
| Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com> |
| Link: https://lore.kernel.org/r/20210408094550.75484A0094@mailhost.synopsys.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/dwc2/core_intr.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/drivers/usb/dwc2/core_intr.c |
| +++ b/drivers/usb/dwc2/core_intr.c |
| @@ -307,6 +307,7 @@ static void dwc2_handle_conn_id_status_c |
| static void dwc2_handle_session_req_intr(struct dwc2_hsotg *hsotg) |
| { |
| int ret; |
| + u32 hprt0; |
| |
| /* Clear interrupt */ |
| dwc2_writel(hsotg, GINTSTS_SESSREQINT, GINTSTS); |
| @@ -327,6 +328,13 @@ static void dwc2_handle_session_req_intr |
| * established |
| */ |
| dwc2_hsotg_disconnect(hsotg); |
| + } else { |
| + /* Turn on the port power bit. */ |
| + hprt0 = dwc2_read_hprt0(hsotg); |
| + hprt0 |= HPRT0_PWR; |
| + dwc2_writel(hsotg, hprt0, HPRT0); |
| + /* Connect hcd after port power is set. */ |
| + dwc2_hcd_connect(hsotg); |
| } |
| } |
| |