]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: dwc3: Add software-managed properties for flattened model
authorFrank Li <Frank.Li@nxp.com>
Mon, 29 Sep 2025 14:24:15 +0000 (10:24 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Oct 2025 07:11:50 +0000 (09:11 +0200)
Add software-managed properties for the flattened model, which does not
need to use device tree properties to pass down information to the
common DWC3 core.

Add 'properties' in dwc3_probe_data and set default values for existing
users (dwc3-qcom, dwc3-generic-plat).

No functional changes.

Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Signed-off-by: Frank Li <Frank.Li@nxp.com>
Link: https://lore.kernel.org/r/20250929-ls_dma_coherence-v5-2-2ebee578eb7e@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/core.c
drivers/usb/dwc3/dwc3-generic-plat.c
drivers/usb/dwc3/dwc3-qcom.c
drivers/usb/dwc3/glue.h

index ae140c356295c03df3982ff4fa95f8638296e52d..c5076580616e81c79b2da65a271f5b75e76c90e8 100644 (file)
@@ -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,6 +1675,12 @@ static void dwc3_get_software_properties(struct dwc3 *dwc)
 
        dwc->gsbuscfg0_reqinfo = DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED;
 
+       if (properties->gsbuscfg0_reqinfo !=
+           DWC3_GSBUSCFG0_REQINFO_UNSPECIFIED) {
+               dwc->gsbuscfg0_reqinfo = properties->gsbuscfg0_reqinfo;
+               return;
+       }
+
        /*
         * Iterate over all parent nodes for finding swnode properties
         * and non-DT (non-ABI) properties.
@@ -2206,7 +2213,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 +2363,7 @@ static int dwc3_probe(struct platform_device *pdev)
 
        probe_data.dwc = dwc;
        probe_data.res = res;
+       probe_data.properties = DWC3_DEFAULT_PROPERTIES;
 
        return dwc3_core_probe(&probe_data);
 }
index d96b20570002dc619ea813f4d6a8013636a0f346..af95a527dcc27a7a14d38dcc887f74a888ed91e6 100644 (file)
@@ -75,6 +75,7 @@ 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;
+       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");
index ded2ca86670c0bd7ceadd3cba3fa5ecf9e7e02b5..9ac75547820d978b4a32e570e5f59a2807be68a2 100644 (file)
@@ -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");
index 2efd00e763be4fc51911f32d43054059e61fb43a..cc6e138bd9ef2500215aba665300e7638f3d5214 100644 (file)
@@ -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: dwc3 software manage properties
  */
 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);