]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
usb: gadget: remove global variable composite in composite.c
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Fri, 7 Sep 2012 07:53:17 +0000 (09:53 +0200)
committerFelipe Balbi <balbi@ti.com>
Mon, 10 Sep 2012 12:35:41 +0000 (15:35 +0300)
This patch removes the global variable composite in composite.c.
The private data which was saved there is now passed via an additional
argument to the bind() function in struct usb_gadget_driver.

Only the "old-style" UDC drivers have to be touched here, new style are
doing it right because this change is made in udc-core.

Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
19 files changed:
drivers/staging/ccg/composite.c
drivers/usb/gadget/amd5536udc.c
drivers/usb/gadget/composite.c
drivers/usb/gadget/dbgp.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/fsl_udc_core.c
drivers/usb/gadget/fusb300_udc.c
drivers/usb/gadget/goku_udc.c
drivers/usb/gadget/inode.c
drivers/usb/gadget/m66592-udc.c
drivers/usb/gadget/mv_udc_core.c
drivers/usb/gadget/omap_udc.c
drivers/usb/gadget/pch_udc.c
drivers/usb/gadget/pxa25x_udc.c
drivers/usb/gadget/pxa27x_udc.c
drivers/usb/gadget/s3c2410_udc.c
drivers/usb/gadget/udc-core.c
include/linux/usb/composite.h
include/linux/usb/gadget.h

index 2a345f28b9aeb11b08bbd4fb4c50d084d9738810..228b4574f2280459f053169d563b5dfbc46a6dda 100644 (file)
@@ -1422,7 +1422,8 @@ static u8 override_id(struct usb_composite_dev *cdev, u8 *desc)
        return *desc;
 }
 
