FAILED: patch "[PATCH] usb: dwc3: fix dwc3_readl() and dwc3_writel() calls in" failed to apply to 6.18-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x e0f844d9d74200d311c6438a0f04270834ba5365
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026071411-expose-starless-4335@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e0f844d9d74200d311c6438a0f04270834ba5365 Mon Sep 17 00:00:00 2001
From: Ben Dooks <[email protected]>
Date: Fri, 3 Jul 2026 17:20:33 +0100
Subject: [PATCH] usb: dwc3: fix dwc3_readl() and dwc3_writel() calls in
dwc3_ulpi_setup()
The dwc3_ulpi_setup() calls the register read and write calls with dwc3->regs when both these calls take the dwc3 structure directly.
Chnage these two calls to fix the following sparse warning, and possibly a nasty bug in the dwc3_ulpi_setup() code:
drivers/usb/dwc3/core.c:796:45: warning: incorrect type in argument 1 (different address spaces)drivers/usb/dwc3/core.c:796:45: expected struct dwc3 *dwcdrivers/usb/dwc3/core.c:796:45: got void [noderef] __iomem *regsdrivers/usb/dwc3/core.c:798:40: warning: incorrect type in argument 1 (different address spaces)drivers/usb/dwc3/core.c:798:40: expected struct dwc3 *dwcdrivers/usb/dwc3/core.c:798:40: got void [noderef] __iomem *regs
drivers/usb/dwc3/core.c +2 -2
@@ -789,9 +789,9 @@ static void dwc3_ulpi_setup(struct dwc3 *dwc)if (dwc->enable_usb2_transceiver_delay) {for (index =0 ; index < dwc->num_usb2_ports; index++) { - reg =dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (index)); + reg =dwc3_readl (dwc,DWC3_GUSB2PHYCFG (index)); reg |=DWC3_GUSB2PHYCFG_XCVRDLY ; -dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (index), reg); +dwc3_writel (dwc,DWC3_GUSB2PHYCFG (index), reg); } } }
Sasha Levin
maintainerPATCH 1/2 usb: dwc3: Support USB3340x ULPI PHY high-speed negotiation.
From: Ingo Rohloff <[email protected]>
[ Upstream commit a28de63356575612954d4e5d5f48a2488f50e16d ]
The Microchip USB3340x ULPI PHY requires a delay when switching to the high-speed transmitter. See:
http://ww1.microchip.com/downloads/en/DeviceDoc/80000645A.pdf
Module 2 "Device Enumeration Failure with Link IP Systems"
For details on the behavior and fix, refer to the AMD (formerly Xilinx) forum post: "USB stuck in full speed mode with USB3340 ULPI PHY, ZynqMP."
This patch uses the USB PHY Vendor-ID and Product-ID to detect the USB3340 PHY and then applies the necessary fix if this PHY is found.
Stable-dep-of: e0f844d9d742 ("usb: dwc3: fix dwc3_readl() and dwc3_writel() calls in dwc3_ulpi_setup()")
--- drivers/usb/dwc3/core.c | 20 ++++++++++++++++++++ drivers/usb/dwc3/core.h | 4 ++++ drivers/usb/dwc3/ulpi.c | 25 +++++++++++++++++++++++++ 3 files changed, 49 insertions(+)
drivers/usb/dwc3/core.c +20 -0
@@ -781,6 +781,24 @@ static int dwc3_hs_phy_setup(struct dwc3 *dwc, int index)return 0 ; } +static void dwc3_ulpi_setup (struct dwc3 *dwc) +{ +int index; +u32 reg; + +/* Don't do anything if there is no ULPI PHY */ +if (!dwc->ulpi) +return ; + +if (dwc->enable_usb2_transceiver_delay) { +for (index =0 ; index < dwc->num_usb2_ports; index++) { + reg =dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (index)); + reg |=DWC3_GUSB2PHYCFG_XCVRDLY ; +dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (index), reg); + } + } +} +/** * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core * @dwc: Pointer to our controller context structure
@@ -1355,6 +1373,8 @@ static int dwc3_core_init(struct dwc3 *dwc) dwc->ulpi_ready = true; } +dwc3_ulpi_setup (dwc); +if (!dwc->phys_ready) { ret =dwc3_core_get_phy (dwc);if (ret)
drivers/usb/dwc3/core.h +4 -0
@@ -302,6 +302,7 @@#define DWC3_GUSB2PHYCFG_SUSPHY BIT(6)#define DWC3_GUSB2PHYCFG_ULPI_UTMI BIT(4)#define DWC3_GUSB2PHYCFG_ENBLSLPM BIT(8) +#define DWC3_GUSB2PHYCFG_XCVRDLY BIT(9)#define DWC3_GUSB2PHYCFG_PHYIF (n) (n << 3)#define DWC3_GUSB2PHYCFG_PHYIF_MASK DWC3_GUSB2PHYCFG_PHYIF(1)#define DWC3_GUSB2PHYCFG_USBTRDTIM (n) (n << 10)
@@ -1161,6 +1162,8 @@ struct dwc3_glue_ops {* 3 - Reserved * @dis_metastability_quirk: set to disable metastability quirk. * @dis_split_quirk: set to disable split boundary. +* @enable_usb2_transceiver_delay: Set to insert a delay before the +* assertion of the TxValid signal during a HS Chirp. * @sys_wakeup: set if the device may do system wakeup. * @wakeup_configured: set if the device is configured for remote wakeup. * @suspended: set to track suspend event due to U3/L2.
@@ -1403,6 +1406,7 @@ struct dwc3 { unsigned dis_metastability_quirk:1; unsigned dis_split_quirk:1; + unsigned enable_usb2_transceiver_delay:1; unsigned async_callbacks:1; unsigned sys_wakeup:1; unsigned wakeup_configured:1;
drivers/usb/dwc3/ulpi.c +25 -0
@@ -10,10 +10,13 @@#include <linux/delay.h> #include <linux/time64.h> #include <linux/ulpi/regs.h> +#include <linux/ulpi/driver.h> #include "core.h" #include "io.h" +#define USB_VENDOR_MICROCHIP 0x0424 +#define DWC3_ULPI_ADDR (a) \ ((a >= ULPI_EXT_VENDOR_SPECIFIC) ? \ DWC3_GUSB2PHYACC_ADDR(ULPI_ACCESS_EXTENDED) | \
@@ -83,6 +86,26 @@ static const struct ulpi_ops dwc3_ulpi_ops = { .write = dwc3_ulpi_write, }; +static void dwc3_ulpi_detect_config (struct dwc3 *dwc) +{ +struct ulpi *ulpi = dwc->ulpi; + +switch (ulpi->id.vendor) { +case USB_VENDOR_MICROCHIP : +switch (ulpi->id.product) { +case 0x0009 : +/* Microchip USB3340 ULPI PHY */ + dwc->enable_usb2_transceiver_delay = true; +break ; +default : +break ; + } +break ; +default : +break ; + } +} +int dwc3_ulpi_init (struct dwc3 *dwc) {/* Register the interface */
@@ -92,6 +115,8 @@ int dwc3_ulpi_init(struct dwc3 *dwc)return PTR_ERR (dwc->ulpi); } +dwc3_ulpi_detect_config (dwc); +return 0 ; }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 usb: dwc3: fix dwc3_readl() and dwc3_writel() calls in dwc3_ulpi_setup()
From: Ben Dooks <[email protected]>
[ Upstream commit e0f844d9d74200d311c6438a0f04270834ba5365 ]
The dwc3_ulpi_setup() calls the register read and write calls with dwc3->regs when both these calls take the dwc3 structure directly.
Chnage these two calls to fix the following sparse warning, and possibly a nasty bug in the dwc3_ulpi_setup() code:
drivers/usb/dwc3/core.c:796:45: warning: incorrect type in argument 1 (different address spaces)drivers/usb/dwc3/core.c:796:45: expected struct dwc3 *dwcdrivers/usb/dwc3/core.c:796:45: got void [noderef] __iomem *regsdrivers/usb/dwc3/core.c:798:40: warning: incorrect type in argument 1 (different address spaces)drivers/usb/dwc3/core.c:798:40: expected struct dwc3 *dwcdrivers/usb/dwc3/core.c:798:40: got void [noderef] __iomem *regs
--- drivers/usb/dwc3/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/core.c +2 -2
@@ -792,9 +792,9 @@ static void dwc3_ulpi_setup(struct dwc3 *dwc)if (dwc->enable_usb2_transceiver_delay) {for (index =0 ; index < dwc->num_usb2_ports; index++) { - reg =dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (index)); + reg =dwc3_readl (dwc,DWC3_GUSB2PHYCFG (index)); reg |=DWC3_GUSB2PHYCFG_XCVRDLY ; -dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (index), reg); +dwc3_writel (dwc,DWC3_GUSB2PHYCFG (index), reg); } } }
Signature · 1 line
2.53.0