]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/gadget/omap_udc.c
Merge with /home/tmlind/src/kernel/linux-2.6
[linux-2.6-omap-h63xx.git] / drivers / usb / gadget / omap_udc.c
index 35e16919646749b343a6e570cf7cdbdc989377a4..91b3bb098d9f4f618b0eb6a60f47adb3b480463c 100644 (file)
@@ -2094,7 +2094,6 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
                        // FIXME if otg, check:  driver->is_otg
                        || driver->speed < USB_SPEED_FULL
                        || !driver->bind
-                       || !driver->unbind
                        || !driver->setup)
                return -EINVAL;
 
@@ -2141,9 +2140,11 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)
                status = otg_set_peripheral(udc->transceiver, &udc->gadget);
                if (status < 0) {
                        ERR("can't bind to transceiver\n");
-                       driver->unbind (&udc->gadget);
-                       udc->gadget.dev.driver = NULL;
-                       udc->driver = NULL;
+                       if (driver->unbind) {
+                               driver->unbind (&udc->gadget);
+                               udc->gadget.dev.driver = NULL;
+                               udc->driver = NULL;
+                       }
                        goto done;
                }
        } else {
@@ -2173,7 +2174,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
 
        if (!udc)
                return -ENODEV;
-       if (!driver || driver != udc->driver)
+       if (!driver || driver != udc->driver || !driver->unbind)
                return -EINVAL;
 
        if (udc->dc_clk != NULL)
@@ -2657,7 +2658,7 @@ omap_udc_setup(struct platform_device *odev, struct otg_transceiver *xceiv)
        /* UDC_PULLUP_EN gates the chip clock */
        // OTG_SYSCON_1_REG |= DEV_IDLE_EN;
 
-       udc = kzalloc(sizeof(*udc), SLAB_KERNEL);
+       udc = kzalloc(sizeof(*udc), GFP_KERNEL);
        if (!udc)
                return -ENOMEM;
 
@@ -3004,6 +3005,8 @@ static int __exit omap_udc_remove(struct platform_device *pdev)
 
        if (!udc)
                return -ENODEV;
+       if (udc->driver)
+               return -EBUSY;
 
        udc->done = &done;