diff options
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/gadget/dummy_hcd.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index fdab97a27c08..4d2946e540cf 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -816,15 +816,14 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver) | |||
816 | dum->gadget.dev.driver = &driver->driver; | 816 | dum->gadget.dev.driver = &driver->driver; |
817 | dev_dbg (udc_dev(dum), "binding gadget driver '%s'\n", | 817 | dev_dbg (udc_dev(dum), "binding gadget driver '%s'\n", |
818 | driver->driver.name); | 818 | driver->driver.name); |
819 | if ((retval = driver->bind (&dum->gadget)) != 0) { | 819 | if ((retval = driver->bind (&dum->gadget)) != 0) |
820 | dum->driver = NULL; | 820 | goto err_bind_gadget; |
821 | dum->gadget.dev.driver = NULL; | ||
822 | return retval; | ||
823 | } | ||
824 | 821 | ||
825 | driver->driver.bus = dum->gadget.dev.parent->bus; | 822 | driver->driver.bus = dum->gadget.dev.parent->bus; |
826 | driver_register (&driver->driver); | 823 | if ((retval = driver_register (&driver->driver)) != 0) |
827 | device_bind_driver (&dum->gadget.dev); | 824 | goto err_register; |
825 | if ((retval = device_bind_driver (&dum->gadget.dev)) != 0) | ||
826 | goto err_bind_driver; | ||
828 | 827 | ||
829 | /* khubd will enumerate this in a while */ | 828 | /* khubd will enumerate this in a while */ |
830 | spin_lock_irq (&dum->lock); | 829 | spin_lock_irq (&dum->lock); |
@@ -834,6 +833,19 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver) | |||
834 | 833 | ||
835 | usb_hcd_poll_rh_status (dummy_to_hcd (dum)); | 834 | usb_hcd_poll_rh_status (dummy_to_hcd (dum)); |
836 | return 0; | 835 | return 0; |
836 | |||
837 | err_bind_driver: | ||
838 | driver_unregister (&driver->driver); | ||
839 | err_register: | ||
840 | driver->unbind (&dum->gadget); | ||
841 | spin_lock_irq (&dum->lock); | ||
842 | dum->pullup = 0; | ||
843 | set_link_state (dum); | ||
844 | spin_unlock_irq (&dum->lock); | ||
845 | err_bind_gadget: | ||
846 | dum->driver = NULL; | ||
847 | dum->gadget.dev.driver = NULL; | ||
848 | return retval; | ||
837 | } | 849 | } |
838 | EXPORT_SYMBOL (usb_gadget_register_driver); | 850 | EXPORT_SYMBOL (usb_gadget_register_driver); |
839 | 851 | ||
@@ -916,7 +928,9 @@ static int dummy_udc_probe (struct platform_device *pdev) | |||
916 | usb_get_hcd (dummy_to_hcd (dum)); | 928 | usb_get_hcd (dummy_to_hcd (dum)); |
917 | 929 | ||
918 | platform_set_drvdata (pdev, dum); | 930 | platform_set_drvdata (pdev, dum); |
919 | device_create_file (&dum->gadget.dev, &dev_attr_function); | 931 | rc = device_create_file (&dum->gadget.dev, &dev_attr_function); |
932 | if (rc < 0) | ||
933 | device_unregister (&dum->gadget.dev); | ||
920 | return rc; | 934 | return rc; |
921 | } | 935 | } |
922 | 936 | ||
@@ -1864,8 +1878,7 @@ static int dummy_start (struct usb_hcd *hcd) | |||
1864 | #endif | 1878 | #endif |
1865 | 1879 | ||
1866 | /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */ | 1880 | /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */ |
1867 | device_create_file (dummy_dev(dum), &dev_attr_urbs); | 1881 | return device_create_file (dummy_dev(dum), &dev_attr_urbs); |
1868 | return 0; | ||
1869 | } | 1882 | } |
1870 | 1883 | ||
1871 | static void dummy_stop (struct usb_hcd *hcd) | 1884 | static void dummy_stop (struct usb_hcd *hcd) |