usb: gadget: convert all users to the new udc infrastructure
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Tue, 28 Jun 2011 13:33:47 +0000 (16:33 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 28 Jun 2011 18:13:35 +0000 (11:13 -0700)
peripheral drivers are using usb_add_gadget()/usb_del_gadget() to
register/unregister to the udc-core.

The udc-core will take the first available gadget driver and attach
function driver which is calling usb_gadget_register_driver(). This is
the same behaviour we have right now.

Only dummy_hcd was tested, the others were compiled tested.

Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Anton Tikhomirov <av.tikhomirov@samsung.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Cc: Dan Carpenter <error27@gmail.com>
Cc: Darius Augulis <augulis.darius@gmail.com>
Cc: Eric Miao <eric.y.miao@gmail.com>
Cc: Jingoo Han <jg1.han@samsung.com>
Cc: Kukjin Kim <kgene.kim@samsung.com>
Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Cc: Li Yang <leoli@freescale.com>
Cc: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
Cc: Pavankumar Kondeti <pkondeti@codeaurora.org>
Cc: Roy Huang <roy.huang@analog.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Toshiharu Okada <toshiharu-linux@dsn.okisemi.com>
Cc: Xiaochen Shen <xiaochen.shen@intel.com>
Cc: Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
Cc: Yuan-Hsin Chen <yhchen@faraday-tech.com>
Cc: cxie4 <cxie4@marvell.com>
Cc: linux-geode@lists.infradead.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
26 files changed:
drivers/usb/gadget/Makefile
drivers/usb/gadget/amd5536udc.c
drivers/usb/gadget/at91_udc.c
drivers/usb/gadget/atmel_usba_udc.c
drivers/usb/gadget/ci13xxx_udc.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/fsl_qe_udc.c
drivers/usb/gadget/fsl_udc_core.c
drivers/usb/gadget/fusb300_udc.c
drivers/usb/gadget/goku_udc.c
drivers/usb/gadget/imx_udc.c
drivers/usb/gadget/langwell_udc.c
drivers/usb/gadget/m66592-udc.c
drivers/usb/gadget/mv_udc_core.c
drivers/usb/gadget/net2272.c
drivers/usb/gadget/net2280.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/r8a66597-udc.c
drivers/usb/gadget/s3c-hsotg.c
drivers/usb/gadget/s3c-hsudc.c
drivers/usb/gadget/s3c2410_udc.c
drivers/usb/musb/musb_gadget.c
drivers/usb/renesas_usbhs/mod_gadget.c

index 3452617..9ba725a 100644 (file)
@@ -3,6 +3,7 @@
 #
 ccflags-$(CONFIG_USB_GADGET_DEBUG) := -DDEBUG
 
+obj-$(CONFIG_USB_GADGET)       += udc-core.o
 obj-$(CONFIG_USB_DUMMY_HCD)    += dummy_hcd.o
 obj-$(CONFIG_USB_NET2272)      += net2272.o
 obj-$(CONFIG_USB_NET2280)      += net2280.o
index 95e8138..70f2b37 100644 (file)
@@ -1438,10 +1438,15 @@ static int udc_wakeup(struct usb_gadget *gadget)
        return 0;
 }
 
+static int amd5536_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int amd5536_stop(struct usb_gadget_driver *driver);
 /* gadget operations */
 static const struct usb_gadget_ops udc_ops = {
        .wakeup         = udc_wakeup,
        .get_frame      = udc_get_frame,
+       .start          = amd5536_start,
+       .stop           = amd5536_stop,
 };
 
 /* Setups endpoint parameters, adds endpoints to linked list */
@@ -1955,7 +1960,7 @@ static int setup_ep0(struct udc *dev)
 }
 
 /* Called by gadget driver to register itself */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int amd5536_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct udc              *dev = udc;
@@ -2002,7 +2007,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /* shutdown requests and disconnect from gadget */
 static void
@@ -2027,7 +2031,7 @@ __acquires(dev->lock)
 }
 
 /* Called by gadget driver to unregister itself */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int amd5536_stop(struct usb_gadget_driver *driver)
 {
        struct udc      *dev = udc;
        unsigned long   flags;
@@ -2057,8 +2061,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
-
 
 /* Clear pending NAK bits */
 static void udc_process_cnak_queue(struct udc *dev)
@@ -3134,6 +3136,7 @@ static void udc_pci_remove(struct pci_dev *pdev)
 
        dev = pci_get_drvdata(pdev);
 
+       usb_del_gadget_udc(&udc->gadget);
        /* gadget driver must not be registered */
        BUG_ON(dev->driver != NULL);
 
@@ -3382,8 +3385,13 @@ static int udc_probe(struct udc *dev)
                "driver version: %s(for Geode5536 B1)\n", tmp);
        udc = dev;
 
+       retval = usb_add_gadget_udc(&udc->pdev->dev, &dev->gadget);
+       if (retval)
+               goto finished;
+
        retval = device_register(&dev->gadget.dev);
        if (retval) {
+               usb_del_gadget_udc(&dev->gadget);
                put_device(&dev->gadget.dev);
                goto finished;
        }
index f4690ff..98cbc06 100644 (file)
@@ -985,12 +985,18 @@ static int at91_set_selfpowered(struct usb_gadget *gadget, int is_on)
        return 0;
 }
 
+static int at91_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int at91_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops at91_udc_ops = {
        .get_frame              = at91_get_frame,
        .wakeup                 = at91_wakeup,
        .set_selfpowered        = at91_set_selfpowered,
        .vbus_session           = at91_vbus_session,
        .pullup                 = at91_pullup,
+       .start                  = at91_start,
+       .stop                   = at91_stop,
 
        /*
         * VBUS-powered devices may also also want to support bigger
@@ -1628,7 +1634,7 @@ static void at91_vbus_timer(unsigned long data)
                schedule_work(&udc->vbus_timer_work);
 }
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int at91_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct at91_udc *udc = &controller;
@@ -1672,9 +1678,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
        DBG("bound to %s\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
+static int at91_stop(struct usb_gadget_driver *driver)
 {
        struct at91_udc *udc = &controller;
        unsigned long   flags;
@@ -1696,7 +1701,6 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
        DBG("unbound from %s\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL (usb_gadget_unregister_driver);
 
 /*-------------------------------------------------------------------------*/
 
@@ -1854,13 +1858,18 @@ static int __init at91udc_probe(struct platform_device *pdev)
                DBG("no VBUS detection, assuming always-on\n");
                udc->vbus = 1;
        }
+       retval = usb_add_gadget_udc(dev, &udc->gadget);
+       if (retval)
+               goto fail4;
        dev_set_drvdata(dev, udc);
        device_init_wakeup(dev, 1);
        create_debug_file(udc);
 
        INFO("%s version %s\n", driver_name, DRIVER_VERSION);
        return 0;
-
+fail4:
+       if (udc->board.vbus_pin > 0 && !udc->board.vbus_polled)
+               free_irq(udc->board.vbus_pin, udc);
 fail3:
        if (udc->board.vbus_pin > 0)
                gpio_free(udc->board.vbus_pin);
@@ -1887,6 +1896,7 @@ static int __exit at91udc_remove(struct platform_device *pdev)
 
        DBG("remove\n");
 
+       usb_del_gadget_udc(&udc->gadget);
        if (udc->driver)
                return -EBUSY;
 
index db1a659..e6b970a 100644 (file)
@@ -1007,10 +1007,16 @@ usba_udc_set_selfpowered(struct usb_gadget *gadget, int is_selfpowered)
        return 0;
 }
 
