usb: gadget: udc-core: allow udc class register gadget device
Currently all UDC drivers are calling device_register() before calling usb_add_gadget_udc(). In order to avoid code duplication, we can allow udc-core.c register that device. However that would become a really large patch, so to cope with the meanwhile and allow us to write bite-sized patches, we're adding a flag which will be set by UDC driver once it removes the code for registering the gadget device. Once all are converted, the new flag will be removed. Reviewed-by: Tomasz Figa <tomasz.figa@gmail.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
		
					parent
					
						
							
								7eaf8f2a7d
							
						
					
				
			
			
				commit
				
					
						f07bd56bbd
					
				
			
		
					 2 changed files with 23 additions and 4 deletions
				
			
		|  | @ -173,6 +173,14 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | |||
| 	if (!udc) | ||||
| 		goto err1; | ||||
| 
 | ||||
| 	if (gadget->register_my_device) { | ||||
| 		dev_set_name(&gadget->dev, "gadget"); | ||||
| 
 | ||||
| 		ret = device_register(&gadget->dev); | ||||
| 		if (ret) | ||||
| 			goto err2; | ||||
| 	} | ||||
| 
 | ||||
| 	device_initialize(&udc->dev); | ||||
| 	udc->dev.release = usb_udc_release; | ||||
| 	udc->dev.class = udc_class; | ||||
|  | @ -180,7 +188,7 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | |||
| 	udc->dev.parent = parent; | ||||
| 	ret = dev_set_name(&udc->dev, "%s", kobject_name(&parent->kobj)); | ||||
| 	if (ret) | ||||
| 		goto err2; | ||||
| 		goto err3; | ||||
| 
 | ||||
| 	udc->gadget = gadget; | ||||
| 
 | ||||
|  | @ -189,18 +197,22 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | |||
| 
 | ||||
| 	ret = device_add(&udc->dev); | ||||
| 	if (ret) | ||||
| 		goto err3; | ||||
| 		goto err4; | ||||
| 
 | ||||
| 	mutex_unlock(&udc_lock); | ||||
| 
 | ||||
| 	return 0; | ||||
| err3: | ||||
| 
 | ||||
| err4: | ||||
| 	list_del(&udc->list); | ||||
| 	mutex_unlock(&udc_lock); | ||||
| 
 | ||||
| err2: | ||||
| err3: | ||||
| 	put_device(&udc->dev); | ||||
| 
 | ||||
| err2: | ||||
| 	if (gadget->register_my_device) | ||||
| 		put_device(&gadget->dev); | ||||
| err1: | ||||
| 	return ret; | ||||
| } | ||||
|  | @ -254,6 +266,9 @@ found: | |||
| 
 | ||||
| 	kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE); | ||||
| 	device_unregister(&udc->dev); | ||||
| 
 | ||||
| 	if (gadget->register_my_device) | ||||
| 		device_unregister(&gadget->dev); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(usb_del_gadget_udc); | ||||
| 
 | ||||
|  |  | |||
|  | @ -494,6 +494,9 @@ struct usb_gadget_ops { | |||
|  *	only supports HNP on a different root port. | ||||
|  * @b_hnp_enable: OTG device feature flag, indicating that the A-Host | ||||
|  *	enabled HNP support. | ||||
|  * @register_my_device: Flag telling udc-core that UDC driver didn't | ||||
|  *	register the gadget device to the driver model. Temporary until | ||||
|  *	all UDC drivers are fixed up properly. | ||||
|  * @name: Identifies the controller hardware type.  Used in diagnostics | ||||
|  *	and sometimes configuration. | ||||
|  * @dev: Driver model state for this abstract device. | ||||
|  | @ -531,6 +534,7 @@ struct usb_gadget { | |||
| 	unsigned			b_hnp_enable:1; | ||||
| 	unsigned			a_hnp_support:1; | ||||
| 	unsigned			a_alt_hnp_support:1; | ||||
| 	unsigned			register_my_device:1; | ||||
| 	const char			*name; | ||||
| 	struct device			dev; | ||||
| 	unsigned			out_epnum; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Felipe Balbi
				Felipe Balbi