usb: ci_udc: Add function to remove usb device
authorYe Li <ye.li@nxp.com>
Mon, 29 Jun 2020 02:12:59 +0000 (10:12 +0800)
committerMarek Vasut <marex@denx.de>
Tue, 1 Sep 2020 12:47:43 +0000 (14:47 +0200)
When unregister gadget driver in ci_udc, the usb device is not
removed or stop. This causes next "usb start" fails to work.

Add a new interface "usb_remove_ehci_gadget" in usb-uclass to
remove the usb device for DM driver. Using "usb_lowlevel_stop" for
non-DM driver.

Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/usb/gadget/ci_udc.c
drivers/usb/host/usb-uclass.c
include/usb.h

index cdbdbcc..cdb8f6f 100644 (file)
@@ -1053,6 +1053,13 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
        free(controller.items_mem);
        free(controller.epts);
 
+#if CONFIG_IS_ENABLED(DM_USB)
+       usb_remove_ehci_gadget(&controller.ctrl);
+#else
+       usb_lowlevel_stop(0);
+       controller.ctrl = NULL;
+#endif
+
        return 0;
 }
 
index e5dda79..8773824 100644 (file)
@@ -411,6 +411,24 @@ int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp)
        return 0;
 }
 
+int usb_remove_ehci_gadget(struct ehci_ctrl **ctlrp)
+{
+       struct udevice *dev;
+       int ret;
+
+       /* Find the old device and remove it */
+       ret = uclass_find_device_by_seq(UCLASS_USB, 0, true, &dev);
+       if (ret)
+               return ret;
+       ret = device_remove(dev, DM_REMOVE_NORMAL);
+       if (ret)
+               return ret;
+
+       *ctlrp = NULL;
+
+       return 0;
+}
+
 /* returns 0 if no match, 1 if match */
 static int usb_match_device(const struct usb_device_descriptor *desc,
                            const struct usb_device_id *id)
index fa9e096..5a7af88 100644 (file)
@@ -922,6 +922,15 @@ struct ehci_ctrl;
 int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp);
 
 /**
+ * usb_remove_ehci_gadget() - Remove a gadget USB device
+ *
+ * TODO(sjg@chromium.org): Tidy this up when USB gadgets can use driver model
+ *
+ * This provides a way to tell a controller to remove a USB device
+ */
+int usb_remove_ehci_gadget(struct ehci_ctrl **ctlrp);
+
+/**
  * usb_stor_reset() - Prepare to scan USB storage devices
  *
  * Empty the list of USB storage devices in preparation for scanning them.