usb: gadget: net2280: convert to new style
authorFelipe Balbi <balbi@ti.com>
Mon, 10 Oct 2011 07:37:17 +0000 (10:37 +0300)
committerFelipe Balbi <balbi@ti.com>
Thu, 13 Oct 2011 17:39:57 +0000 (20:39 +0300)
with this patch we can finally remove the global
"the_controller" pointer.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/net2280.c

index db508d0bb3af82d1acb31f6c4f174d7795e4118f..2680fcc011d490f88cf0ab6584a7edc23a14e69b 100644 (file)
@@ -1401,17 +1401,18 @@ 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 int net2280_start(struct usb_gadget *_gadget,
+               struct usb_gadget_driver *driver);
+static int net2280_stop(struct usb_gadget *_gadget,
+               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,
+       .udc_start      = net2280_start,
+       .udc_stop       = net2280_stop,
 };
 
 /*-------------------------------------------------------------------------*/
@@ -1744,8 +1745,6 @@ static void set_fifo_mode (struct net2280 *dev, int mode)
  * perhaps to bind specific drivers to specific devices.
  */
 
-static struct net2280  *the_controller;
-
 static void usb_reset (struct net2280 *dev)
 {
        u32     tmp;
@@ -1871,10 +1870,10 @@ static void ep0_start (struct net2280 *dev)
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-static int net2280_start(struct usb_gadget_driver *driver,
-               int (*bind)(struct usb_gadget *))
+static int net2280_start(struct usb_gadget *_gadget,
+               struct usb_gadget_driver *driver)
 {
-       struct net2280          *dev = the_controller;
+       struct net2280          *dev;
        int                     retval;
        unsigned                i;
 
@@ -1882,14 +1881,11 @@ static int net2280_start(struct usb_gadget_driver *driver,
         * (dev->usb->xcvrdiag & FORCE_FULL_SPEED_MODE)
         * "must not be used in normal operation"
         */
-       if (!driver
-                       || driver->speed != USB_SPEED_HIGH
-                       || !bind || !driver->setup)
+       if (!driver || driver->speed != USB_SPEED_HIGH
+                       || !driver->setup)
                return -EINVAL;
-       if (!dev)
-               return -ENODEV;
-       if (dev->driver)
-               return -EBUSY;
+
+       dev = container_of (_gadget, struct net2280, gadget);
 
        for (i = 0; i < 7; i++)
                dev->ep [i].irqs = 0;
@@ -1899,14 +1895,6 @@ static int net2280_start(struct usb_gadget_driver *driver,
        driver->driver.bus = NULL;
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
-       retval = bind(&dev->gadget);
-       if (retval) {
-               DEBUG (dev, "bind to driver %s --> %d\n",
-                               driver->driver.name, retval);
-               dev->driver = NULL;
-               dev->gadget.dev.driver = NULL;
-               return retval;
-       }
 
        retval = device_create_file (&dev->pdev->dev, &dev_attr_function);
        if (retval) goto err_unbind;
@@ -1952,33 +1940,21 @@ stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver)
        for (i = 0; i < 7; i++)
                nuke (&dev->ep [i]);
 
-       /* report disconnect; the driver is already quiesced */
-       if (driver) {
-               spin_unlock (&dev->lock);
-               driver->disconnect (&dev->gadget);
-               spin_lock (&dev->lock);
-       }
-
        usb_reinit (dev);
 }
 
-static int net2280_stop(struct usb_gadget_driver *driver)
+static int net2280_stop(struct usb_gadget *_gadget,
+               struct usb_gadget_driver *driver)
 {
-       struct net2280  *dev = the_controller;
+       struct net2280  *dev;
        unsigned long   flags;
 
-       if (!dev)
-               return -ENODEV;
-       if (!driver || driver != dev->driver || !driver->unbind)
-               return -EINVAL;
+       dev = container_of (_gadget, struct net2280, gadget);
 
        spin_lock_irqsave (&dev->lock, flags);
        stop_activity (dev, driver);
        spin_unlock_irqrestore (&dev->lock, flags);
 
-       net2280_pullup (&dev->gadget, 0);
-
-       driver->unbind (&dev->gadget);
        dev->gadget.dev.driver = NULL;
        dev->driver = NULL;
 
@@ -2698,8 +2674,6 @@ static void net2280_remove (struct pci_dev *pdev)
        pci_set_drvdata (pdev, NULL);
 
        INFO (dev, "unbind\n");
-
-       the_controller = NULL;
 }
 
 /* wrap this driver around the specified device, but
@@ -2713,14 +2687,6 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id)
        void                    __iomem *base = NULL;
        int                     retval, i;
 
-       /* if you want to support more than one controller in a system,
-        * usb_gadget_driver_{register,unregister}() must change.
-        */
-       if (the_controller) {
-               dev_warn (&pdev->dev, "ignoring\n");
-               return -EBUSY;
-       }
-
        /* alloc, and start init */
        dev = kzalloc (sizeof *dev, GFP_KERNEL);
        if (dev == NULL){
@@ -2847,8 +2813,6 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id)
                        use_dma
                                ? (use_dma_chaining ? "chaining" : "enabled")
                                : "disabled");
-       the_controller = dev;
-
        retval = device_register (&dev->gadget.dev);
        if (retval) goto done;
        retval = device_create_file (&pdev->dev, &dev_attr_registers);