On Wed, Apr 09, 2025 at 07:17:28PM +0200, 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 <[email protected]>
> ---
>  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;
>  }

We should now be able to drop OF_BOARD_SETUP from qcom_defconfig and
this API.

With that:

Reviewed-by: Sumit Garg <[email protected]>

-Sumit

Reply via email to