public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
@ 2026-03-12 13:32 Prasanth Babu Mantena
  2026-03-12 13:50 ` Tom Rini
  2026-04-04 18:25 ` Tom Rini
  0 siblings, 2 replies; 8+ messages in thread
From: Prasanth Babu Mantena @ 2026-03-12 13:32 UTC (permalink / raw)
  To: u-boot, trini, n-francis; +Cc: u-kumar1, vigneshr, s-vadapalli

While USB DFU boot works with this patch, but the non USB boot modes like
SD Boot and flash boot fails for J784S4 EVM device.

So, Reverting this patch.

This reverts commit bfb530e06ca6c19f66c079601e568c761a001993.

Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
---
 drivers/usb/cdns3/core.c | 53 ----------------------------------------
 drivers/usb/cdns3/drd.c  | 11 ---------
 2 files changed, 64 deletions(-)

diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
index 10bc4cabed4..4434dc15bec 100644
--- a/drivers/usb/cdns3/core.c
+++ b/drivers/usb/cdns3/core.c
@@ -392,52 +392,6 @@ 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(struct udevice *parent, enum usb_dr_mode *mode)
-{
-	/* Create a temporary child device for using devfdt_remap_addr_name() */
-	struct udevice child = {
-		.parent = parent,
-	};
-	struct cdns3 cdns, *cdnsp;
-	void __iomem *otg_regs;
-
-	dev_set_ofnode(&child, ofnode_first_subnode(dev_ofnode(parent)));
-	otg_regs = devfdt_remap_addr_name(&child, "otg");
-	if (!otg_regs) {
-		dev_err(parent, "failed to get otg registers for child node\n");
-		return -ENXIO;
-	}
-
-	/*
-	 * As mentioned in drivers/usb/cdns3/drd.c, there are two versions
-	 * of the Controller. The following logic detects the version of the
-	 * Controller and interprets the register layout accordingly.
-	 */
-	cdnsp = &cdns;
-	cdnsp->otg_v0_regs = otg_regs;
-	if (!readl(&cdnsp->otg_v0_regs->cmd)) {
-		cdnsp->otg_regs = otg_regs;
-	} else {
-		cdnsp->otg_v1_regs = otg_regs;
-		cdnsp->otg_regs = (void *)&cdnsp->otg_v1_regs->cmd;
-	}
-
-	/* Use VBUS Valid to determine role */
-	if (readl(&cdnsp->otg_regs->sts) & OTGSTS_VBUS_VALID)
-		*mode = USB_DR_MODE_PERIPHERAL;
-	else
-		*mode = USB_DR_MODE_HOST;
-
-	return 0;
-}
-
 int cdns3_bind(struct udevice *parent)
 {
 	enum usb_dr_mode dr_mode;
@@ -459,13 +413,6 @@ int cdns3_bind(struct udevice *parent)
 	if (dr_mode == USB_DR_MODE_UNKNOWN)
 		dr_mode = usb_get_dr_mode(dev_ofnode(parent));
 
-	/* Use VBUS Valid to determine role */
-	if (dr_mode == USB_DR_MODE_OTG) {
-		ret = cdns3_get_otg_mode(parent, &dr_mode);
-		if (ret < 0)
-			return ret;
-	}
-
 	switch (dr_mode) {
 #if defined(CONFIG_SPL_USB_HOST) || \
 	(!defined(CONFIG_XPL_BUILD) && defined(CONFIG_USB_HOST))
diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
index 0ca40a5cc8d..cbb13342343 100644
--- a/drivers/usb/cdns3/drd.c
+++ b/drivers/usb/cdns3/drd.c
@@ -301,17 +301,6 @@ int cdns3_drd_init(struct cdns3 *cdns)
 		cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
 	}
 
-	/*
-	 * In the absence of STRAP configuration, use VBUS Valid to
-	 * determine the appropriate role to be assigned to dr_mode.
-	 */
-	if (cdns->dr_mode == USB_DR_MODE_OTG) {
-		if (cdns3_get_vbus(cdns))
-			cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
-		else
-			cdns->dr_mode = USB_DR_MODE_HOST;
-	}
-
 	state = readl(&cdns->otg_regs->sts);
 	if (OTGSTS_OTG_NRDY(state) != 0) {
 		dev_err(cdns->dev, "Cadence USB3 OTG device not ready\n");
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
  2026-03-12 13:32 [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG" Prasanth Babu Mantena
@ 2026-03-12 13:50 ` Tom Rini
  2026-03-12 15:01   ` Marek Vasut
  2026-04-04 18:25 ` Tom Rini
  1 sibling, 1 reply; 8+ messages in thread
From: Tom Rini @ 2026-03-12 13:50 UTC (permalink / raw)
  To: Prasanth Babu Mantena, Marek Vasut
  Cc: u-boot, n-francis, u-kumar1, vigneshr, s-vadapalli

[-- Attachment #1: Type: text/plain, Size: 3967 bytes --]

On Thu, Mar 12, 2026 at 07:02:47PM +0530, Prasanth Babu Mantena wrote:

> While USB DFU boot works with this patch, but the non USB boot modes like
> SD Boot and flash boot fails for J784S4 EVM device.
> 
> So, Reverting this patch.
> 
> This reverts commit bfb530e06ca6c19f66c079601e568c761a001993.
> 
> Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
> ---
>  drivers/usb/cdns3/core.c | 53 ----------------------------------------
>  drivers/usb/cdns3/drd.c  | 11 ---------
>  2 files changed, 64 deletions(-)
> 
> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
> index 10bc4cabed4..4434dc15bec 100644
> --- a/drivers/usb/cdns3/core.c
> +++ b/drivers/usb/cdns3/core.c
> @@ -392,52 +392,6 @@ 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(struct udevice *parent, enum usb_dr_mode *mode)
> -{
> -	/* Create a temporary child device for using devfdt_remap_addr_name() */
> -	struct udevice child = {
> -		.parent = parent,
> -	};
> -	struct cdns3 cdns, *cdnsp;
> -	void __iomem *otg_regs;
> -
> -	dev_set_ofnode(&child, ofnode_first_subnode(dev_ofnode(parent)));
> -	otg_regs = devfdt_remap_addr_name(&child, "otg");
> -	if (!otg_regs) {
> -		dev_err(parent, "failed to get otg registers for child node\n");
> -		return -ENXIO;
> -	}
> -
> -	/*
> -	 * As mentioned in drivers/usb/cdns3/drd.c, there are two versions
> -	 * of the Controller. The following logic detects the version of the
> -	 * Controller and interprets the register layout accordingly.
> -	 */
> -	cdnsp = &cdns;
> -	cdnsp->otg_v0_regs = otg_regs;
> -	if (!readl(&cdnsp->otg_v0_regs->cmd)) {
> -		cdnsp->otg_regs = otg_regs;
> -	} else {
> -		cdnsp->otg_v1_regs = otg_regs;
> -		cdnsp->otg_regs = (void *)&cdnsp->otg_v1_regs->cmd;
> -	}
> -
> -	/* Use VBUS Valid to determine role */
> -	if (readl(&cdnsp->otg_regs->sts) & OTGSTS_VBUS_VALID)
> -		*mode = USB_DR_MODE_PERIPHERAL;
> -	else
> -		*mode = USB_DR_MODE_HOST;
> -
> -	return 0;
> -}
> -
>  int cdns3_bind(struct udevice *parent)
>  {
>  	enum usb_dr_mode dr_mode;
> @@ -459,13 +413,6 @@ int cdns3_bind(struct udevice *parent)
>  	if (dr_mode == USB_DR_MODE_UNKNOWN)
>  		dr_mode = usb_get_dr_mode(dev_ofnode(parent));
>  
> -	/* Use VBUS Valid to determine role */
> -	if (dr_mode == USB_DR_MODE_OTG) {
> -		ret = cdns3_get_otg_mode(parent, &dr_mode);
> -		if (ret < 0)
> -			return ret;
> -	}
> -
>  	switch (dr_mode) {
>  #if defined(CONFIG_SPL_USB_HOST) || \
>  	(!defined(CONFIG_XPL_BUILD) && defined(CONFIG_USB_HOST))
> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
> index 0ca40a5cc8d..cbb13342343 100644
> --- a/drivers/usb/cdns3/drd.c
> +++ b/drivers/usb/cdns3/drd.c
> @@ -301,17 +301,6 @@ int cdns3_drd_init(struct cdns3 *cdns)
>  		cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>  	}
>  
> -	/*
> -	 * In the absence of STRAP configuration, use VBUS Valid to
> -	 * determine the appropriate role to be assigned to dr_mode.
> -	 */
> -	if (cdns->dr_mode == USB_DR_MODE_OTG) {
> -		if (cdns3_get_vbus(cdns))
> -			cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
> -		else
> -			cdns->dr_mode = USB_DR_MODE_HOST;
> -	}
> -
>  	state = readl(&cdns->otg_regs->sts);
>  	if (OTGSTS_OTG_NRDY(state) != 0) {
>  		dev_err(cdns->dev, "Cadence USB3 OTG device not ready\n");

Adding in the USB custodian as this revert is intended for master and
v2026.04 I assume as the commit being reverted is also in master.
Thanks.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
  2026-03-12 13:50 ` Tom Rini
@ 2026-03-12 15:01   ` Marek Vasut
  2026-03-13  3:59     ` Siddharth Vadapalli
  0 siblings, 1 reply; 8+ messages in thread
From: Marek Vasut @ 2026-03-12 15:01 UTC (permalink / raw)
  To: Tom Rini, Prasanth Babu Mantena, Marek Vasut
  Cc: u-boot, n-francis, u-kumar1, vigneshr, s-vadapalli

On 3/12/26 2:50 PM, Tom Rini wrote:
> On Thu, Mar 12, 2026 at 07:02:47PM +0530, Prasanth Babu Mantena wrote:
> 
>> While USB DFU boot works with this patch, but the non USB boot modes like
>> SD Boot and flash boot fails for J784S4 EVM device.
>>
>> So, Reverting this patch.
>>
>> This reverts commit bfb530e06ca6c19f66c079601e568c761a001993.
>>
>> Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
>> ---
>>   drivers/usb/cdns3/core.c | 53 ----------------------------------------
>>   drivers/usb/cdns3/drd.c  | 11 ---------
>>   2 files changed, 64 deletions(-)
>>
>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
>> index 10bc4cabed4..4434dc15bec 100644
>> --- a/drivers/usb/cdns3/core.c
>> +++ b/drivers/usb/cdns3/core.c
>> @@ -392,52 +392,6 @@ 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(struct udevice *parent, enum usb_dr_mode *mode)
>> -{
>> -	/* Create a temporary child device for using devfdt_remap_addr_name() */
>> -	struct udevice child = {
>> -		.parent = parent,
>> -	};
>> -	struct cdns3 cdns, *cdnsp;
>> -	void __iomem *otg_regs;
>> -
>> -	dev_set_ofnode(&child, ofnode_first_subnode(dev_ofnode(parent)));
>> -	otg_regs = devfdt_remap_addr_name(&child, "otg");
>> -	if (!otg_regs) {
>> -		dev_err(parent, "failed to get otg registers for child node\n");
>> -		return -ENXIO;
>> -	}
>> -
>> -	/*
>> -	 * As mentioned in drivers/usb/cdns3/drd.c, there are two versions
>> -	 * of the Controller. The following logic detects the version of the
>> -	 * Controller and interprets the register layout accordingly.
>> -	 */
>> -	cdnsp = &cdns;
>> -	cdnsp->otg_v0_regs = otg_regs;
>> -	if (!readl(&cdnsp->otg_v0_regs->cmd)) {
>> -		cdnsp->otg_regs = otg_regs;
>> -	} else {
>> -		cdnsp->otg_v1_regs = otg_regs;
>> -		cdnsp->otg_regs = (void *)&cdnsp->otg_v1_regs->cmd;
>> -	}
>> -
>> -	/* Use VBUS Valid to determine role */
>> -	if (readl(&cdnsp->otg_regs->sts) & OTGSTS_VBUS_VALID)
>> -		*mode = USB_DR_MODE_PERIPHERAL;
>> -	else
>> -		*mode = USB_DR_MODE_HOST;
>> -
>> -	return 0;
>> -}
>> -
>>   int cdns3_bind(struct udevice *parent)
>>   {
>>   	enum usb_dr_mode dr_mode;
>> @@ -459,13 +413,6 @@ int cdns3_bind(struct udevice *parent)
>>   	if (dr_mode == USB_DR_MODE_UNKNOWN)
>>   		dr_mode = usb_get_dr_mode(dev_ofnode(parent));
>>   
>> -	/* Use VBUS Valid to determine role */
>> -	if (dr_mode == USB_DR_MODE_OTG) {
>> -		ret = cdns3_get_otg_mode(parent, &dr_mode);
>> -		if (ret < 0)
>> -			return ret;
>> -	}
>> -
>>   	switch (dr_mode) {
>>   #if defined(CONFIG_SPL_USB_HOST) || \
>>   	(!defined(CONFIG_XPL_BUILD) && defined(CONFIG_USB_HOST))
>> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
>> index 0ca40a5cc8d..cbb13342343 100644
>> --- a/drivers/usb/cdns3/drd.c
>> +++ b/drivers/usb/cdns3/drd.c
>> @@ -301,17 +301,6 @@ int cdns3_drd_init(struct cdns3 *cdns)
>>   		cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>>   	}
>>   
>> -	/*
>> -	 * In the absence of STRAP configuration, use VBUS Valid to
>> -	 * determine the appropriate role to be assigned to dr_mode.
>> -	 */
>> -	if (cdns->dr_mode == USB_DR_MODE_OTG) {
>> -		if (cdns3_get_vbus(cdns))
>> -			cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>> -		else
>> -			cdns->dr_mode = USB_DR_MODE_HOST;
>> -	}
>> -
>>   	state = readl(&cdns->otg_regs->sts);
>>   	if (OTGSTS_OTG_NRDY(state) != 0) {
>>   		dev_err(cdns->dev, "Cadence USB3 OTG device not ready\n");
> 
> Adding in the USB custodian as this revert is intended for master and
> v2026.04 I assume as the commit being reverted is also in master.
> Thanks.
This may be related to

[PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and probe 
parent

?

Can you coordinate with Siddharth Vadapalli ?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
  2026-03-12 15:01   ` Marek Vasut
@ 2026-03-13  3:59     ` Siddharth Vadapalli
  2026-04-02 11:03       ` Siddharth Vadapalli
  2026-04-03 22:38       ` Marek Vasut
  0 siblings, 2 replies; 8+ messages in thread
From: Siddharth Vadapalli @ 2026-03-13  3:59 UTC (permalink / raw)
  To: Marek Vasut, Marek Vasut
  Cc: Tom Rini, Prasanth Babu Mantena, u-boot, n-francis, u-kumar1,
	vigneshr, s-vadapalli

On 12/03/26 20:31, Marek Vasut wrote:
> On 3/12/26 2:50 PM, Tom Rini wrote:
>> On Thu, Mar 12, 2026 at 07:02:47PM +0530, Prasanth Babu Mantena wrote:
>>
>>> While USB DFU boot works with this patch, but the non USB boot modes like
>>> SD Boot and flash boot fails for J784S4 EVM device.
>>>
>>> So, Reverting this patch.
>>>
>>> This reverts commit bfb530e06ca6c19f66c079601e568c761a001993.
>>>
>>> Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
>>> ---
>>>   drivers/usb/cdns3/core.c | 53 ----------------------------------------
>>>   drivers/usb/cdns3/drd.c  | 11 ---------
>>>   2 files changed, 64 deletions(-)
>>>
>>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
>>> index 10bc4cabed4..4434dc15bec 100644
>>> --- a/drivers/usb/cdns3/core.c
>>> +++ b/drivers/usb/cdns3/core.c
>>> @@ -392,52 +392,6 @@ 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(struct udevice *parent, enum usb_dr_mode 
>>> *mode)
>>> -{
>>> -    /* Create a temporary child device for using 
>>> devfdt_remap_addr_name() */
>>> -    struct udevice child = {
>>> -        .parent = parent,
>>> -    };
>>> -    struct cdns3 cdns, *cdnsp;
>>> -    void __iomem *otg_regs;
>>> -
>>> -    dev_set_ofnode(&child, ofnode_first_subnode(dev_ofnode(parent)));
>>> -    otg_regs = devfdt_remap_addr_name(&child, "otg");
>>> -    if (!otg_regs) {
>>> -        dev_err(parent, "failed to get otg registers for child node\n");
>>> -        return -ENXIO;
>>> -    }
>>> -
>>> -    /*
>>> -     * As mentioned in drivers/usb/cdns3/drd.c, there are two versions
>>> -     * of the Controller. The following logic detects the version of the
>>> -     * Controller and interprets the register layout accordingly.
>>> -     */
>>> -    cdnsp = &cdns;
>>> -    cdnsp->otg_v0_regs = otg_regs;
>>> -    if (!readl(&cdnsp->otg_v0_regs->cmd)) {
>>> -        cdnsp->otg_regs = otg_regs;
>>> -    } else {
>>> -        cdnsp->otg_v1_regs = otg_regs;
>>> -        cdnsp->otg_regs = (void *)&cdnsp->otg_v1_regs->cmd;
>>> -    }
>>> -
>>> -    /* Use VBUS Valid to determine role */
>>> -    if (readl(&cdnsp->otg_regs->sts) & OTGSTS_VBUS_VALID)
>>> -        *mode = USB_DR_MODE_PERIPHERAL;
>>> -    else
>>> -        *mode = USB_DR_MODE_HOST;
>>> -
>>> -    return 0;
>>> -}
>>> -
>>>   int cdns3_bind(struct udevice *parent)
>>>   {
>>>       enum usb_dr_mode dr_mode;
>>> @@ -459,13 +413,6 @@ int cdns3_bind(struct udevice *parent)
>>>       if (dr_mode == USB_DR_MODE_UNKNOWN)
>>>           dr_mode = usb_get_dr_mode(dev_ofnode(parent));
>>> -    /* Use VBUS Valid to determine role */
>>> -    if (dr_mode == USB_DR_MODE_OTG) {
>>> -        ret = cdns3_get_otg_mode(parent, &dr_mode);
>>> -        if (ret < 0)
>>> -            return ret;
>>> -    }
>>> -
>>>       switch (dr_mode) {
>>>   #if defined(CONFIG_SPL_USB_HOST) || \
>>>       (!defined(CONFIG_XPL_BUILD) && defined(CONFIG_USB_HOST))
>>> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
>>> index 0ca40a5cc8d..cbb13342343 100644
>>> --- a/drivers/usb/cdns3/drd.c
>>> +++ b/drivers/usb/cdns3/drd.c
>>> @@ -301,17 +301,6 @@ int cdns3_drd_init(struct cdns3 *cdns)
>>>           cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>>>       }
>>> -    /*
>>> -     * In the absence of STRAP configuration, use VBUS Valid to
>>> -     * determine the appropriate role to be assigned to dr_mode.
>>> -     */
>>> -    if (cdns->dr_mode == USB_DR_MODE_OTG) {
>>> -        if (cdns3_get_vbus(cdns))
>>> -            cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>>> -        else
>>> -            cdns->dr_mode = USB_DR_MODE_HOST;
>>> -    }
>>> -
>>>       state = readl(&cdns->otg_regs->sts);
>>>       if (OTGSTS_OTG_NRDY(state) != 0) {
>>>           dev_err(cdns->dev, "Cadence USB3 OTG device not ready\n");
>>
>> Adding in the USB custodian as this revert is intended for master and
>> v2026.04 I assume as the commit being reverted is also in master.
>> Thanks.
> This may be related to
> 
> [PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and probe parent
> 
> ?
> 
> Can you coordinate with Siddharth Vadapalli ?
Please refer to my response at:
https://lore.kernel.org/r/17a341aa-4711-4389-8ea1-a8169616baeb@ti.com/
on the patch quoted above
([PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and probe 
parent)

A common .probe as a stub will not work and probing the parent in 
cdns3_bind() doesn't seem to be acceptable. So reverting the commit appears 
to be the only option at the moment to fix non-USB Boot Modes.

Regards,
Siddharth.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
  2026-03-13  3:59     ` Siddharth Vadapalli
@ 2026-04-02 11:03       ` Siddharth Vadapalli
  2026-04-03 22:39         ` Marek Vasut
  2026-04-03 22:38       ` Marek Vasut
  1 sibling, 1 reply; 8+ messages in thread
From: Siddharth Vadapalli @ 2026-04-02 11:03 UTC (permalink / raw)
  To: Marek Vasut, Marek Vasut
  Cc: Tom Rini, Prasanth Babu Mantena, u-boot, n-francis, u-kumar1,
	vigneshr, s-vadapalli

Hello Marek,

On 13/03/26 09:29, Siddharth Vadapalli wrote:
> On 12/03/26 20:31, Marek Vasut wrote:
>> On 3/12/26 2:50 PM, Tom Rini wrote:
>>> On Thu, Mar 12, 2026 at 07:02:47PM +0530, Prasanth Babu Mantena wrote:
>>>
>>>> While USB DFU boot works with this patch, but the non USB boot modes like
>>>> SD Boot and flash boot fails for J784S4 EVM device.
>>>>
>>>> So, Reverting this patch.
>>>>
>>>> This reverts commit bfb530e06ca6c19f66c079601e568c761a001993.
>>>>
>>>> Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
>>>> ---
>>>>   drivers/usb/cdns3/core.c | 53 ----------------------------------------
>>>>   drivers/usb/cdns3/drd.c  | 11 ---------
>>>>   2 files changed, 64 deletions(-)
>>>>
>>>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
>>>> index 10bc4cabed4..4434dc15bec 100644
>>>> --- a/drivers/usb/cdns3/core.c
>>>> +++ b/drivers/usb/cdns3/core.c
>>>> @@ -392,52 +392,6 @@ 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(struct udevice *parent, enum usb_dr_mode 
>>>> *mode)
>>>> -{
>>>> -    /* Create a temporary child device for using 
>>>> devfdt_remap_addr_name() */
>>>> -    struct udevice child = {
>>>> -        .parent = parent,
>>>> -    };
>>>> -    struct cdns3 cdns, *cdnsp;
>>>> -    void __iomem *otg_regs;
>>>> -
>>>> -    dev_set_ofnode(&child, ofnode_first_subnode(dev_ofnode(parent)));
>>>> -    otg_regs = devfdt_remap_addr_name(&child, "otg");
>>>> -    if (!otg_regs) {
>>>> -        dev_err(parent, "failed to get otg registers for child node\n");
>>>> -        return -ENXIO;
>>>> -    }
>>>> -
>>>> -    /*
>>>> -     * As mentioned in drivers/usb/cdns3/drd.c, there are two versions
>>>> -     * of the Controller. The following logic detects the version of the
>>>> -     * Controller and interprets the register layout accordingly.
>>>> -     */
>>>> -    cdnsp = &cdns;
>>>> -    cdnsp->otg_v0_regs = otg_regs;
>>>> -    if (!readl(&cdnsp->otg_v0_regs->cmd)) {
>>>> -        cdnsp->otg_regs = otg_regs;
>>>> -    } else {
>>>> -        cdnsp->otg_v1_regs = otg_regs;
>>>> -        cdnsp->otg_regs = (void *)&cdnsp->otg_v1_regs->cmd;
>>>> -    }
>>>> -
>>>> -    /* Use VBUS Valid to determine role */
>>>> -    if (readl(&cdnsp->otg_regs->sts) & OTGSTS_VBUS_VALID)
>>>> -        *mode = USB_DR_MODE_PERIPHERAL;
>>>> -    else
>>>> -        *mode = USB_DR_MODE_HOST;
>>>> -
>>>> -    return 0;
>>>> -}
>>>> -
>>>>   int cdns3_bind(struct udevice *parent)
>>>>   {
>>>>       enum usb_dr_mode dr_mode;
>>>> @@ -459,13 +413,6 @@ int cdns3_bind(struct udevice *parent)
>>>>       if (dr_mode == USB_DR_MODE_UNKNOWN)
>>>>           dr_mode = usb_get_dr_mode(dev_ofnode(parent));
>>>> -    /* Use VBUS Valid to determine role */
>>>> -    if (dr_mode == USB_DR_MODE_OTG) {
>>>> -        ret = cdns3_get_otg_mode(parent, &dr_mode);
>>>> -        if (ret < 0)
>>>> -            return ret;
>>>> -    }
>>>> -
>>>>       switch (dr_mode) {
>>>>   #if defined(CONFIG_SPL_USB_HOST) || \
>>>>       (!defined(CONFIG_XPL_BUILD) && defined(CONFIG_USB_HOST))
>>>> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
>>>> index 0ca40a5cc8d..cbb13342343 100644
>>>> --- a/drivers/usb/cdns3/drd.c
>>>> +++ b/drivers/usb/cdns3/drd.c
>>>> @@ -301,17 +301,6 @@ int cdns3_drd_init(struct cdns3 *cdns)
>>>>           cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>>>>       }
>>>> -    /*
>>>> -     * In the absence of STRAP configuration, use VBUS Valid to
>>>> -     * determine the appropriate role to be assigned to dr_mode.
>>>> -     */
>>>> -    if (cdns->dr_mode == USB_DR_MODE_OTG) {
>>>> -        if (cdns3_get_vbus(cdns))
>>>> -            cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>>>> -        else
>>>> -            cdns->dr_mode = USB_DR_MODE_HOST;
>>>> -    }
>>>> -
>>>>       state = readl(&cdns->otg_regs->sts);
>>>>       if (OTGSTS_OTG_NRDY(state) != 0) {
>>>>           dev_err(cdns->dev, "Cadence USB3 OTG device not ready\n");
>>>
>>> Adding in the USB custodian as this revert is intended for master and
>>> v2026.04 I assume as the commit being reverted is also in master.
>>> Thanks.
>> This may be related to
>>
>> [PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and probe 
>> parent
>>
>> ?
>>
>> Can you coordinate with Siddharth Vadapalli ?
> Please refer to my response at:
> https://lore.kernel.org/r/17a341aa-4711-4389-8ea1-a8169616baeb@ti.com/
> on the patch quoted above
> ([PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and probe 
> parent)
> 
> A common .probe as a stub will not work and probing the parent in 
> cdns3_bind() doesn't seem to be acceptable. So reverting the commit appears 
> to be the only option at the moment to fix non-USB Boot Modes.
Please note that this revert patch is required to fix non-USB Boot Mode. If 
you have a suggestion for an alternative, please let me know.

Regards,
Siddharth.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
  2026-03-13  3:59     ` Siddharth Vadapalli
  2026-04-02 11:03       ` Siddharth Vadapalli
@ 2026-04-03 22:38       ` Marek Vasut
  1 sibling, 0 replies; 8+ messages in thread
From: Marek Vasut @ 2026-04-03 22:38 UTC (permalink / raw)
  To: Siddharth Vadapalli
  Cc: Tom Rini, Prasanth Babu Mantena, u-boot, n-francis, u-kumar1,
	vigneshr

On 3/13/26 4:59 AM, Siddharth Vadapalli wrote:
> On 12/03/26 20:31, Marek Vasut wrote:
>> On 3/12/26 2:50 PM, Tom Rini wrote:
>>> On Thu, Mar 12, 2026 at 07:02:47PM +0530, Prasanth Babu Mantena wrote:
>>>
>>>> While USB DFU boot works with this patch, but the non USB boot modes 
>>>> like
>>>> SD Boot and flash boot fails for J784S4 EVM device.
>>>>
>>>> So, Reverting this patch.
>>>>
>>>> This reverts commit bfb530e06ca6c19f66c079601e568c761a001993.
>>>>
>>>> Signed-off-by: Prasanth Babu Mantena <p-mantena@ti.com>
>>>> ---
>>>>   drivers/usb/cdns3/core.c | 53 
>>>> ----------------------------------------
>>>>   drivers/usb/cdns3/drd.c  | 11 ---------
>>>>   2 files changed, 64 deletions(-)
>>>>
>>>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
>>>> index 10bc4cabed4..4434dc15bec 100644
>>>> --- a/drivers/usb/cdns3/core.c
>>>> +++ b/drivers/usb/cdns3/core.c
>>>> @@ -392,52 +392,6 @@ 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(struct udevice *parent, enum 
>>>> usb_dr_mode *mode)
>>>> -{
>>>> -    /* Create a temporary child device for using 
>>>> devfdt_remap_addr_name() */
>>>> -    struct udevice child = {
>>>> -        .parent = parent,
>>>> -    };
>>>> -    struct cdns3 cdns, *cdnsp;
>>>> -    void __iomem *otg_regs;
>>>> -
>>>> -    dev_set_ofnode(&child, ofnode_first_subnode(dev_ofnode(parent)));
>>>> -    otg_regs = devfdt_remap_addr_name(&child, "otg");
>>>> -    if (!otg_regs) {
>>>> -        dev_err(parent, "failed to get otg registers for child 
>>>> node\n");
>>>> -        return -ENXIO;
>>>> -    }
>>>> -
>>>> -    /*
>>>> -     * As mentioned in drivers/usb/cdns3/drd.c, there are two versions
>>>> -     * of the Controller. The following logic detects the version 
>>>> of the
>>>> -     * Controller and interprets the register layout accordingly.
>>>> -     */
>>>> -    cdnsp = &cdns;
>>>> -    cdnsp->otg_v0_regs = otg_regs;
>>>> -    if (!readl(&cdnsp->otg_v0_regs->cmd)) {
>>>> -        cdnsp->otg_regs = otg_regs;
>>>> -    } else {
>>>> -        cdnsp->otg_v1_regs = otg_regs;
>>>> -        cdnsp->otg_regs = (void *)&cdnsp->otg_v1_regs->cmd;
>>>> -    }
>>>> -
>>>> -    /* Use VBUS Valid to determine role */
>>>> -    if (readl(&cdnsp->otg_regs->sts) & OTGSTS_VBUS_VALID)
>>>> -        *mode = USB_DR_MODE_PERIPHERAL;
>>>> -    else
>>>> -        *mode = USB_DR_MODE_HOST;
>>>> -
>>>> -    return 0;
>>>> -}
>>>> -
>>>>   int cdns3_bind(struct udevice *parent)
>>>>   {
>>>>       enum usb_dr_mode dr_mode;
>>>> @@ -459,13 +413,6 @@ int cdns3_bind(struct udevice *parent)
>>>>       if (dr_mode == USB_DR_MODE_UNKNOWN)
>>>>           dr_mode = usb_get_dr_mode(dev_ofnode(parent));
>>>> -    /* Use VBUS Valid to determine role */
>>>> -    if (dr_mode == USB_DR_MODE_OTG) {
>>>> -        ret = cdns3_get_otg_mode(parent, &dr_mode);
>>>> -        if (ret < 0)
>>>> -            return ret;
>>>> -    }
>>>> -
>>>>       switch (dr_mode) {
>>>>   #if defined(CONFIG_SPL_USB_HOST) || \
>>>>       (!defined(CONFIG_XPL_BUILD) && defined(CONFIG_USB_HOST))
>>>> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
>>>> index 0ca40a5cc8d..cbb13342343 100644
>>>> --- a/drivers/usb/cdns3/drd.c
>>>> +++ b/drivers/usb/cdns3/drd.c
>>>> @@ -301,17 +301,6 @@ int cdns3_drd_init(struct cdns3 *cdns)
>>>>           cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>>>>       }
>>>> -    /*
>>>> -     * In the absence of STRAP configuration, use VBUS Valid to
>>>> -     * determine the appropriate role to be assigned to dr_mode.
>>>> -     */
>>>> -    if (cdns->dr_mode == USB_DR_MODE_OTG) {
>>>> -        if (cdns3_get_vbus(cdns))
>>>> -            cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
>>>> -        else
>>>> -            cdns->dr_mode = USB_DR_MODE_HOST;
>>>> -    }
>>>> -
>>>>       state = readl(&cdns->otg_regs->sts);
>>>>       if (OTGSTS_OTG_NRDY(state) != 0) {
>>>>           dev_err(cdns->dev, "Cadence USB3 OTG device not ready\n");
>>>
>>> Adding in the USB custodian as this revert is intended for master and
>>> v2026.04 I assume as the commit being reverted is also in master.
>>> Thanks.
>> This may be related to
>>
>> [PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and 
>> probe parent
>>
>> ?
>>
>> Can you coordinate with Siddharth Vadapalli ?
> Please refer to my response at:
> https://lore.kernel.org/r/17a341aa-4711-4389-8ea1-a8169616baeb@ti.com/
> on the patch quoted above
> ([PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and probe 
> parent)

I just replied to it (sorry, I am completely drowning in emails).

> A common .probe as a stub will not work and probing the parent in 
> cdns3_bind() doesn't seem to be acceptable. So reverting the commit 
> appears to be the only option at the moment to fix non-USB Boot Modes.
If this is a stop-gap measure for this release, to avoid breakage on TI 
platforms, sure, go with the revert.

But it would be nice if the bind in probe could be fixed properly at 
some point. I think it might be doable, see my reply to [PATCH] usb: 
cdns3: fix cdns3_bind() to avoid returning error and probe parent .

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
  2026-04-02 11:03       ` Siddharth Vadapalli
@ 2026-04-03 22:39         ` Marek Vasut
  0 siblings, 0 replies; 8+ messages in thread
From: Marek Vasut @ 2026-04-03 22:39 UTC (permalink / raw)
  To: Siddharth Vadapalli, Marek Vasut
  Cc: Tom Rini, Prasanth Babu Mantena, u-boot, n-francis, u-kumar1,
	vigneshr

On 4/2/26 1:03 PM, Siddharth Vadapalli wrote:

Hi,

>>>> Adding in the USB custodian as this revert is intended for master and
>>>> v2026.04 I assume as the commit being reverted is also in master.
>>>> Thanks.
>>> This may be related to
>>>
>>> [PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and 
>>> probe parent
>>>
>>> ?
>>>
>>> Can you coordinate with Siddharth Vadapalli ?
>> Please refer to my response at:
>> https://lore.kernel.org/r/17a341aa-4711-4389-8ea1-a8169616baeb@ti.com/
>> on the patch quoted above
>> ([PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and 
>> probe parent)
>>
>> A common .probe as a stub will not work and probing the parent in 
>> cdns3_bind() doesn't seem to be acceptable. So reverting the commit 
>> appears to be the only option at the moment to fix non-USB Boot Modes.
> Please note that this revert patch is required to fix non-USB Boot Mode. 
> If you have a suggestion for an alternative, please let me know.
I replied to [PATCH] usb: cdns3: fix cdns3_bind() to avoid returning 
error and probe parent now, we can continue there.

If this patch is a stop-gap measure to avoid breakage on TI platform for 
v2026.04 release, then let's pick it up.

And I'm sorry for my slow response, I am buried in email.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
  2026-03-12 13:32 [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG" Prasanth Babu Mantena
  2026-03-12 13:50 ` Tom Rini
@ 2026-04-04 18:25 ` Tom Rini
  1 sibling, 0 replies; 8+ messages in thread
From: Tom Rini @ 2026-04-04 18:25 UTC (permalink / raw)
  To: u-boot, n-francis, Prasanth Babu Mantena; +Cc: u-kumar1, vigneshr, s-vadapalli

On Thu, 12 Mar 2026 19:02:47 +0530, Prasanth Babu Mantena wrote:

> While USB DFU boot works with this patch, but the non USB boot modes like
> SD Boot and flash boot fails for J784S4 EVM device.
> 
> So, Reverting this patch.
> 
> This reverts commit bfb530e06ca6c19f66c079601e568c761a001993.
> 
> [...]

Applied to u-boot/master, thanks!

[1/1] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG"
      commit: 214aababe07de0598bd26ecb0c8fb2e2843ff7d5
-- 
Tom



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-04-04 18:25 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-12 13:32 [PATCH] Revert "usb: cdns3: use VBUS Valid to determine role for dr_mode OTG" Prasanth Babu Mantena
2026-03-12 13:50 ` Tom Rini
2026-03-12 15:01   ` Marek Vasut
2026-03-13  3:59     ` Siddharth Vadapalli
2026-04-02 11:03       ` Siddharth Vadapalli
2026-04-03 22:39         ` Marek Vasut
2026-04-03 22:38       ` Marek Vasut
2026-04-04 18:25 ` Tom Rini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox