On 09/04/2025 19:17, Caleb Connolly wrote:
The RB1 and RB2 have a single USB controller which is manually muxed
between a type-c port and an internal USB hub via a DIP switch. OTG is
supported in Linux, but the DWC3 driver in U-Boot can only handle a
single mode, and defaults to peripheral mode.

We did hack around this on the RB2, but the RB1 got left out.

Now that we can fix up the live tree before devices are bound, drop the
DTS hacks and do the fixup at runtime instead.

Signed-off-by: Caleb Connolly <caleb.conno...@linaro.org>
---
  arch/arm/dts/qrb4210-rb2-u-boot.dtsi |  6 ------
  arch/arm/mach-snapdragon/of_fixup.c  | 28 ++++++++++++++--------------
  2 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/arch/arm/dts/qrb4210-rb2-u-boot.dtsi 
b/arch/arm/dts/qrb4210-rb2-u-boot.dtsi
deleted file mode 100644
index 
7d1375f38c44d7bd54c022fa3d390f666a35d6ee..0000000000000000000000000000000000000000
--- a/arch/arm/dts/qrb4210-rb2-u-boot.dtsi
+++ /dev/null
@@ -1,6 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-
-/* This is usually OTG but U-Boot doesn't support that properly */
-&usb_dwc3 {
-       dr_mode = "host";
-};
diff --git a/arch/arm/mach-snapdragon/of_fixup.c 
b/arch/arm/mach-snapdragon/of_fixup.c
index 
b39036e8e0890fdf834a0dfe6966ef3dd365f3d2..62b329e2c90d7e0a374838968ab5707333edbf03
 100644
--- a/arch/arm/mach-snapdragon/of_fixup.c
+++ b/arch/arm/mach-snapdragon/of_fixup.c
@@ -98,8 +98,21 @@ static int fixup_qcom_dwc3(struct device_node *glue_np)
                log_err("Failed to set 'maximum-speed' property: %d\n", ret);
                return ret;
        }
+ /*
+        * The RB1/2 boards only have a single USB controller and it's muxed 
between the type-C port
+        * and a USB hub. Since we can't do OTG in U-Boot properly we prefer to 
put it into host mode.
+        */
+       if (of_device_is_compatible(gd->of_root, "qcom,qrb4210-rb2", NULL, 
NULL) ||
+           of_device_is_compatible(gd->of_root, "qcom,qrb2210-rb1", NULL, 
NULL)) {
+               ret = of_write_prop(dwc3, "dr_mode", sizeof("host"), "host");
+               if (ret) {
+                       log_err("Failed to set 'dr_mode' property: %d\n", ret);
+                       return ret;
+               }
+       }
+
        return 0;
  }
static void fixup_usb_nodes(void)
@@ -162,21 +175,8 @@ static int qcom_of_fixup_nodes(void)
  }
EVENT_SPY_SIMPLE(EVT_OF_LIVE_INIT, qcom_of_fixup_nodes); -int ft_board_setup(void *blob, struct bd_info __maybe_unused *bd)
+int ft_board_setup(void __maybe_unused *blob, struct bd_info __maybe_unused 
*bd)
  {
-       struct fdt_header *fdt = blob;
-       int node;
-
-       /* On RB1/2 we need to fix-up the dr_mode */
-       if (!fdt_node_check_compatible(fdt, 0, "qcom,qrb4210-rb2") ||
-           !fdt_node_check_compatible(fdt, 0, "qcom,qrb2210-rb1")) {
-               fdt_for_each_node_by_compatible(node, blob, 0, "snps,dwc3") {
-                       log_debug("%s: Setting 'dr_mode' to OTG\n", 
fdt_get_name(blob, node, NULL));
-                       fdt_setprop_string(fdt, node, "dr_mode", "otg");
-                       break;
-               }
-       }
-
        return 0;
  }


Reviewed-by: Neil Armstrong <neil.armstr...@linaro.org>

Reply via email to