+static int atmel_usba_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int atmel_usba_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops usba_udc_ops = {
        .get_frame              = usba_udc_get_frame,
        .wakeup                 = usba_udc_wakeup,
        .set_selfpowered        = usba_udc_set_selfpowered,
+       .start                  = atmel_usba_start,
+       .stop                   = atmel_usba_stop,
 };
 
 static struct usb_endpoint_descriptor usba_ep0_desc = {
@@ -1789,7 +1795,7 @@ out:
        return IRQ_HANDLED;
 }
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int atmel_usba_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct usba_udc *udc = &the_udc;
@@ -1842,9 +1848,8 @@ err_driver_bind:
        udc->gadget.dev.driver = NULL;
        return ret;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int atmel_usba_stop(struct usb_gadget_driver *driver)
 {
        struct usba_udc *udc = &the_udc;
        unsigned long flags;
@@ -1880,7 +1885,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 static int __init usba_udc_probe(struct platform_device *pdev)
 {
@@ -2021,12 +2025,24 @@ static int __init usba_udc_probe(struct platform_device *pdev)
                }
        }
 
+       ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
+       if (ret)
+               goto err_add_udc;
+
        usba_init_debugfs(udc);
        for (i = 1; i < pdata->num_ep; i++)
                usba_ep_init_debugfs(udc, &usba_ep[i]);
 
        return 0;
 
+err_add_udc:
+       if (gpio_is_valid(pdata->vbus_pin)) {
+               free_irq(gpio_to_irq(udc->vbus_pin), udc);
+               gpio_free(udc->vbus_pin);
+       }
+
+       device_unregister(&udc->gadget.dev);
+
 err_device_add:
        free_irq(irq, udc);
 err_request_irq:
@@ -2053,6 +2069,8 @@ static int __exit usba_udc_remove(struct platform_device *pdev)
 
        udc = platform_get_drvdata(pdev);
 
+       usb_del_gadget_udc(&udc->gadget);
+
        for (i = 1; i < pdata->num_ep; i++)
                usba_ep_cleanup_debugfs(&usba_ep[i]);
        usba_cleanup_debugfs(udc);
index baaf87e..909bc45 100644 (file)
@@ -857,7 +857,7 @@ static void dbg_print(u8 addr, const char *name, int status, const char *extra)
        stamp = stamp * 1000000 + tval.tv_usec;
 
        scnprintf(dbg_data.buf[dbg_data.idx], DBG_DATA_MSG,
-                 "%04X\t» %02X %-7.7s %4i Â«\t%s\n",
+                 "%04X\t? %02X %-7.7s %4i ?\t%s\n",
                  stamp, addr, name, status, extra);
 
        dbg_inc(&dbg_data.idx);
@@ -865,7 +865,7 @@ static void dbg_print(u8 addr, const char *name, int status, const char *extra)
        write_unlock_irqrestore(&dbg_data.lck, flags);
 
        if (dbg_data.tty != 0)
-               pr_notice("%04X\t» %02X %-7.7s %4i Â«\t%s\n",
+               pr_notice("%04X\t? %02X %-7.7s %4i ?\t%s\n",
                          stamp, addr, name, status, extra);
 }
 
