Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

David Brownell and committed by
Greg Kroah-Hartman
6bea476c 5f8364b7

+41 -47
+4 -5
drivers/usb/gadget/at91_udc.c
··· 1574 1574 if (!driver 1575 1575 || driver->speed != USB_SPEED_FULL 1576 1576 || !driver->bind 1577 - || !driver->unbind 1578 1577 || !driver->setup) { 1579 1578 DBG("bad parameter.\n"); 1580 1579 return -EINVAL; ··· 1610 1611 { 1611 1612 struct at91_udc *udc = &controller; 1612 1613 1613 - if (!driver || driver != udc->driver) 1614 + if (!driver || driver != udc->driver || !driver->unbind) 1614 1615 return -EINVAL; 1615 1616 1616 1617 local_irq_disable(); ··· 1730 1731 1731 1732 DBG("remove\n"); 1732 1733 1733 - pullup(udc, 0); 1734 + if (udc->driver) 1735 + return -EBUSY; 1734 1736 1735 - if (udc->driver != 0) 1736 - usb_gadget_unregister_driver(udc->driver); 1737 + pullup(udc, 0); 1737 1738 1738 1739 device_init_wakeup(&pdev->dev, 0); 1739 1740 remove_debug_file(udc);
+4 -3
drivers/usb/gadget/dummy_hcd.c
··· 779 779 return -EINVAL; 780 780 if (dum->driver) 781 781 return -EBUSY; 782 - if (!driver->bind || !driver->unbind || !driver->setup 782 + if (!driver->bind || !driver->setup 783 783 || driver->speed == USB_SPEED_UNKNOWN) 784 784 return -EINVAL; 785 785 ··· 837 837 err_bind_driver: 838 838 driver_unregister (&driver->driver); 839 839 err_register: 840 - driver->unbind (&dum->gadget); 840 + if (driver->unbind) 841 + driver->unbind (&dum->gadget); 841 842 spin_lock_irq (&dum->lock); 842 843 dum->pullup = 0; 843 844 set_link_state (dum); ··· 858 857 859 858 if (!dum) 860 859 return -ENODEV; 861 - if (!driver || driver != dum->driver) 860 + if (!driver || driver != dum->driver || !driver->unbind) 862 861 return -EINVAL; 863 862 864 863 dev_dbg (udc_dev(dum), "unregister gadget driver '%s'\n",
+1 -1
drivers/usb/gadget/file_storage.c
··· 4100 4100 #endif 4101 4101 .function = (char *) longname, 4102 4102 .bind = fsg_bind, 4103 - .unbind = __exit_p(fsg_unbind), 4103 + .unbind = fsg_unbind, 4104 4104 .disconnect = fsg_disconnect, 4105 4105 .setup = fsg_setup, 4106 4106 .suspend = fsg_suspend,
+6 -6
drivers/usb/gadget/gmidi.c
··· 123 123 struct usb_request *req; /* for control responses */ 124 124 u8 config; 125 125 struct usb_ep *in_ep, *out_ep; 126 - struct snd_card *card; 126 + struct snd_card *card; 127 127 struct snd_rawmidi *rmidi; 128 128 struct snd_rawmidi_substream *in_substream; 129 129 struct snd_rawmidi_substream *out_substream; ··· 490 490 int status = req->status; 491 491 492 492 switch (status) { 493 - case 0: /* normal completion */ 493 + case 0: /* normal completion */ 494 494 if (ep == dev->out_ep) { 495 495 /* we received stuff. 496 496 req is queued again, below */ ··· 505 505 break; 506 506 507 507 /* this endpoint is normally active while we're configured */ 508 - case -ECONNABORTED: /* hardware forced ep reset */ 508 + case -ECONNABORTED: /* hardware forced ep reset */ 509 509 case -ECONNRESET: /* request dequeued */ 510 510 case -ESHUTDOWN: /* disconnect from host */ 511 511 VDBG(dev, "%s gone (%d), %d/%d\n", ep->name, status, ··· 656 656 case USB_SPEED_LOW: speed = "low"; break; 657 657 case USB_SPEED_FULL: speed = "full"; break; 658 658 case USB_SPEED_HIGH: speed = "high"; break; 659 - default: speed = "?"; break; 659 + default: speed = "?"; break; 660 660 } 661 661 662 662 dev->config = number; ··· 1308 1308 .speed = USB_SPEED_FULL, 1309 1309 .function = (char *)longname, 1310 1310 .bind = gmidi_bind, 1311 - .unbind = __exit_p(gmidi_unbind), 1311 + .unbind = gmidi_unbind, 1312 1312 1313 1313 .setup = gmidi_setup, 1314 1314 .disconnect = gmidi_disconnect, ··· 1316 1316 .suspend = gmidi_suspend, 1317 1317 .resume = gmidi_resume, 1318 1318 1319 - .driver = { 1319 + .driver = { 1320 1320 .name = (char *)shortname, 1321 1321 .owner = THIS_MODULE, 1322 1322 },
+3 -9
drivers/usb/gadget/goku_udc.c
··· 1432 1432 if (!driver 1433 1433 || driver->speed != USB_SPEED_FULL 1434 1434 || !driver->bind 1435 - || !driver->unbind 1436 1435 || !driver->disconnect 1437 1436 || !driver->setup) 1438 1437 return -EINVAL; ··· 1494 1495 1495 1496 if (!dev) 1496 1497 return -ENODEV; 1497 - if (!driver || driver != dev->driver) 1498 + if (!driver || driver != dev->driver || !driver->unbind) 1498 1499 return -EINVAL; 1499 1500 1500 1501 spin_lock_irqsave(&dev->lock, flags); ··· 1807 1808 struct goku_udc *dev = pci_get_drvdata(pdev); 1808 1809 1809 1810 DBG(dev, "%s\n", __FUNCTION__); 1810 - /* start with the driver above us */ 1811 - if (dev->driver) { 1812 - /* should have been done already by driver model core */ 1813 - WARN(dev, "pci remove, driver '%s' is still registered\n", 1814 - dev->driver->driver.name); 1815 - usb_gadget_unregister_driver(dev->driver); 1816 - } 1811 + 1812 + BUG_ON(dev->driver); 1817 1813 1818 1814 #ifdef CONFIG_USB_GADGET_DEBUG_FILES 1819 1815 remove_proc_entry(proc_node_name, NULL);
+8 -5
drivers/usb/gadget/lh7a40x_udc.c
··· 422 422 DEBUG("%s: %s\n", __FUNCTION__, driver->driver.name); 423 423 424 424 if (!driver 425 - || driver->speed != USB_SPEED_FULL 426 - || !driver->bind 427 - || !driver->unbind || !driver->disconnect || !driver->setup) 425 + || driver->speed != USB_SPEED_FULL 426 + || !driver->bind 427 + || !driver->disconnect 428 + || !driver->setup) 428 429 return -EINVAL; 429 430 if (!dev) 430 431 return -ENODEV; ··· 472 471 473 472 if (!dev) 474 473 return -ENODEV; 475 - if (!driver || driver != dev->driver) 474 + if (!driver || driver != dev->driver || !driver->unbind) 476 475 return -EINVAL; 477 476 478 477 spin_lock_irqsave(&dev->lock, flags); ··· 2126 2125 2127 2126 DEBUG("%s: %p\n", __FUNCTION__, pdev); 2128 2127 2128 + if (dev->driver) 2129 + return -EBUSY; 2130 + 2129 2131 udc_disable(dev); 2130 2132 remove_proc_files(); 2131 - usb_gadget_unregister_driver(dev->driver); 2132 2133 2133 2134 free_irq(IRQ_USBINTR, dev); 2134 2135
+2 -9
drivers/usb/gadget/net2280.c
··· 2020 2020 if (!driver 2021 2021 || driver->speed != USB_SPEED_HIGH 2022 2022 || !driver->bind 2023 - || !driver->unbind 2024 2023 || !driver->setup) 2025 2024 return -EINVAL; 2026 2025 if (!dev) ··· 2106 2107 2107 2108 if (!dev) 2108 2109 return -ENODEV; 2109 - if (!driver || driver != dev->driver) 2110 + if (!driver || driver != dev->driver || !driver->unbind) 2110 2111 return -EINVAL; 2111 2112 2112 2113 spin_lock_irqsave (&dev->lock, flags); ··· 2802 2803 { 2803 2804 struct net2280 *dev = pci_get_drvdata (pdev); 2804 2805 2805 - /* start with the driver above us */ 2806 - if (dev->driver) { 2807 - /* should have been done already by driver model core */ 2808 - WARN (dev, "pci remove, driver '%s' is still registered\n", 2809 - dev->driver->driver.name); 2810 - usb_gadget_unregister_driver (dev->driver); 2811 - } 2806 + BUG_ON(dev->driver); 2812 2807 2813 2808 /* then clean up the resources we allocated during probe() */ 2814 2809 net2280_led_shutdown (dev);
+8 -5
drivers/usb/gadget/omap_udc.c
··· 2043 2043 // FIXME if otg, check: driver->is_otg 2044 2044 || driver->speed < USB_SPEED_FULL 2045 2045 || !driver->bind 2046 - || !driver->unbind 2047 2046 || !driver->setup) 2048 2047 return -EINVAL; 2049 2048 ··· 2086 2087 status = otg_set_peripheral(udc->transceiver, &udc->gadget); 2087 2088 if (status < 0) { 2088 2089 ERR("can't bind to transceiver\n"); 2089 - driver->unbind (&udc->gadget); 2090 - udc->gadget.dev.driver = NULL; 2091 - udc->driver = NULL; 2090 + if (driver->unbind) { 2091 + driver->unbind (&udc->gadget); 2092 + udc->gadget.dev.driver = NULL; 2093 + udc->driver = NULL; 2094 + } 2092 2095 goto done; 2093 2096 } 2094 2097 } else { ··· 2118 2117 2119 2118 if (!udc) 2120 2119 return -ENODEV; 2121 - if (!driver || driver != udc->driver) 2120 + if (!driver || driver != udc->driver || !driver->unbind) 2122 2121 return -EINVAL; 2123 2122 2124 2123 if (machine_is_omap_innovator() || machine_is_omap_osk()) ··· 2871 2870 2872 2871 if (!udc) 2873 2872 return -ENODEV; 2873 + if (udc->driver) 2874 + return -EBUSY; 2874 2875 2875 2876 udc->done = &done; 2876 2877
+4 -3
drivers/usb/gadget/pxa2xx_udc.c
··· 1623 1623 if (!driver 1624 1624 || driver->speed < USB_SPEED_FULL 1625 1625 || !driver->bind 1626 - || !driver->unbind 1627 1626 || !driver->disconnect 1628 1627 || !driver->setup) 1629 1628 return -EINVAL; ··· 1693 1694 1694 1695 if (!dev) 1695 1696 return -ENODEV; 1696 - if (!driver || driver != dev->driver) 1697 + if (!driver || driver != dev->driver || !driver->unbind) 1697 1698 return -EINVAL; 1698 1699 1699 1700 local_irq_disable(); ··· 2637 2638 { 2638 2639 struct pxa2xx_udc *dev = platform_get_drvdata(pdev); 2639 2640 2641 + if (dev->driver) 2642 + return -EBUSY; 2643 + 2640 2644 udc_disable(dev); 2641 2645 remove_proc_files(); 2642 - usb_gadget_unregister_driver(dev->driver); 2643 2646 2644 2647 if (dev->got_irq) { 2645 2648 free_irq(IRQ_USB, dev);
+1 -1
drivers/usb/gadget/serial.c
··· 296 296 #endif /* CONFIG_USB_GADGET_DUALSPEED */ 297 297 .function = GS_LONG_NAME, 298 298 .bind = gs_bind, 299 - .unbind = __exit_p(gs_unbind), 299 + .unbind = gs_unbind, 300 300 .setup = gs_setup, 301 301 .disconnect = gs_disconnect, 302 302 .driver = {