-static int composite_bind(struct usb_gadget *gadget)
+static int composite_bind(struct usb_gadget *gadget,
+               struct usb_gadget_driver *driver)
 {
        struct usb_composite_dev        *cdev;
        int                             status = -ENOMEM;
index 187d21181cd5f85d6b23627bfbabb56af0301c2b..fc0ec5e0d58ef43a11f525148dca69d1cb442188 100644 (file)
@@ -1401,7 +1401,7 @@ static int udc_wakeup(struct usb_gadget *gadget)
 }
 
 static int amd5536_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int amd5536_stop(struct usb_gadget_driver *driver);
 /* gadget operations */
 static const struct usb_gadget_ops udc_ops = {
@@ -1914,7 +1914,7 @@ static int setup_ep0(struct udc *dev)
 
 /* Called by gadget driver to register itself */
 static int amd5536_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct udc              *dev = udc;
        int                     retval;
@@ -1932,7 +1932,7 @@ static int amd5536_start(struct usb_gadget_driver *driver,
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
 
-       retval = bind(&dev->gadget);
+       retval = bind(&dev->gadget, driver);
 
        /* Some gadget drivers use both ep0 directions.
         * NOTE: to gadget driver, ep0 is just one endpoint...
index 2a345f28b9aeb11b08bbd4fb4c50d084d9738810..0b6ee2012af1189a667ea10234d6061dbc2092a1 100644 (file)
@@ -31,8 +31,6 @@
 /* big enough to hold our biggest descriptor */
 #define USB_BUFSIZ     1024
 
-static struct usb_composite_driver *composite;
-
 /* Some systems will need runtime overrides for the  product identifiers
  * published in the device descriptor, either numbers or strings or both.
  * String parameters are in UTF-8 (superset of ASCII's 7 bit characters).
@@ -889,6 +887,7 @@ static int lookup_string(
 static int get_string(struct usb_composite_dev *cdev,
                void *buf, u16 language, int id)
 {
+       struct usb_composite_driver     *composite = cdev->driver;
        struct usb_configuration        *c;
        struct usb_function             *f;
        int                             len;
@@ -1359,8 +1358,8 @@ static void composite_disconnect(struct usb_gadget *gadget)
        spin_lock_irqsave(&cdev->lock, flags);
        if (cdev->config)
                reset_config(cdev);
-       if (composite->disconnect)
-               composite->disconnect(cdev);
+       if (cdev->driver->disconnect)
+               cdev->driver->disconnect(cdev);
        spin_unlock_irqrestore(&cdev->lock, flags);
 }
 
@@ -1396,8 +1395,8 @@ composite_unbind(struct usb_gadget *gadget)
                                struct usb_configuration, list);
                remove_config(cdev, c);
        }
-       if (composite->unbind)
-               composite->unbind(cdev);
+       if (cdev->driver->unbind)
+               cdev->driver->unbind(cdev);
 
        if (cdev->req) {
                kfree(cdev->req->buf);
@@ -1406,7 +1405,6 @@ composite_unbind(struct usb_gadget *gadget)
        device_remove_file(&gadget->dev, &dev_attr_suspended);
        kfree(cdev);
        set_gadget_data(gadget, NULL);
-       composite = NULL;
 }
 
 static u8 override_id(struct usb_composite_dev *cdev, u8 *desc)
@@ -1422,9 +1420,16 @@ static u8 override_id(struct usb_composite_dev *cdev, u8 *desc)
        return *desc;
 }
 
-static int composite_bind(struct usb_gadget *gadget)
+static struct usb_composite_driver *to_cdriver(struct usb_gadget_driver *gdrv)
+{
+       return container_of(gdrv, struct usb_composite_driver, gadget_driver);
+}
+
+static int composite_bind(struct usb_gadget *gadget,
+               struct usb_gadget_driver *gdriver)
 {
        struct usb_composite_dev        *cdev;
+       struct usb_composite_driver     *composite = to_cdriver(gdriver);
        int                             status = -ENOMEM;
 
        cdev = kzalloc(sizeof *cdev, GFP_KERNEL);
@@ -1546,8 +1551,8 @@ composite_suspend(struct usb_gadget *gadget)
                                f->suspend(f);
                }
        }
-       if (composite->suspend)
-               composite->suspend(cdev);
+       if (cdev->driver->suspend)
+               cdev->driver->suspend(cdev);
 
        cdev->suspended = 1;
 
@@ -1565,8 +1570,8 @@ composite_resume(struct usb_gadget *gadget)
         * suspend/resume callbacks?
         */
        DBG(cdev, "resume\n");
-       if (composite->resume)
-               composite->resume(cdev);
+       if (cdev->driver->resume)
+               cdev->driver->resume(cdev);
        if (cdev->config) {
                list_for_each_entry(f, &cdev->config->functions, list) {
                        if (f->resume)
@@ -1584,7 +1589,7 @@ composite_resume(struct usb_gadget *gadget)
 
 /*-------------------------------------------------------------------------*/
 
-static struct usb_gadget_driver composite_driver = {
+static const struct usb_gadget_driver composite_driver_template = {
        .bind           = composite_bind,
        .unbind         = composite_unbind,
 
@@ -1620,19 +1625,24 @@ static struct usb_gadget_driver composite_driver = {
  */
 int usb_composite_probe(struct usb_composite_driver *driver)
 {
-       if (!driver || !driver->dev || composite || !driver->bind)
+       struct usb_gadget_driver *gadget_driver;
+
+       if (!driver || !driver->dev || !driver->bind)
                return -EINVAL;
 
        if (!driver->name)
                driver->name = "composite";
        if (!driver->iProduct)
                driver->iProduct = driver->name;
-       composite_driver.function =  (char *) driver->name;
-       composite_driver.driver.name = driver->name;
-       composite_driver.max_speed = driver->max_speed;
-       composite = driver;
 
-       return usb_gadget_probe_driver(&composite_driver);
+       driver->gadget_driver = composite_driver_template;
+       gadget_driver = &driver->gadget_driver;
+
+       gadget_driver->function =  (char *) driver->name;
+       gadget_driver->driver.name = driver->name;
+       gadget_driver->max_speed = driver->max_speed;
+
+       return usb_gadget_probe_driver(gadget_driver);
 }
 
 /**
@@ -1644,9 +1654,7 @@ int usb_composite_probe(struct usb_composite_driver *driver)
  */
 void usb_composite_unregister(struct usb_composite_driver *driver)
 {
-       if (composite != driver)
-               return;
-       usb_gadget_unregister_driver(&composite_driver);
+       usb_gadget_unregister_driver(&driver->gadget_driver);
 }
 
 /**
index df9a0104bdf2de358c541ff697c80f06631003b6..cc1746597aab07c3633618510ccc2283dc3feea8 100644 (file)
@@ -292,7 +292,8 @@ fail_1:
        return -ENODEV;
 }
 
-static int __init dbgp_bind(struct usb_gadget *gadget)
+static int __init dbgp_bind(struct usb_gadget *gadget,
+               struct usb_gadget_driver *driver)
 {
        int err, stp;
 
index ce186fa7e7b2e2543092cad080897598f7dfc9af..cdacae706b7069f0e14ca025ccb3f83ab4a147f9 100644 (file)
@@ -3331,7 +3331,8 @@ static int __init check_parameters(struct fsg_dev *fsg)
 }
 
 
-static int __init fsg_bind(struct usb_gadget *gadget)
+static int __init fsg_bind(struct usb_gadget *gadget,
+               struct usb_gadget_driver *driver)
 {
        struct fsg_dev          *fsg = the_fsg;
        int                     rc;
index 3def828f85e7fe5ad31a3eaf5c4bf5e71bbf1458..6ae70cba0c4a99684b51b3e8cbbce890c63aaff1 100644 (file)
@@ -1255,7 +1255,7 @@ static int fsl_pullup(struct usb_gadget *gadget, int is_on)
 }
 
 static int fsl_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int fsl_stop(struct usb_gadget_driver *driver);
 /* defined in gadget.h */
 static struct usb_gadget_ops fsl_gadget_ops = {
@@ -1951,7 +1951,7 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
  * Called by initialization code of gadget drivers
 *----------------------------------------------------------------*/
 static int fsl_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        int retval = -ENODEV;
        unsigned long flags = 0;
@@ -1976,7 +1976,7 @@ static int fsl_start(struct usb_gadget_driver *driver,
        spin_unlock_irqrestore(&udc_controller->lock, flags);
 
        /* bind udc driver to gadget driver */
-       retval = bind(&udc_controller->gadget);
+       retval = bind(&udc_controller->gadget, driver);
        if (retval) {
                VDBG("bind to %s --> %d", driver->driver.name, retval);
                udc_controller->gadget.dev.driver = NULL;
index cdd94540e1cdf7d1c9ead21f2a6a8b29c6f46f16..72cd5e6719db3e4fde63929b19e579f2fc897ee0 100644 (file)
@@ -1311,7 +1311,7 @@ static void init_controller(struct fusb300 *fusb300)
 static struct fusb300 *the_controller;
 
 static int fusb300_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct fusb300 *fusb300 = the_controller;
        int retval;
@@ -1339,7 +1339,7 @@ static int fusb300_udc_start(struct usb_gadget_driver *driver,
                goto error;
        }
 
-       retval = bind(&fusb300->gadget);
+       retval = bind(&fusb300->gadget, driver);
        if (retval) {
                pr_err("bind to driver error (%d)\n", retval);
                device_del(&fusb300->gadget.dev);
index 9fd7886cfa9a7aac60035d7357e5ed00bfff40ff..51037cb7860421bacfa34430f5d6906e0f4a7bb8 100644 (file)
@@ -994,7 +994,7 @@ static int goku_get_frame(struct usb_gadget *_gadget)
 }
 
 static int goku_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int goku_stop(struct usb_gadget_driver *driver);
 
 static const struct usb_gadget_ops goku_ops = {
@@ -1348,7 +1348,7 @@ static struct goku_udc    *the_controller;
  * the driver might get unbound.
  */
 static int goku_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct goku_udc *dev = the_controller;
        int                     retval;
@@ -1368,7 +1368,7 @@ static int goku_start(struct usb_gadget_driver *driver,
        driver->driver.bus = NULL;
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
-       retval = bind(&dev->gadget);
+       retval = bind(&dev->gadget, driver);
        if (retval) {
                DBG(dev, "bind to driver %s --> error %d\n",
                                driver->driver.name, retval);
index 2521804ba4eec4e387c39cd77cc55ac2d75af892..4bb6d53f2de3ff1bc3b97c05a28a8705a133e7a0 100644 (file)
@@ -1679,8 +1679,8 @@ gadgetfs_unbind (struct usb_gadget *gadget)
 
 static struct dev_data         *the_device;
 
-static int
-gadgetfs_bind (struct usb_gadget *gadget)
+static int gadgetfs_bind(struct usb_gadget *gadget,
+               struct usb_gadget_driver *driver)
 {
        struct dev_data         *dev = the_device;
 
@@ -1773,7 +1773,8 @@ static struct usb_gadget_driver gadgetfs_driver = {
 
 static void gadgetfs_nop(struct usb_gadget *arg) { }
 
-static int gadgetfs_probe (struct usb_gadget *gadget)
+static int gadgetfs_probe(struct usb_gadget *gadget,
+               struct usb_gadget_driver *driver)
 {
        CHIP = gadget->name;
        return -EISNAM;
index cf6bd626f3fe1e3731b062328226b842a84fcb50..b6401f1b56ce216226c9b5decfa97035ff24b684 100644 (file)
@@ -1466,7 +1466,7 @@ static struct usb_ep_ops m66592_ep_ops = {
 static struct m66592 *the_controller;
 
 static int m66592_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct m66592 *m66592 = the_controller;
        int retval;
@@ -1492,7 +1492,7 @@ static int m66592_start(struct usb_gadget_driver *driver,
                goto error;
        }
 
-       retval = bind(&m66592->gadget);
+       retval = bind(&m66592->gadget, driver);
        if (retval) {
                pr_err("bind to driver error (%d)\n", retval);
                device_del(&m66592->gadget.dev);
index ad91de4d60d8694ad5e736f5e233b993c5113c3c..ea45224f78c877175004cbc897426161ad0cd965 100644 (file)
@@ -1269,7 +1269,7 @@ static int mv_udc_pullup(struct usb_gadget *gadget, int is_on)
 }
 
 static int mv_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int mv_udc_stop(struct usb_gadget_driver *driver);
 /* device controller usb_gadget_ops structure */
 static const struct usb_gadget_ops mv_ops = {
@@ -1374,7 +1374,7 @@ static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver)
 }
 
 static int mv_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct mv_udc *udc = the_controller;
        int retval = 0;
@@ -1399,7 +1399,7 @@ static int mv_udc_start(struct usb_gadget_driver *driver,
 
        spin_unlock_irqrestore(&udc->lock, flags);
 
-       retval = bind(&udc->gadget);
+       retval = bind(&udc->gadget, driver);
        if (retval) {
                dev_err(&udc->dev->dev, "bind to driver %s --> %d\n",
                                driver->driver.name, retval);
index f9132ada53b5e267a3bff86aa89bb9e1d037b0f9..2a4749c3eb3f7bd7679f768ca5cdab27de0db72f 100644 (file)
@@ -1308,7 +1308,7 @@ static int omap_pullup(struct usb_gadget *gadget, int is_on)
 }
 
 static int omap_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int omap_udc_stop(struct usb_gadget_driver *driver);
 
 static struct usb_gadget_ops omap_gadget_ops = {
@@ -2040,7 +2040,7 @@ static inline int machine_without_vbus_sense(void)
 }
 
 static int omap_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        int             status = -ENODEV;
        struct omap_ep  *ep;
@@ -2082,7 +2082,7 @@ static int omap_udc_start(struct usb_gadget_driver *driver,
        if (udc->dc_clk != NULL)
                omap_udc_enable_clock(1);
 
-       status = bind(&udc->gadget);
+       status = bind(&udc->gadget, driver);
        if (status) {
                DBG("bind to %s --> %d\n", driver->driver.name, status);
                udc->gadget.dev.driver = NULL;
index f4fb71c9ae0816d18f18c8b1771cb2f4f8da42e2..6490c0040e3adcc02ea608320412fcfb25aa5241 100644 (file)
@@ -1236,7 +1236,7 @@ static int pch_udc_pcd_vbus_draw(struct usb_gadget *gadget, unsigned int mA)
 }
 
 static int pch_udc_start(struct usb_gadget_driver *driver,
-       int (*bind)(struct usb_gadget *));
+       int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int pch_udc_stop(struct usb_gadget_driver *driver);
 static const struct usb_gadget_ops pch_udc_ops = {
        .get_frame = pch_udc_pcd_get_frame,
@@ -2982,7 +2982,7 @@ static int init_dma_pools(struct pch_udc_dev *dev)
 }
 
 static int pch_udc_start(struct usb_gadget_driver *driver,
-       int (*bind)(struct usb_gadget *))
+       int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct pch_udc_dev      *dev = pch_udc;
        int                     retval;
@@ -3006,7 +3006,7 @@ static int pch_udc_start(struct usb_gadget_driver *driver,
        dev->gadget.dev.driver = &driver->driver;
 
        /* Invoke the bind routine of the gadget driver */
-       retval = bind(&dev->gadget);
+       retval = bind(&dev->gadget, driver);
 
        if (retval) {
                dev_err(&dev->pdev->dev, "%s: binding to %s returning %d\n",
index c246c08a242d6da248b97757f8f56b1b2b386c29..8efbf08c35614dbcd8f3e6138b4cebb55b75e095 100644 (file)
@@ -999,7 +999,7 @@ static int pxa25x_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
 }
 
 static int pxa25x_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int pxa25x_stop(struct usb_gadget_driver *driver);
 
 static const struct usb_gadget_ops pxa25x_udc_ops = {
@@ -1257,7 +1257,7 @@ static void udc_enable (struct pxa25x_udc *dev)
  * the driver might get unbound.
  */
 static int pxa25x_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct pxa25x_udc       *dev = the_controller;
        int                     retval;
@@ -1285,7 +1285,7 @@ fail:
                dev->gadget.dev.driver = NULL;
                return retval;
        }
-       retval = bind(&dev->gadget);
+       retval = bind(&dev->gadget, driver);
        if (retval) {
                DMSG("bind to driver %s --> error %d\n",
                                driver->driver.name, retval);
index 644b4305cb99fe1653ac8f9d0b5021ac4d8945a1..979ddaddb0f815e740dc7304c6d632a24caf7b68 100644 (file)
@@ -1672,7 +1672,7 @@ static int pxa_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
 }
 
 static int pxa27x_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int pxa27x_udc_stop(struct usb_gadget_driver *driver);
 
 static const struct usb_gadget_ops pxa_udc_ops = {
@@ -1803,7 +1803,7 @@ static void udc_enable(struct pxa_udc *udc)
  * Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise
  */
 static int pxa27x_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct pxa_udc *udc = the_controller;
        int retval;
@@ -1826,7 +1826,7 @@ static int pxa27x_udc_start(struct usb_gadget_driver *driver,
                dev_err(udc->dev, "device_add error %d\n", retval);
                goto add_fail;
        }
-       retval = bind(&udc->gadget);
+       retval = bind(&udc->gadget, driver);
        if (retval) {
                dev_err(udc->dev, "bind to driver %s --> error %d\n",
                        driver->driver.name, retval);
index b627c9b51fda084d615f95dd49f4ddad3ce45e20..c33e942d119c0fc1c9a776693c7ea45fbcd7c0f6 100644 (file)
@@ -1539,7 +1539,7 @@ static int s3c2410_vbus_draw(struct usb_gadget *_gadget, unsigned ma)
 }
 
 static int s3c2410_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *));
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
 static int s3c2410_udc_stop(struct usb_gadget_driver *driver);
 
 static const struct usb_gadget_ops s3c2410_ops = {
@@ -1665,7 +1665,7 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev)
 }
 
 static int s3c2410_udc_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        struct s3c2410_udc *udc = the_controller;
        int             retval;
@@ -1705,7 +1705,7 @@ static int s3c2410_udc_start(struct usb_gadget_driver *driver,
        dprintk(DEBUG_NORMAL, "binding gadget driver '%s'\n",
                driver->driver.name);
 
-       retval = bind(&udc->gadget);
+       retval = bind(&udc->gadget, driver);
        if (retval) {
                device_del(&udc->gadget.dev);
                goto register_error;
index 85e1e2fdd403c7ca39b0a891e7d1e6ff1a54a28d..f3cd9690b101d6945fca7924e40ebfdd5df608f1 100644 (file)
@@ -118,7 +118,7 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
  */
 static inline int usb_gadget_start(struct usb_gadget *gadget,
                struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+               int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
 {
        return gadget->ops->start(driver, bind);
 }
@@ -338,7 +338,7 @@ found:
        udc->dev.driver = &driver->driver;
 
        if (udc_is_newstyle(udc)) {
-               ret = driver->bind(udc->gadget);
+               ret = driver->bind(udc->gadget, driver);
                if (ret)
                        goto err1;
                ret = usb_gadget_udc_start(udc->gadget, driver);
index 19a5adf18bf430d5d3c30662e1bac5deab8e0a42..43d6b9ca51b7ab14e4cb64d9ac30cfe37d6f7064 100644 (file)
@@ -303,6 +303,7 @@ struct usb_composite_driver {
        /* global suspend hooks */
        void                    (*suspend)(struct usb_composite_dev *);
        void                    (*resume)(struct usb_composite_dev *);
+       struct usb_gadget_driver                gadget_driver;
 };
 
 extern int usb_composite_probe(struct usb_composite_driver *driver);
index 9eb4e712168f2adf5976be4383e81a26a17d65d0..822c1b88f95a70084d916660fce9fc0b10a5eabe 100644 (file)
@@ -474,7 +474,8 @@ struct usb_gadget_ops {
 
        /* Those two are deprecated */
        int     (*start)(struct usb_gadget_driver *,
-                       int (*bind)(struct usb_gadget *));
+                       int (*bind)(struct usb_gadget *,
+                               struct usb_gadget_driver *driver));
        int     (*stop)(struct usb_gadget_driver *);
 };
 
@@ -821,7 +822,8 @@ 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);
+       int                     (*bind)(struct usb_gadget *gadget,
+                                       struct usb_gadget_driver *driver);
        void                    (*unbind)(struct usb_gadget *);
        int                     (*setup)(struct usb_gadget *,
                                        const struct usb_ctrlrequest *);