[U-Boot] DWC3 USB driver regression

Neil Armstrong narmstrong at baylibre.com
Wed Apr 25 08:37:57 UTC 2018


Hi,

On 25/04/2018 06:21, Masahiro Yamada wrote:
> Hi.
> 
> 
> I found DWC3 usb driver on UniPhier SoC family
> not working.
> 
> 
> I did git-bisect, and the first bad commit is
> 
> 
> 7c839ea70c4991e8d4c322e074359ac5e155d59d is the first bad commit
> commit 7c839ea70c4991e8d4c322e074359ac5e155d59d
> Author: Neil Armstrong <narmstrong at baylibre.com>
> Date:   Wed Apr 11 17:08:01 2018 +0200
> 
>     usb: host: dwc3: Add support for multiple PHYs
> 
>     DWC3 Ips can have more than 1 PHY for USB2 and 1 PHY for USB3, add support
>     for a generic number of PHYs and adapt the code to handle a generic
>     number of PHYs.
> 
>     Signed-off-by: Neil Armstrong <narmstrong at baylibre.com>
> 
> 
> 
> 
> If I revert this commit, I can get the USB on my board working.
> 
> Any insight about the cause of the problem?
> 
> 
> 

Can you test this ?

====><=============================

diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c
index c100735..4e6bf5a 100644
--- a/drivers/usb/host/xhci-dwc3.c
+++ b/drivers/usb/host/xhci-dwc3.c
@@ -113,11 +113,15 @@ void dwc3_set_fladj(struct dwc3 *dwc3_reg, u32 val)
 }

 #ifdef CONFIG_DM_USB
-static int xhci_dwc3_setup_phy(struct udevice *dev, int count)
+static int xhci_dwc3_setup_phy(struct udevice *dev)
 {
 	struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
-	int i, ret;
+	int i, ret, count;
+
+	if (!dev_read_prop(dev, "phys", NULL))
+		return 0;

+	count = dev_count_phandle_with_args(dev, "phys", "#phy-cells");
 	if (!count)
 		return 0;

@@ -136,7 +140,7 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count)

 		++plat->num_phys;
 	}
-	
+
 	for (i = 0; i < plat->num_phys; i++) {
 		ret = generic_phy_init(&plat->usb_phys[i]);
 		if (ret) {
@@ -145,7 +149,7 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count)
 			goto phys_init_err;
 		}
 	}
-	
+
 	for (i = 0; i < plat->num_phys; i++) {
 		ret = generic_phy_power_on(&plat->usb_phys[i]);
 		if (ret) {
@@ -206,8 +210,7 @@ static int xhci_dwc3_probe(struct udevice *dev)
 	hcor = (struct xhci_hcor *)((uintptr_t)hccr +
 			HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));

-	ret = xhci_dwc3_setup_phy(dev, dev_count_phandle_with_args(
-						dev, "phys", "#phy-cells"));
+	ret = xhci_dwc3_setup_phy(dev);
 	if (ret)
 		return ret;


More information about the U-Boot mailing list