usb: gadget: s3c-hsudc: use udc_start and udc_stop functions
udc_start and udc_stop reduce code duplication in comparison to start and stop generalising calls done by all drivers (i.e. bind and unbind) and moving these calls to common code. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
		
					parent
					
						
							
								103495aaf0
							
						
					
				
			
			
				commit
				
					
						d93e2600d8
					
				
			
		
					 1 changed files with 14 additions and 30 deletions
				
			
		|  | @ -282,8 +282,7 @@ static void s3c_hsudc_nuke_ep(struct s3c_hsudc_ep *hsep, int status) | ||||||
|  * All the endpoints are stopped and any pending transfer requests if any on |  * All the endpoints are stopped and any pending transfer requests if any on | ||||||
|  * the endpoint are terminated. |  * the endpoint are terminated. | ||||||
|  */ |  */ | ||||||
| static void s3c_hsudc_stop_activity(struct s3c_hsudc *hsudc, | static void s3c_hsudc_stop_activity(struct s3c_hsudc *hsudc) | ||||||
| 			  struct usb_gadget_driver *driver) |  | ||||||
| { | { | ||||||
| 	struct s3c_hsudc_ep *hsep; | 	struct s3c_hsudc_ep *hsep; | ||||||
| 	int epnum; | 	int epnum; | ||||||
|  | @ -295,10 +294,6 @@ static void s3c_hsudc_stop_activity(struct s3c_hsudc *hsudc, | ||||||
| 		hsep->stopped = 1; | 		hsep->stopped = 1; | ||||||
| 		s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); | 		s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	spin_unlock(&hsudc->lock); |  | ||||||
| 	driver->disconnect(&hsudc->gadget); |  | ||||||
| 	spin_lock(&hsudc->lock); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -1135,16 +1130,15 @@ static irqreturn_t s3c_hsudc_irq(int irq, void *_dev) | ||||||
| 	return IRQ_HANDLED; | 	return IRQ_HANDLED; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int s3c_hsudc_start(struct usb_gadget_driver *driver, | static int s3c_hsudc_start(struct usb_gadget *gadget, | ||||||
| 		int (*bind)(struct usb_gadget *)) | 		struct usb_gadget_driver *driver) | ||||||
| { | { | ||||||
| 	struct s3c_hsudc *hsudc = the_controller; | 	struct s3c_hsudc *hsudc = the_controller; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	if (!driver | 	if (!driver | ||||||
| 		|| driver->max_speed < USB_SPEED_FULL | 		|| driver->max_speed < USB_SPEED_FULL | ||||||
| 		|| !bind | 		|| !driver->setup) | ||||||
| 		|| !driver->unbind || !driver->disconnect || !driver->setup) |  | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if (!hsudc) | 	if (!hsudc) | ||||||
|  | @ -1155,17 +1149,6 @@ static int s3c_hsudc_start(struct usb_gadget_driver *driver, | ||||||
| 
 | 
 | ||||||
| 	hsudc->driver = driver; | 	hsudc->driver = driver; | ||||||
| 	hsudc->gadget.dev.driver = &driver->driver; | 	hsudc->gadget.dev.driver = &driver->driver; | ||||||
| 	hsudc->gadget.speed = USB_SPEED_UNKNOWN; |  | ||||||
| 
 |  | ||||||
| 	ret = bind(&hsudc->gadget); |  | ||||||
| 	if (ret) { |  | ||||||
| 		dev_err(hsudc->dev, "%s: bind failed\n", hsudc->gadget.name); |  | ||||||
| 		device_del(&hsudc->gadget.dev); |  | ||||||
| 
 |  | ||||||
| 		hsudc->driver = NULL; |  | ||||||
| 		hsudc->gadget.dev.driver = NULL; |  | ||||||
| 		return ret; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	/* connect to bus through transceiver */ | 	/* connect to bus through transceiver */ | ||||||
| 	if (hsudc->transceiver) { | 	if (hsudc->transceiver) { | ||||||
|  | @ -1173,8 +1156,6 @@ static int s3c_hsudc_start(struct usb_gadget_driver *driver, | ||||||
| 		if (ret) { | 		if (ret) { | ||||||
| 			dev_err(hsudc->dev, "%s: can't bind to transceiver\n", | 			dev_err(hsudc->dev, "%s: can't bind to transceiver\n", | ||||||
| 					hsudc->gadget.name); | 					hsudc->gadget.name); | ||||||
| 			driver->unbind(&hsudc->gadget); |  | ||||||
| 
 |  | ||||||
| 			hsudc->driver = NULL; | 			hsudc->driver = NULL; | ||||||
| 			hsudc->gadget.dev.driver = NULL; | 			hsudc->gadget.dev.driver = NULL; | ||||||
| 			return ret; | 			return ret; | ||||||
|  | @ -1192,7 +1173,8 @@ static int s3c_hsudc_start(struct usb_gadget_driver *driver, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int s3c_hsudc_stop(struct usb_gadget_driver *driver) | static int s3c_hsudc_stop(struct usb_gadget *gadget, | ||||||
|  | 		struct usb_gadget_driver *driver) | ||||||
| { | { | ||||||
| 	struct s3c_hsudc *hsudc = the_controller; | 	struct s3c_hsudc *hsudc = the_controller; | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
|  | @ -1200,21 +1182,22 @@ static int s3c_hsudc_stop(struct usb_gadget_driver *driver) | ||||||
| 	if (!hsudc) | 	if (!hsudc) | ||||||
| 		return -ENODEV; | 		return -ENODEV; | ||||||
| 
 | 
 | ||||||
| 	if (!driver || driver != hsudc->driver || !driver->unbind) | 	if (!driver || driver != hsudc->driver) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	spin_lock_irqsave(&hsudc->lock, flags); | 	spin_lock_irqsave(&hsudc->lock, flags); | ||||||
| 	hsudc->driver = 0; | 	hsudc->driver = NULL; | ||||||
|  | 	hsudc->gadget.dev.driver = NULL; | ||||||
|  | 	hsudc->gadget.speed = USB_SPEED_UNKNOWN; | ||||||
| 	s3c_hsudc_uninit_phy(); | 	s3c_hsudc_uninit_phy(); | ||||||
| 	if (hsudc->pd->gpio_uninit) | 	if (hsudc->pd->gpio_uninit) | ||||||
| 		hsudc->pd->gpio_uninit(); | 		hsudc->pd->gpio_uninit(); | ||||||
| 	s3c_hsudc_stop_activity(hsudc, driver); | 	s3c_hsudc_stop_activity(hsudc); | ||||||
| 	spin_unlock_irqrestore(&hsudc->lock, flags); | 	spin_unlock_irqrestore(&hsudc->lock, flags); | ||||||
| 
 | 
 | ||||||
| 	if (hsudc->transceiver) | 	if (hsudc->transceiver) | ||||||
| 		(void) otg_set_peripheral(hsudc->transceiver, NULL); | 		(void) otg_set_peripheral(hsudc->transceiver, NULL); | ||||||
| 
 | 
 | ||||||
| 	driver->unbind(&hsudc->gadget); |  | ||||||
| 	disable_irq(hsudc->irq); | 	disable_irq(hsudc->irq); | ||||||
| 
 | 
 | ||||||
| 	dev_info(hsudc->dev, "unregistered gadget driver '%s'\n", | 	dev_info(hsudc->dev, "unregistered gadget driver '%s'\n", | ||||||
|  | @ -1247,8 +1230,8 @@ static int s3c_hsudc_vbus_draw(struct usb_gadget *gadget, unsigned mA) | ||||||
| 
 | 
 | ||||||
| static struct usb_gadget_ops s3c_hsudc_gadget_ops = { | static struct usb_gadget_ops s3c_hsudc_gadget_ops = { | ||||||
| 	.get_frame	= s3c_hsudc_gadget_getframe, | 	.get_frame	= s3c_hsudc_gadget_getframe, | ||||||
| 	.start		= s3c_hsudc_start, | 	.udc_start	= s3c_hsudc_start, | ||||||
| 	.stop		= s3c_hsudc_stop, | 	.udc_stop	= s3c_hsudc_stop, | ||||||
| 	.vbus_draw	= s3c_hsudc_vbus_draw, | 	.vbus_draw	= s3c_hsudc_vbus_draw, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -1310,6 +1293,7 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev) | ||||||
| 
 | 
 | ||||||
| 	hsudc->gadget.is_otg = 0; | 	hsudc->gadget.is_otg = 0; | ||||||
| 	hsudc->gadget.is_a_peripheral = 0; | 	hsudc->gadget.is_a_peripheral = 0; | ||||||
|  | 	hsudc->gadget.speed = USB_SPEED_UNKNOWN; | ||||||
| 
 | 
 | ||||||
| 	s3c_hsudc_setup_ep(hsudc); | 	s3c_hsudc_setup_ep(hsudc); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Heiko Stübner
				Heiko Stübner