| From 966c4a922aed674103fcc10bfdeef97ce186c796 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 12 Aug 2021 01:26:35 -0700 |
| Subject: usb: dwc3: Decouple USB 2.0 L1 & L2 events |
| |
| From: Jack Pham <jackp@codeaurora.org> |
| |
| [ Upstream commit 843714bb37d9a3780160d7b4a4a72b8077a77589 ] |
| |
| On DWC_usb3 revisions 3.00a and newer (including DWC_usb31 and |
| DWC_usb32) the GUCTL1 register gained the DEV_DECOUPLE_L1L2_EVT |
| field (bit 31) which when enabled allows the controller in device |
| mode to treat USB 2.0 L1 LPM & L2 events separately. |
| |
| After commit d1d90dd27254 ("usb: dwc3: gadget: Enable suspend |
| events") the controller will now receive events (and therefore |
| interrupts) for every state change when entering/exiting either |
| L1 or L2 states. Since L1 is handled entirely by the hardware |
| and requires no software intervention, there is no need to even |
| enable these events and unnecessarily notify the gadget driver. |
| Enable the aforementioned bit to help reduce the overall interrupt |
| count for these L1 events that don't need to be handled while |
| retaining the events for full L2 suspend/wakeup. |
| |
| Tested-by: Jun Li <jun.li@nxp.com> |
| Tested-by: Amit Pundir <amit.pundir@linaro.org> # for RB5 (sm8250) |
| Tested-by: John Stultz <john.stultz@linaro.org> # for HiKey960 & db845c |
| Reviewed-by: Jun Li <jun.li@nxp.com> |
| Acked-by: Felipe Balbi <balbi@kernel.org> |
| Signed-off-by: Jack Pham <jackp@codeaurora.org> |
| Link: https://lore.kernel.org/r/20210812082635.12924-1-jackp@codeaurora.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Stable-dep-of: 9149c9b0c7e0 ("usb: dwc3: core: update LC timer as per USB Spec V3.2") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/dwc3/core.c | 9 +++++++++ |
| drivers/usb/dwc3/core.h | 5 +++-- |
| 2 files changed, 12 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c |
| index ee7682faa6f3..3a88e4268590 100644 |
| --- a/drivers/usb/dwc3/core.c |
| +++ b/drivers/usb/dwc3/core.c |
| @@ -1064,6 +1064,15 @@ static int dwc3_core_init(struct dwc3 *dwc) |
| if (!DWC3_VER_IS_PRIOR(DWC3, 290A)) |
| reg |= DWC3_GUCTL1_DEV_L1_EXIT_BY_HW; |
| |
| + /* |
| + * Decouple USB 2.0 L1 & L2 events which will allow for |
| + * gadget driver to only receive U3/L2 suspend & wakeup |
| + * events and prevent the more frequent L1 LPM transitions |
| + * from interrupting the driver. |
| + */ |
| + if (!DWC3_VER_IS_PRIOR(DWC3, 300A)) |
| + reg |= DWC3_GUCTL1_DEV_DECOUPLE_L1L2_EVT; |
| + |
| if (dwc->dis_tx_ipgap_linecheck_quirk) |
| reg |= DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS; |
| |
| diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h |
| index 1c8496fc732e..620c19deeee7 100644 |
| --- a/drivers/usb/dwc3/core.h |
| +++ b/drivers/usb/dwc3/core.h |
| @@ -250,9 +250,10 @@ |
| #define DWC3_GCTL_DSBLCLKGTNG BIT(0) |
| |
| /* Global User Control 1 Register */ |
| -#define DWC3_GUCTL1_PARKMODE_DISABLE_SS BIT(17) |
| +#define DWC3_GUCTL1_DEV_DECOUPLE_L1L2_EVT BIT(31) |
| #define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28) |
| -#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW BIT(24) |
| +#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW BIT(24) |
| +#define DWC3_GUCTL1_PARKMODE_DISABLE_SS BIT(17) |
| |
| /* Global Status Register */ |
| #define DWC3_GSTS_OTG_IP BIT(10) |
| -- |
| 2.43.0 |
| |