diff options
Diffstat (limited to 'drivers/usb/gadget/composite.c')
| -rw-r--r-- | drivers/usb/gadget/composite.c | 60 | 
1 files changed, 40 insertions, 20 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 09289bb1e20..391d169f8d0 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -36,7 +36,7 @@   */  /* big enough to hold our biggest descriptor */ -#define USB_BUFSIZ	512 +#define USB_BUFSIZ	1024  static struct usb_composite_driver *composite; @@ -85,7 +85,7 @@ MODULE_PARM_DESC(iSerialNumber, "SerialNumber string");   * This function returns the value of the function's bind(), which is   * zero for success else a negative errno value.   */ -int __init usb_add_function(struct usb_configuration *config, +int usb_add_function(struct usb_configuration *config,  		struct usb_function *function)  {  	int	value = -EINVAL; @@ -215,7 +215,7 @@ int usb_function_activate(struct usb_function *function)   * Returns the interface ID which was allocated; or -ENODEV if no   * more interface IDs can be allocated.   */ -int __init usb_interface_id(struct usb_configuration *config, +int usb_interface_id(struct usb_configuration *config,  		struct usb_function *function)  {  	unsigned id = config->next_interface_id; @@ -480,7 +480,7 @@ done:   * assigns global resources including string IDs, and per-configuration   * resources such as interface IDs and endpoints.   */ -int __init usb_add_config(struct usb_composite_dev *cdev, +int usb_add_config(struct usb_composite_dev *cdev,  		struct usb_configuration *config)  {  	int				status = -EINVAL; @@ -677,7 +677,7 @@ static int get_string(struct usb_composite_dev *cdev,   * ensure that for example different functions don't wrongly assign   * different meanings to the same identifier.   */ -int __init usb_string_id(struct usb_composite_dev *cdev) +int usb_string_id(struct usb_composite_dev *cdev)  {  	if (cdev->next_string_id < 254) {  		/* string id 0 is reserved */ @@ -898,7 +898,19 @@ static void composite_disconnect(struct usb_gadget *gadget)  /*-------------------------------------------------------------------------*/ -static void /* __init_or_exit */ +static ssize_t composite_show_suspended(struct device *dev, +					struct device_attribute *attr, +					char *buf) +{ +	struct usb_gadget *gadget = dev_to_usb_gadget(dev); +	struct usb_composite_dev *cdev = get_gadget_data(gadget); + +	return sprintf(buf, "%d\n", cdev->suspended); +} + +static DEVICE_ATTR(suspended, 0444, composite_show_suspended, NULL); + +static void  composite_unbind(struct usb_gadget *gadget)  {  	struct usb_composite_dev	*cdev = get_gadget_data(gadget); @@ -944,10 +956,11 @@ composite_unbind(struct usb_gadget *gadget)  	}  	kfree(cdev);  	set_gadget_data(gadget, NULL); +	device_remove_file(&gadget->dev, &dev_attr_suspended);  	composite = NULL;  } -static void __init +static void  string_override_one(struct usb_gadget_strings *tab, u8 id, const char *s)  {  	struct usb_string		*str = tab->strings; @@ -960,7 +973,7 @@ string_override_one(struct usb_gadget_strings *tab, u8 id, const char *s)  	}  } -static void __init +static void  string_override(struct usb_gadget_strings **tab, u8 id, const char *s)  {  	while (*tab) { @@ -969,7 +982,7 @@ string_override(struct usb_gadget_strings **tab, u8 id, const char *s)  	}  } -static int __init composite_bind(struct usb_gadget *gadget) +static int composite_bind(struct usb_gadget *gadget)  {  	struct usb_composite_dev	*cdev;  	int				status = -ENOMEM; @@ -1004,6 +1017,14 @@ static int __init composite_bind(struct usb_gadget *gadget)  	 */  	usb_ep_autoconfig_reset(cdev->gadget); +	/* standardized runtime overrides for device ID data */ +	if (idVendor) +		cdev->desc.idVendor = cpu_to_le16(idVendor); +	if (idProduct) +		cdev->desc.idProduct = cpu_to_le16(idProduct); +	if (bcdDevice) +		cdev->desc.bcdDevice = cpu_to_le16(bcdDevice); +  	/* composite gadget needs to assign strings for whole device (like  	 * serial number), register function drivers, potentially update  	 * power state and consumption, etc @@ -1015,14 +1036,6 @@ static int __init composite_bind(struct usb_gadget *gadget)  	cdev->desc = *composite->dev;  	cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket; -	/* standardized runtime overrides for device ID data */ -	if (idVendor) -		cdev->desc.idVendor = cpu_to_le16(idVendor); -	if (idProduct) -		cdev->desc.idProduct = cpu_to_le16(idProduct); -	if (bcdDevice) -		cdev->desc.bcdDevice = cpu_to_le16(bcdDevice); -  	/* strings can't be assigned before bind() allocates the  	 * releavnt identifiers  	 */ @@ -1036,6 +1049,10 @@ static int __init composite_bind(struct usb_gadget *gadget)  		string_override(composite->strings,  			cdev->desc.iSerialNumber, iSerialNumber); +	status = device_create_file(&gadget->dev, &dev_attr_suspended); +	if (status) +		goto fail; +  	INFO(cdev, "%s ready\n", composite->name);  	return 0; @@ -1064,6 +1081,8 @@ composite_suspend(struct usb_gadget *gadget)  	}  	if (composite->suspend)  		composite->suspend(cdev); + +	cdev->suspended = 1;  }  static void @@ -1084,6 +1103,8 @@ composite_resume(struct usb_gadget *gadget)  				f->resume(f);  		}  	} + +	cdev->suspended = 0;  }  /*-------------------------------------------------------------------------*/ @@ -1092,7 +1113,6 @@ static struct usb_gadget_driver composite_driver = {  	.speed		= USB_SPEED_HIGH,  	.bind		= composite_bind, -	/* .unbind		= __exit_p(composite_unbind), */  	.unbind		= composite_unbind,  	.setup		= composite_setup, @@ -1121,7 +1141,7 @@ static struct usb_gadget_driver composite_driver = {   * while it was binding.  That would usually be done in order to wait for   * some userspace participation.   */ -int __init usb_composite_register(struct usb_composite_driver *driver) +int usb_composite_register(struct usb_composite_driver *driver)  {  	if (!driver || !driver->dev || !driver->bind || composite)  		return -EINVAL; @@ -1142,7 +1162,7 @@ int __init usb_composite_register(struct usb_composite_driver *driver)   * This function is used to unregister drivers using the composite   * driver framework.   */ -void /* __exit */ usb_composite_unregister(struct usb_composite_driver *driver) +void usb_composite_unregister(struct usb_composite_driver *driver)  {  	if (composite != driver)  		return;  |