@@ -1025,15 +1025,15 @@ static ssize_t show_inters(struct device *dev, struct device_attribute *attr,
 
        n += scnprintf(buf + n, PAGE_SIZE - n, "*test = %d\n",
                       isr_statistics.test);
-       n += scnprintf(buf + n, PAGE_SIZE - n, "» ui  = %d\n",
+       n += scnprintf(buf + n, PAGE_SIZE - n, "? ui  = %d\n",
                       isr_statistics.ui);
-       n += scnprintf(buf + n, PAGE_SIZE - n, "» uei = %d\n",
+       n += scnprintf(buf + n, PAGE_SIZE - n, "? uei = %d\n",
                       isr_statistics.uei);
-       n += scnprintf(buf + n, PAGE_SIZE - n, "» pci = %d\n",
+       n += scnprintf(buf + n, PAGE_SIZE - n, "? pci = %d\n",
                       isr_statistics.pci);
-       n += scnprintf(buf + n, PAGE_SIZE - n, "» uri = %d\n",
+       n += scnprintf(buf + n, PAGE_SIZE - n, "? uri = %d\n",
                       isr_statistics.uri);
-       n += scnprintf(buf + n, PAGE_SIZE - n, "» sli = %d\n",
+       n += scnprintf(buf + n, PAGE_SIZE - n, "? sli = %d\n",
                       isr_statistics.sli);
        n += scnprintf(buf + n, PAGE_SIZE - n, "*none = %d\n",
                       isr_statistics.none);
@@ -2515,6 +2515,9 @@ static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
        return -ENOTSUPP;
 }
 
+static int ci13xxx_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int ci13xxx_stop(struct usb_gadget_driver *driver);
 /**
  * Device operations part of the API to the USB controller hardware,
  * which don't involve endpoints (or i/o)
@@ -2524,17 +2527,19 @@ static const struct usb_gadget_ops usb_gadget_ops = {
        .vbus_session   = ci13xxx_vbus_session,
        .wakeup         = ci13xxx_wakeup,
        .vbus_draw      = ci13xxx_vbus_draw,
+       .start          = ci13xxx_start,
+       .stop           = ci13xxx_stop,
 };
 
 /**
- * usb_gadget_probe_driver: register a gadget driver
+ * ci13xxx_start: register a gadget driver
  * @driver: the driver being registered
  * @bind: the driver's bind callback
  *
- * Check usb_gadget_probe_driver() at <linux/usb/gadget.h> for details.
+ * Check ci13xxx_start() at <linux/usb/gadget.h> for details.
  * Interrupts are enabled here.
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int ci13xxx_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct ci13xxx *udc = _udc;
@@ -2657,14 +2662,13 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
        spin_unlock_irqrestore(udc->lock, flags);
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /**
- * usb_gadget_unregister_driver: unregister a gadget driver
+ * ci13xxx_stop: unregister a gadget driver
  *
  * Check usb_gadget_unregister_driver() at "usb_gadget.h" for details
  */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int ci13xxx_stop(struct usb_gadget_driver *driver)
 {
        struct ci13xxx *udc = _udc;
        unsigned long i, flags;
@@ -2726,7 +2730,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /******************************************************************************
  * BUS block
@@ -2901,12 +2904,23 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev,
                if (retval)
                        goto remove_dbg;
        }
+
+       retval = usb_add_gadget_udc(dev, &udc->gadget);
+       if (retval)
+               goto remove_trans;
+
        pm_runtime_no_callbacks(&udc->gadget.dev);
        pm_runtime_enable(&udc->gadget.dev);
 
        _udc = udc;
        return retval;
 
+remove_trans:
+       if (udc->transceiver) {
+               otg_set_peripheral(udc->transceiver, &udc->gadget);
+               otg_put_transceiver(udc->transceiver);
+       }
+
        err("error = %i", retval);
 remove_dbg:
 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
@@ -2936,6 +2950,7 @@ static void udc_remove(void)
                err("EINVAL");
                return;
        }
+       usb_del_gadget_udc(&udc->gadget);
 
        if (udc->transceiver) {
                otg_set_peripheral(udc->transceiver, &udc->gadget);
index d3dcabc..d47a565 100644 (file)
@@ -710,11 +710,17 @@ static int dummy_pullup (struct usb_gadget *_gadget, int value)
        return 0;
 }
 
+static int dummy_udc_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int dummy_udc_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops dummy_ops = {
        .get_frame      = dummy_g_get_frame,
        .wakeup         = dummy_wakeup,
        .set_selfpowered = dummy_set_selfpowered,
        .pullup         = dummy_pullup,
+       .start          = dummy_udc_start,
+       .stop           = dummy_udc_stop,
 };
 
 /*-------------------------------------------------------------------------*/
@@ -747,8 +753,7 @@ static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);
  * for each driver that registers:  just add to a big root hub.
  */
 
-int
-usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int dummy_udc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct dummy    *dum = the_controller;
@@ -812,10 +817,8 @@ usb_gadget_probe_driver(struct usb_gadget_driver *driver,
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int
-usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
+static int dummy_udc_stop(struct usb_gadget_driver *driver)
 {
        struct dummy    *dum = the_controller;
        unsigned long   flags;
@@ -845,7 +848,6 @@ usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
        return 0;
 }
-EXPORT_SYMBOL (usb_gadget_unregister_driver);
 
 #undef is_enabled
 
@@ -892,11 +894,20 @@ static int dummy_udc_probe (struct platform_device *pdev)
                return rc;
        }
 
+       rc = usb_add_gadget_udc(&pdev->dev, &dum->gadget);
+       if (rc < 0)
+               goto err_udc;
+
        rc = device_create_file (&dum->gadget.dev, &dev_attr_function);
        if (rc < 0)
-               device_unregister (&dum->gadget.dev);
-       else
-               platform_set_drvdata(pdev, dum);
+               goto err_dev;
+       platform_set_drvdata(pdev, dum);
+       return rc;
+
+err_dev:
+       usb_del_gadget_udc(&dum->gadget);
+err_udc:
+       device_unregister(&dum->gadget.dev);
        return rc;
 }
 
@@ -904,6 +915,7 @@ static int dummy_udc_remove (struct platform_device *pdev)
 {
        struct dummy    *dum = platform_get_drvdata (pdev);
 
+       usb_del_gadget_udc(&dum->gadget);
        platform_set_drvdata (pdev, NULL);
        device_remove_file (&dum->gadget.dev, &dev_attr_function);
        device_unregister (&dum->gadget.dev);
@@ -1863,7 +1875,6 @@ static void dummy_stop (struct usb_hcd *hcd)
        dum = hcd_to_dummy (hcd);
 
        device_remove_file (dummy_dev(dum), &dev_attr_urbs);
-       usb_gadget_unregister_driver (dum->driver);
        dev_info (dummy_dev(dum), "stopped\n");
 }
 
index 3a68e09..3bf872e 100644 (file)
@@ -1927,6 +1927,10 @@ static int qe_pullup(struct usb_gadget *gadget, int is_on)
        return -ENOTSUPP;
 }
 
+static int fsl_qe_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int fsl_qe_stop(struct usb_gadget_driver *driver);
+
 /* defined in usb_gadget.h */
 static struct usb_gadget_ops qe_gadget_ops = {
        .get_frame = qe_get_frame,
@@ -1935,6 +1939,8 @@ static struct usb_gadget_ops qe_gadget_ops = {
        .vbus_session = qe_vbus_session,
        .vbus_draw = qe_vbus_draw,
        .pullup = qe_pullup,
+       .start = fsl_qe_start,
+       .stop = fsl_qe_stop,
 };
 
 /*-------------------------------------------------------------------------
@@ -2320,7 +2326,7 @@ static irqreturn_t qe_udc_irq(int irq, void *_udc)
 /*-------------------------------------------------------------------------
        Gadget driver probe and unregister.
  --------------------------------------------------------------------------*/
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int fsl_qe_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        int retval;
@@ -2369,9 +2375,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
                udc_controller->gadget.name, driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int fsl_qe_stop(struct usb_gadget_driver *driver)
 {
        struct qe_ep *loop_ep;
        unsigned long flags;
@@ -2411,7 +2416,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
                        driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /* udc structure's alloc and setup, include ep-param alloc */
 static struct qe_udc __devinit *qe_udc_config(struct platform_device *ofdev)
@@ -2662,11 +2666,17 @@ static int __devinit qe_udc_probe(struct platform_device *ofdev)
        if (ret)
                goto err6;
 
+       ret = usb_add_gadget_udc(&ofdev->dev, &udc_controller->gadget);
+       if (ret)
+               goto err7;
+
        dev_info(udc_controller->dev,
                        "%s USB controller initialized as device\n",
                        (udc_controller->soc_type == PORT_QE) ? "QE" : "CPM");
        return 0;
 
+err7:
+       device_unregister(&udc_controller->gadget.dev);
 err6:
        free_irq(udc_controller->usb_irq, udc_controller);
 err5:
@@ -2721,6 +2731,8 @@ static int __devexit qe_udc_remove(struct platform_device *ofdev)
        if (!udc_controller)
                return -ENODEV;
 
+       usb_del_gadget_udc(&udc_controller->gadget);
+
        udc_controller->done = &done;
        tasklet_disable(&udc_controller->rx_tasklet);
 
index 2cd9a60..5e3dbed 100644 (file)
@@ -1232,6 +1232,9 @@ static int fsl_pullup(struct usb_gadget *gadget, int is_on)
        return 0;
 }
 
+static int fsl_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int fsl_stop(struct usb_gadget_driver *driver);
 /* defined in gadget.h */
 static struct usb_gadget_ops fsl_gadget_ops = {
        .get_frame = fsl_get_frame,
@@ -1240,6 +1243,8 @@ static struct usb_gadget_ops fsl_gadget_ops = {
        .vbus_session = fsl_vbus_session,
        .vbus_draw = fsl_vbus_draw,
        .pullup = fsl_pullup,
+       .start = fsl_start,
+       .stop = fsl_stop,
 };
 
 /* Set protocol stall on ep0, protocol stall will automatically be cleared
@@ -1908,7 +1913,7 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
  * Hook to gadget drivers
  * Called by initialization code of gadget drivers
 *----------------------------------------------------------------*/
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int fsl_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        int retval = -ENODEV;
@@ -1976,10 +1981,9 @@ out:
                       retval);
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 /* Disconnect from gadget driver */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int fsl_stop(struct usb_gadget_driver *driver)
 {
        struct fsl_ep *loop_ep;
        unsigned long flags;
@@ -2022,7 +2026,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
               driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /*-------------------------------------------------------------------------
                PROC File System Support
@@ -2578,9 +2581,16 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
                ret = -ENOMEM;
                goto err_unregister;
        }
+
+       ret = usb_add_gadget_udc(&pdev->dev, &udc_controller->gadget);
+       if (ret)
+               goto err_del_udc;
+
        create_proc_file();
        return 0;
 
+err_del_udc:
+       dma_pool_destroy(udc_controller->td_pool);
 err_unregister:
        device_unregister(&udc_controller->gadget.dev);
 err_free_irq:
@@ -2612,6 +2622,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
 
        if (!udc_controller)
                return -ENODEV;
+
+       usb_del_gadget_udc(&udc_controller->gadget);
        udc_controller->done = &done;
 
        fsl_udc_clk_release();
index b82a114..06353e7 100644 (file)
@@ -1495,7 +1495,7 @@ static void init_controller(struct fusb300 *fusb300)
 /*------------------------------------------------------------------------*/
 static struct fusb300 *the_controller;
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int fusb300_udc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct fusb300 *fusb300 = the_controller;
@@ -1539,9 +1539,8 @@ error:
 
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int fusb300_udc_stop(struct usb_gadget_driver *driver)
 {
        struct fusb300 *fusb300 = the_controller;
 
@@ -1557,7 +1556,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 /*--------------------------------------------------------------------------*/
 
 static int fusb300_udc_pullup(struct usb_gadget *_gadget, int is_active)
@@ -1567,12 +1565,15 @@ static int fusb300_udc_pullup(struct usb_gadget *_gadget, int is_active)
 
 static struct usb_gadget_ops fusb300_gadget_ops = {
        .pullup         = fusb300_udc_pullup,
+       .start          = fusb300_udc_start,
+       .stop           = fusb300_udc_stop,
 };
 
 static int __exit fusb300_remove(struct platform_device *pdev)
 {
        struct fusb300 *fusb300 = dev_get_drvdata(&pdev->dev);
 
+       usb_del_gadget_udc(&fusb300->gadget);
        iounmap(fusb300->reg);
        free_irq(platform_get_irq(pdev, 0), fusb300);
 
@@ -1697,9 +1698,15 @@ static int __init fusb300_probe(struct platform_device *pdev)
                goto clean_up3;
 
        init_controller(fusb300);
+       ret = usb_add_gadget_udc(&pdev->dev, &fusb300->gadget);
+       if (ret)
+               goto err_add_udc;
+
        dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
 
        return 0;
+err_add_udc:
+       fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req);
 
 clean_up3:
        free_irq(ires->start, fusb300);
index bf6e11c..7f87805 100644 (file)
@@ -996,8 +996,14 @@ static int goku_get_frame(struct usb_gadget *_gadget)
        return -EOPNOTSUPP;
 }
 
+static int goku_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int goku_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops goku_ops = {
        .get_frame      = goku_get_frame,
+       .start          = goku_start,
+       .stop           = goku_stop,
        // no remote wakeup
        // not selfpowered
 };
@@ -1344,7 +1350,7 @@ static struct goku_udc    *the_controller;
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int goku_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct goku_udc *dev = the_controller;
@@ -1382,7 +1388,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
        DBG(dev, "registered gadget driver '%s'\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver)
@@ -1408,7 +1413,7 @@ stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver)
                udc_enable(dev);
 }
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int goku_stop(struct usb_gadget_driver *driver)
 {
        struct goku_udc *dev = the_controller;
        unsigned long   flags;
@@ -1429,8 +1434,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        DBG(dev, "unregistered driver '%s'\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
-
 
 /*-------------------------------------------------------------------------*/
 
@@ -1730,6 +1733,8 @@ static void goku_remove(struct pci_dev *pdev)
 
        DBG(dev, "%s\n", __func__);
 
+       usb_del_gadget_udc(&dev->gadget);
+
        BUG_ON(dev->driver);
 
 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
@@ -1854,6 +1859,10 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto err;
        }
        dev->registered = 1;
+       retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
+       if (retval)
+               goto err;
+
        return 0;
 
 err:
index ade4006..692fd9b 100644 (file)
@@ -1237,9 +1237,14 @@ irq_handler_t intr_handler(int i)
  *******************************************************************************
  */
 
+static int imx_udc_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int imx_udc_stop(struct usb_gadget_driver *driver);
 static const struct usb_gadget_ops imx_udc_ops = {
        .get_frame       = imx_udc_get_frame,
        .wakeup          = imx_udc_wakeup,
+       .start          = imx_udc_start,
+       .stop           = imx_udc_stop,
 };
 
 static struct imx_udc_struct controller = {
@@ -1324,7 +1329,7 @@ static struct imx_udc_struct controller = {
  * USB gadget driver functions
  *******************************************************************************
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int imx_udc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct imx_udc_struct *imx_usb = &controller;
@@ -1368,9 +1373,8 @@ fail:
        imx_usb->gadget.dev.driver = NULL;
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int imx_udc_stop(struct usb_gadget_driver *driver)
 {
        struct imx_udc_struct *imx_usb = &controller;
 
@@ -1394,7 +1398,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /*******************************************************************************
  * Module functions
@@ -1504,8 +1507,14 @@ static int __init imx_udc_probe(struct platform_device *pdev)
        imx_usb->timer.function = handle_config;
        imx_usb->timer.data = (unsigned long)imx_usb;
 
-       return 0;
+       ret = usb_add_gadget_udc(&pdev->dev, &imx_usb->gadget);
+       if (ret)
+               goto fail4;
 
+       return 0;
+fail4:
+       for (i = 0; i < IMX_USB_NB_EP + 1; i++)
+               free_irq(imx_usb->usbd_int[i], imx_usb);
 fail3:
        clk_put(clk);
        clk_disable(clk);
@@ -1525,6 +1534,7 @@ static int __exit imx_udc_remove(struct platform_device *pdev)
        struct imxusb_platform_data *pdata = pdev->dev.platform_data;
        int i;
 
+       usb_del_gadget_udc(&imx_usb->gadget);
        imx_udc_disable(imx_usb);
        del_timer(&imx_usb->timer);
 
index 9cee88a..d8403ae 100644 (file)
@@ -1321,7 +1321,9 @@ static int langwell_pullup(struct usb_gadget *_gadget, int is_on)
        return 0;
 }
 
-
+static int langwell_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int langwell_stop(struct usb_gadget_driver *driver);
 /* device controller usb_gadget_ops structure */
 static const struct usb_gadget_ops langwell_ops = {
 
@@ -1342,6 +1344,9 @@ static const struct usb_gadget_ops langwell_ops = {
 
        /* D+ pullup, software-controlled connect/disconnect to USB host */
        .pullup         = langwell_pullup,
+
+       .start          = langwell_start,
+       .stop           = langwell_stop,
 };
 
 
@@ -1852,7 +1857,7 @@ static DEVICE_ATTR(remote_wakeup, S_IWUSR, NULL, store_remote_wakeup);
  * the driver might get unbound.
  */
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int langwell_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct langwell_udc     *dev = the_controller;
@@ -1914,11 +1919,9 @@ err_unbind:
        dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__);
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
-
 
 /* unregister gadget driver */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int langwell_stop(struct usb_gadget_driver *driver)
 {
        struct langwell_udc     *dev = the_controller;
        unsigned long           flags;
@@ -1965,8 +1968,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
-
 
 /*-------------------------------------------------------------------------*/
 
@@ -3373,6 +3374,10 @@ static int langwell_udc_probe(struct pci_dev *pdev,
        if (retval)
                goto error;
 
+       retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
+       if (retval)
+               goto error;
+
        retval = device_create_file(&pdev->dev, &dev_attr_langwell_udc);
        if (retval)
                goto error;
@@ -3403,6 +3408,7 @@ static int langwell_udc_suspend(struct pci_dev *pdev, pm_message_t state)
 
        dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__);
 
+       usb_del_gadget_udc(&dev->gadget);
        /* disable interrupt and set controller to stop state */
        langwell_udc_stop(dev);
 
index 084aa08..11d3782 100644 (file)
@@ -1454,7 +1454,7 @@ static struct usb_ep_ops m66592_ep_ops = {
 /*-------------------------------------------------------------------------*/
 static struct m66592 *the_controller;
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int m66592_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct m66592 *m66592 = the_controller;
@@ -1506,9 +1506,8 @@ error:
 
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int m66592_stop(struct usb_gadget_driver *driver)
 {
        struct m66592 *m66592 = the_controller;
        unsigned long flags;
@@ -1533,7 +1532,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        m66592->driver = NULL;
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /*-------------------------------------------------------------------------*/
 static int m66592_get_frame(struct usb_gadget *_gadget)
@@ -1544,12 +1542,16 @@ static int m66592_get_frame(struct usb_gadget *_gadget)
 
 static struct usb_gadget_ops m66592_gadget_ops = {
        .get_frame              = m66592_get_frame,
+       .start                  = m66592_start,
+       .stop                   = m66592_stop,
 };
 
 static int __exit m66592_remove(struct platform_device *pdev)
 {
        struct m66592           *m66592 = dev_get_drvdata(&pdev->dev);
 
+       usb_del_gadget_udc(&m66592->gadget);
+
        del_timer_sync(&m66592->timer);
        iounmap(m66592->reg);
        free_irq(platform_get_irq(pdev, 0), m66592);
@@ -1691,9 +1693,16 @@ static int __init m66592_probe(struct platform_device *pdev)
 
        init_controller(m66592);
 
+       ret = usb_add_gadget_udc(&pdev->dev, &m66592->gadget);
+       if (ret)
+               goto err_add_udc;
+
        dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
        return 0;
 
+err_add_udc:
+       m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
+
 clean_up3:
 #ifdef CONFIG_HAVE_CLK
        if (m66592->pdata->on_chip) {
index b1a8146..6adf38c 100644 (file)
@@ -1128,6 +1128,9 @@ static int mv_udc_pullup(struct usb_gadget *gadget, int is_on)
        return 0;
 }
 
+static int mv_udc_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int mv_udc_stop(struct usb_gadget_driver *driver);
 /* device controller usb_gadget_ops structure */
 static const struct usb_gadget_ops mv_ops = {
 
@@ -1139,6 +1142,8 @@ static const struct usb_gadget_ops mv_ops = {
 
        /* D+ pullup, software-controlled connect/disconnect to USB host */
        .pullup         = mv_udc_pullup,
+       .start          = mv_udc_start,
+       .stop           = mv_udc_stop,
 };
 
 static void mv_udc_testmode(struct mv_udc *udc, u16 index, bool enter)
@@ -1230,7 +1235,7 @@ static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver)
        }
 }
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int mv_udc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct mv_udc *udc = the_controller;
@@ -1270,9 +1275,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int mv_udc_stop(struct usb_gadget_driver *driver)
 {
        struct mv_udc *udc = the_controller;
        unsigned long flags;
@@ -1296,7 +1300,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 static int
 udc_prime_status(struct mv_udc *udc, u8 direction, u16 status, bool empty)
@@ -1880,9 +1883,10 @@ static void gadget_release(struct device *_dev)
 static int mv_udc_remove(struct platform_device *dev)
 {
        struct mv_udc *udc = the_controller;
-
        DECLARE_COMPLETION(done);
 
+       usb_del_gadget_udc(&udc->gadget);
+
        udc->done = &done;
 
        /* free memory allocated in probe */
@@ -2074,11 +2078,12 @@ int mv_udc_probe(struct platform_device *dev)
 
        the_controller = udc;
 
-       goto out;
+       retval = usb_add_gadget_udc(&dev->dev, &udc->gadget);
+       if (!retval)
+               return retval;
 error:
        if (udc)
                mv_udc_remove(udc->dev);
-out:
        return retval;
 }
 
index 29151c4..7f1219e 100644 (file)
@@ -1172,11 +1172,17 @@ net2272_pullup(struct usb_gadget *_gadget, int is_on)
        return 0;
 }
 
+static int net2272_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int net2272_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops net2272_ops = {
        .get_frame       = net2272_get_frame,
        .wakeup          = net2272_wakeup,
        .set_selfpowered = net2272_set_selfpowered,
-       .pullup          = net2272_pullup
+       .pullup                 = net2272_pullup,
+       .start                  = net2272_start,
+       .stop                   = net2272_stop,
 };
 
 /*---------------------------------------------------------------------------*/
@@ -1447,7 +1453,7 @@ net2272_ep0_start(struct net2272 *dev)
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int net2272_start(struct usb_gadget_driver *driver,
        int (*bind)(struct usb_gadget *))
 {
        struct net2272 *dev = the_controller;
@@ -1487,7 +1493,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver)
@@ -1515,7 +1520,7 @@ stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver)
        net2272_usb_reinit(dev);
 }
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int net2272_stop(struct usb_gadget_driver *driver)
 {
        struct net2272 *dev = the_controller;
        unsigned long flags;
@@ -1538,7 +1543,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        dev_dbg(dev->dev, "unregistered driver '%s'\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /*---------------------------------------------------------------------------*/
 /* handle ep-a/ep-b dma completions */
@@ -2217,6 +2221,8 @@ net2272_gadget_release(struct device *_dev)
 static void __devexit
 net2272_remove(struct net2272 *dev)
 {
+       usb_del_gadget_udc(&dev->gadget);
+
        /* start with the driver above us */
        if (dev->driver) {
                /* should have been done already by driver model core */
@@ -2310,8 +2316,14 @@ net2272_probe_fin(struct net2272 *dev, unsigned int irqflags)
        if (ret)
                goto err_dev_reg;
 
+       ret = usb_add_gadget_udc(dev->dev, &dev->gadget);
+       if (ret)
+               goto err_add_udc;
+
        return 0;
 
+err_add_udc:
+       device_remove_file(dev->dev, &dev_attr_registers);
  err_dev_reg:
        device_unregister(&dev->gadget.dev);
  err_irq:
index 476d88e..1e6ea6f 100644 (file)
@@ -1410,11 +1410,17 @@ static int net2280_pullup(struct usb_gadget *_gadget, int is_on)
        return 0;
 }
 
+static int net2280_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int net2280_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops net2280_ops = {
        .get_frame      = net2280_get_frame,
        .wakeup         = net2280_wakeup,
        .set_selfpowered = net2280_set_selfpowered,
        .pullup         = net2280_pullup,
+       .start          = net2280_start,
+       .stop           = net2280_stop,
 };
 
 /*-------------------------------------------------------------------------*/
@@ -1930,7 +1936,7 @@ static void ep0_start (struct net2280 *dev)
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int net2280_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct net2280          *dev = the_controller;
@@ -1994,7 +2000,6 @@ err_unbind:
        dev->driver = NULL;
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver)
@@ -2022,7 +2027,7 @@ stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver)
        usb_reinit (dev);
 }
 
-int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
+static int net2280_stop(struct usb_gadget_driver *driver)
 {
        struct net2280  *dev = the_controller;
        unsigned long   flags;
@@ -2049,8 +2054,6 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
        DEBUG (dev, "unregistered driver '%s'\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL (usb_gadget_unregister_driver);
-
 
 /*-------------------------------------------------------------------------*/
 
@@ -2732,6 +2735,8 @@ static void net2280_remove (struct pci_dev *pdev)
 {
        struct net2280          *dev = pci_get_drvdata (pdev);
 
+       usb_del_gadget_udc(&dev->gadget);
+
        BUG_ON(dev->driver);
 
        /* then clean up the resources we allocated during probe() */
@@ -2916,6 +2921,9 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id)
        retval = device_create_file (&pdev->dev, &dev_attr_registers);
        if (retval) goto done;
 
+       retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
+       if (retval)
+               goto done;
        return 0;
 
 done:
index 82fd249..740c7da 100644 (file)
@@ -1375,6 +1375,10 @@ static int omap_pullup(struct usb_gadget *gadget, int is_on)
        return 0;
 }
 
+static int omap_udc_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int omap_udc_stop(struct usb_gadget_driver *driver);
+
 static struct usb_gadget_ops omap_gadget_ops = {
        .get_frame              = omap_get_frame,
        .wakeup                 = omap_wakeup,
@@ -1382,6 +1386,8 @@ static struct usb_gadget_ops omap_gadget_ops = {
        .vbus_session           = omap_vbus_session,
        .vbus_draw              = omap_vbus_draw,
        .pullup                 = omap_pullup,
+       .start                  = omap_udc_start,
+       .stop                   = omap_udc_stop,
 };
 
 /*-------------------------------------------------------------------------*/
@@ -2102,7 +2108,7 @@ static inline int machine_without_vbus_sense(void)
                );
 }
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int omap_udc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        int             status = -ENODEV;
@@ -2186,9 +2192,8 @@ done:
                omap_udc_enable_clock(0);
        return status;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
+static int omap_udc_stop(struct usb_gadget_driver *driver)
 {
        unsigned long   flags;
        int             status = -ENODEV;
@@ -2222,8 +2227,6 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
        DBG("unregistered driver '%s'\n", driver->driver.name);
        return status;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
-
 
 /*-------------------------------------------------------------------------*/
 
@@ -2991,9 +2994,16 @@ known:
 
        create_proc_file();
        status = device_add(&udc->gadget.dev);
+       if (status)
+               goto cleanup4;
+
+       status = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
        if (!status)
                return status;
        /* If fail, fall through */
+cleanup4:
+       remove_proc_file();
+
 #ifdef USE_ISO
 cleanup3:
        free_irq(pdev->resource[2].start, udc);
@@ -3029,6 +3039,8 @@ static int __exit omap_udc_remove(struct platform_device *pdev)
 
        if (!udc)
                return -ENODEV;
+
+       usb_del_gadget_udc(&udc->gadget);
        if (udc->driver)
                return -EBUSY;
 
index 68dbcc3..f96615a 100644 (file)
@@ -1176,6 +1176,9 @@ static int pch_udc_pcd_vbus_draw(struct usb_gadget *gadget, unsigned int mA)
        return -EOPNOTSUPP;
 }
 
+static int pch_udc_start(struct usb_gadget_driver *driver,
+       int (*bind)(struct usb_gadget *));
+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,
        .wakeup = pch_udc_pcd_wakeup,
@@ -1183,6 +1186,8 @@ static const struct usb_gadget_ops pch_udc_ops = {
        .pullup = pch_udc_pcd_pullup,
        .vbus_session = pch_udc_pcd_vbus_session,
        .vbus_draw = pch_udc_pcd_vbus_draw,
+       .start  = pch_udc_start,
+       .stop   = pch_udc_stop,
 };
 
 /**
@@ -2690,7 +2695,7 @@ static int init_dma_pools(struct pch_udc_dev *dev)
        return 0;
 }
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int pch_udc_start(struct usb_gadget_driver *driver,
        int (*bind)(struct usb_gadget *))
 {
        struct pch_udc_dev      *dev = pch_udc;
@@ -2733,9 +2738,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
        dev->connected = 1;
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int pch_udc_stop(struct usb_gadget_driver *driver)
 {
        struct pch_udc_dev      *dev = pch_udc;
 
@@ -2761,7 +2765,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        pch_udc_set_disconnect(dev);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 static void pch_udc_shutdown(struct pci_dev *pdev)
 {
@@ -2778,6 +2781,8 @@ static void pch_udc_remove(struct pci_dev *pdev)
 {
        struct pch_udc_dev      *dev = pci_get_drvdata(pdev);
 
+       usb_del_gadget_udc(&dev->gadget);
+
        /* gadget driver must not be registered */
        if (dev->driver)
                dev_err(&pdev->dev,
@@ -2953,6 +2958,9 @@ static int pch_udc_probe(struct pci_dev *pdev,
 
        /* Put the device in disconnected state till a driver is bound */
        pch_udc_set_disconnect(dev);
+       retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
+       if (retval)
+               goto finished;
        return 0;
 
 finished:
index 7745454..e4e59b4 100644 (file)
@@ -1011,12 +1011,18 @@ static int pxa25x_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
        return -EOPNOTSUPP;
 }
 
+static int pxa25x_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int pxa25x_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops pxa25x_udc_ops = {
        .get_frame      = pxa25x_udc_get_frame,
        .wakeup         = pxa25x_udc_wakeup,
        .vbus_session   = pxa25x_udc_vbus_session,
        .pullup         = pxa25x_udc_pullup,
        .vbus_draw      = pxa25x_udc_vbus_draw,
+       .start          = pxa25x_start,
+       .stop           = pxa25x_stop,
 };
 
 /*-------------------------------------------------------------------------*/
@@ -1263,7 +1269,7 @@ static void udc_enable (struct pxa25x_udc *dev)
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int pxa25x_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct pxa25x_udc       *dev = the_controller;
@@ -1322,7 +1328,6 @@ fail:
 bind_fail:
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity(struct pxa25x_udc *dev, struct usb_gadget_driver *driver)
@@ -1351,7 +1356,7 @@ stop_activity(struct pxa25x_udc *dev, struct usb_gadget_driver *driver)
        udc_reinit(dev);
 }
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int pxa25x_stop(struct usb_gadget_driver *driver)
 {
        struct pxa25x_udc       *dev = the_controller;
 
@@ -1379,8 +1384,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        dump_state(dev);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
-
 
 /*-------------------------------------------------------------------------*/
 
@@ -2231,8 +2234,11 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev)
 #endif
        create_debug_files(dev);
 
-       return 0;
+       retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
+       if (!retval)
+               return retval;
 
+       remove_debug_files(dev);
 #ifdef CONFIG_ARCH_LUBBOCK
 lubbock_fail0:
        free_irq(LUBBOCK_USB_DISC_IRQ, dev);
@@ -2261,6 +2267,7 @@ static int __exit pxa25x_udc_remove(struct platform_device *pdev)
 {
        struct pxa25x_udc *dev = platform_get_drvdata(pdev);
 
+       usb_del_gadget_udc(&dev->gadget);
        if (dev->driver)
                return -EBUSY;
 
index 5760769..85b68c7 100644 (file)
@@ -1680,12 +1680,18 @@ static int pxa_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
        return -EOPNOTSUPP;
 }
 
+static int pxa27x_udc_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int pxa27x_udc_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops pxa_udc_ops = {
        .get_frame      = pxa_udc_get_frame,
        .wakeup         = pxa_udc_wakeup,
        .pullup         = pxa_udc_pullup,
        .vbus_session   = pxa_udc_vbus_session,
        .vbus_draw      = pxa_udc_vbus_draw,
+       .start          = pxa27x_udc_start,
+       .stop           = pxa27x_udc_stop,
 };
 
 /**
@@ -1791,7 +1797,7 @@ static void udc_enable(struct pxa_udc *udc)
 }
 
 /**
- * usb_gadget_probe_driver - Register gadget driver
+ * pxa27x_start - Register gadget driver
  * @driver: gadget driver
  * @bind: bind function
  *
@@ -1805,7 +1811,7 @@ static void udc_enable(struct pxa_udc *udc)
  *
  * Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int pxa27x_udc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct pxa_udc *udc = the_controller;
@@ -1860,8 +1866,6 @@ add_fail:
        udc->gadget.dev.driver = NULL;
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
-
 
 /**
  * stop_activity - Stops udc endpoints
@@ -1888,12 +1892,12 @@ static void stop_activity(struct pxa_udc *udc, struct usb_gadget_driver *driver)
 }
 
 /**
- * usb_gadget_unregister_driver - Unregister the gadget driver
+ * pxa27x_udc_stop - Unregister the gadget driver
  * @driver: gadget driver
  *
  * Returns 0 if no error, -ENODEV, -EINVAL otherwise
  */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int pxa27x_udc_stop(struct usb_gadget_driver *driver)
 {
        struct pxa_udc *udc = the_controller;
 
@@ -1917,7 +1921,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
                return otg_set_peripheral(udc->transceiver, NULL);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /**
  * handle_ep0_ctrl_req - handle control endpoint control request
@@ -2516,9 +2519,14 @@ static int __init pxa_udc_probe(struct platform_device *pdev)
                        driver_name, IRQ_USB, retval);
                goto err_irq;
        }
+       retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
+       if (retval)
+               goto err_add_udc;
 
        pxa_init_debugfs(udc);
        return 0;
+err_add_udc:
+       free_irq(udc->irq, udc);
 err_irq:
        iounmap(udc->regs);
 err_map:
@@ -2537,6 +2545,7 @@ static int __exit pxa_udc_remove(struct platform_device *_dev)
        struct pxa_udc *udc = platform_get_drvdata(_dev);
        int gpio = udc->mach->gpio_pullup;
 
+       usb_del_gadget_udc(&udc->gadget);
        usb_gadget_unregister_driver(udc->driver);
        free_irq(udc->irq, udc);
        pxa_cleanup_debugfs(udc);
index 6dcc1f6..51b655f 100644 (file)
@@ -1410,7 +1410,7 @@ static struct usb_ep_ops r8a66597_ep_ops = {
 /*-------------------------------------------------------------------------*/
 static struct r8a66597 *the_controller;
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int r8a66597_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct r8a66597 *r8a66597 = the_controller;
@@ -1462,9 +1462,8 @@ error:
 
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int r8a66597_stop(struct usb_gadget_driver *driver)
 {
        struct r8a66597 *r8a66597 = the_controller;
        unsigned long flags;
@@ -1488,7 +1487,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        r8a66597->driver = NULL;
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /*-------------------------------------------------------------------------*/
 static int r8a66597_get_frame(struct usb_gadget *_gadget)
@@ -1499,12 +1497,15 @@ static int r8a66597_get_frame(struct usb_gadget *_gadget)
 
 static struct usb_gadget_ops r8a66597_gadget_ops = {
        .get_frame              = r8a66597_get_frame,
+       .start                  = r8a66597_start,
+       .stop                   = r8a66597_stop,
 };
 
 static int __exit r8a66597_remove(struct platform_device *pdev)
 {
        struct r8a66597         *r8a66597 = dev_get_drvdata(&pdev->dev);
 
+       usb_del_gadget_udc(&r8a66597->gadget);
        del_timer_sync(&r8a66597->timer);
        iounmap(r8a66597->reg);
        free_irq(platform_get_irq(pdev, 0), r8a66597);
@@ -1647,9 +1648,15 @@ static int __init r8a66597_probe(struct platform_device *pdev)
 
        init_controller(r8a66597);
 
+       ret = usb_add_gadget_udc(&pdev->dev, &r8a66597->gadget);
+       if (ret)
+               goto err_add_udc;
+
        dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
        return 0;
 
+err_add_udc:
+       r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req);
 clean_up3:
        free_irq(irq, r8a66597);
 clean_up2:
index 0dfee28..8bdee67 100644 (file)
@@ -2574,7 +2574,7 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)
        return 0;
 }
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int s3c_hsotg_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct s3c_hsotg *hsotg = our_hsotg;
@@ -2745,9 +2745,8 @@ err:
        hsotg->gadget.dev.driver = NULL;
        return ret;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int s3c_hsotg_stop(struct usb_gadget_driver *driver)
 {
        struct s3c_hsotg *hsotg = our_hsotg;
        int ep;
@@ -2775,7 +2774,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 static int s3c_hsotg_gadget_getframe(struct usb_gadget *gadget)
 {
@@ -2784,6 +2782,8 @@ static int s3c_hsotg_gadget_getframe(struct usb_gadget *gadget)
 
 static struct usb_gadget_ops s3c_hsotg_gadget_ops = {
        .get_frame      = s3c_hsotg_gadget_getframe,
+       .start          = s3c_hsotg_start,
+       .stop           = s3c_hsotg_stop,
 };
 
 /**
@@ -3403,6 +3403,10 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
        for (epnum = 0; epnum < S3C_HSOTG_EPS; epnum++)
                s3c_hsotg_initep(hsotg, &hsotg->eps[epnum], epnum);
 
+       ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget);
+       if (ret)
+               goto err_add_udc;
+
        s3c_hsotg_create_debug(hsotg);
 
        s3c_hsotg_dump(hsotg);
@@ -3410,6 +3414,11 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
        our_hsotg = hsotg;
        return 0;
 
+err_add_udc:
+       s3c_hsotg_gate(pdev, false);
+       clk_disable(hsotg->clk);
+       clk_put(hsotg->clk);
+
 err_regs:
        iounmap(hsotg->regs);
 
@@ -3427,6 +3436,8 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev)
 {
        struct s3c_hsotg *hsotg = platform_get_drvdata(pdev);
 
+       usb_del_gadget_udc(&hsotg->gadget);
+
        s3c_hsotg_delete_debug(hsotg);
 
        usb_gadget_unregister_driver(hsotg->driver);
index d5e3e1e..dc9f428 100644 (file)
@@ -1133,7 +1133,7 @@ static irqreturn_t s3c_hsudc_irq(int irq, void *_dev)
        return IRQ_HANDLED;
 }
 
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int s3c_hsudc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct s3c_hsudc *hsudc = the_controller;
@@ -1181,9 +1181,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int s3c_hsudc_stop(struct usb_gadget_driver *driver)
 {
        struct s3c_hsudc *hsudc = the_controller;
        unsigned long flags;
@@ -1210,7 +1209,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
                        driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 static inline u32 s3c_hsudc_read_frameno(struct s3c_hsudc *hsudc)
 {
@@ -1224,6 +1222,8 @@ static int s3c_hsudc_gadget_getframe(struct usb_gadget *gadget)
 
 static struct usb_gadget_ops s3c_hsudc_gadget_ops = {
        .get_frame      = s3c_hsudc_gadget_getframe,
+       .start          = s3c_hsudc_start,
+       .stop           = s3c_hsudc_stop,
 };
 
 static int s3c_hsudc_probe(struct platform_device *pdev)
@@ -1311,7 +1311,15 @@ static int s3c_hsudc_probe(struct platform_device *pdev)
 
        disable_irq(hsudc->irq);
        local_irq_enable();
+
+       ret = usb_add_gadget_udc(&pdev->dev, &hsudc->gadget);
+       if (ret)
+               goto err_add_udc;
+
        return 0;
+err_add_udc:
+       clk_disable(hsudc->uclk);
+       clk_put(hsudc->uclk);
 err_clk:
        free_irq(hsudc->irq, hsudc);
 err_irq:
index 100f263..1c19cd3 100644 (file)
@@ -1552,6 +1552,10 @@ static int s3c2410_vbus_draw(struct usb_gadget *_gadget, unsigned ma)
        return -ENOTSUPP;
 }
 
+static int s3c2410_udc_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int s3c2410_udc_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops s3c2410_ops = {
        .get_frame              = s3c2410_udc_get_frame,
        .wakeup                 = s3c2410_udc_wakeup,
@@ -1559,6 +1563,8 @@ static const struct usb_gadget_ops s3c2410_ops = {
        .pullup                 = s3c2410_udc_pullup,
        .vbus_session           = s3c2410_udc_vbus_session,
        .vbus_draw              = s3c2410_vbus_draw,
+       .start                  = s3c2410_udc_start,
+       .stop                   = s3c2410_udc_stop,
 };
 
 static void s3c2410_udc_command(enum s3c2410_udc_cmd_e cmd)
@@ -1672,10 +1678,7 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev)
        s3c2410_udc_command(S3C2410_UDC_P_ENABLE);
 }
 
-/*
- *     usb_gadget_probe_driver
- */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int s3c2410_udc_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct s3c2410_udc *udc = the_controller;
@@ -1730,12 +1733,8 @@ register_error:
        udc->gadget.dev.driver = NULL;
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-/*
- *     usb_gadget_unregister_driver
- */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int s3c2410_udc_stop(struct usb_gadget_driver *driver)
 {
        struct s3c2410_udc *udc = the_controller;
 
@@ -1955,6 +1954,10 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
                        goto err_vbus_irq;
        }
 
+       retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
+       if (retval)
+               goto err_add_udc;
+
        if (s3c2410_udc_debugfs_root) {
                udc->regs_info = debugfs_create_file("registers", S_IRUGO,
                                s3c2410_udc_debugfs_root,
@@ -1967,6 +1970,10 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
 
        return 0;
 
+err_add_udc:
+       if (udc_info && !udc_info->udc_command &&
+                       gpio_is_valid(udc_info->pullup_pin))
+               gpio_free(udc_info->pullup_pin);
 err_vbus_irq:
        if (udc_info && udc_info->vbus_pin > 0)
                free_irq(gpio_to_irq(udc_info->vbus_pin), udc);
@@ -1992,6 +1999,8 @@ static int s3c2410_udc_remove(struct platform_device *pdev)
        unsigned int irq;
 
        dev_dbg(&pdev->dev, "%s()\n", __func__);
+
+       usb_del_gadget_udc(&udc->gadget);
        if (udc->driver)
                return -EBUSY;
 
@@ -2105,8 +2114,6 @@ static void __exit udc_exit(void)
        debugfs_remove(s3c2410_udc_debugfs_root);
 }
 
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
-
 module_init(udc_init);
 module_exit(udc_exit);
 
index 0a50a35..728572c 100644 (file)
@@ -1704,6 +1704,10 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on)
        return 0;
 }
 
+static int musb_gadget_start(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *));
+static int musb_gadget_stop(struct usb_gadget_driver *driver);
+
 static const struct usb_gadget_ops musb_gadget_operations = {
        .get_frame              = musb_gadget_get_frame,
        .wakeup                 = musb_gadget_wakeup,
@@ -1711,6 +1715,8 @@ static const struct usb_gadget_ops musb_gadget_operations = {
        /* .vbus_session                = musb_gadget_vbus_session, */
        .vbus_draw              = musb_gadget_vbus_draw,
        .pullup                 = musb_gadget_pullup,
+       .start                  = musb_gadget_start,
+       .stop                   = musb_gadget_stop,
 };
 
 /* ----------------------------------------------------------------------- */
@@ -1835,7 +1841,16 @@ int __init musb_gadget_setup(struct musb *musb)
        if (status != 0) {
                put_device(&musb->g.dev);
                the_gadget = NULL;
+               return status;
        }
+       status = usb_add_gadget_udc(musb->controller, &musb->g);
+       if (status)
+               goto err;
+
+       return 0;
+err:
+       device_unregister(&musb->g.dev);
+       the_gadget = NULL;
        return status;
 }
 
@@ -1844,6 +1859,7 @@ void musb_gadget_cleanup(struct musb *musb)
        if (musb != the_gadget)
                return;
 
+       usb_del_gadget_udc(&musb->g);
        device_unregister(&musb->g.dev);
        the_gadget = NULL;
 }
@@ -1860,7 +1876,7 @@ void musb_gadget_cleanup(struct musb *musb)
  * @param bind the driver's bind function
  * @return <0 if error, 0 if everything is fine
  */
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int musb_gadget_start(struct usb_gadget_driver *driver,
                int (*bind)(struct usb_gadget *))
 {
        struct musb             *musb = the_gadget;
@@ -1962,7 +1978,6 @@ err1:
 err0:
        return retval;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void stop_activity(struct musb *musb, struct usb_gadget_driver *driver)
 {
@@ -2012,7 +2027,7 @@ static void stop_activity(struct musb *musb, struct usb_gadget_driver *driver)
  *
  * @param driver the gadget driver to unregister
  */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int musb_gadget_stop(struct usb_gadget_driver *driver)
 {
        struct musb     *musb = the_gadget;
        unsigned long   flags;
@@ -2071,8 +2086,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
-
 
 /* ----------------------------------------------------------------------- */
 
index aa591b6..c9c56e7 100644 (file)
@@ -725,7 +725,7 @@ static int usbhsg_try_stop(struct usbhs_priv *priv, u32 status)
  *
  */
 struct usbhsg_gpriv *the_controller;
-int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+static int usbhsg_gadget_start(struct usb_gadget_driver *driver,
                            int (*bind)(struct usb_gadget *))
 {
        struct usbhsg_gpriv *gpriv = the_controller;
@@ -775,9 +775,8 @@ add_fail:
 
        return ret;
 }
-EXPORT_SYMBOL(usb_gadget_probe_driver);
 
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+static int usbhsg_gadget_stop(struct usb_gadget_driver *driver)
 {
        struct usbhsg_gpriv *gpriv = the_controller;
        struct usbhs_priv *priv;
@@ -806,7 +805,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
 
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 /*
  *             usb gadget ops
@@ -821,6 +819,8 @@ static int usbhsg_get_frame(struct usb_gadget *gadget)
 
 static struct usb_gadget_ops usbhsg_gadget_ops = {
        .get_frame              = usbhsg_get_frame,
+       .start                  = usbhsg_gadget_start,
+       .stop                   = usbhsg_gadget_stop,
 };
 
 static int usbhsg_start(struct usbhs_priv *priv)
@@ -840,6 +840,7 @@ int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv)
        struct device *dev = usbhs_priv_to_dev(priv);
        int pipe_size = usbhs_get_dparam(priv, pipe_size);
        int i;
+       int ret;
 
        gpriv = kzalloc(sizeof(struct usbhsg_gpriv), GFP_KERNEL);
        if (!gpriv) {
@@ -850,6 +851,7 @@ int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv)
        uep = kzalloc(sizeof(struct usbhsg_uep) * pipe_size, GFP_KERNEL);
        if (!uep) {
                dev_err(dev, "Could not allocate ep\n");
+               ret = -ENOMEM;
                goto usbhs_mod_gadget_probe_err_gpriv;
        }
 
@@ -911,20 +913,28 @@ int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv)
 
        the_controller = gpriv;
 
+       ret = usb_add_gadget_udc(dev, &gpriv->gadget);
+       if (ret)
+               goto err_add_udc;
+
+
        dev_info(dev, "gadget probed\n");
 
        return 0;
+err_add_udc:
+       kfree(gpriv->uep);
 
 usbhs_mod_gadget_probe_err_gpriv:
        kfree(gpriv);
 
-       return -ENOMEM;
+       return ret;
 }
 
 void __devexit usbhs_mod_gadget_remove(struct usbhs_priv *priv)
 {
        struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv);
 
+       usb_del_gadget_udc(&gpriv->gadget);
        kfree(gpriv->uep);
        kfree(gpriv);
 }