diff options
| author | Casey Connolly <[email protected]> | 2026-01-14 14:57:32 +0100 |
|---|---|---|
| committer | Casey Connolly <[email protected]> | 2026-01-14 16:25:09 +0100 |
| commit | 9be4f2f5f4d0b8327befde42c743336fa63fc43b (patch) | |
| tree | 64d6dba36065a03ec75296ccd1d11c3b2e4d88ae | |
| parent | 338c4b820804323c9c02521df5796c82b6dc1e81 (diff) | |
mach-snapdragon: of_fixup: support new flat dwc3 node
Qualcomm DTs are being updated to use a new format where the dwc3 glue
node and controller are combined into a single DT node. Update the fixup
code to handle this case.
Reviewed-by: Neil Armstrong <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Casey Connolly <[email protected]>
| -rw-r--r-- | arch/arm/mach-snapdragon/of_fixup.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/arch/arm/mach-snapdragon/of_fixup.c b/arch/arm/mach-snapdragon/of_fixup.c index eec2c0c757e..5b6076ea8e5 100644 --- a/arch/arm/mach-snapdragon/of_fixup.c +++ b/arch/arm/mach-snapdragon/of_fixup.c @@ -32,7 +32,7 @@ * DT here. This improves compatibility with upstream DT and simplifies the * porting process for new devices. */ -static int fixup_qcom_dwc3(struct device_node *root, struct device_node *glue_np) +static int fixup_qcom_dwc3(struct device_node *root, struct device_node *glue_np, bool flat) { struct device_node *dwc3; int ret, len, hsphy_idx = 1; @@ -41,6 +41,19 @@ static int fixup_qcom_dwc3(struct device_node *root, struct device_node *glue_np debug("Fixing up %s\n", glue_np->name); + /* New DT flattens the glue and controller into a single node. */ + if (flat) { + dwc3 = glue_np; + debug("%s uses flat DT\n", glue_np->name); + } else { + /* Find the DWC3 node itself */ + dwc3 = of_find_compatible_node(glue_np, NULL, "snps,dwc3"); + if (!dwc3) { + log_err("Failed to find dwc3 node\n"); + return -ENOENT; + } + } + /* Tell the glue driver to configure the wrapper for high-speed only operation */ ret = of_write_prop(glue_np, "qcom,select-utmi-as-pipe-clk", 0, NULL); if (ret) { @@ -48,13 +61,6 @@ static int fixup_qcom_dwc3(struct device_node *root, struct device_node *glue_np return ret; } - /* Find the DWC3 node itself */ - dwc3 = of_find_compatible_node(glue_np, NULL, "snps,dwc3"); - if (!dwc3) { - log_err("Failed to find dwc3 node\n"); - return -ENOENT; - } - phandles = of_get_property(dwc3, "phys", &len); len /= sizeof(*phandles); if (len == 1) { @@ -104,13 +110,25 @@ static int fixup_qcom_dwc3(struct device_node *root, struct device_node *glue_np static void fixup_usb_nodes(struct device_node *root) { - struct device_node *glue_np = root; + struct device_node *glue_np = root, *tmp; int ret; + bool flat; + + while (true) { + flat = false; + /* First check for the old DT format with glue node then the new flattened format */ + tmp = of_find_compatible_node(glue_np, NULL, "qcom,dwc3"); + if (!tmp) { + tmp = of_find_compatible_node(glue_np, NULL, "qcom,snps-dwc3"); + flat = !!tmp; + } + if (!tmp) + break; + glue_np = tmp; - while ((glue_np = of_find_compatible_node(glue_np, NULL, "qcom,dwc3"))) { if (!of_device_is_available(glue_np)) continue; - ret = fixup_qcom_dwc3(root, glue_np); + ret = fixup_qcom_dwc3(root, glue_np, flat); if (ret) log_warning("Failed to fixup node %s: %d\n", glue_np->name, ret); } |
