[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190607113835.15376-1-geert+renesas@glider.be>
Date: Fri, 7 Jun 2019 13:38:35 +0200
From: Geert Uytterhoeven <geert+renesas@...der.be>
To: Dan Williams <dan.j.williams@...el.com>,
Vinod Koul <vkoul@...nel.org>
Cc: dmaengine@...r.kernel.org, linux-renesas-soc@...r.kernel.org,
linux-kernel@...r.kernel.org,
Geert Uytterhoeven <geert+renesas@...der.be>
Subject: [PATCH/RFC] dmaengine: Create symlinks from DMA channels to slaves
Currently it is not easy to find out which DMA channels are in use, and
by which slave devices.
Fix this by creating in sysfs a "slave" symlink from the DMA channel to
the actual slave device when a channel is requested, and removing it
again when the channel is released.
For now this is limited to DT and ACPI.
Signed-off-by: Geert Uytterhoeven <geert+renesas@...der.be>
---
Questions:
1. Do you think this is useful?
2. Should backlinks (e.g. "dma:<name>") be created from the slave
device to the DMA channel?
This requires storing the name in struct dma_chan, for later
symlink removal.
3. Should this be extended to other ways of requesting channels?
In many cases, no device pointer is available, so a device pointer
parameter has to be added to all DMA channel request APIs that
don't have it yet.
---
drivers/dma/dmaengine.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
index 03ac4b96117cd8db..c11476f76fc96bcf 100644
--- a/drivers/dma/dmaengine.c
+++ b/drivers/dma/dmaengine.c
@@ -706,6 +706,10 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name)
if (chan) {
/* Valid channel found or requester needs to be deferred */
+ if (!IS_ERR(chan) &&
+ sysfs_create_link(&chan->dev->device.kobj, &dev->kobj,
+ "slave"))
+ dev_err(dev, "Cannot create DMA slave symlink\n");
if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)
return chan;
}
@@ -786,6 +790,7 @@ void dma_release_channel(struct dma_chan *chan)
/* drop PRIVATE cap enabled by __dma_request_channel() */
if (--chan->device->privatecnt == 0)
dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask);
+ sysfs_remove_link(&chan->dev->device.kobj, "slave");
mutex_unlock(&dma_list_mutex);
}
EXPORT_SYMBOL_GPL(dma_release_channel);
--
2.17.1
Powered by blists - more mailing lists