
Hi Simon,
On 03.03.2017 05:53, Simon Glass wrote:
On 1 March 2017 at 03:23, Stefan Roese sr@denx.de wrote:
The new function dm_pre_os_remove() is intented for driver specific last-stage cleanup operations before the OS is started. This patch adds this functionality and hooks it into the common device_remove() function.
To enable usage for custom driver (e.g. ethernet drivers), this patch also sets the pre-OS remove flag for the root driver and simple-bus drivers. Otherwise the recursive call starting from the root device would not reach the drivers in need for this specific remove call.
Signed-off-by: Stefan Roese sr@denx.de Cc: Simon Glass sjg@chromium.org
drivers/core/device-remove.c | 7 +++++++ drivers/core/root.c | 8 ++++++++ drivers/core/simple-bus.c | 1 + include/dm/root.h | 9 +++++++++ 4 files changed, 25 insertions(+)
diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c index 4725d4751c..0dfb20cdce 100644 --- a/drivers/core/device-remove.c +++ b/drivers/core/device-remove.c @@ -166,6 +166,13 @@ int device_remove(struct udevice *dev, bool pre_os_remove) drv = dev->driver; assert(drv);
/*
* If pre-OS remove is requested, only continue for drivers with this
* flag set
*/
if (pre_os_remove && !(drv->flags & DM_FLAG_PRE_OS_REMOVE))
return 0;
This doesn't seem good to me. I think it should scan the whole tree, and process devices with the flag set. That way you don't need the root node to have the flag.
Yes, thats better, I agree.
If a device has DMA, it will be removed. But its parent may not, in which case the parent will not be removed. However any children of the device will need to be removed, even if they don't have DMA, because we cannot have active children of an inactive device. Does that make sense?
Yes. I'll change this in the next patchset version accordingly.
Thanks, Stefan