![Hal Emmerich](/assets/img/avatar_default.png)
Add backported patched from 5.x from usb related fixes Up kernel version to most recent lts
69 lines
2.2 KiB
Diff
69 lines
2.2 KiB
Diff
From 5799aecd64f2bb6c8175a2e86fbcb9e60d052221 Mon Sep 17 00:00:00 2001
|
|
From: Minas Harutyunyan <minas.harutyunyan@synopsys.com>
|
|
Date: Tue, 5 Mar 2019 15:08:55 +0400
|
|
Subject: [PATCH 41/53] usb: dwc2: Fix channel disable flow
|
|
|
|
Channel disabling/halting should performed for enabled only channels
|
|
to avoid warnings "Unable to clear enable on channel N" which seen
|
|
if host works in Slave mode.
|
|
|
|
Signed-off-by: Minas Harutyunyan <hminas@synopsys.com>
|
|
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
|
|
---
|
|
drivers/usb/dwc2/hcd.c | 34 ++++++++++++++++++++--------------
|
|
1 file changed, 20 insertions(+), 14 deletions(-)
|
|
|
|
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
|
|
index 7ac7b524243d..b50ec3714fd8 100644
|
|
--- a/drivers/usb/dwc2/hcd.c
|
|
+++ b/drivers/usb/dwc2/hcd.c
|
|
@@ -2247,25 +2247,31 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
|
|
num_channels = hsotg->params.host_channels;
|
|
for (i = 0; i < num_channels; i++) {
|
|
hcchar = dwc2_readl(hsotg, HCCHAR(i));
|
|
- hcchar &= ~HCCHAR_CHENA;
|
|
- hcchar |= HCCHAR_CHDIS;
|
|
- hcchar &= ~HCCHAR_EPDIR;
|
|
- dwc2_writel(hsotg, hcchar, HCCHAR(i));
|
|
+ if (hcchar & HCCHAR_CHENA) {
|
|
+ hcchar &= ~HCCHAR_CHENA;
|
|
+ hcchar |= HCCHAR_CHDIS;
|
|
+ hcchar &= ~HCCHAR_EPDIR;
|
|
+ dwc2_writel(hsotg, hcchar, HCCHAR(i));
|
|
+ }
|
|
}
|
|
|
|
/* Halt all channels to put them into a known state */
|
|
for (i = 0; i < num_channels; i++) {
|
|
hcchar = dwc2_readl(hsotg, HCCHAR(i));
|
|
- hcchar |= HCCHAR_CHENA | HCCHAR_CHDIS;
|
|
- hcchar &= ~HCCHAR_EPDIR;
|
|
- dwc2_writel(hsotg, hcchar, HCCHAR(i));
|
|
- dev_dbg(hsotg->dev, "%s: Halt channel %d\n",
|
|
- __func__, i);
|
|
-
|
|
- if (dwc2_hsotg_wait_bit_clear(hsotg, HCCHAR(i),
|
|
- HCCHAR_CHENA, 1000)) {
|
|
- dev_warn(hsotg->dev, "Unable to clear enable on channel %d\n",
|
|
- i);
|
|
+ if (hcchar & HCCHAR_CHENA) {
|
|
+ hcchar |= HCCHAR_CHENA | HCCHAR_CHDIS;
|
|
+ hcchar &= ~HCCHAR_EPDIR;
|
|
+ dwc2_writel(hsotg, hcchar, HCCHAR(i));
|
|
+ dev_dbg(hsotg->dev, "%s: Halt channel %d\n",
|
|
+ __func__, i);
|
|
+
|
|
+ if (dwc2_hsotg_wait_bit_clear(hsotg, HCCHAR(i),
|
|
+ HCCHAR_CHENA,
|
|
+ 1000)) {
|
|
+ dev_warn(hsotg->dev,
|
|
+ "Unable to clear enable on channel %d\n",
|
|
+ i);
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
--
|
|
2.11.0
|
|
|