summaryrefslogtreecommitdiffstats
path: root/drivers/core
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/core')
-rw-r--r--drivers/core/Kconfig3
-rw-r--r--drivers/core/devres.c29
2 files changed, 31 insertions, 1 deletions
diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig
index 8ae0072aa9..c82b5645cd 100644
--- a/drivers/core/Kconfig
+++ b/drivers/core/Kconfig
@@ -93,10 +93,11 @@ config DEVRES
devm_kmalloc() to kmalloc(), etc.
config DEBUG_DEVRES
- bool "Managed device resources verbose debug messages"
+ bool "Managed device resources debugging functions"
depends on DEVRES
help
If this option is enabled, devres debug messages are printed.
+ Also, a function is available to dump a list of device resources.
Select this if you are having a problem with devres or want to
debug resource management for a managed device.
diff --git a/drivers/core/devres.c b/drivers/core/devres.c
index f235c1bcfd..605295bd14 100644
--- a/drivers/core/devres.c
+++ b/drivers/core/devres.c
@@ -13,6 +13,8 @@
#include <linux/kernel.h>
#include <linux/list.h>
#include <dm/device.h>
+#include <dm/root.h>
+#include <dm/util.h>
/**
* struct devres - Bookkeeping info for managed device resource
@@ -195,6 +197,33 @@ void devres_release_all(struct udevice *dev)
release_nodes(dev, &dev->devres_head, false);
}
+#ifdef CONFIG_DEBUG_DEVRES
+static void dump_resources(struct udevice *dev, int depth)
+{
+ struct devres *dr;
+ struct udevice *child;
+
+ printf("- %s\n", dev->name);
+
+ list_for_each_entry(dr, &dev->devres_head, entry)
+ printf(" %p (%lu byte) %s %s\n", dr,
+ (unsigned long)dr->size, dr->name,
+ dr->probe ? "PROBE" : "BIND");
+
+ list_for_each_entry(child, &dev->child_head, sibling_node)
+ dump_resources(child, depth + 1);
+}
+
+void dm_dump_devres(void)
+{
+ struct udevice *root;
+
+ root = dm_root();
+ if (root)
+ dump_resources(root, 0);
+}
+#endif
+
/*
* Managed kmalloc/kfree
*/
OpenPOWER on IntegriCloud