From patchwork Mon Jun 29 02:12:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 243052 List-Id: U-Boot discussion From: peng.fan at nxp.com (Peng Fan) Date: Mon, 29 Jun 2020 10:12:59 +0800 Subject: [PATCH] usb: ci_udc: Add function to remove usb device Message-ID: <20200629021259.21103-1-peng.fan@nxp.com> From: Ye Li 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 Signed-off-by: Peng Fan --- drivers/usb/gadget/ci_udc.c | 7 +++++++ drivers/usb/host/usb-uclass.c | 18 ++++++++++++++++++ include/usb.h | 9 +++++++++ 3 files changed, 34 insertions(+) diff --git a/drivers/usb/gadget/ci_udc.c b/drivers/usb/gadget/ci_udc.c index cdbdbcc5ca..cdb8f6fb3d 100644 --- a/drivers/usb/gadget/ci_udc.c +++ b/drivers/usb/gadget/ci_udc.c @@ -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; } diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c index cb79dfbbd5..50ba39af42 100644 --- a/drivers/usb/host/usb-uclass.c +++ b/drivers/usb/host/usb-uclass.c @@ -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) diff --git a/include/usb.h b/include/usb.h index fa9e09607e..5a7af882fb 100644 --- a/include/usb.h +++ b/include/usb.h @@ -921,6 +921,15 @@ struct ehci_ctrl; */ int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp); +/** + * usb_remove_ehci_gadget() - Remove a gadget USB device + * + * TODO(sjg at 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 *