diff options
Diffstat (limited to 'drivers/usb/gadget/udc-core.c')
| -rw-r--r-- | drivers/usb/gadget/udc-core.c | 39 | 
1 files changed, 34 insertions, 5 deletions
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index 2423d024654..a50811e35bd 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c @@ -166,15 +166,23 @@ static void usb_udc_release(struct device *dev)  }  static const struct attribute_group *usb_udc_attr_groups[]; + +static void usb_udc_nop_release(struct device *dev) +{ +	dev_vdbg(dev, "%s\n", __func__); +} +  /** - * usb_add_gadget_udc - adds a new gadget to the udc class driver list - * @parent: the parent device to this udc. Usually the controller - * driver's device. - * @gadget: the gadget to be added to the list + * usb_add_gadget_udc_release - adds a new gadget to the udc class driver list + * @parent: the parent device to this udc. Usually the controller driver's + * device. + * @gadget: the gadget to be added to the list. + * @release: a gadget release function.   *   * Returns zero on success, negative errno otherwise.   */ -int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) +int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget, +		void (*release)(struct device *dev))  {  	struct usb_udc		*udc;  	int			ret = -ENOMEM; @@ -190,6 +198,13 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)  	gadget->dev.dma_parms = parent->dma_parms;  	gadget->dev.dma_mask = parent->dma_mask; +	if (release) { +		gadget->dev.release = release; +	} else { +		if (!gadget->dev.release) +			gadget->dev.release = usb_udc_nop_release; +	} +  	ret = device_register(&gadget->dev);  	if (ret)  		goto err2; @@ -231,6 +246,20 @@ err2:  err1:  	return ret;  } +EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release); + +/** + * usb_add_gadget_udc - adds a new gadget to the udc class driver list + * @parent: the parent device to this udc. Usually the controller + * driver's device. + * @gadget: the gadget to be added to the list + * + * Returns zero on success, negative errno otherwise. + */ +int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) +{ +	return usb_add_gadget_udc_release(parent, gadget, NULL); +}  EXPORT_SYMBOL_GPL(usb_add_gadget_udc);  static void usb_gadget_remove_driver(struct usb_udc *udc)  |