usb: gadget: move bind() callback back to struct usb_gadget_driver
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Thu, 6 Sep 2012 18:11:05 +0000 (20:11 +0200)
committerFelipe Balbi <balbi@ti.com>
Mon, 10 Sep 2012 12:35:16 +0000 (15:35 +0300)
This partly reverts 07a18bd7 ("usb gadget: don't save bind callback in
struct usb_composite_driver") and fixes new drivers. The section missmatch
problems was solved by whitelisting bind callback in modpost.

Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/composite.c
drivers/usb/gadget/dbgp.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/inode.c
drivers/usb/gadget/udc-core.c
include/linux/usb/gadget.h

index 071d15c44116024c52a33adfea1f1d70ebff9bb7..2a345f28b9aeb11b08bbd4fb4c50d084d9738810 100644 (file)
@@ -1585,6 +1585,7 @@ composite_resume(struct usb_gadget *gadget)
 /*-------------------------------------------------------------------------*/
 
 static struct usb_gadget_driver composite_driver = {
+       .bind           = composite_bind,
        .unbind         = composite_unbind,
 
        .setup          = composite_setup,
@@ -1631,7 +1632,7 @@ int usb_composite_probe(struct usb_composite_driver *driver)
        composite_driver.max_speed = driver->max_speed;
        composite = driver;
 
-       return usb_gadget_probe_driver(&composite_driver, composite_bind);
+       return usb_gadget_probe_driver(&composite_driver);
 }
 
 /**
index 2d2cff3e454c11dde4de200e79ebae33a663adf0..df9a0104bdf2de358c541ff697c80f06631003b6 100644 (file)
@@ -405,6 +405,7 @@ fail:
 static __refdata struct usb_gadget_driver dbgp_driver = {
        .function = "dbgp",
        .max_speed = USB_SPEED_HIGH,
+       .bind = dbgp_bind,
        .unbind = dbgp_unbind,
        .setup = dbgp_setup,
        .disconnect = dbgp_disconnect,
@@ -416,7 +417,7 @@ static __refdata struct usb_gadget_driver dbgp_driver = {
 
 static int __init dbgp_init(void)
 {
-       return usb_gadget_probe_driver(&dbgp_driver, dbgp_bind);
+       return usb_gadget_probe_driver(&dbgp_driver);
 }
 
 static void __exit dbgp_exit(void)
index 683234bcdced45d8d76b616a7db5f3160be2e101..ce186fa7e7b2e2543092cad080897598f7dfc9af 100644 (file)
@@ -3606,6 +3606,7 @@ static void fsg_resume(struct usb_gadget *gadget)
 static __refdata struct usb_gadget_driver              fsg_driver = {
        .max_speed      = USB_SPEED_SUPER,
        .function       = (char *) fsg_string_product,
+       .bind           = fsg_bind,
        .unbind         = fsg_unbind,
        .disconnect     = fsg_disconnect,
        .setup          = fsg_setup,
@@ -3653,7 +3654,8 @@ static int __init fsg_init(void)
        if ((rc = fsg_alloc()) != 0)
                return rc;
        fsg = the_fsg;
-       if ((rc = usb_gadget_probe_driver(&fsg_driver, fsg_bind)) != 0)
+       rc = usb_gadget_probe_driver(&fsg_driver);
+       if (rc != 0)
                kref_put(&fsg->ref, fsg_release);
        return rc;
 }
index ae13a106fb96fe39a29d2331a9f6c0179c1f2ba8..2521804ba4eec4e387c39cd77cc55ac2d75af892 100644 (file)
@@ -1758,6 +1758,7 @@ gadgetfs_suspend (struct usb_gadget *gadget)
 
 static struct usb_gadget_driver gadgetfs_driver = {
        .function       = (char *) driver_desc,
+       .bind           = gadgetfs_bind,
        .unbind         = gadgetfs_unbind,
        .setup          = gadgetfs_setup,
        .disconnect     = gadgetfs_disconnect,
@@ -1780,6 +1781,7 @@ static int gadgetfs_probe (struct usb_gadget *gadget)
 
 static struct usb_gadget_driver probe_driver = {
        .max_speed      = USB_SPEED_HIGH,
+       .bind           = gadgetfs_probe,
        .unbind         = gadgetfs_nop,
        .setup          = (void *)gadgetfs_nop,
        .disconnect     = gadgetfs_nop,
@@ -1893,7 +1895,8 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
                gadgetfs_driver.max_speed = USB_SPEED_HIGH;
        else
                gadgetfs_driver.max_speed = USB_SPEED_FULL;
-       value = usb_gadget_probe_driver(&gadgetfs_driver, gadgetfs_bind);
+
+       value = usb_gadget_probe_driver(&gadgetfs_driver);
        if (value != 0) {
                kfree (dev->buf);
                dev->buf = NULL;
@@ -2032,7 +2035,7 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent)
                return -ESRCH;
 
        /* fake probe to determine $CHIP */
-       (void) usb_gadget_probe_driver(&probe_driver, gadgetfs_probe);
+       usb_gadget_probe_driver(&probe_driver);
        if (!CHIP)
                return -ENODEV;
 
index bae243c23141ec44c8c473491a3c1f591e28b3d0..85e1e2fdd403c7ca39b0a891e7d1e6ff1a54a28d 100644 (file)
@@ -311,13 +311,12 @@ EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
 
 /* ------------------------------------------------------------------------- */
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver)
 {
        struct usb_udc          *udc = NULL;
        int                     ret;
 
-       if (!driver || !bind || !driver->setup)
+       if (!driver || !driver->bind || !driver->setup)
                return -EINVAL;
 
        mutex_lock(&udc_lock);
@@ -339,7 +338,7 @@ found:
        udc->dev.driver = &driver->driver;
 
        if (udc_is_newstyle(udc)) {
-               ret = bind(udc->gadget);
+               ret = driver->bind(udc->gadget);
                if (ret)
                        goto err1;
                ret = usb_gadget_udc_start(udc->gadget, driver);
@@ -350,7 +349,7 @@ found:
                usb_gadget_connect(udc->gadget);
        } else {
 
-               ret = usb_gadget_start(udc->gadget, driver, bind);
+               ret = usb_gadget_start(udc->gadget, driver, driver->bind);
                if (ret)
                        goto err1;
 
index d05b220f0fd337dd45d940e9dce26e3be103cebe..9eb4e712168f2adf5976be4383e81a26a17d65d0 100644 (file)
@@ -766,6 +766,7 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)
  *     when the host is disconnected.  May be called in_interrupt; this
  *     may not sleep.  Some devices can't detect disconnect, so this might
  *     not be called except as part of controller shutdown.
+ * @bind: the driver's bind callback
  * @unbind: Invoked when the driver is unbound from a gadget,
  *     usually from rmmod (after a disconnect is reported).
  *     Called in a context that permits sleeping.
@@ -820,6 +821,7 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)
 struct usb_gadget_driver {
        char                    *function;
        enum usb_device_speed   max_speed;
+       int                     (*bind)(struct usb_gadget *gadget);
        void                    (*unbind)(struct usb_gadget *);
        int                     (*setup)(struct usb_gadget *,
                                        const struct usb_ctrlrequest *);
@@ -845,7 +847,6 @@ struct usb_gadget_driver {
 /**
  * usb_gadget_probe_driver - probe a gadget driver
  * @driver: the driver being registered
- * @bind: the driver's bind callback
  * Context: can sleep
  *
  * Call this in your gadget driver's module initialization function,
@@ -854,8 +855,7 @@ struct usb_gadget_driver {
  * registration call returns.  It's expected that the @bind() function will
  * be in init sections.
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver);
 
 /**
  * usb_gadget_unregister_driver - unregister a gadget driver