Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6bea476c authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman
Browse files

USB: gadget driver unbind() is optional; section fixes; misc



Allow gadget drivers to omit the unbind() method.  When they're
statically linked, that's an appropriate memory saving tweak.

Similarly, provide consistent/simpler handling for a should-not-happen
error case:  removing a peripheral controller driver when a gadget
driver is still loaded.  Such code dates back to early versions of the
first implementation of the gadget API, and has never been triggered.

Includes relevant section annotation fixs for gmidi.c, file_storage.c,
and serial.c; we don't yet have an "init or exit" annotation.  Also
some whitespace fixes in gmidi.c (space at EOL, before tabs, etc).

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 5f8364b7
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -1574,7 +1574,6 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
	if (!driver
			|| driver->speed != USB_SPEED_FULL
			|| !driver->bind
			|| !driver->unbind
			|| !driver->setup) {
		DBG("bad parameter.\n");
		return -EINVAL;
@@ -1611,7 +1610,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
{
	struct at91_udc *udc = &controller;

	if (!driver || driver != udc->driver)
	if (!driver || driver != udc->driver || !driver->unbind)
		return -EINVAL;

	local_irq_disable();
@@ -1731,10 +1730,10 @@ static int __devexit at91udc_remove(struct platform_device *pdev)

	DBG("remove\n");

	pullup(udc, 0);
	if (udc->driver)
		return -EBUSY;

	if (udc->driver != 0)
		usb_gadget_unregister_driver(udc->driver);
	pullup(udc, 0);

	device_init_wakeup(&pdev->dev, 0);
	remove_debug_file(udc);
+4 −3
Original line number Diff line number Diff line
@@ -779,7 +779,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)
		return -EINVAL;
	if (dum->driver)
		return -EBUSY;
	if (!driver->bind || !driver->unbind || !driver->setup
	if (!driver->bind || !driver->setup
			|| driver->speed == USB_SPEED_UNKNOWN)
		return -EINVAL;

@@ -837,6 +837,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)
err_bind_driver:
	driver_unregister (&driver->driver);
err_register:
	if (driver->unbind)
		driver->unbind (&dum->gadget);
	spin_lock_irq (&dum->lock);
	dum->pullup = 0;
@@ -857,7 +858,7 @@ usb_gadget_unregister_driver (struct usb_gadget_driver *driver)

	if (!dum)
		return -ENODEV;
	if (!driver || driver != dum->driver)
	if (!driver || driver != dum->driver || !driver->unbind)
		return -EINVAL;

	dev_dbg (udc_dev(dum), "unregister gadget driver '%s'\n",
+1 −1
Original line number Diff line number Diff line
@@ -4100,7 +4100,7 @@ static struct usb_gadget_driver fsg_driver = {
#endif
	.function	= (char *) longname,
	.bind		= fsg_bind,
	.unbind		= __exit_p(fsg_unbind),
	.unbind		= fsg_unbind,
	.disconnect	= fsg_disconnect,
	.setup		= fsg_setup,
	.suspend	= fsg_suspend,
+6 −6
Original line number Diff line number Diff line
@@ -1308,7 +1308,7 @@ static struct usb_gadget_driver gmidi_driver = {
	.speed		= USB_SPEED_FULL,
	.function	= (char *)longname,
	.bind		= gmidi_bind,
	.unbind		= __exit_p(gmidi_unbind),
	.unbind		= gmidi_unbind,

	.setup		= gmidi_setup,
	.disconnect	= gmidi_disconnect,
+3 −9
Original line number Diff line number Diff line
@@ -1432,7 +1432,6 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	if (!driver
			|| driver->speed != USB_SPEED_FULL
			|| !driver->bind
			|| !driver->unbind
			|| !driver->disconnect
			|| !driver->setup)
		return -EINVAL;
@@ -1495,7 +1494,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)

	if (!dev)
		return -ENODEV;
	if (!driver || driver != dev->driver)
	if (!driver || driver != dev->driver || !driver->unbind)
		return -EINVAL;

	spin_lock_irqsave(&dev->lock, flags);
@@ -1808,13 +1807,8 @@ static void goku_remove(struct pci_dev *pdev)
	struct goku_udc		*dev = pci_get_drvdata(pdev);

	DBG(dev, "%s\n", __FUNCTION__);
	/* start with the driver above us */
	if (dev->driver) {
		/* should have been done already by driver model core */
		WARN(dev, "pci remove, driver '%s' is still registered\n",
				dev->driver->driver.name);
		usb_gadget_unregister_driver(dev->driver);
	}

	BUG_ON(dev->driver);

#ifdef CONFIG_USB_GADGET_DEBUG_FILES
	remove_proc_entry(proc_node_name, NULL);
Loading