[PATCH v2] usb: cdns3: use VBUS Valid to determine role for dr_mode OTG

Marek Vasut marek.vasut at mailbox.org
Fri Feb 13 16:04:53 CET 2026


On 2/13/26 6:15 AM, Siddharth Vadapalli wrote:

[...]

> +++ b/drivers/usb/cdns3/core.c
> @@ -392,6 +392,63 @@ static const struct udevice_id cdns3_ids[] = {
>   	{ },
>   };
>   
> +/*
> + * The VBUS Valid Bit in the OTG Status register can be used to determine
> + * the role. When VBUS Valid is set, it indicates that a USB Host is supplying
> + * power, so the Controller should assume the PERIPHERAL role. If it isn't set,
> + * it indicates the absence of a USB Host, so the Controller should assume the
> + * HOST role. If the OTG Status register is inaccessible, return an error.
> + */
> +static int cdns3_get_otg_mode(ofnode node

Pass struct udevice *parent instead of node here ...

> , enum usb_dr_mode *mode)
> +{
> +	struct cdns3 cdns, *cdnsp;
> +	void __iomem *otg_regs;
> +	fdt_addr_t otg_addr;
> +	int otg_reg_index;
> +	int vbus;
> +
> +	otg_reg_index = ofnode_stringlist_search(node, "reg-names", "otg");
> +	if (otg_reg_index < 0) {
> +		printf("%s: dr_mode is otg but otg register name is missing\n", __func__);
> +		return -ENOENT;
> +	}
> +
> +	otg_addr = ofnode_get_addr_index(node, otg_reg_index);
> +	if (otg_addr == FDT_ADDR_T_NONE) {
> +		printf("%s: address of otg registers is unspecified\n", __func__);
> +		return -ENOENT;
> +	}
> +
> +	otg_regs = map_physmem(otg_addr, 0, MAP_NOCACHE);
> +	if (!otg_regs) {
> +		printf("%s: failed to map otg registers\n", __func__);
> +		return -EINVAL;
> +	}

... and replace all that ^ with devfdt_remap_addr_name(parent, "otg") . 
That should work.


More information about the U-Boot mailing list