diff options
Diffstat (limited to 'drivers/usb/dwc3/dwc3-xilinx.c')
| -rw-r--r-- | drivers/usb/dwc3/dwc3-xilinx.c | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-xilinx.c index 9cc3ad701a29..e14ac15e24c3 100644 --- a/drivers/usb/dwc3/dwc3-xilinx.c +++ b/drivers/usb/dwc3/dwc3-xilinx.c @@ -102,14 +102,26 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)  	int			ret;  	u32			reg; -	usb3_phy = devm_phy_get(dev, "usb3-phy"); -	if (PTR_ERR(usb3_phy) == -EPROBE_DEFER) { -		ret = -EPROBE_DEFER; +	usb3_phy = devm_phy_optional_get(dev, "usb3-phy"); +	if (IS_ERR(usb3_phy)) { +		ret = PTR_ERR(usb3_phy); +		dev_err_probe(dev, ret, +			      "failed to get USB3 PHY\n");  		goto err; -	} else if (IS_ERR(usb3_phy)) { -		usb3_phy = NULL;  	} +	/* +	 * The following core resets are not required unless a USB3 PHY +	 * is used, and the subsequent register settings are not required +	 * unless a core reset is performed (they should be set properly +	 * by the first-stage boot loader, but may be reverted by a core +	 * reset). They may also break the configuration if USB3 is actually +	 * in use but the usb3-phy entry is missing from the device tree. +	 * Therefore, skip these operations in this case. +	 */ +	if (!usb3_phy) +		goto skip_usb3_phy; +  	crst = devm_reset_control_get_exclusive(dev, "usb_crst");  	if (IS_ERR(crst)) {  		ret = PTR_ERR(crst); @@ -188,6 +200,7 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)  		goto err;  	} +skip_usb3_phy:  	/*  	 * This routes the USB DMA traffic to go through FPD path instead  	 * of reaching DDR directly. This traffic routing is needed to  |