aboutsummaryrefslogtreecommitdiff
path: root/include/dm/device.h
diff options
context:
space:
mode:
authorMarek Vasut2021-01-24 14:32:46 -0700
committerSimon Glass2021-02-03 03:38:41 -0700
commitcc6f4c8f2574472e359cb915811f6f93efdfcad4 (patch)
tree67b550a1af9bd00eb5fed3bc5d257eda641abcae /include/dm/device.h
parentc51d2e704a1c89d504b379b133bd552c3387fa6c (diff)
dm: core: Add late driver remove option
Add another flag to the DM core which could be assigned to drivers and which makes those drivers call their remove callbacks last, just before booting OS and after all the other drivers finished with their remove callbacks. This is necessary for things like clock drivers, where the other drivers might depend on the clock driver in their remove callbacks. Prime example is the mmc subsystem, which can reconfigure a card from HS mode to slower modes in the remove callback and for that it needs to reconfigure the controller clock. Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include/dm/device.h')
-rw-r--r--include/dm/device.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/include/dm/device.h b/include/dm/device.h
index 204441fd234..28533ce0b6d 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -74,6 +74,13 @@ struct driver_info;
#define DM_FLAG_LEAVE_PD_ON (1 << 13)
/*
+ * Device is vital to the operation of other devices. It is possible to remove
+ * removed this device after all regular devices are removed. This is useful
+ * e.g. for clock, which need to be active during the device-removal phase.
+ */
+#define DM_FLAG_VITAL (1 << 14)
+
+/*
* One or multiple of these flags are passed to device_remove() so that
* a selective device removal as specified by the remove-stage and the
* driver flags can be done.
@@ -91,7 +98,8 @@ enum {
/* Remove devices which need some final OS preparation steps */
DM_REMOVE_OS_PREPARE = DM_FLAG_OS_PREPARE,
- /* Add more use cases here */
+ /* Remove only devices that are not marked vital */
+ DM_REMOVE_NON_VITAL = DM_FLAG_VITAL,
/* Remove devices with any active flag */
DM_REMOVE_ACTIVE_ALL = DM_REMOVE_ACTIVE_DMA | DM_REMOVE_OS_PREPARE,