usb: gadget: udc-core: introduce usb_add_gadget_udc_release()
not all UDC drivers need a proper release function, for those which don't need it, we udc-core will provide a no-op release method so we can remove "redefinition" of such methods in almost every UDC driver. Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
@@ -166,15 +166,23 @@ static void usb_udc_release(struct device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct attribute_group *usb_udc_attr_groups[];
|
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
|
* 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
|
* @parent: the parent device to this udc. Usually the controller driver's
|
||||||
* driver's device.
|
* device.
|
||||||
* @gadget: the gadget to be added to the list
|
* @gadget: the gadget to be added to the list.
|
||||||
|
* @release: a gadget release function.
|
||||||
*
|
*
|
||||||
* Returns zero on success, negative errno otherwise.
|
* 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;
|
struct usb_udc *udc;
|
||||||
int ret = -ENOMEM;
|
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_parms = parent->dma_parms;
|
||||||
gadget->dev.dma_mask = parent->dma_mask;
|
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);
|
ret = device_register(&gadget->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err2;
|
goto err2;
|
||||||
@@ -231,6 +246,20 @@ err2:
|
|||||||
err1:
|
err1:
|
||||||
return ret;
|
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);
|
EXPORT_SYMBOL_GPL(usb_add_gadget_udc);
|
||||||
|
|
||||||
static void usb_gadget_remove_driver(struct usb_udc *udc)
|
static void usb_gadget_remove_driver(struct usb_udc *udc)
|
||||||
|
@@ -874,6 +874,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver);
|
|||||||
*/
|
*/
|
||||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver);
|
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver);
|
||||||
|
|
||||||
|
extern int usb_add_gadget_udc_release(struct device *parent,
|
||||||
|
struct usb_gadget *gadget, void (*release)(struct device *dev));
|
||||||
extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget);
|
extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget);
|
||||||
extern void usb_del_gadget_udc(struct usb_gadget *gadget);
|
extern void usb_del_gadget_udc(struct usb_gadget *gadget);
|
||||||
extern int udc_attach_driver(const char *name,
|
extern int udc_attach_driver(const char *name,
|
||||||
|
Reference in New Issue
Block a user