diff options
Diffstat (limited to 'drivers/usb/gadget')
| -rw-r--r-- | drivers/usb/gadget/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/usb/gadget/Makefile | 12 | ||||
| -rw-r--r-- | drivers/usb/gadget/composite.c | 5 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_fs.c | 1 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_rndis.c | 3 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_uac1.c | 1 | ||||
| -rw-r--r-- | drivers/usb/gadget/g_ffs.c | 4 | ||||
| -rw-r--r-- | drivers/usb/gadget/imx_udc.c | 20 | ||||
| -rw-r--r-- | drivers/usb/gadget/inode.c | 1 | ||||
| -rw-r--r-- | drivers/usb/gadget/net2272.c | 9 | ||||
| -rw-r--r-- | drivers/usb/gadget/net2280.c | 8 | ||||
| -rw-r--r-- | drivers/usb/gadget/omap_udc.c | 3 | ||||
| -rw-r--r-- | drivers/usb/gadget/pxa25x_udc.c | 24 | ||||
| -rw-r--r-- | drivers/usb/gadget/pxa27x_udc.c | 18 | ||||
| -rw-r--r-- | drivers/usb/gadget/s3c2410_udc.c | 28 | ||||
| -rw-r--r-- | drivers/usb/gadget/u_serial.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/u_uac1.c | 3 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc-core.c | 2 | 
18 files changed, 83 insertions, 62 deletions
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 5a0c541daf8..c7525b1cad7 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -145,6 +145,7 @@ config USB_LPC32XX  	tristate "LPC32XX USB Peripheral Controller"  	depends on ARCH_LPC32XX  	select USB_ISP1301 +	select USB_OTG_UTILS  	help  	   This option selects the USB device controller in the LPC32xx SoC. diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 97a13c349cc..82fb2251135 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -35,6 +35,12 @@ mv_udc-y			:= mv_udc_core.o  obj-$(CONFIG_USB_FUSB300)	+= fusb300_udc.o  obj-$(CONFIG_USB_MV_U3D)	+= mv_u3d_core.o +# USB Functions +obj-$(CONFIG_USB_F_ACM)		+= f_acm.o +f_ss_lb-y			:= f_loopback.o f_sourcesink.o +obj-$(CONFIG_USB_F_SS_LB)	+= f_ss_lb.o +obj-$(CONFIG_USB_U_SERIAL)	+= u_serial.o +  #  # USB gadget drivers  # @@ -74,9 +80,3 @@ obj-$(CONFIG_USB_G_WEBCAM)	+= g_webcam.o  obj-$(CONFIG_USB_G_NCM)		+= g_ncm.o  obj-$(CONFIG_USB_G_ACM_MS)	+= g_acm_ms.o  obj-$(CONFIG_USB_GADGET_TARGET)	+= tcm_usb_gadget.o - -# USB Functions -obj-$(CONFIG_USB_F_ACM)		+= f_acm.o -f_ss_lb-y			:= f_loopback.o f_sourcesink.o -obj-$(CONFIG_USB_F_SS_LB)	+= f_ss_lb.o -obj-$(CONFIG_USB_U_SERIAL)	+= u_serial.o diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 7c821de8ce3..c0d62b27861 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -1757,10 +1757,7 @@ static const struct usb_gadget_driver composite_driver_template = {  /**   * usb_composite_probe() - register a composite driver   * @driver: the driver to register - * @bind: the callback used to allocate resources that are shared across the - *	whole device, such as string IDs, and add its configurations using - *	@usb_add_config().  This may fail by returning a negative errno - *	value; it should return zero on successful initialization. + *   * Context: single threaded during gadget setup   *   * This function is used to register drivers using the composite driver diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 38388d7844f..c377ff84bf2 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c @@ -1235,6 +1235,7 @@ static struct file_system_type ffs_fs_type = {  	.mount		= ffs_fs_mount,  	.kill_sb	= ffs_fs_kill_sb,  }; +MODULE_ALIAS_FS("functionfs");  /* Driver's main init/cleanup functions *************************************/ diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 71beeb83355..cc9c49c57c8 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c @@ -447,14 +447,13 @@ static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req)  static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)  {  	struct f_rndis			*rndis = req->context; -	struct usb_composite_dev	*cdev = rndis->port.func.config->cdev;  	int				status;  	/* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */  //	spin_lock(&dev->lock);  	status = rndis_msg_parser(rndis->config, (u8 *) req->buf);  	if (status < 0) -		ERROR(cdev, "RNDIS command error %d, %d/%d\n", +		pr_err("RNDIS command error %d, %d/%d\n",  			status, req->actual, req->length);  //	spin_unlock(&dev->lock);  } diff --git a/drivers/usb/gadget/f_uac1.c b/drivers/usb/gadget/f_uac1.c index f570e667a64..fa8ea4ea00c 100644 --- a/drivers/usb/gadget/f_uac1.c +++ b/drivers/usb/gadget/f_uac1.c @@ -418,6 +418,7 @@ static int audio_get_intf_req(struct usb_function *f,  	req->context = audio;  	req->complete = f_audio_complete; +	len = min_t(size_t, sizeof(value), len);  	memcpy(req->buf, &value, len);  	return len; diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 3953dd4d718..3b343b23e4b 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c @@ -357,7 +357,7 @@ static int gfs_bind(struct usb_composite_dev *cdev)  		goto error;  	gfs_dev_desc.iProduct = gfs_strings[USB_GADGET_PRODUCT_IDX].id; -	for (i = func_num; --i; ) { +	for (i = func_num; i--; ) {  		ret = functionfs_bind(ffs_tab[i].ffs_data, cdev);  		if (unlikely(ret < 0)) {  			while (++i < func_num) @@ -413,7 +413,7 @@ static int gfs_unbind(struct usb_composite_dev *cdev)  		gether_cleanup();  	gfs_ether_setup = false; -	for (i = func_num; --i; ) +	for (i = func_num; i--; )  		if (ffs_tab[i].ffs_data)  			functionfs_unbind(ffs_tab[i].ffs_data); diff --git a/drivers/usb/gadget/imx_udc.c b/drivers/usb/gadget/imx_udc.c index 8efd7555fa2..5bd930d779b 100644 --- a/drivers/usb/gadget/imx_udc.c +++ b/drivers/usb/gadget/imx_udc.c @@ -1334,27 +1334,18 @@ static int imx_udc_start(struct usb_gadget *gadget,  		struct usb_gadget_driver *driver)  {  	struct imx_udc_struct *imx_usb; -	int retval;  	imx_usb = container_of(gadget, struct imx_udc_struct, gadget);  	/* first hook up the driver ... */  	imx_usb->driver = driver;  	imx_usb->gadget.dev.driver = &driver->driver; -	retval = device_add(&imx_usb->gadget.dev); -	if (retval) -		goto fail; -  	D_INI(imx_usb->dev, "<%s> registered gadget driver '%s'\n",  		__func__, driver->driver.name);  	imx_udc_enable(imx_usb);  	return 0; -fail: -	imx_usb->driver = NULL; -	imx_usb->gadget.dev.driver = NULL; -	return retval;  }  static int imx_udc_stop(struct usb_gadget *gadget, @@ -1370,8 +1361,6 @@ static int imx_udc_stop(struct usb_gadget *gadget,  	imx_usb->gadget.dev.driver = NULL;  	imx_usb->driver = NULL; -	device_del(&imx_usb->gadget.dev); -  	D_INI(imx_usb->dev, "<%s> unregistered gadget driver '%s'\n",  		__func__, driver->driver.name); @@ -1477,6 +1466,10 @@ static int __init imx_udc_probe(struct platform_device *pdev)  	imx_usb->gadget.dev.parent = &pdev->dev;  	imx_usb->gadget.dev.dma_mask = pdev->dev.dma_mask; +	ret = device_add(&imx_usb->gadget.dev); +	if (retval) +		goto fail4; +  	platform_set_drvdata(pdev, imx_usb);  	usb_init_data(imx_usb); @@ -1488,9 +1481,11 @@ static int __init imx_udc_probe(struct platform_device *pdev)  	ret = usb_add_gadget_udc(&pdev->dev, &imx_usb->gadget);  	if (ret) -		goto fail4; +		goto fail5;  	return 0; +fail5: +	device_unregister(&imx_usb->gadget.dev);  fail4:  	for (i = 0; i < IMX_USB_NB_EP + 1; i++)  		free_irq(imx_usb->usbd_int[i], imx_usb); @@ -1514,6 +1509,7 @@ static int __exit imx_udc_remove(struct platform_device *pdev)  	int i;  	usb_del_gadget_udc(&imx_usb->gadget); +	device_unregister(&imx_usb->gadget.dev);  	imx_udc_disable(imx_usb);  	del_timer(&imx_usb->timer); diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index 8ac840f25ba..e2b2e9cf254 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c @@ -2105,6 +2105,7 @@ static struct file_system_type gadgetfs_type = {  	.mount		= gadgetfs_mount,  	.kill_sb	= gadgetfs_kill_sb,  }; +MODULE_ALIAS_FS("gadgetfs");  /*----------------------------------------------------------------------*/ diff --git a/drivers/usb/gadget/net2272.c b/drivers/usb/gadget/net2272.c index d226058e3b8..32524b63195 100644 --- a/drivers/usb/gadget/net2272.c +++ b/drivers/usb/gadget/net2272.c @@ -59,7 +59,7 @@ static const char * const ep_name[] = {  };  #define DMA_ADDR_INVALID	(~(dma_addr_t)0) -#ifdef CONFIG_USB_GADGET_NET2272_DMA +#ifdef CONFIG_USB_NET2272_DMA  /*   * use_dma: the NET2272 can use an external DMA controller.   * Note that since there is no generic DMA api, some functions, @@ -1495,6 +1495,13 @@ stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver)  	for (i = 0; i < 4; ++i)  		net2272_dequeue_all(&dev->ep[i]); +	/* report disconnect; the driver is already quiesced */ +	if (driver) { +		spin_unlock(&dev->lock); +		driver->disconnect(&dev->gadget); +		spin_lock(&dev->lock); +	} +  	net2272_usb_reinit(dev);  } diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index a1b650e1133..3bd0f992fb4 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c @@ -1924,7 +1924,6 @@ static int net2280_start(struct usb_gadget *_gadget,  err_func:  	device_remove_file (&dev->pdev->dev, &dev_attr_function);  err_unbind: -	driver->unbind (&dev->gadget);  	dev->gadget.dev.driver = NULL;  	dev->driver = NULL;  	return retval; @@ -1946,6 +1945,13 @@ stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver)  	for (i = 0; i < 7; i++)  		nuke (&dev->ep [i]); +	/* report disconnect; the driver is already quiesced */ +	if (driver) { +		spin_unlock(&dev->lock); +		driver->disconnect(&dev->gadget); +		spin_lock(&dev->lock); +	} +  	usb_reinit (dev);  } diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 06be85c2b23..f8445653577 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c @@ -62,6 +62,7 @@  #define	DRIVER_VERSION	"4 October 2004"  #define OMAP_DMA_USB_W2FC_TX0		29 +#define OMAP_DMA_USB_W2FC_RX0		26  /*   * The OMAP UDC needs _very_ early endpoint setup:  before enabling the @@ -1310,7 +1311,7 @@ static int omap_pullup(struct usb_gadget *gadget, int is_on)  }  static int omap_udc_start(struct usb_gadget *g, -		struct usb_gadget_driver *driver) +		struct usb_gadget_driver *driver);  static int omap_udc_stop(struct usb_gadget *g,  		struct usb_gadget_driver *driver); diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index 2bbcdce942d..d0f37484b6b 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c @@ -1266,13 +1266,6 @@ static int pxa25x_udc_start(struct usb_gadget *g,  	dev->gadget.dev.driver = &driver->driver;  	dev->pullup = 1; -	retval = device_add (&dev->gadget.dev); -	if (retval) { -		dev->driver = NULL; -		dev->gadget.dev.driver = NULL; -		return retval; -	} -  	/* ... then enable host detection and ep0; and we're ready  	 * for set_configuration as well as eventual disconnect.  	 */ @@ -1310,6 +1303,10 @@ stop_activity(struct pxa25x_udc *dev, struct usb_gadget_driver *driver)  	}  	del_timer_sync(&dev->timer); +	/* report disconnect; the driver is already quiesced */ +	if (driver) +		driver->disconnect(&dev->gadget); +  	/* re-init driver-visible data structures */  	udc_reinit(dev);  } @@ -1331,7 +1328,6 @@ static int pxa25x_udc_stop(struct usb_gadget*g,  	dev->gadget.dev.driver = NULL;  	dev->driver = NULL; -	device_del (&dev->gadget.dev);  	dump_state(dev);  	return 0; @@ -2146,6 +2142,13 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev)  	dev->gadget.dev.parent = &pdev->dev;  	dev->gadget.dev.dma_mask = pdev->dev.dma_mask; +	retval = device_add(&dev->gadget.dev); +	if (retval) { +		dev->driver = NULL; +		dev->gadget.dev.driver = NULL; +		goto err_device_add; +	} +  	the_controller = dev;  	platform_set_drvdata(pdev, dev); @@ -2196,6 +2199,8 @@ lubbock_fail0:  	free_irq(irq, dev);  #endif   err_irq1: +	device_unregister(&dev->gadget.dev); + err_device_add:  	if (gpio_is_valid(dev->mach->gpio_pullup))  		gpio_free(dev->mach->gpio_pullup);   err_gpio_pullup: @@ -2217,10 +2222,11 @@ static int __exit pxa25x_udc_remove(struct platform_device *pdev)  {  	struct pxa25x_udc *dev = platform_get_drvdata(pdev); -	usb_del_gadget_udc(&dev->gadget);  	if (dev->driver)  		return -EBUSY; +	usb_del_gadget_udc(&dev->gadget); +	device_unregister(&dev->gadget.dev);  	dev->pullup = 0;  	pullup(dev); diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index f7d25795821..2fc867652ef 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c @@ -1814,11 +1814,6 @@ static int pxa27x_udc_start(struct usb_gadget *g,  	udc->gadget.dev.driver = &driver->driver;  	dplus_pullup(udc, 1); -	retval = device_add(&udc->gadget.dev); -	if (retval) { -		dev_err(udc->dev, "device_add error %d\n", retval); -		goto fail; -	}  	if (!IS_ERR_OR_NULL(udc->transceiver)) {  		retval = otg_set_peripheral(udc->transceiver->otg,  						&udc->gadget); @@ -1876,7 +1871,6 @@ static int pxa27x_udc_stop(struct usb_gadget *g,  	udc->driver = NULL; -	device_del(&udc->gadget.dev);  	if (!IS_ERR_OR_NULL(udc->transceiver))  		return otg_set_peripheral(udc->transceiver->otg, NULL); @@ -2480,13 +2474,24 @@ static int __init pxa_udc_probe(struct platform_device *pdev)  			driver_name, udc->irq, retval);  		goto err_irq;  	} + +	retval = device_add(&udc->gadget.dev); +	if (retval) { +		dev_err(udc->dev, "device_add error %d\n", retval); +		goto err_dev_add; +	} +  	retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);  	if (retval)  		goto err_add_udc;  	pxa_init_debugfs(udc); +  	return 0; +  err_add_udc: +	device_unregister(&udc->gadget.dev); +err_dev_add:  	free_irq(udc->irq, udc);  err_irq:  	iounmap(udc->regs); @@ -2507,6 +2512,7 @@ static int __exit pxa_udc_remove(struct platform_device *_dev)  	int gpio = udc->mach->gpio_pullup;  	usb_del_gadget_udc(&udc->gadget); +	device_del(&udc->gadget.dev);  	usb_gadget_unregister_driver(udc->driver);  	free_irq(udc->irq, udc);  	pxa_cleanup_debugfs(udc); diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index fc07b438128..08f89652533 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c @@ -1668,8 +1668,7 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev)  static int s3c2410_udc_start(struct usb_gadget *g,  		struct usb_gadget_driver *driver)  { -	struct s3c2410_udc *udc = to_s3c2410(g) -	int		retval; +	struct s3c2410_udc *udc = to_s3c2410(g);  	dprintk(DEBUG_NORMAL, "%s() '%s'\n", __func__, driver->driver.name); @@ -1677,22 +1676,10 @@ static int s3c2410_udc_start(struct usb_gadget *g,  	udc->driver = driver;  	udc->gadget.dev.driver = &driver->driver; -	/* Bind the driver */ -	retval = device_add(&udc->gadget.dev); -	if (retval) { -		dev_err(&udc->gadget.dev, "Error in device_add() : %d\n", retval); -		goto register_error; -	} -  	/* Enable udc */  	s3c2410_udc_enable(udc);  	return 0; - -register_error: -	udc->driver = NULL; -	udc->gadget.dev.driver = NULL; -	return retval;  }  static int s3c2410_udc_stop(struct usb_gadget *g, @@ -1700,7 +1687,6 @@ static int s3c2410_udc_stop(struct usb_gadget *g,  {  	struct s3c2410_udc *udc = to_s3c2410(g); -	device_del(&udc->gadget.dev);  	udc->driver = NULL;  	/* Disable udc */ @@ -1842,6 +1828,13 @@ static int s3c2410_udc_probe(struct platform_device *pdev)  	udc->gadget.dev.parent = &pdev->dev;  	udc->gadget.dev.dma_mask = pdev->dev.dma_mask; +	/* Bind the driver */ +	retval = device_add(&udc->gadget.dev); +	if (retval) { +		dev_err(&udc->gadget.dev, "Error in device_add() : %d\n", retval); +		goto err_device_add; +	} +  	the_controller = udc;  	platform_set_drvdata(pdev, udc); @@ -1930,6 +1923,8 @@ err_gpio_claim:  err_int:  	free_irq(IRQ_USBD, udc);  err_map: +	device_unregister(&udc->gadget.dev); +err_device_add:  	iounmap(base_addr);  err_mem:  	release_mem_region(rsrc_start, rsrc_len); @@ -1947,10 +1942,11 @@ static int s3c2410_udc_remove(struct platform_device *pdev)  	dev_dbg(&pdev->dev, "%s()\n", __func__); -	usb_del_gadget_udc(&udc->gadget);  	if (udc->driver)  		return -EBUSY; +	usb_del_gadget_udc(&udc->gadget); +	device_unregister(&udc->gadget.dev);  	debugfs_remove(udc->regs_info);  	if (udc_info && !udc_info->udc_command && diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index c5034d9c946..b369292d4b9 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c @@ -136,7 +136,7 @@ static struct portmaster {  	pr_debug(fmt, ##arg)  #endif /* pr_vdebug */  #else -#ifndef pr_vdebig +#ifndef pr_vdebug  #define pr_vdebug(fmt, arg...) \  	({ if (0) pr_debug(fmt, ##arg); })  #endif /* pr_vdebug */ diff --git a/drivers/usb/gadget/u_uac1.c b/drivers/usb/gadget/u_uac1.c index e0c5e88e03e..c7d460f4339 100644 --- a/drivers/usb/gadget/u_uac1.c +++ b/drivers/usb/gadget/u_uac1.c @@ -240,8 +240,11 @@ static int gaudio_open_snd_dev(struct gaudio *card)  	snd = &card->playback;  	snd->filp = filp_open(fn_play, O_WRONLY, 0);  	if (IS_ERR(snd->filp)) { +		int ret = PTR_ERR(snd->filp); +  		ERROR(card, "No such PCM playback device: %s\n", fn_play);  		snd->filp = NULL; +		return ret;  	}  	pcm_file = snd->filp->private_data;  	snd->substream = pcm_file->substream; diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index 2a9cd369f71..f8f62c3ed65 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c @@ -216,7 +216,7 @@ static void usb_gadget_remove_driver(struct usb_udc *udc)  	usb_gadget_disconnect(udc->gadget);  	udc->driver->disconnect(udc->gadget);  	udc->driver->unbind(udc->gadget); -	usb_gadget_udc_stop(udc->gadget, udc->driver); +	usb_gadget_udc_stop(udc->gadget, NULL);  	udc->driver = NULL;  	udc->dev.driver = NULL;  |