Skip to content

Commit

Permalink
USB: gadget driver unbind() is optional; section fixes; misc
Browse files Browse the repository at this point in the history
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: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
David Brownell authored and Greg Kroah-Hartman committed Dec 20, 2006
1 parent 5f8364b commit 6bea476
Show file tree
Hide file tree
Showing 10 changed files with 41 additions and 47 deletions.
9 changes: 4 additions & 5 deletions drivers/usb/gadget/at91_udc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down
7 changes: 4 additions & 3 deletions drivers/usb/gadget/dummy_hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -837,7 +837,8 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)
err_bind_driver:
driver_unregister (&driver->driver);
err_register:
driver->unbind (&dum->gadget);
if (driver->unbind)
driver->unbind (&dum->gadget);
spin_lock_irq (&dum->lock);
dum->pullup = 0;
set_link_state (dum);
Expand All @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion drivers/usb/gadget/file_storage.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
12 changes: 6 additions & 6 deletions drivers/usb/gadget/gmidi.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ struct gmidi_device {
struct usb_request *req; /* for control responses */
u8 config;
struct usb_ep *in_ep, *out_ep;
struct snd_card *card;
struct snd_card *card;
struct snd_rawmidi *rmidi;
struct snd_rawmidi_substream *in_substream;
struct snd_rawmidi_substream *out_substream;
Expand Down Expand Up @@ -490,7 +490,7 @@ static void gmidi_complete(struct usb_ep *ep, struct usb_request *req)
int status = req->status;

switch (status) {
case 0: /* normal completion */
case 0: /* normal completion */
if (ep == dev->out_ep) {
/* we received stuff.
req is queued again, below */
Expand All @@ -505,7 +505,7 @@ static void gmidi_complete(struct usb_ep *ep, struct usb_request *req)
break;

/* this endpoint is normally active while we're configured */
case -ECONNABORTED: /* hardware forced ep reset */
case -ECONNABORTED: /* hardware forced ep reset */
case -ECONNRESET: /* request dequeued */
case -ESHUTDOWN: /* disconnect from host */
VDBG(dev, "%s gone (%d), %d/%d\n", ep->name, status,
Expand Down Expand Up @@ -656,7 +656,7 @@ gmidi_set_config(struct gmidi_device *dev, unsigned number, gfp_t gfp_flags)
case USB_SPEED_LOW: speed = "low"; break;
case USB_SPEED_FULL: speed = "full"; break;
case USB_SPEED_HIGH: speed = "high"; break;
default: speed = "?"; break;
default: speed = "?"; break;
}

dev->config = number;
Expand Down Expand Up @@ -1308,15 +1308,15 @@ 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,

.suspend = gmidi_suspend,
.resume = gmidi_resume,

.driver = {
.driver = {
.name = (char *)shortname,
.owner = THIS_MODULE,
},
Expand Down
12 changes: 3 additions & 9 deletions drivers/usb/gadget/goku_udc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
13 changes: 8 additions & 5 deletions drivers/usb/gadget/lh7a40x_udc.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,9 +422,10 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
DEBUG("%s: %s\n", __FUNCTION__, driver->driver.name);

if (!driver
|| driver->speed != USB_SPEED_FULL
|| !driver->bind
|| !driver->unbind || !driver->disconnect || !driver->setup)
|| driver->speed != USB_SPEED_FULL
|| !driver->bind
|| !driver->disconnect
|| !driver->setup)
return -EINVAL;
if (!dev)
return -ENODEV;
Expand Down Expand Up @@ -471,7 +472,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);
Expand Down Expand Up @@ -2125,9 +2126,11 @@ static int lh7a40x_udc_remove(struct platform_device *pdev)

DEBUG("%s: %p\n", __FUNCTION__, pdev);

if (dev->driver)
return -EBUSY;

udc_disable(dev);
remove_proc_files();
usb_gadget_unregister_driver(dev->driver);

free_irq(IRQ_USBINTR, dev);

Expand Down
11 changes: 2 additions & 9 deletions drivers/usb/gadget/net2280.c
Original file line number Diff line number Diff line change
Expand Up @@ -2020,7 +2020,6 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
if (!driver
|| driver->speed != USB_SPEED_HIGH
|| !driver->bind
|| !driver->unbind
|| !driver->setup)
return -EINVAL;
if (!dev)
Expand Down Expand Up @@ -2107,7 +2106,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);
Expand Down Expand Up @@ -2803,13 +2802,7 @@ static void net2280_remove (struct pci_dev *pdev)
{
struct net2280 *dev = pci_get_drvdata (pdev);

/* 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);

/* then clean up the resources we allocated during probe() */
net2280_led_shutdown (dev);
Expand Down
13 changes: 8 additions & 5 deletions drivers/usb/gadget/omap_udc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2043,7 +2043,6 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
// FIXME if otg, check: driver->is_otg
|| driver->speed < USB_SPEED_FULL
|| !driver->bind
|| !driver->unbind
|| !driver->setup)
return -EINVAL;

Expand Down Expand Up @@ -2087,9 +2086,11 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
status = otg_set_peripheral(udc->transceiver, &udc->gadget);
if (status < 0) {
ERR("can't bind to transceiver\n");
driver->unbind (&udc->gadget);
udc->gadget.dev.driver = NULL;
udc->driver = NULL;
if (driver->unbind) {
driver->unbind (&udc->gadget);
udc->gadget.dev.driver = NULL;
udc->driver = NULL;
}
goto done;
}
} else {
Expand Down Expand Up @@ -2117,7 +2118,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)

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

if (machine_is_omap_innovator() || machine_is_omap_osk())
Expand Down Expand Up @@ -2870,6 +2871,8 @@ static int __exit omap_udc_remove(struct platform_device *pdev)

if (!udc)
return -ENODEV;
if (udc->driver)
return -EBUSY;

udc->done = &done;

Expand Down
7 changes: 4 additions & 3 deletions drivers/usb/gadget/pxa2xx_udc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1623,7 +1623,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;
Expand Down Expand Up @@ -1694,7 +1693,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;

local_irq_disable();
Expand Down Expand Up @@ -2638,9 +2637,11 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev)
{
struct pxa2xx_udc *dev = platform_get_drvdata(pdev);

if (dev->driver)
return -EBUSY;

udc_disable(dev);
remove_proc_files();
usb_gadget_unregister_driver(dev->driver);

if (dev->got_irq) {
free_irq(IRQ_USB, dev);
Expand Down
2 changes: 1 addition & 1 deletion drivers/usb/gadget/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ static struct usb_gadget_driver gs_gadget_driver = {
#endif /* CONFIG_USB_GADGET_DUALSPEED */
.function = GS_LONG_NAME,
.bind = gs_bind,
.unbind = __exit_p(gs_unbind),
.unbind = gs_unbind,
.setup = gs_setup,
.disconnect = gs_disconnect,
.driver = {
Expand Down

0 comments on commit 6bea476

Please sign in to comment.