]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/gadget/goku_udc.c
Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
[karo-tx-linux.git] / drivers / usb / gadget / goku_udc.c
index 1088d08c7ed8fac07146bd8d6fbde9d59a1897ca..48a760220baf992c48541f2cae822943690bae5c 100644 (file)
@@ -1343,14 +1343,15 @@ static struct goku_udc  *the_controller;
  * disconnect is reported.  then a host may connect again, or
  * the driver might get unbound.
  */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
+               int (*bind)(struct usb_gadget *))
 {
        struct goku_udc *dev = the_controller;
        int                     retval;
 
        if (!driver
                        || driver->speed < USB_SPEED_FULL
-                       || !driver->bind
+                       || !bind
                        || !driver->disconnect
                        || !driver->setup)
                return -EINVAL;
@@ -1363,7 +1364,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
        driver->driver.bus = NULL;
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
-       retval = driver->bind(&dev->gadget);
+       retval = bind(&dev->gadget);
        if (retval) {
                DBG(dev, "bind to driver %s --> error %d\n",
                                driver->driver.name, retval);
@@ -1380,7 +1381,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
        DBG(dev, "registered gadget driver '%s'\n", driver->driver.name);
        return 0;
 }
-EXPORT_SYMBOL(usb_gadget_register_driver);
+EXPORT_SYMBOL(usb_gadget_probe_driver);
 
 static void
 stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver)
@@ -1744,7 +1745,8 @@ static void goku_remove(struct pci_dev *pdev)
                                pci_resource_len (pdev, 0));
        if (dev->enabled)
                pci_disable_device(pdev);
-       device_unregister(&dev->gadget.dev);
+       if (dev->registered)
+               device_unregister(&dev->gadget.dev);
 
        pci_set_drvdata(pdev, NULL);
        dev->regs = NULL;
@@ -1774,7 +1776,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (!pdev->irq) {
                printk(KERN_ERR "Check PCI %s IRQ setup!\n", pci_name(pdev));
                retval = -ENODEV;
-               goto done;
+               goto err;
        }
 
        /* alloc, and start init */
@@ -1782,7 +1784,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (dev == NULL){
                pr_debug("enomem %s\n", pci_name(pdev));
                retval = -ENOMEM;
-               goto done;
+               goto err;
        }
 
        spin_lock_init(&dev->lock);
@@ -1800,7 +1802,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        retval = pci_enable_device(pdev);
        if (retval < 0) {
                DBG(dev, "can't enable, %d\n", retval);
-               goto done;
+               goto err;
        }
        dev->enabled = 1;
 
@@ -1809,7 +1811,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (!request_mem_region(resource, len, driver_name)) {
                DBG(dev, "controller already in use\n");
                retval = -EBUSY;
-               goto done;
+               goto err;
        }
        dev->got_region = 1;
 
@@ -1817,7 +1819,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (base == NULL) {
                DBG(dev, "can't map memory\n");
                retval = -EFAULT;
-               goto done;
+               goto err;
        }
        dev->regs = (struct goku_udc_regs __iomem *) base;
 
@@ -1833,7 +1835,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                        driver_name, dev) != 0) {
                DBG(dev, "request interrupt %d failed\n", pdev->irq);
                retval = -EBUSY;
-               goto done;
+               goto err;
        }
        dev->got_irq = 1;
        if (use_dma)
@@ -1844,13 +1846,16 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev);
 #endif
 
-       /* done */
        the_controller = dev;
        retval = device_register(&dev->gadget.dev);
-       if (retval == 0)
-               return 0;
+       if (retval) {
+               put_device(&dev->gadget.dev);
+               goto err;
+       }
+       dev->registered = 1;
+       return 0;
 
-done:
+err:
        if (dev)
                goku_remove (pdev);
        return retval;