mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 15:41:40 +00:00
usb: ci_udc: Add function to remove usb device
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>
This commit is contained in:
parent
213fa47dac
commit
1468a1cc72
3 changed files with 34 additions and 0 deletions
|
@ -1053,6 +1053,13 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||||
free(controller.items_mem);
|
free(controller.items_mem);
|
||||||
free(controller.epts);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -411,6 +411,24 @@ int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp)
|
||||||
return 0;
|
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 */
|
/* returns 0 if no match, 1 if match */
|
||||||
static int usb_match_device(const struct usb_device_descriptor *desc,
|
static int usb_match_device(const struct usb_device_descriptor *desc,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
|
|
|
@ -921,6 +921,15 @@ struct ehci_ctrl;
|
||||||
*/
|
*/
|
||||||
int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp);
|
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
|
* usb_stor_reset() - Prepare to scan USB storage devices
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue