|
@@ -1133,6 +1133,7 @@ static int check_pending_gadget_drivers(struct usb_udc *udc)
|
|
|
* @release: a gadget release function.
|
|
|
*
|
|
|
* Returns zero on success, negative errno otherwise.
|
|
|
+ * Calls the gadget release function in the latter case.
|
|
|
*/
|
|
|
int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
|
|
|
void (*release)(struct device *dev))
|
|
@@ -1140,10 +1141,6 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
|
|
|
struct usb_udc *udc;
|
|
|
int ret = -ENOMEM;
|
|
|
|
|
|
- udc = kzalloc(sizeof(*udc), GFP_KERNEL);
|
|
|
- if (!udc)
|
|
|
- goto err1;
|
|
|
-
|
|
|
dev_set_name(&gadget->dev, "gadget");
|
|
|
INIT_WORK(&gadget->work, usb_gadget_state_work);
|
|
|
gadget->dev.parent = parent;
|
|
@@ -1153,7 +1150,13 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
|
|
|
else
|
|
|
gadget->dev.release = usb_udc_nop_release;
|
|
|
|
|
|
- ret = device_register(&gadget->dev);
|
|
|
+ device_initialize(&gadget->dev);
|
|
|
+
|
|
|
+ udc = kzalloc(sizeof(*udc), GFP_KERNEL);
|
|
|
+ if (!udc)
|
|
|
+ goto err1;
|
|
|
+
|
|
|
+ ret = device_add(&gadget->dev);
|
|
|
if (ret)
|
|
|
goto err2;
|
|
|
|
|
@@ -1200,10 +1203,10 @@ err3:
|
|
|
device_del(&gadget->dev);
|
|
|
|
|
|
err2:
|
|
|
- put_device(&gadget->dev);
|
|
|
kfree(udc);
|
|
|
|
|
|
err1:
|
|
|
+ put_device(&gadget->dev);
|
|
|
return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release);
|