@ -17,16 +17,7 @@
# include <dm/uclass-internal.h>
# include <dm/util.h>
/**
* device_chld_unbind ( ) - Unbind all device ' s children from the device
*
* On error , the function continues to unbind all children , and reports the
* first error .
*
* @ dev : The device that is to be stripped of its children
* @ return 0 on success , - ve on error
*/
static int device_chld_unbind ( struct udevice * dev )
int device_chld_unbind ( struct udevice * dev , struct driver * drv )
{
struct udevice * pos , * n ;
int ret , saved_ret = 0 ;
@ -34,6 +25,9 @@ static int device_chld_unbind(struct udevice *dev)
assert ( dev ) ;
list_for_each_entry_safe ( pos , n , & dev - > child_head , sibling_node ) {
if ( drv & & ( pos - > driver ! = drv ) )
continue ;
ret = device_unbind ( pos ) ;
if ( ret & & ! saved_ret )
saved_ret = ret ;
@ -42,13 +36,8 @@ static int device_chld_unbind(struct udevice *dev)
return saved_ret ;
}
/**
* device_chld_remove ( ) - Stop all device ' s children
* @ dev : The device whose children are to be removed
* @ pre_os_remove : Flag , if this functions is called in the pre - OS stage
* @ return 0 on success , - ve on error
*/
static int device_chld_remove ( struct udevice * dev , uint flags )
int device_chld_remove ( struct udevice * dev , struct driver * drv ,
uint flags )
{
struct udevice * pos , * n ;
int ret ;
@ -56,6 +45,9 @@ static int device_chld_remove(struct udevice *dev, uint flags)
assert ( dev ) ;
list_for_each_entry_safe ( pos , n , & dev - > child_head , sibling_node ) {
if ( drv & & ( pos - > driver ! = drv ) )
continue ;
ret = device_remove ( pos , flags ) ;
if ( ret )
return ret ;
@ -87,7 +79,7 @@ int device_unbind(struct udevice *dev)
return ret ;
}
ret = device_chld_unbind ( dev ) ;
ret = device_chld_unbind ( dev , NULL ) ;
if ( ret )
return ret ;
@ -178,7 +170,7 @@ int device_remove(struct udevice *dev, uint flags)
if ( ret )
return ret ;
ret = device_chld_remove ( dev , flags ) ;
ret = device_chld_remove ( dev , NULL , flags ) ;
if ( ret )
goto err ;