diff options
Diffstat (limited to 'drivers/usb/dwc3/drd.c')
| -rw-r--r-- | drivers/usb/dwc3/drd.c | 34 | 
1 files changed, 28 insertions, 6 deletions
diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c index 1d8c557e97e0..218371f985ca 100644 --- a/drivers/usb/dwc3/drd.c +++ b/drivers/usb/dwc3/drd.c @@ -8,6 +8,7 @@   */  #include <linux/extcon.h> +#include <linux/of_graph.h>  #include <linux/platform_device.h>  #include "debug.h" @@ -439,17 +440,38 @@ static int dwc3_drd_notifier(struct notifier_block *nb,  	return NOTIFY_DONE;  } +static struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc) +{ +	struct device *dev = dwc->dev; +	struct device_node *np_phy, *np_conn; +	struct extcon_dev *edev; + +	if (of_property_read_bool(dev->of_node, "extcon")) +		return extcon_get_edev_by_phandle(dwc->dev, 0); + +	np_phy = of_parse_phandle(dev->of_node, "phys", 0); +	np_conn = of_graph_get_remote_node(np_phy, -1, -1); + +	if (np_conn) +		edev = extcon_find_edev_by_node(np_conn); +	else +		edev = NULL; + +	of_node_put(np_conn); +	of_node_put(np_phy); + +	return edev; +} +  int dwc3_drd_init(struct dwc3 *dwc)  {  	int ret, irq; -	if (dwc->dev->of_node && -	    of_property_read_bool(dwc->dev->of_node, "extcon")) { -		dwc->edev = extcon_get_edev_by_phandle(dwc->dev, 0); - -		if (IS_ERR(dwc->edev)) -			return PTR_ERR(dwc->edev); +	dwc->edev = dwc3_get_extcon(dwc); +	if (IS_ERR(dwc->edev)) +		return PTR_ERR(dwc->edev); +	if (dwc->edev) {  		dwc->edev_nb.notifier_call = dwc3_drd_notifier;  		ret = extcon_register_notifier(dwc->edev, EXTCON_USB_HOST,  					       &dwc->edev_nb);  | 
