diff mbox series

[2/2] dm: core: Add a way to skip powering down power domains

Message ID 20200328140343.2.I67ec46b666e0712ab0c80c271698dc97719385e4@changeid
State Accepted
Commit ced1080489077ab9943c319a38c2d89adb215f1f
Headers show
Series [1/2] dm: core: Add logging on unbind failure | expand

Commit Message

Simon Glass March 28, 2020, 8:03 p.m. UTC
When removing a device the power domains it uses are generally powered
off. But when we are trying to unbind all devices (e.g. for running tests)
we don't want to probe a device in the 'remove' path.

Add a new flag to skip this power-down step.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 drivers/core/device-remove.c |  3 ++-
 drivers/core/uclass.c        |  2 +-
 include/dm/device.h          | 11 +++++++----
 3 files changed, 10 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c
index 8736fd9821e..efdb0f29058 100644
--- a/drivers/core/device-remove.c
+++ b/drivers/core/device-remove.c
@@ -198,7 +198,8 @@  int device_remove(struct udevice *dev, uint flags)
 		}
 	}
 
-	if (!(drv->flags &
+	if (!(flags & DM_REMOVE_NO_PD) &&
+	    !(drv->flags &
 	      (DM_FLAG_DEFAULT_PD_CTRL_OFF | DM_FLAG_REMOVE_WITH_PD_ON)) &&
 	    dev != gd->cur_serial_dev)
 		dev_power_domain_off(dev);
diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index b24b677c55d..68493029364 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -118,7 +118,7 @@  int uclass_destroy(struct uclass *uc)
 	while (!list_empty(&uc->dev_head)) {
 		dev = list_first_entry(&uc->dev_head, struct udevice,
 				       uclass_node);
-		ret = device_remove(dev, DM_REMOVE_NORMAL);
+		ret = device_remove(dev, DM_REMOVE_NORMAL | DM_REMOVE_NO_PD);
 		if (ret)
 			return log_msg_ret("remove", ret);
 		ret = device_unbind(dev);
diff --git a/include/dm/device.h b/include/dm/device.h
index a56164b19bb..17e57bf829c 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -80,18 +80,21 @@  struct driver_info;
  */
 enum {
 	/* Normal remove, remove all devices */
-	DM_REMOVE_NORMAL     = 1 << 0,
+	DM_REMOVE_NORMAL	= 1 << 0,
 
 	/* Remove devices with active DMA */
-	DM_REMOVE_ACTIVE_DMA = DM_FLAG_ACTIVE_DMA,
+	DM_REMOVE_ACTIVE_DMA	= DM_FLAG_ACTIVE_DMA,
 
 	/* Remove devices which need some final OS preparation steps */
-	DM_REMOVE_OS_PREPARE = DM_FLAG_OS_PREPARE,
+	DM_REMOVE_OS_PREPARE	= DM_FLAG_OS_PREPARE,
 
 	/* Add more use cases here */
 
 	/* Remove devices with any active flag */
-	DM_REMOVE_ACTIVE_ALL = DM_REMOVE_ACTIVE_DMA | DM_REMOVE_OS_PREPARE,
+	DM_REMOVE_ACTIVE_ALL	= DM_REMOVE_ACTIVE_DMA | DM_REMOVE_OS_PREPARE,
+
+	/* Don't power down any attached power domains */
+	DM_REMOVE_NO_PD		= 1 << 1,
 };
 
 /**