diff options
Diffstat (limited to 'drivers/usb/core/port.c')
| -rw-r--r-- | drivers/usb/core/port.c | 32 | 
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index dfcca9c876c7..c2bbf97a79be 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -9,6 +9,7 @@  #include <linux/slab.h>  #include <linux/pm_qos.h> +#include <linux/component.h>  #include "hub.h" @@ -528,6 +529,32 @@ static void find_and_link_peer(struct usb_hub *hub, int port1)  		link_peers_report(port_dev, peer);  } +static int connector_bind(struct device *dev, struct device *connector, void *data) +{ +	int ret; + +	ret = sysfs_create_link(&dev->kobj, &connector->kobj, "connector"); +	if (ret) +		return ret; + +	ret = sysfs_create_link(&connector->kobj, &dev->kobj, dev_name(dev)); +	if (ret) +		sysfs_remove_link(&dev->kobj, "connector"); + +	return ret; +} + +static void connector_unbind(struct device *dev, struct device *connector, void *data) +{ +	sysfs_remove_link(&connector->kobj, dev_name(dev)); +	sysfs_remove_link(&dev->kobj, "connector"); +} + +static const struct component_ops connector_ops = { +	.bind = connector_bind, +	.unbind = connector_unbind, +}; +  int usb_hub_create_port_device(struct usb_hub *hub, int port1)  {  	struct usb_port *port_dev; @@ -577,6 +604,10 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)  	find_and_link_peer(hub, port1); +	retval = component_add(&port_dev->dev, &connector_ops); +	if (retval) +		dev_warn(&port_dev->dev, "failed to add component\n"); +  	/*  	 * Enable runtime pm and hold a refernce that hub_configure()  	 * will drop once the PM_QOS_NO_POWER_OFF flag state has been set @@ -619,5 +650,6 @@ void usb_hub_remove_port_device(struct usb_hub *hub, int port1)  	peer = port_dev->peer;  	if (peer)  		unlink_peers(port_dev, peer); +	component_del(&port_dev->dev, &connector_ops);  	device_unregister(&port_dev->dev);  }  | 
