DMA40 registers multiple dma_device instances for the same platform
device. The DMAengine debugfs code uses dev_name(dma_dev->dev) as the
directory name, so the second and third registrations try to create the
same directory and print duplicate-name warnings.

Keep the existing device-name directory for the first registration, but
use a dev_id-suffixed fallback when that name already exists.

Signed-off-by: Linus Walleij <[email protected]>
---
 drivers/dma/dmaengine.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
index 6ffd8bd82154..a1c388def67a 100644
--- a/drivers/dma/dmaengine.c
+++ b/drivers/dma/dmaengine.c
@@ -33,6 +33,7 @@
 
 #include <linux/acpi.h>
 #include <linux/acpi_dma.h>
+#include <linux/dcache.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
@@ -70,8 +71,24 @@ static struct dentry *rootdir;
 
 static void dmaengine_debug_register(struct dma_device *dma_dev)
 {
-       dma_dev->dbg_dev_root = debugfs_create_dir(dev_name(dma_dev->dev),
-                                                  rootdir);
+       const char *name = dev_name(dma_dev->dev);
+       struct dentry *dentry;
+       char *uniq;
+
+       dentry = debugfs_lookup(name, rootdir);
+       if (dentry) {
+               dput(dentry);
+
+               uniq = kasprintf(GFP_KERNEL, "%s.%d", name, dma_dev->dev_id);
+               if (!uniq)
+                       return;
+
+               dma_dev->dbg_dev_root = debugfs_create_dir(uniq, rootdir);
+               kfree(uniq);
+       } else {
+               dma_dev->dbg_dev_root = debugfs_create_dir(name, rootdir);
+       }
+
        if (IS_ERR(dma_dev->dbg_dev_root))
                dma_dev->dbg_dev_root = NULL;
 }

-- 
2.55.0


Reply via email to