
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; + ret = uclass_pre_remove_device(dev); if (ret) return ret; diff --git a/drivers/core/root.c b/drivers/core/root.c index 583daa88b0..1468a15db4 100644 --- a/drivers/core/root.c +++ b/drivers/core/root.c @@ -182,6 +182,13 @@ int dm_uninit(void) return 0; }
+int dm_pre_os_remove(void) +{ + device_remove(dm_root(), true); + + return 0; +} + int dm_scan_platdata(bool pre_reloc_only) { int ret; @@ -280,6 +287,7 @@ U_BOOT_DRIVER(root_driver) = { .name = "root_driver", .id = UCLASS_ROOT, .priv_auto_alloc_size = sizeof(struct root_priv), + .flags = DM_FLAG_PRE_OS_REMOVE, };
/* This is the root uclass */ diff --git a/drivers/core/simple-bus.c b/drivers/core/simple-bus.c index a300217d39..4142626ff6 100644 --- a/drivers/core/simple-bus.c +++ b/drivers/core/simple-bus.c @@ -64,4 +64,5 @@ U_BOOT_DRIVER(simple_bus_drv) = { .name = "generic_simple_bus", .id = UCLASS_SIMPLE_BUS, .of_match = generic_simple_bus_ids, + .flags = DM_FLAG_PRE_OS_REMOVE, }; diff --git a/include/dm/root.h b/include/dm/root.h index 3cf730dcee..8ac7bc3512 100644 --- a/include/dm/root.h +++ b/include/dm/root.h @@ -115,4 +115,13 @@ int dm_init(void); */ int dm_uninit(void);
+/** + * dm_pre_os_remove - Call remove function of all drivers with the pre-OS + * remove flag set + * + * All devices with the pre-OS remove flag set, will be removed + * @return 0 if OK, -ve on error + */ +int dm_pre_os_remove(void); + #endif