mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 13:11:31 +00:00
dm: core: Handle recursive unbinding of uclass devices
Since a device can have children in the same uclass as itself, we need to handle unbinding carefully: we must allow that unbinding a device in a uclass may cause another device in the same uclass to be unbound. Adjust the code to cope. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Joe Hershberger <joe.hershberger@ni.com> Tested-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
a7b8250210
commit
07d260e047
1 changed files with 10 additions and 2 deletions
|
@ -99,10 +99,18 @@ fail_mem:
|
|||
int uclass_destroy(struct uclass *uc)
|
||||
{
|
||||
struct uclass_driver *uc_drv;
|
||||
struct udevice *dev, *tmp;
|
||||
struct udevice *dev;
|
||||
int ret;
|
||||
|
||||
list_for_each_entry_safe(dev, tmp, &uc->dev_head, uclass_node) {
|
||||
/*
|
||||
* We cannot use list_for_each_entry_safe() here. If a device in this
|
||||
* uclass has a child device also in this uclass, it will be also be
|
||||
* unbound (by the recursion in the call to device_unbind() below).
|
||||
* We can loop until the list is empty.
|
||||
*/
|
||||
while (!list_empty(&uc->dev_head)) {
|
||||
dev = list_first_entry(&uc->dev_head, struct udevice,
|
||||
uclass_node);
|
||||
ret = device_remove(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
Loading…
Add table
Reference in a new issue