* [PATCH v2 0/3] usb: dwc3: add layerscape platform driver use flatten dwc3 core
@ 2025-09-23 20:22 Frank Li
2025-09-23 20:22 ` [PATCH v2 1/3] dt-bindings: usb: add missed compatible string for arm64 layerscape Frank Li
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Frank Li @ 2025-09-23 20:22 UTC (permalink / raw)
To: Greg Kroah-Hartman, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Thinh Nguyen, Shawn Guo
Cc: linux-usb, devicetree, linux-kernel, linux-arm-kernel,
bjorn.andersson, Frank Li, Ze Huang
Add layerscape platform driver use flatten dwc3 core to enable dma-coherence.
It needs set gsburstcfg0 to 0x2222.
There are some several try before:
[1] https://lore.kernel.org/imx/20240710-ls-dwc-v1-0-62f8cbed31d7@nxp.com/
[2] https://lore.kernel.org/imx/20240123170206.3702413-1-Frank.Li@nxp.com/
[2]: add new property, which was reject because there are no varience in
the soc. Fortunately the below commit resolve this problem by use software
managed property.
d504bfa6cfd1a usb: dwc3: enable CCI support for AMD-xilinx DWC3 controller
[1] was reject because there are not actually dwc wrap at layerscape
platform. Fortunately Bjorn Andersson's below patch to make it possible
by use correct dts dwc3 node layer out.
613a2e655d4dc usb: dwc3: core: Expose core driver as library
This resolve problem [1] and [2] by use flatten dwc3 core library.
1. add soc specific compatible string at dt-binding.
2. create platform driver for layerscape chips and pass down gsbuscfg0 if
dma-coherence enabled.
3. update layerscape dts files.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
Changes in v2:
- base on drivers/usb/dwc3/dwc3-generic-plat.c
commit e0b6dc00c701e600e655417aab1e100b73de821a
Author: Ze Huang <huang.ze@linux.dev>
Date: Sat Sep 13 00:53:48 2025 +0800
usb: dwc3: add generic driver to support flattened
To support flattened dwc3 dt model and drop the glue layer, introduce the
`dwc3-generic` driver. This enables direct binding of the DWC3 core driver
and offers an alternative to the existing glue driver `dwc3-of-simple`.
- Link to v1: https://lore.kernel.org/r/20250602-ls_dma_coherence-v1-0-c67484d6ab64@nxp.com
---
Frank Li (3):
dt-bindings: usb: add missed compatible string for arm64 layerscape
usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support
arm64: dts: layerscape: add dma-coherent for usb node
.../devicetree/bindings/usb/fsl,ls1028a.yaml | 33 ++++++++++++----------
arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi | 3 +-
arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | 8 ++++--
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 9 ++++--
arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi | 9 ++++--
arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi | 8 ++++--
arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 8 ++++--
drivers/usb/dwc3/dwc3-generic-plat.c | 30 +++++++++++++++++++-
8 files changed, 79 insertions(+), 29 deletions(-)
---
base-commit: c45d2c21b3889c520bf141d576eaecb25666895c
change-id: 20250602-ls_dma_coherence-c3c2b6f79db2
Best regards,
--
Frank Li <Frank.Li@nxp.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/3] dt-bindings: usb: add missed compatible string for arm64 layerscape
2025-09-23 20:22 [PATCH v2 0/3] usb: dwc3: add layerscape platform driver use flatten dwc3 core Frank Li
@ 2025-09-23 20:22 ` Frank Li
2025-09-23 20:22 ` [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support Frank Li
2025-09-23 20:22 ` [PATCH v2 3/3] arm64: dts: layerscape: add dma-coherent for usb node Frank Li
2 siblings, 0 replies; 8+ messages in thread
From: Frank Li @ 2025-09-23 20:22 UTC (permalink / raw)
To: Greg Kroah-Hartman, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Thinh Nguyen, Shawn Guo
Cc: linux-usb, devicetree, linux-kernel, linux-arm-kernel,
bjorn.andersson, Frank Li, Ze Huang
Add missed compatible string for arm64 layerscape platform. Allow these
fallback to fsl,ls1028a-dwc3.
Remove fallback snps,dwc3 because layerscape dwc3 is not full compatible
with common snps,dwc3 device, a special value gsburstcfg0 need be set when
dma coherence enabled.
Allow iommus property.
Change ref to snps,dwc3-common.yaml to use dwc3 flatten library.
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
.../devicetree/bindings/usb/fsl,ls1028a.yaml | 33 ++++++++++++----------
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/Documentation/devicetree/bindings/usb/fsl,ls1028a.yaml b/Documentation/devicetree/bindings/usb/fsl,ls1028a.yaml
index a44bdf391887f9c7d565c01d2c3aede99c4a9fc3..4784f057264ac7b18cbc8b41a405f9c9268605bb 100644
--- a/Documentation/devicetree/bindings/usb/fsl,ls1028a.yaml
+++ b/Documentation/devicetree/bindings/usb/fsl,ls1028a.yaml
@@ -9,21 +9,19 @@ title: Freescale layerscape SuperSpeed DWC3 USB SoC controller
maintainers:
- Frank Li <Frank.Li@nxp.com>
-select:
- properties:
- compatible:
- contains:
- enum:
- - fsl,ls1028a-dwc3
- required:
- - compatible
-
properties:
compatible:
- items:
- - enum:
- - fsl,ls1028a-dwc3
- - const: snps,dwc3
+ oneOf:
+ - items:
+ - enum:
+ - fsl,ls1012a-dwc3
+ - fsl,ls1043a-dwc3
+ - fsl,ls1046a-dwc3
+ - fsl,ls1088a-dwc3
+ - fsl,ls208xa-dwc3
+ - fsl,lx2160a-dwc3
+ - const: fsl,ls1028a-dwc3
+ - const: fsl,ls1028a-dwc3
reg:
maxItems: 1
@@ -31,6 +29,11 @@ properties:
interrupts:
maxItems: 1
+ iommus:
+ maxItems: 1
+
+ dma-coherent: true
+
unevaluatedProperties: false
required:
@@ -39,14 +42,14 @@ required:
- interrupts
allOf:
- - $ref: snps,dwc3.yaml#
+ - $ref: snps,dwc3-common.yaml#
examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
usb@fe800000 {
- compatible = "fsl,ls1028a-dwc3", "snps,dwc3";
+ compatible = "fsl,ls1028a-dwc3";
reg = <0xfe800000 0x100000>;
interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
};
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support
2025-09-23 20:22 [PATCH v2 0/3] usb: dwc3: add layerscape platform driver use flatten dwc3 core Frank Li
2025-09-23 20:22 ` [PATCH v2 1/3] dt-bindings: usb: add missed compatible string for arm64 layerscape Frank Li
@ 2025-09-23 20:22 ` Frank Li
2025-09-24 22:13 ` Thinh Nguyen
2025-09-23 20:22 ` [PATCH v2 3/3] arm64: dts: layerscape: add dma-coherent for usb node Frank Li
2 siblings, 1 reply; 8+ messages in thread
From: Frank Li @ 2025-09-23 20:22 UTC (permalink / raw)
To: Greg Kroah-Hartman, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Thinh Nguyen, Shawn Guo
Cc: linux-usb, devicetree, linux-kernel, linux-arm-kernel,
bjorn.andersson, Frank Li, Ze Huang
Add layerscape dwc3 support by using flatten dwc3 core library. Layerscape
dwc3 need set software managed property snps,gsbuscfg0-reqinfo as 0x2222
when dma-coherence set.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
drivers/usb/dwc3/dwc3-generic-plat.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/dwc3/dwc3-generic-plat.c b/drivers/usb/dwc3/dwc3-generic-plat.c
index d96b20570002dc619ea813f4d6a8013636a0f346..d886b6e557b12edda71203e4f640a9a0a53b4f35 100644
--- a/drivers/usb/dwc3/dwc3-generic-plat.c
+++ b/drivers/usb/dwc3/dwc3-generic-plat.c
@@ -8,10 +8,15 @@
*/
#include <linux/clk.h>
+#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/reset.h>
#include "glue.h"
+struct dwc3_generic_drvdata {
+ u32 gsbuscfg0;
+};
+
struct dwc3_generic {
struct device *dev;
struct dwc3 dwc;
@@ -29,6 +34,7 @@ static void dwc3_generic_reset_control_assert(void *data)
static int dwc3_generic_probe(struct platform_device *pdev)
{
+ const struct dwc3_generic_drvdata *drvdata;
struct dwc3_probe_data probe_data = {};
struct device *dev = &pdev->dev;
struct dwc3_generic *dwc3g;
@@ -41,6 +47,8 @@ static int dwc3_generic_probe(struct platform_device *pdev)
dwc3g->dev = dev;
+ drvdata = of_device_get_match_data(dev);
+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "missing memory resource\n");
@@ -70,6 +78,17 @@ static int dwc3_generic_probe(struct platform_device *pdev)
if (ret < 0)
return dev_err_probe(dev, ret, "failed to get clocks\n");
+ if (of_dma_is_coherent(pdev->dev.of_node)) {
+ struct property_entry props[2] = {};
+
+ props[0] = PROPERTY_ENTRY_U16("snps,gsbuscfg0-reqinfo", drvdata->gsbuscfg0);
+
+ ret = device_create_managed_software_node(dev, props, NULL);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "fail create software managed property node\n");
+ }
+
dwc3g->num_clocks = ret;
dwc3g->dwc.dev = dev;
probe_data.dwc = &dwc3g->dwc;
@@ -145,8 +164,17 @@ static const struct dev_pm_ops dwc3_generic_dev_pm_ops = {
dwc3_generic_runtime_idle)
};
+static const struct dwc3_generic_drvdata spacemit_k1_dwc3 = {
+ .gsbuscfg0 = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED,
+};
+
+static const struct dwc3_generic_drvdata fsl_ls1028_dwc3 = {
+ .gsbuscfg0 = 0x2222,
+};
+
static const struct of_device_id dwc3_generic_of_match[] = {
- { .compatible = "spacemit,k1-dwc3", },
+ { .compatible = "spacemit,k1-dwc3", &spacemit_k1_dwc3},
+ { .compatible = "fsl,ls1028a-dwc3", &fsl_ls1028_dwc3},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, dwc3_generic_of_match);
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] arm64: dts: layerscape: add dma-coherent for usb node
2025-09-23 20:22 [PATCH v2 0/3] usb: dwc3: add layerscape platform driver use flatten dwc3 core Frank Li
2025-09-23 20:22 ` [PATCH v2 1/3] dt-bindings: usb: add missed compatible string for arm64 layerscape Frank Li
2025-09-23 20:22 ` [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support Frank Li
@ 2025-09-23 20:22 ` Frank Li
2 siblings, 0 replies; 8+ messages in thread
From: Frank Li @ 2025-09-23 20:22 UTC (permalink / raw)
To: Greg Kroah-Hartman, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Thinh Nguyen, Shawn Guo
Cc: linux-usb, devicetree, linux-kernel, linux-arm-kernel,
bjorn.andersson, Frank Li, Ze Huang
Add SOC special compatible string, remove fallback snps,dwc3 to let flatten
dwc3-layerscape driver to be probed and enable dma-coherence for usb node
since commit add layerscape dwc3 support, which set correct gsbustcfg0
value.
Add iommus property to run at old uboot, which use fixup add iommus by
check compatible string snsp,dwc3 compatible string.
Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi | 3 ++-
arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | 8 ++++++--
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi | 9 ++++++---
arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi | 9 ++++++---
arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi | 8 ++++++--
arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 8 ++++++--
6 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
index fc3e138077b86cd5e3cf95c3d336cb3c6e1c45ef..ef80bf6a604f475c670e2d626a727e94fcb2a17a 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
@@ -493,10 +493,11 @@ QORIQ_CLK_PLL_DIV(4)>,
};
usb0: usb@2f00000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1012a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x2f00000 0x0 0x10000>;
interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
index 7d172d7e5737c4b6e42ee88676c5763fa7415260..e7f9c9319319a69d8c70d1e26446b899c3599f95 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
@@ -613,9 +613,11 @@ gpio3: gpio@2320000 {
};
usb0: usb@3100000 {
- compatible = "fsl,ls1028a-dwc3", "snps,dwc3";
+ compatible = "fsl,ls1028a-dwc3";
reg = <0x0 0x3100000 0x0 0x10000>;
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+ iommus = <&smmu 1>;
+ dma-coherent;
snps,dis_rxdet_inp3_quirk;
snps,quirk-frame-length-adjustment = <0x20>;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
@@ -623,9 +625,11 @@ usb0: usb@3100000 {
};
usb1: usb@3110000 {
- compatible = "fsl,ls1028a-dwc3", "snps,dwc3";
+ compatible = "fsl,ls1028a-dwc3";
reg = <0x0 0x3110000 0x0 0x10000>;
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
+ iommus = <&smmu 2>;
+ dma-coherent;
snps,dis_rxdet_inp3_quirk;
snps,quirk-frame-length-adjustment = <0x20>;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
index 73315c51703943d9ee5e1aa300c388ff6482423f..50d9b03a284a2aa4e13aa3323c25bbc5fe08f3d0 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
@@ -833,10 +833,11 @@ aux_bus: bus {
dma-ranges = <0x0 0x0 0x0 0x0 0x100 0x00000000>;
usb0: usb@2f00000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1043a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x2f00000 0x0 0x10000>;
interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
usb3-lpm-capable;
@@ -845,10 +846,11 @@ usb0: usb@2f00000 {
};
usb1: usb@3000000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1043a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3000000 0x0 0x10000>;
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
usb3-lpm-capable;
@@ -857,10 +859,11 @@ usb1: usb@3000000 {
};
usb2: usb@3100000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1043a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3100000 0x0 0x10000>;
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
usb3-lpm-capable;
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi
index 770d91ef0310d971d044a1f55cc5e2cb738acc47..22173d69713d1bd2abca986e76668ad437dd34e4 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi
@@ -749,10 +749,11 @@ aux_bus: bus {
dma-ranges = <0x0 0x0 0x0 0x0 0x100 0x00000000>;
usb0: usb@2f00000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1046a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x2f00000 0x0 0x10000>;
interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
@@ -760,10 +761,11 @@ usb0: usb@2f00000 {
};
usb1: usb@3000000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1046a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3000000 0x0 0x10000>;
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
@@ -771,10 +773,11 @@ usb1: usb@3000000 {
};
usb2: usb@3100000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1046a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3100000 0x0 0x10000>;
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
index 9d5726378aa015eff10578bf095908a58b9d9eee..b2f6cd237be046123de9342e2167aa32248a8a16 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
@@ -489,10 +489,12 @@ esdhc: mmc@2140000 {
};
usb0: usb@3100000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1088a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3100000 0x0 0x10000>;
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ iommus = <&smmu 1>;
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
@@ -500,10 +502,12 @@ usb0: usb@3100000 {
};
usb1: usb@3110000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,ls1088a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3110000 0x0 0x10000>;
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
+ iommus = <&smmu 2>;
+ dma-coherent;
snps,quirk-frame-length-adjustment = <0x20>;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
diff --git a/arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi b/arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi
index c9541403bcd8239a48d4ef79c7c4f9e3b607b556..d899c0355e51dd457a4e7259709cea98a488f557 100644
--- a/arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi
@@ -1094,24 +1094,28 @@ ftm_alarm0: rtc@2800000 {
};
usb0: usb@3100000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,lx2160a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3100000 0x0 0x10000>;
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
snps,quirk-frame-length-adjustment = <0x20>;
usb3-lpm-capable;
+ iommus = <&smmu 1>;
+ dma-coherent;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
status = "disabled";
};
usb1: usb@3110000 {
- compatible = "snps,dwc3";
+ compatible = "fsl,lx2160a-dwc3", "fsl,ls1028a-dwc3";
reg = <0x0 0x3110000 0x0 0x10000>;
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
snps,quirk-frame-length-adjustment = <0x20>;
usb3-lpm-capable;
+ iommus = <&smmu 2>;
+ dma-coherent;
snps,dis_rxdet_inp3_quirk;
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
status = "disabled";
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support
2025-09-23 20:22 ` [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support Frank Li
@ 2025-09-24 22:13 ` Thinh Nguyen
2025-09-25 4:09 ` Frank Li
0 siblings, 1 reply; 8+ messages in thread
From: Thinh Nguyen @ 2025-09-24 22:13 UTC (permalink / raw)
To: Frank Li
Cc: Greg Kroah-Hartman, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Thinh Nguyen, Shawn Guo, linux-usb@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
bjorn.andersson@oss.qualcomm.com, Ze Huang
On Tue, Sep 23, 2025, Frank Li wrote:
> Add layerscape dwc3 support by using flatten dwc3 core library. Layerscape
> dwc3 need set software managed property snps,gsbuscfg0-reqinfo as 0x2222
> when dma-coherence set.
>
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
> drivers/usb/dwc3/dwc3-generic-plat.c | 30 +++++++++++++++++++++++++++++-
> 1 file changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/dwc3/dwc3-generic-plat.c b/drivers/usb/dwc3/dwc3-generic-plat.c
> index d96b20570002dc619ea813f4d6a8013636a0f346..d886b6e557b12edda71203e4f640a9a0a53b4f35 100644
> --- a/drivers/usb/dwc3/dwc3-generic-plat.c
> +++ b/drivers/usb/dwc3/dwc3-generic-plat.c
> @@ -8,10 +8,15 @@
> */
>
> #include <linux/clk.h>
> +#include <linux/of_address.h>
> #include <linux/platform_device.h>
> #include <linux/reset.h>
> #include "glue.h"
>
> +struct dwc3_generic_drvdata {
> + u32 gsbuscfg0;
Are we going to overwrite the entire register or just the REQINFO
fields? The "snps,gsbuscfg0-reqinfo" property only updates the reqinfo
of GSBUSCFG0. Perhaps rename this?
> +};
> +
> struct dwc3_generic {
> struct device *dev;
> struct dwc3 dwc;
> @@ -29,6 +34,7 @@ static void dwc3_generic_reset_control_assert(void *data)
>
> static int dwc3_generic_probe(struct platform_device *pdev)
> {
> + const struct dwc3_generic_drvdata *drvdata;
> struct dwc3_probe_data probe_data = {};
> struct device *dev = &pdev->dev;
> struct dwc3_generic *dwc3g;
> @@ -41,6 +47,8 @@ static int dwc3_generic_probe(struct platform_device *pdev)
>
> dwc3g->dev = dev;
>
> + drvdata = of_device_get_match_data(dev);
> +
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> if (!res) {
> dev_err(&pdev->dev, "missing memory resource\n");
> @@ -70,6 +78,17 @@ static int dwc3_generic_probe(struct platform_device *pdev)
> if (ret < 0)
> return dev_err_probe(dev, ret, "failed to get clocks\n");
>
> + if (of_dma_is_coherent(pdev->dev.of_node)) {
> + struct property_entry props[2] = {};
> +
> + props[0] = PROPERTY_ENTRY_U16("snps,gsbuscfg0-reqinfo", drvdata->gsbuscfg0);
> +
> + ret = device_create_managed_software_node(dev, props, NULL);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "fail create software managed property node\n");
> + }
> +
> dwc3g->num_clocks = ret;
> dwc3g->dwc.dev = dev;
> probe_data.dwc = &dwc3g->dwc;
> @@ -145,8 +164,17 @@ static const struct dev_pm_ops dwc3_generic_dev_pm_ops = {
> dwc3_generic_runtime_idle)
> };
>
> +static const struct dwc3_generic_drvdata spacemit_k1_dwc3 = {
> + .gsbuscfg0 = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED,
Why do we need to do this?
> +};
> +
> +static const struct dwc3_generic_drvdata fsl_ls1028_dwc3 = {
> + .gsbuscfg0 = 0x2222,
> +};
> +
> static const struct of_device_id dwc3_generic_of_match[] = {
> - { .compatible = "spacemit,k1-dwc3", },
> + { .compatible = "spacemit,k1-dwc3", &spacemit_k1_dwc3},
> + { .compatible = "fsl,ls1028a-dwc3", &fsl_ls1028_dwc3},
> { /* sentinel */ }
> };
> MODULE_DEVICE_TABLE(of, dwc3_generic_of_match);
>
> --
> 2.34.1
>
Thanks,
Thinh
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support
2025-09-24 22:13 ` Thinh Nguyen
@ 2025-09-25 4:09 ` Frank Li
2025-09-25 23:42 ` Thinh Nguyen
0 siblings, 1 reply; 8+ messages in thread
From: Frank Li @ 2025-09-25 4:09 UTC (permalink / raw)
To: Thinh Nguyen
Cc: Greg Kroah-Hartman, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Shawn Guo, linux-usb@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
bjorn.andersson@oss.qualcomm.com, Ze Huang
On Wed, Sep 24, 2025 at 10:13:36PM +0000, Thinh Nguyen wrote:
> On Tue, Sep 23, 2025, Frank Li wrote:
> > Add layerscape dwc3 support by using flatten dwc3 core library. Layerscape
> > dwc3 need set software managed property snps,gsbuscfg0-reqinfo as 0x2222
> > when dma-coherence set.
> >
> > Signed-off-by: Frank Li <Frank.Li@nxp.com>
> > ---
> > drivers/usb/dwc3/dwc3-generic-plat.c | 30 +++++++++++++++++++++++++++++-
> > 1 file changed, 29 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/usb/dwc3/dwc3-generic-plat.c b/drivers/usb/dwc3/dwc3-generic-plat.c
> > index d96b20570002dc619ea813f4d6a8013636a0f346..d886b6e557b12edda71203e4f640a9a0a53b4f35 100644
> > --- a/drivers/usb/dwc3/dwc3-generic-plat.c
> > +++ b/drivers/usb/dwc3/dwc3-generic-plat.c
> > @@ -8,10 +8,15 @@
> > */
> >
> > #include <linux/clk.h>
> > +#include <linux/of_address.h>
> > #include <linux/platform_device.h>
> > #include <linux/reset.h>
> > #include "glue.h"
> >
> > +struct dwc3_generic_drvdata {
> > + u32 gsbuscfg0;
>
> Are we going to overwrite the entire register or just the REQINFO
> fields? The "snps,gsbuscfg0-reqinfo" property only updates the reqinfo
> of GSBUSCFG0. Perhaps rename this?
Yes
>
> > +};
> > +
> > struct dwc3_generic {
> > struct device *dev;
> > struct dwc3 dwc;
> > @@ -29,6 +34,7 @@ static void dwc3_generic_reset_control_assert(void *data)
> >
> > static int dwc3_generic_probe(struct platform_device *pdev)
> > {
> > + const struct dwc3_generic_drvdata *drvdata;
> > struct dwc3_probe_data probe_data = {};
> > struct device *dev = &pdev->dev;
> > struct dwc3_generic *dwc3g;
> > @@ -41,6 +47,8 @@ static int dwc3_generic_probe(struct platform_device *pdev)
> >
> > dwc3g->dev = dev;
> >
> > + drvdata = of_device_get_match_data(dev);
> > +
> > res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > if (!res) {
> > dev_err(&pdev->dev, "missing memory resource\n");
> > @@ -70,6 +78,17 @@ static int dwc3_generic_probe(struct platform_device *pdev)
> > if (ret < 0)
> > return dev_err_probe(dev, ret, "failed to get clocks\n");
> >
> > + if (of_dma_is_coherent(pdev->dev.of_node)) {
> > + struct property_entry props[2] = {};
> > +
> > + props[0] = PROPERTY_ENTRY_U16("snps,gsbuscfg0-reqinfo", drvdata->gsbuscfg0);
> > +
> > + ret = device_create_managed_software_node(dev, props, NULL);
> > + if (ret)
> > + return dev_err_probe(dev, ret,
> > + "fail create software managed property node\n");
> > + }
> > +
> > dwc3g->num_clocks = ret;
> > dwc3g->dwc.dev = dev;
> > probe_data.dwc = &dwc3g->dwc;
> > @@ -145,8 +164,17 @@ static const struct dev_pm_ops dwc3_generic_dev_pm_ops = {
> > dwc3_generic_runtime_idle)
> > };
> >
> > +static const struct dwc3_generic_drvdata spacemit_k1_dwc3 = {
> > + .gsbuscfg0 = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED,
>
> Why do we need to do this?
because is 0 valildate setting for cfg0_regqinfo.
Avoid add new flags like REGINFO_VALDATE in drvdata. dwc3 will use default
value if reginfo is DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED.
of cousre, if you like add bool b_usebuscfg0 in drvdata, I am also fine.
Frank
>
> > +};
> > +
> > +static const struct dwc3_generic_drvdata fsl_ls1028_dwc3 = {
> > + .gsbuscfg0 = 0x2222,
> > +};
> > +
> > static const struct of_device_id dwc3_generic_of_match[] = {
> > - { .compatible = "spacemit,k1-dwc3", },
> > + { .compatible = "spacemit,k1-dwc3", &spacemit_k1_dwc3},
> > + { .compatible = "fsl,ls1028a-dwc3", &fsl_ls1028_dwc3},
> > { /* sentinel */ }
> > };
> > MODULE_DEVICE_TABLE(of, dwc3_generic_of_match);
> >
> > --
> > 2.34.1
> >
>
> Thanks,
> Thinh
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support
2025-09-25 4:09 ` Frank Li
@ 2025-09-25 23:42 ` Thinh Nguyen
2025-09-25 23:47 ` Thinh Nguyen
0 siblings, 1 reply; 8+ messages in thread
From: Thinh Nguyen @ 2025-09-25 23:42 UTC (permalink / raw)
To: Frank Li
Cc: Thinh Nguyen, Greg Kroah-Hartman, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shawn Guo,
linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
bjorn.andersson@oss.qualcomm.com, Ze Huang
On Thu, Sep 25, 2025, Frank Li wrote:
> On Wed, Sep 24, 2025 at 10:13:36PM +0000, Thinh Nguyen wrote:
> > >
> > > +static const struct dwc3_generic_drvdata spacemit_k1_dwc3 = {
> > > + .gsbuscfg0 = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED,
> >
> > Why do we need to do this?
>
> because is 0 valildate setting for cfg0_regqinfo.
>
> Avoid add new flags like REGINFO_VALDATE in drvdata. dwc3 will use default
> value if reginfo is DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED.
>
> of cousre, if you like add bool b_usebuscfg0 in drvdata, I am also fine.
>
Let's avoid the parent-child model to pass the properties as if they
were from device-tree. That was a workaround we had before the new
flattened model.
I'm thinking of something like below. Let me know if this works for you.
Note that this isn't tested:
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index ae140c356295..bf7323a1658e 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1666,7 +1666,8 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc)
dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE, true);
}
-static void dwc3_get_software_properties(struct dwc3 *dwc)
+static void dwc3_get_software_properties(struct dwc3 *dwc,
+ const struct dwc3_properties *properties)
{
struct device *tmpdev;
u16 gsbuscfg0_reqinfo;
@@ -1674,16 +1675,20 @@ static void dwc3_get_software_properties(struct dwc3 *dwc)
dwc->gsbuscfg0_reqinfo = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED;
- /*
- * Iterate over all parent nodes for finding swnode properties
- * and non-DT (non-ABI) properties.
- */
- for (tmpdev = dwc->dev; tmpdev; tmpdev = tmpdev->parent) {
- ret = device_property_read_u16(tmpdev,
- "snps,gsbuscfg0-reqinfo",
- &gsbuscfg0_reqinfo);
- if (!ret)
- dwc->gsbuscfg0_reqinfo = gsbuscfg0_reqinfo;
+ if (properties->gsbuscfg0_reqinfo != DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED) {
+ dwc->gsbuscfg0_reqinfo = properties->gsbuscfg0_reqinfo;
+ } else {
+ /*
+ * Iterate over all parent nodes for finding swnode properties
+ * and non-DT (non-ABI) properties.
+ */
+ for (tmpdev = dwc->dev; tmpdev; tmpdev = tmpdev->parent) {
+ ret = device_property_read_u16(tmpdev,
+ "snps,gsbuscfg0-reqinfo",
+ &gsbuscfg0_reqinfo);
+ if (!ret)
+ dwc->gsbuscfg0_reqinfo = gsbuscfg0_reqinfo;
+ }
}
}
@@ -2206,7 +2211,7 @@ int dwc3_core_probe(const struct dwc3_probe_data *data)
dwc3_get_properties(dwc);
- dwc3_get_software_properties(dwc);
+ dwc3_get_software_properties(dwc, &data->properties);
dwc->usb_psy = dwc3_get_usb_power_supply(dwc);
if (IS_ERR(dwc->usb_psy))
@@ -2356,6 +2361,7 @@ static int dwc3_probe(struct platform_device *pdev)
probe_data.dwc = dwc;
probe_data.res = res;
+ probe_data.properties.gsbuscfg0_reqinfo = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED;
return dwc3_core_probe(&probe_data);
}
diff --git a/drivers/usb/dwc3/dwc3-generic-plat.c b/drivers/usb/dwc3/dwc3-generic-plat.c
index d96b20570002..b9bf27ed8c05 100644
--- a/drivers/usb/dwc3/dwc3-generic-plat.c
+++ b/drivers/usb/dwc3/dwc3-generic-plat.c
@@ -30,6 +30,7 @@ static void dwc3_generic_reset_control_assert(void *data)
static int dwc3_generic_probe(struct platform_device *pdev)
{
struct dwc3_probe_data probe_data = {};
+ const struct dwc3_properties *properties;
struct device *dev = &pdev->dev;
struct dwc3_generic *dwc3g;
struct resource *res;
@@ -75,6 +76,13 @@ static int dwc3_generic_probe(struct platform_device *pdev)
probe_data.dwc = &dwc3g->dwc;
probe_data.res = res;
probe_data.ignore_clocks_and_resets = true;
+
+ properties = of_device_get_match_data(dev);
+ if (properties)
+ probe_data.properties = *properties;
+ else
+ probe_data.properties = DWC3_DEFAULT_PROPERTIES;
+
ret = dwc3_core_probe(&probe_data);
if (ret)
return dev_err_probe(dev, ret, "failed to register DWC3 Core\n");
@@ -145,8 +153,13 @@ static const struct dev_pm_ops dwc3_generic_dev_pm_ops = {
dwc3_generic_runtime_idle)
};
+static const struct dwc3_properties fsl_ls1028_dwc3 = {
+ .gsbuscfg0_reqinfo = 0x2222,
+};
+
static const struct of_device_id dwc3_generic_of_match[] = {
{ .compatible = "spacemit,k1-dwc3", },
+ { .compatible = "fsl,ls1028a-dwc3", &fsl_ls1028_dwc3},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, dwc3_generic_of_match);
diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
index ded2ca86670c..9ac75547820d 100644
--- a/drivers/usb/dwc3/dwc3-qcom.c
+++ b/drivers/usb/dwc3/dwc3-qcom.c
@@ -704,6 +704,7 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
probe_data.dwc = &qcom->dwc;
probe_data.res = &res;
probe_data.ignore_clocks_and_resets = true;
+ probe_data.properties = DWC3_DEFAULT_PROPERTIES;
ret = dwc3_core_probe(&probe_data);
if (ret) {
ret = dev_err_probe(dev, ret, "failed to register DWC3 Core\n");
diff --git a/drivers/usb/dwc3/glue.h b/drivers/usb/dwc3/glue.h
index 2efd00e763be..7083ab193417 100644
--- a/drivers/usb/dwc3/glue.h
+++ b/drivers/usb/dwc3/glue.h
@@ -9,17 +9,31 @@
#include <linux/types.h>
#include "core.h"
+/**
+ * dwc3_properties: DWC3 core properties
+ * @gsbuscfg0_reqinfo: Value to be programmed in the GSBUSCFG0.REQINFO field
+ */
+struct dwc3_properties {
+ u32 gsbuscfg0_reqinfo;
+};
+
+#define DWC3_DEFAULT_PROPERTIES ((struct dwc3_properties){ \
+ .gsbuscfg0_reqinfo = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED, \
+ })
+
/**
* dwc3_probe_data: Initialization parameters passed to dwc3_core_probe()
* @dwc: Reference to dwc3 context structure
* @res: resource for the DWC3 core mmio region
* @ignore_clocks_and_resets: clocks and resets defined for the device should
* be ignored by the DWC3 core, as they are managed by the glue
+ * @properties: <description>
*/
struct dwc3_probe_data {
struct dwc3 *dwc;
struct resource *res;
bool ignore_clocks_and_resets;
+ struct dwc3_properties properties;
};
int dwc3_core_probe(const struct dwc3_probe_data *data);
---
BR,
Thinh
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support
2025-09-25 23:42 ` Thinh Nguyen
@ 2025-09-25 23:47 ` Thinh Nguyen
0 siblings, 0 replies; 8+ messages in thread
From: Thinh Nguyen @ 2025-09-25 23:47 UTC (permalink / raw)
To: Frank Li
Cc: Thinh Nguyen, Greg Kroah-Hartman, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Shawn Guo,
linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
bjorn.andersson@oss.qualcomm.com, Ze Huang
On Thu, Sep 25, 2025, Thinh Nguyen wrote:
>
> @@ -2206,7 +2211,7 @@ int dwc3_core_probe(const struct dwc3_probe_data *data)
>
> dwc3_get_properties(dwc);
>
> - dwc3_get_software_properties(dwc);
> + dwc3_get_software_properties(dwc, &data->properties);
>
> dwc->usb_psy = dwc3_get_usb_power_supply(dwc);
> if (IS_ERR(dwc->usb_psy))
> @@ -2356,6 +2361,7 @@ static int dwc3_probe(struct platform_device *pdev)
>
> probe_data.dwc = dwc;
> probe_data.res = res;
> + probe_data.properties.gsbuscfg0_reqinfo = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED;
>
Sent a bit early. The change above should've been this:
probe_data.properties = DWC3_DEFAULT_PROPERTIES;
BR,
Thinh
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-09-25 23:48 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-23 20:22 [PATCH v2 0/3] usb: dwc3: add layerscape platform driver use flatten dwc3 core Frank Li
2025-09-23 20:22 ` [PATCH v2 1/3] dt-bindings: usb: add missed compatible string for arm64 layerscape Frank Li
2025-09-23 20:22 ` [PATCH v2 2/3] usb: dwc3: dwc3-generic-plat: add layerscape dwc3 support Frank Li
2025-09-24 22:13 ` Thinh Nguyen
2025-09-25 4:09 ` Frank Li
2025-09-25 23:42 ` Thinh Nguyen
2025-09-25 23:47 ` Thinh Nguyen
2025-09-23 20:22 ` [PATCH v2 3/3] arm64: dts: layerscape: add dma-coherent for usb node Frank Li
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox