]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - drivers/usb/host/usb-uclass.c
dm: usb: Allow usb host drivers to implement usb_reset_root_port
[karo-tx-uboot.git] / drivers / usb / host / usb-uclass.c
index 10d47127b851b81d0a7f8a01063ea3c0cefec9bc..b0e6e71a8fb0f6017d41177d6d5703fe8b3c1e7e 100644 (file)
@@ -128,6 +128,17 @@ int usb_alloc_device(struct usb_device *udev)
        return ops->alloc_device(bus, udev);
 }
 
+int usb_reset_root_port(struct usb_device *udev)
+{
+       struct udevice *bus = udev->controller_dev;
+       struct dm_usb_ops *ops = usb_get_ops(bus);
+
+       if (!ops->reset_root_port)
+               return -ENOSYS;
+
+       return ops->reset_root_port(bus, udev);
+}
+
 int usb_stop(void)
 {
        struct udevice *bus;
@@ -146,6 +157,9 @@ int usb_stop(void)
                ret = device_remove(bus);
                if (ret && !err)
                        err = ret;
+               ret = device_unbind_children(bus);
+               if (ret && !err)
+                       err = ret;
        }
 
 #ifdef CONFIG_SANDBOX
@@ -265,11 +279,6 @@ int usb_init(void)
        return usb_started ? 0 : -1;
 }
 
-int usb_reset_root_port(void)
-{
-       return -ENOSYS;
-}
-
 static struct usb_device *find_child_devnum(struct udevice *parent, int devnum)
 {
        struct usb_device *udev;
@@ -482,15 +491,14 @@ error:
 }
 
 /**
- * usb_find_child() - Find an existing device which matches our needs
- *
- *
+ * usb_find_emul_child() - Find an existing device for emulated devices
  */
-static int usb_find_child(struct udevice *parent,
-                         struct usb_device_descriptor *desc,
-                         struct usb_interface_descriptor *iface,
-                         struct udevice **devp)
+static int usb_find_emul_child(struct udevice *parent,
+                              struct usb_device_descriptor *desc,
+                              struct usb_interface_descriptor *iface,
+                              struct udevice **devp)
 {
+#ifdef CONFIG_SANDBOX
        struct udevice *dev;
 
        *devp = NULL;
@@ -509,7 +517,7 @@ static int usb_find_child(struct udevice *parent,
                        return 0;
                }
        }
-
+#endif
        return -ENOENT;
 }
 
@@ -565,12 +573,12 @@ int usb_scan_device(struct udevice *parent, int port,
        debug("Calling usb_setup_device(), portnr=%d\n", udev->portnr);
        parent_udev = device_get_uclass_id(parent) == UCLASS_USB_HUB ?
                dev_get_parentdata(parent) : NULL;
-       ret = usb_setup_device(udev, priv->desc_before_addr, parent_udev, port);
+       ret = usb_setup_device(udev, priv->desc_before_addr, parent_udev);
        debug("read_descriptor for '%s': ret=%d\n", parent->name, ret);
        if (ret)
                return ret;
-       ret = usb_find_child(parent, &udev->descriptor, iface, &dev);
-       debug("** usb_find_child returns %d\n", ret);
+       ret = usb_find_emul_child(parent, &udev->descriptor, iface, &dev);
+       debug("** usb_find_emul_child returns %d\n", ret);
        if (ret) {
                if (ret != -ENOENT)
                        return ret;